 ',
                    nextArrow: '
',
                    nextArrow: ' ',
                    responsive: [{
                        breakpoint: 1199,
                        settings: {
                            slidesToShow: 3,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 2,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: 1,
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._dataArray = [];
        $scope._dataArrayDone = false;
        $scope._getDataArray = function(id) {
            var dataSend = {
                'txt_referral_id': id
            };
            GAEAPI.get('referral/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    console.log("_dataArray", $scope._dataArray);
                }
            });
        };
        $scope._getDataArray($scope.referralid);
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.openCity = function(evt, cityName) {
            var i, tabcontent, tablinks;
            tabcontent = document.getElementsByClassName("tabcontent");
            for (i = 0; i < tabcontent.length; i++) {
                tabcontent[i].style.display = "none";
            }
            tablinks = document.getElementsByClassName("tablinks");
            for (i = 0; i < tablinks.length; i++) {
                tablinks[i].className = tablinks[i].className.replace(" active", "");
            }
            document.getElementById(cityName).style.display = "block";
            evt.currentTarget.className += " active";
        }
        $scope.displayImage = function(image_url, prefix) {
            return GAEAPI.getGaeImageUrl(image_url, prefix);
        }
    };
    return promise;
});_ui_share_app.directive('componentCategoryFeaturedSildeA', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryFeaturedSildeA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.carousel = function(cover_in, carousel_in) {
            $scope.getData().consoleLog("imageCarousel : cover_in : ", cover_in);
            $scope.getData().consoleLog("imageCarousel : carousel_in :", carousel_in);
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: false,
                    autoplay: true,
                    autoplaySpeed: 5000,
                    slidesToShow: 4,
                    slidesToScroll: 4,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                    responsive: [{
                        breakpoint: 1199,
                        settings: {
                            slidesToShow: 4,
                            slidesToScroll: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 3,
                            slidesToScroll: 3,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: 2,
                            slidesToScroll: 2,
                        }
                    }]
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1500);
        };
        $scope.getData = function() {
            var data = {
                consoleLog: function(name, data) {
                    /* console.log(name, data); */
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(number, api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(number, api, dataSend);
                },
                getApi: function(number, api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(number, output);
                    });
                },
                titleUrl: function(str) {
                    var url = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    return url;
                },
                locationUrlProductDetail: function(product_id, product_title) {
                    var _self = this;
                    var url = 'product-detail/';
                    url += product_id + '-';
                    url += _self.titleUrl(product_title);
                    _self.locationUrl(url, '');
                },
                locationUrl: function(url) {
                    if (url != "") {
                        $location.url(url).replace();
                    }
                },
                windowLocation: function(url) {
                    if (url != "") {
                        window.location.href = url;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return data;
        };
        $scope.dataArray = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataSet = [{
            number: 0,
            api: "referral/lists",
            dataSend: {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 5,
                'txt_sortby': 'referral_sort_index_asc_time_desc',
                'txt_filter_json': JSON.stringify({
                    "badge_id_array": [16]
                })
            },
        }, {
            number: 1,
            api: "product/lists",
            dataSend: {},
        }];
        $scope.getData().dataSend($scope.dataSet[0].number, $scope.dataSet[0].api, $scope.dataSet[0].dataSend, function(number, api, dataSend) {
            $scope.dataArrayState = $scope.getData().stateData(true, false);
            $scope.getData().getApi(0, api, dataSend, function(number, output) {
                $scope.dataArray = output.data.dataList;
                $scope.dataArrayState = $scope.getData().stateData(false, true);
                $scope.getData().consoleLog("getData : dataArray :  ", $scope.dataArray);
                for (var a = 0; a < output.data.dataList.length; a++) {
                    $scope.dataArray[a].referral_product_carousel = a;
                    $scope.dataArray[a].referral_product_state = $scope.getData().stateData(true, false);
                    $scope.dataArray[a].referral_products = [];
                    var filter_json = {
                        referral_id_array: [output.data.dataList[a].referral_id],
                    }
                    $scope.dataSet[1].dataSend = {
                        'cur_page': 1,
                        'per_page': 8,
                        'txt_sortby': 'product_lastest_create',
                        'txt_filter_json': JSON.stringify(filter_json)
                    }
                    $scope.getData().dataSend(a, $scope.dataSet[1].api, $scope.dataSet[1].dataSend, function(a, api, dataSend) {
                        $scope.getData().getApi(a, api, dataSend, function(number, output) {
                            $scope.dataArray[number].referral_products = output.data.dataList;
                            $scope.dataArray[a].referral_product_state = $scope.getData().stateData(false, true);
                            $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                            $scope.getData().consoleLog("getData : a            : ", a);
                            $scope.getData().consoleLog("getData : product_lists : ", $scope.dataArray[number].referral_products);
                            $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                            $scope.getData().consoleLog("getData : dataArray : ", $scope.dataArray);
                        });
                    });
                }
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentCategoryFeaturedTabsTypeA', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryFeaturedTabsTypeA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.getData = function() {
            var data = {
                consoleLog: function(name, data) {
                    /* console.log(name, data); */
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(number1, number2, api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : number1   : ", number1);
                    _self.consoleLog("getData : number2   : ", number2);
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(number1, number2, api, dataSend);
                },
                getApi: function(number1, number2, api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : number1   : ", number1);
                        _self.consoleLog("getData : number2   : ", number2);
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(number1, number2, output);
                    });
                },
                main: function() {
                    var _self = this;
                },
                titleUrl: function(str) {
                    var url = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    return url;
                },
                locationUrlProductDetail: function(product_id, product_title) {
                    var _self = this;
                    var url = 'product-detail/';
                    url += product_id + '-';
                    url += _self.titleUrl(product_title);
                    _self.locationUrl(url, '');
                },
                locationUrl: function(template, data) {
                    $location.url(template + data).replace();
                },
                getHeight: function() {
                    return ($(window).width() > 767) ? 100 : 60;
                }
            }
            return data;
        };
        $scope.buy = function() {
            var data = {
                buyProcess: function(product_id, product_total_stock) {
                    var _self = this;
                    if (product_total_stock != '0') {
                        _self.isSelected(product_id, function(selected) {
                            console.log("buy : buyProcess : isSelected : ", selected);
                            if (!selected) {
                                _self.isProgress(product_id, function(progress) {
                                    console.log("buy : buyProcess : isProgress : ", progress);
                                    if (!progress) {
                                        var root_virtual_cart_type_b = $('#root-virtual-cart-type-b').hasClass('show');
                                        if (!root_virtual_cart_type_b) {
                                            $virtualCartTypeB.isCart();
                                        } else {
                                            $virtualCartTypeB.isLoad();
                                        }
                                        UiCart.delegate.product.add(product_id, 1, 0, function(output) {
                                            console.log("buy : buyProcess : add : ", output);
                                            if (!root_virtual_cart_type_b) {
                                                $virtualCartTypeB.isCart();
                                            } else {
                                                $virtualCartTypeB.isLoad();
                                            }
                                        });
                                    }
                                });
                            }
                        });
                    } else {
                        alert("สินค้าหมดแล้วนะค่ะ");
                    }
                },
                isSelected: function(product_id, callback) {
                    var selected = UiCart.delegate.product.isSelected(product_id);
                    callback(selected);
                },
                isProgress: function(product_id, callback) {
                    var progress = UiCart.delegate.product.isProgress(product_id);
                    callback(progress);
                }
            }
            return data;
        };
        $scope.tags = {
            index: '0'
        };
        $scope.dataArray = [];
        $scope.dataSet = [{
            api: "referral/short_lists",
            dataSend: {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 10,
                'txt_badge_id': 16,
                'txt_parent_id': 0,
                'txt_sortby': 'referral_sort_index_asc_time_desc',
            },
        }, {
            api: "referral/map",
            dataSend: {},
        }, {
            api: "product/lists",
            dataSend: {},
        }];
        $scope.getData().dataSend(0, 0, $scope.dataSet[0].api, $scope.dataSet[0].dataSend, function(number1, number2, api, dataSend) {
            $scope.getData().getApi(number1, number2, api, dataSend, function(number1, number2, output) {
                $scope.dataArray = output.data.dataList;
                $scope.getData().consoleLog("getData : dataArray :  ", $scope.dataArray);
                for (var a = 0; a < output.data.dataList.length; a++) {
                    $scope.getData().getRouteParams(function(params) {
                        if (typeof params.root_id != 'undefined') {
                            $scope.tags.index = params.root_id.toString();
                        } else {
                            $scope.tags.index = output.data.dataList[0].referral_id.toString();
                        }
                    });
                    $scope.dataArray[a].referral_sub_array_state = $scope.getData().stateData(true, false);
                    $scope.dataArray[a].referral_sub_array = [];
                    $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                    $scope.getData().consoleLog("getData : number        : ", a);
                    $scope.getData().consoleLog("getData : referral_id   : ", output.data.dataList[a].referral_id);
                    $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                    $scope.dataSet[1].dataSend = {
                        'txt_referral_type_id': 11,
                        'txt_parent_id': output.data.dataList[a].referral_id
                    }
                    $scope.getData().dataSend(a, 0, $scope.dataSet[1].api, $scope.dataSet[1].dataSend, function(number1, number2, api, dataSend) {
                        $scope.getData().getApi(number1, number2, api, dataSend, function(number1, number2, output) {
                            $scope.dataArray[number1].referral_sub_array = output.data;
                            $scope.dataArray[number1].referral_sub_array_state = $scope.getData().stateData(false, true);
                            $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                            $scope.getData().consoleLog("getData : number1               : ", number1);
                            $scope.getData().consoleLog("getData : referral_sub_array   : ", $scope.dataArray[number1].referral_sub_array);
                            $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                            for (var b = 0; b < output.data.length; b++) {
                                $scope.dataArray[number1].referral_sub_array[b].product_state = $scope.getData().stateData(true, false);
                                $scope.dataArray[number1].referral_sub_array[b].product_list = [];
                                $scope.getData().consoleLog("getData : dataSend to getApi to for : for : ", "------- dataSet.dataArray -------");
                                $scope.getData().consoleLog("getData : number2        : ", b);
                                $scope.getData().consoleLog("getData : referral_id   : ", output.data[b].referral_id);
                                $scope.getData().consoleLog("getData : dataSend to getApi to for : for : ", "------- dataSet.dataArray -------");
                                var filter_json = {
                                    "referral_id_array": [output.data[b].referral_id],
                                }
                                $scope.dataSet[2].dataSend = {
                                    'cur_page': 1,
                                    'per_page': 200,
                                    'txt_sortby': 'product_lastest_create',
                                    'txt_filter_json': JSON.stringify(filter_json)
                                }
                                $scope.getData().dataSend(number1, b, $scope.dataSet[2].api, $scope.dataSet[2].dataSend, function(number1, number2, api, dataSend) {
                                    $scope.getData().getApi(number1, number2, api, dataSend, function(number1, number2, output) {
                                        $scope.getData().consoleLog("getData : getApi : output : ", output);
                                        $scope.dataArray[number1].referral_sub_array[number2].product_list = output.data.dataList;
                                        $scope.dataArray[number1].referral_sub_array[number2].product_state = $scope.getData().stateData(false, true);
                                        $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                                        $scope.getData().consoleLog("getData : number1      : ", number1);
                                        $scope.getData().consoleLog("getData : number2      : ", number2);
                                        $scope.getData().consoleLog("getData : product_list : ", $scope.dataArray[number1].referral_sub_array[number2].product_list);
                                        $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                                        $scope.getData().getRouteParams(function(params) {
                                            if (typeof params.referral_id != 'undefined' && typeof params.referral_id != '0') {
                                                $timeout(function() {
                                                    $('html, body').animate({
                                                        scrollTop: $("div[id='" + params.referral_id + "']").offset().top - $scope.getData().getHeight()
                                                    }, 200);
                                                }, 1000);
                                            }
                                        });
                                    });
                                });
                            }
                        });
                    });
                }
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentCategoryFeaturedTabsTypeB', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryFeaturedTabsTypeB';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(name, data) {
                    console.log('componentCategoryFeaturedTabsTypeB : ', name, data);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(load, done) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : load : ", load);
                    _self.consoleLog("getData : done : ", done);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: load,
                        done: done
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                titleUrl: function(str) {
                    var url = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    return url;
                },
                locationUrl: function(template) {
                    $location.url(template).replace();
                },
                categoryUrl: function(rootId, referralId) {
                    var _self = this;
                    var template = "category-lists";
                    var res_template = template.concat("?root_id=", rootId, "&referral_id=", referralId, "&referral_type=category");
                    _self.locationUrl(res_template);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.cover_top = "products";
        $scope.state = "";
        $scope.dataArrayMain = [];
        $scope.dataArrayMainState = $scope.getData().stateData(false, false);
        $scope.dataArray = [];
        $scope.dataArrayState = $scope.getData().stateData(false, false);
        $scope.getData().getRouteParams(function(params) {
            $scope.routeParams = params;
            $scope.dataArrayState = $scope.getData().stateData(true, false);
            if (params.root_id == undefined && params.referral_id == undefined && params.sendtag == undefined && params.badge_id == undefined) {
                $scope.cover_top = "products";
                $scope.state = "main_category";
                var txt_filter_json = {
                    badge_id_array: [16, 18]
                };
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_sortby': 'referral_sort_index_asc_name_desc',
                    'txt_filter_json': JSON.stringify(txt_filter_json)
                };
                $scope.dataArrayMainState = $scope.getData().stateData(true, false);
                $scope.getData().dataSend('referral/map', dataSend, function(api, dataSend) {
                    $scope.getData().getApi(api, dataSend, function(output) {
                        $scope.dataArrayMain = output.data;
                        $scope.dataArrayMainState = $scope.getData().stateData(false, true);
                        for (var i = 0; i < output.data.length; i++) {
                            var loop = 0;
                            var txt_filter_json = {};
                            var dataSend = {
                                'txt_referral_type_id': 11,
                                'txt_parent_id': output.data[i].referral_id,
                                'txt_sortby': 'referral_sort_index_asc_name_desc',
                                'txt_filter_json': JSON.stringify(txt_filter_json)
                            };
                            $scope.dataArrayState = $scope.getData().stateData(true, false);
                            $scope.getData().dataSend('referral/map', dataSend, function(api, dataSend) {
                                $scope.getData().getApi(api, dataSend, function(res_output) {
                                    var oldData = $scope.dataArray;
                                    $scope.dataArray = oldData.concat(res_output.data);
                                    loop = loop + 1;
                                    if (output.data.length == loop) {
                                        $scope.dataArrayState = $scope.getData().stateData(false, true);
                                    }
                                });
                            });
                        }
                    });
                });
            } else if (params.root_id == '0' && params.referral_id != undefined && params.sendtag == undefined && params.badge_id == undefined) {
                $scope.state = "sub_category";
                var dataSend = {
                    'txt_referral_id': params.referral_id
                };
                $scope.getData().dataSend('referral/id', dataSend, function(api, dataSend) {
                    $scope.getData().getApi(api, dataSend, function(output) {
                        console.log("referral/id : output.data : ", output.data);
                        $scope.cover_top = output.data.referral_name;
                    });
                });
                var txt_filter_json = {
                    'badge_id_array': [16, 18]
                };
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_sortby': 'referral_sort_index_asc_name_desc',
                    'txt_filter_json': JSON.stringify(txt_filter_json)
                };
                $scope.dataArrayMainState = $scope.getData().stateData(true, false);
                $scope.getData().dataSend('referral/map', dataSend, function(api, dataSend) {
                    $scope.getData().getApi(api, dataSend, function(output) {
                        $scope.dataArrayMain = output.data;
                        $scope.dataArrayMainState = $scope.getData().stateData(false, true);
                    });
                });
                var txt_filter_json = {};
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_parent_id': params.referral_id,
                    'txt_sortby': 'referral_sort_index_asc_name_desc',
                    'txt_filter_json': JSON.stringify(txt_filter_json)
                };
                $scope.dataArrayState = $scope.getData().stateData(true, false);
                $scope.getData().dataSend('referral/map', dataSend, function(api, dataSend) {
                    $scope.getData().getApi(api, dataSend, function(output) {
                        $scope.dataArray = output.data;
                        $scope.dataArrayState = $scope.getData().stateData(false, true);
                    });
                });
            } else if (params.root_id != '0' && params.referral_id != undefined && params.sendtag == undefined && params.badge_id == undefined) {
                $scope.state = "sub_category";
                var dataSend = {
                    'txt_referral_id': params.referral_id
                };
                $scope.getData().dataSend('referral/id', dataSend, function(api, dataSend) {
                    $scope.getData().getApi(api, dataSend, function(output) {
                        $scope.cover_top = output.data.referral_name;
                    });
                });
                var txt_filter_json = {
                    'badge_id_array': [16, 18]
                };
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_sortby': 'referral_sort_index_asc_name_desc',
                    'txt_filter_json': JSON.stringify(txt_filter_json)
                };
                $scope.dataArrayMainState = $scope.getData().stateData(true, false);
                $scope.getData().dataSend('referral/map', dataSend, function(api, dataSend) {
                    $scope.getData().getApi(api, dataSend, function(output) {
                        $scope.dataArrayMain = output.data;
                        $scope.dataArrayMainState = $scope.getData().stateData(false, true);
                    });
                });
                $scope.dataArrayState = $scope.getData().stateData(false, true);
            } else if (params.root_id == undefined && params.referral_id == undefined && params.sendtag != undefined && params.badge_id == undefined) {
                $scope.state = "sendtag_products";
                $scope.dataArrayState = $scope.getData().stateData(false, true);
            } else if (params.root_id == undefined && params.referral_id == undefined && params.sendtag == undefined && params.badge_id != undefined) {
                $scope.state = "badge_products";
                $scope.dataArrayState = $scope.getData().stateData(false, true);
            } else {
                $scope.dataArrayState = $scope.getData().stateData(false, true);
            }
        });
    };
    return promise;
});_ui_share_app.directive('componentCategoryFeaturedTabsTypeBp', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryFeaturedTabsTypeBp';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        referralid: '@referralid',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope._component = {
            name: "componentCategoryFeaturedTabsTypeBp",
            show: (window.location.hostname == "localhost") ? true : false
        };
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        /* scope */
        $scope._name = ($scope.name != undefined && $scope.name != "") ? $scope.name : "default";
        $scope._margin = ($scope.margin != undefined && $scope.margin != "") ? {
            margin: $scope.margin
        } : {
            margin: 0
        };
        $scope._limit = ($scope.limit != undefined && $scope.limit != "") ? parseInt($scope.limit) : 1;
        /* scope */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._component.show) {
                        console.log($scope._component.name, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(_self, params, state);
                },
                getBlogId: function(params, callback) {
                    var _self = this;
                    var blog_id = (params.blog_id != undefined) ? params.blog_id.split("-", 1).join("") : false;
                    _self.consoleLog("getBlogId", "blog_id", blog_id);
                    callback(blog_id);
                },
                formatDataSend: function(data, callback) {
                    var _self = this;
                    _self.consoleLog("formatDataSend", "data", data);
                    callback(data);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData", "state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend", "api", api);
                    _self.consoleLog("dataSend", "dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi", "ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.consoleLog("getApi", "res_api", res_api);
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi", "res_ok", res_ok);
                            state = _self.stateData(false, true);
                            _self.consoleLog("checkGetApi", "state", state);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getDate: function(locale, format, lifetime, callback) {
                    var _self = this;
                    locale = (locale == '') ? 'en' : locale;
                    format = (format == '') ? 'LL' : format;
                    lifetime = (lifetime != "-1" && lifetime != "") ? lifetime : "";
                    if (lifetime != "") {
                        moment.locale(locale);
                        lifetime = moment.unix(parseInt(lifetime)).format(format);
                    }
                    _self.consoleLog("getDate", "lifetime", lifetime);
                    callback(lifetime);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                getCur: function(index, total, show, start, end, callback) {
                    var _self = this;
                    if (index == 1 && total > show) {
                        end = show;
                    } else if (index == total && total > show) {
                        start = total - (show - 1);
                    } else if (index < show && index <= (show / 2) && total > show) {
                        end = show;
                    } else if (index > (show / 2) && (index + (show / 2)) <= total && total > show) {
                        start = (index - ((show / 2) - 1));
                        end = (index + ((show / 2)));
                    } else if (index < total && total > show) {
                        start = total - (show - 1);
                    }
                    _self.getCurArray(start, end, function(res_cur_page_array) {
                        _self.consoleLog("getCur", "res_cur_page_array", res_cur_page_array);
                        callback(res_cur_page_array);
                    });
                },
                getCurArray: function(start, end, callback) {
                    var _self = this;
                    var cur_page_array = [];
                    for (var i = start; i <= end; i++) {
                        var item = {
                            state: true,
                            number: i
                        }
                        cur_page_array.push(item);
                    }
                    _self.consoleLog("getCurArray", "cur_page_array", cur_page_array);
                    callback(cur_page_array);
                },
                getCurPageArray: function(curPage, perPage, totalRows, callback) {
                    var _self = this;
                    var show = 6;
                    var cur_pages = Math.round(totalRows / perPage);
                    var cur_page_array = [];
                    var cur = {
                        start: 1,
                        end: cur_pages
                    }
                    _self.getCur(curPage, cur_pages, show, cur.start, cur.end, function(res_cur_page_array) {
                        cur_page_array = res_cur_page_array;
                    });
                    _self.consoleLog("getCurPageArray", "cur_page_array", cur_page_array);
                    callback(cur_page_array);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getPages = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._component.show) {
                        console.log($scope._component.name, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageBlog: function(page_name, blog_id, blog_name_url) {
                    var _self = this;
                    var page = page_name;
                    page = (blog_id == '' || blog_name_url == '') ? page : page + "/" + blog_id + "-" + blog_name_url;
                    _self.locationUrlReplace(page);
                }
            }
            return getFunction;
        };
        $scope.getCur = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._component.show) {
                        console.log($scope._component.name, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getLeft: function() {
                    var _self = this;
                    var index = ($scope.data_api.load_more.cur_page - 1 != 0) ? $scope.data_api.load_more.cur_page - 1 : false;
                    _self.consoleLog("getLeft", "index", index);
                    if (index != false) {
                        $scope.loadPage(index);
                    }
                },
                getRight: function() {
                    var _self = this;
                    var _self = this;
                    var cur_pages = Math.round($scope.data_api.load_more.total_rows / $scope.data_api.load_more.per_page);
                    var index = ($scope.data_api.load_more.cur_page + 1 < cur_pages) ? $scope.data_api.load_more.cur_page + 1 : false;
                    _self.consoleLog("getRight", "index", index);
                    if (index != false) {
                        $scope.loadPage(index);
                    }
                },
            }
            return getFunction;
        };
        /* get api */
        $scope.data_api = {
            blog_id: false,
            load_more: {
                load: false,
                cur_page: 1,
                cur_page_array: [],
                per_page: 9,
                total_rows: 0
            },
            product: {
                data_send: {},
                api: "product/lists",
                ok: false,
                data_array: [],
                data_array_state: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.loadPage = function(index) {
            $scope.data_api.product = {
                data_send: {},
                api: "product/lists",
                ok: false,
                data_array: [],
                data_array_state: {
                    load: false,
                    done: false
                }
            }
            $scope.data_api.load_more.cur_page = parseInt(index);
            $scope.getData().getRouteParams(function(_self, params, state) {
                $scope.data_api.product.data_array_state = state;
                _self.getBlogId(params, function(res_blog_id) {
                    _self.formatDataSend($scope.data_api.product, function(res_data) {
                        var filter_json = {
                            "referral_id_array": [$scope.referralid],
                        }
                        var dataSend = {
                            'cur_page': $scope.data_api.load_more.cur_page,
                            'per_page': $scope.data_api.load_more.per_page,
                            'txt_sortby': 'product_lastest_create',
                            'txt_filter_json': JSON.stringify(filter_json)
                        }
                        res_data.data_send = dataSend;
                        _self.dataSend(res_data.api, res_data.data_send, function(res_api, res_data_send) {
                            _self.getApi(res_api, res_data_send, function(res_ok, res_api, res_state) {
                                res_data.ok = res_ok;
                                res_data.data_array = res_api.data.dataList;
                                res_data.data_array_state = res_state;
                                _self.consoleLog("getApiData", "res_data", res_data);
                                $scope.data_api.load_more.total_rows = res_api.data.total_rows;
                                _self.getCurPageArray($scope.data_api.load_more.cur_page, $scope.data_api.load_more.per_page, res_api.data.total_rows, function(res_cur_page_array) {
                                    $scope.data_api.load_more.cur_page_array = res_cur_page_array;
                                });
                            });
                        });
                    });
                });
            });
        };
        $scope.getData().getRouteParams(function(_self, params, state) {
            $scope.data_api.product.data_array_state = state;
            _self.getBlogId(params, function(res_blog_id) {
                _self.formatDataSend($scope.data_api.product, function(res_data) {
                    var filter_json = {
                        "referral_id_array": [$scope.referralid],
                    }
                    var dataSend = {
                        'cur_page': $scope.data_api.load_more.cur_page,
                        'per_page': $scope.data_api.load_more.per_page,
                        'txt_sortby': 'product_lastest_create',
                        'txt_filter_json': JSON.stringify(filter_json)
                    }
                    res_data.data_send = dataSend;
                    _self.dataSend(res_data.api, res_data.data_send, function(res_api, res_data_send) {
                        _self.getApi(res_api, res_data_send, function(res_ok, res_api, res_state) {
                            res_data.ok = res_ok;
                            res_data.data_array = res_api.data.dataList;
                            res_data.data_array_state = res_state;
                            _self.consoleLog("getApiData", "res_data", res_data);
                            $scope.data_api.load_more.total_rows = res_api.data.total_rows;
                            _self.getCurPageArray($scope.data_api.load_more.cur_page, $scope.data_api.load_more.per_page, res_api.data.total_rows, function(res_cur_page_array) {
                                $scope.data_api.load_more.cur_page_array = res_cur_page_array;
                            });
                        });
                    });
                });
            });
        });
        /* get api */
    };
    return promise;
});_ui_share_app.directive('componentCategoryFeaturedTypeA', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryFeaturedTypeA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.getData = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                locationUrl: function(url) {
                    if (url != "") {
                        $location.url(url).replace();
                    }
                },
                windowLocation: function(url) {
                    if (url != "") {
                        window.location.href = url;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return data;
        };
        $scope.dataArray = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataSet = [{
            api: "referral/lists",
            dataSend: {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 5,
                'txt_sortby': 'referral_sort_index_asc_time_desc',
                'txt_filter_json': JSON.stringify({
                    "badge_id_array": [16]
                })
            },
        }];
        $scope.getData().dataSend($scope.dataSet[0].api, $scope.dataSet[0].dataSend, function(api, dataSend) {
            $scope.dataArrayState = $scope.getData().stateData(true, false);
            $scope.getData().getApi(api, dataSend, function(output) {
                $scope.dataArray = output.data.dataList;
                $scope.dataArrayState = $scope.getData().stateData(false, true);
                $scope.getData().consoleLog("getData : dataArray :  ", $scope.dataArray);
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentCategoryIdA', function($rootScope, $routeParams) {
    var templateName = 'componentCategoryIdA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        referralid: '@referralid',
        size: '@size',
        sizelist: '@sizelist',
        sort: '@sort',
        col: '@col',
        component: '@component',
        stylebutton: '@stylebutton',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.size = (typeof $scope.size !== 'undefined') ? $scope.size : 8;
        $scope.sizelist = (typeof $scope.sizelist !== 'undefined') ? $scope.sizelist : 4;
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(referralid) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var txt_filter_json = {
                'referral_id_array': [referralid]
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': $scope.sizelist,
                'txt_sortby': $scope.sort,
                'txt_filter_json': JSON.stringify(txt_filter_json)
            };
            GAEAPI.get('product/lists', dataSend, $scope).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data.dataList;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope.referralid);
        $scope.$watch('col', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            $scope._col = newValue.toString().split(",");
        });
        $scope.getCol = function(n) {
            return (typeof $scope._col != 'undefined') ? (typeof $scope._col[n] != 'undefined' && $scope._col[n] != '') ? $scope._col[n] : 12 : 12;
        };
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryListsA', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryListsA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        pagename: '@pagename',
        categorycol: '@categorycol',
        productcol: '@productcol',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.params_referral_id = $routeParams.referral_id;
        $scope.tab = "";
        $scope.view = 'category';
        $scope.viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope.$watch('categorycol', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            $scope._categorycol = newValue.toString().split(",");
        });
        $scope.getCategoryCol = function(n) {
            return (typeof $scope._categorycol != 'undefined') ? (typeof $scope._categorycol[n] != 'undefined' && $scope._categorycol[n] != '') ? $scope._categorycol[n] : 12 : 12;
        };
        $scope.$watch('productcol', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            $scope._productcol = newValue.toString().split(",");
        });
        $scope.getProductCol = function(n) {
            return (typeof $scope._productcol != 'undefined') ? (typeof $scope._productcol[n] != 'undefined' && $scope._productcol[n] != '') ? $scope._productcol[n] : 12 : 12;
        };
        $scope._dataArrayLength = 0;
        $scope._dataArrayId = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArrayId = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {};
            var dataSend = {
                'txt_referral_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log("componentCategoryListsA _getDataArrayId dataSend : ", dataSend);
            GAEAPI.get('referral/id', dataSend, $scope).then(function(output) {
                if (output.ok === 1) {
                    $scope._dataArrayId = output.data;
                    console.log("componentCategoryListsA _getDataArrayId _dataArrayId : ", $scope._dataArrayId);
                    $scope.tab = output.data.referral_name;
                    console.log("componentCategoryListsA _getDataArrayId tab : ", $scope.tab);
                    $scope._getDataArrayProduct(id);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope._dataArrayProduct = [];
        $scope._getDataArrayProduct = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {
                "referral_id_array": [id],
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 24,
                'txt_sortby': 'product_lastest_create',
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log("componentCategoryListsA _getDataArrayProduct dataSend : ", dataSend);
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok === 1) {
                    $scope._dataArrayProduct = output.data.dataList;
                    $scope._dataArrayLength = output.data.dataList.length;
                    console.log("componentCategoryListsA _getDataArrayProduct _dataArrayProduct : ", $scope._dataArrayProduct);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._getDataArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_referral_type_id': 11,
                'txt_sortby': 'referral_sort_index_asc_name_asc'
            };
            console.log("componentCategoryListsA _getDataArray dataSend : ", dataSend);
            GAEAPI.get('referral/map', dataSend, $scope).then(function(output) {
                if (output.ok === 1) {
                    $scope._dataArray = output.data;
                    $scope._dataArrayLength = output.data.length;
                    console.log("componentCategoryListsA _getDataArray _dataArray : ", $scope._dataArray);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        // $scope.intab = function(id, data) {
        //     $scope.tab = data;
        //     console.log('intab : ', id, data);
        //     $scope._getDataArrayId(id);
        // };
        $scope.$watch('params_referral_id', function(newValue, oldValue) {
            console.log("params_referral_id : ", newValue, oldValue);
            if (newValue != undefined) {
                $scope._getDataArray();
                $scope._getDataArrayId(newValue);
                $scope.view = 'product';
            } else {
                $scope._getDataArray();
                $scope.view = 'category';
            }
        });
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryListsIdA', function($rootScope, $routeParams) {
    var templateName = 'componentCategoryListsIdA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        refid: '@refid',
        _font: '@font',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            if (typeof $scope.refid !== 'undefined') {
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_parent_id': id,
                };
            } else {
                var dataSend = {
                    'txt_referral_type_id': 11,
                };
            }
            GAEAPI.get('referral/map', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope.refid);
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryListsProductA', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryListsProductA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        referralid: '@referralid',
        productcol: '@productcol',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope.$watch('productcol', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            $scope._productcol = newValue.toString().split(",");
        });
        $scope.getProductCol = function(n) {
            return (typeof $scope._productcol != 'undefined') ? (typeof $scope._productcol[n] != 'undefined' && $scope._productcol[n] != '') ? $scope._productcol[n] : 12 : 12;
        };
        $scope._dataArrayProduct = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArrayProduct = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {
                "referral_id_array": [id],
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 100,
                'txt_sortby': 'product_lastest_create',
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log("componentCategoryListsA _getDataArrayProduct dataSend : ", dataSend);
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok === 1) {
                    $scope._dataArrayProduct = output.data.dataList;
                    console.log("componentCategoryListsA _getDataArrayProduct _dataArrayProduct : ", $scope._dataArrayProduct);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.$watch('referralid', function(newValue, oldValue) {
            console.log("referralid : ", newValue, oldValue);
            if (newValue != undefined) {
                $scope._getDataArrayProduct(newValue);
            }
        });
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryMapA', function($rootScope, $routeParams) {
    var templateName = 'componentCategoryMapA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        refid: '@refid',
        _font: '@font',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope._dataArray = [];
        $scope._dataArrayDone = false;
        $scope._getDataArray = function() {
            if (typeof $scope.refid !== 'undefined') {
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_parent_id': $scope.refid,
                };
            } else {
                var dataSend = {
                    'txt_referral_type_id': 11,
                };
            }
            GAEAPI.get('referral/map', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope._dataArrayDone = true;
                    console.log("_dataArray", $scope._dataArray);
                }
            });
        };
        $scope._getDataArray();
        $scope.viewDataWidth = function() {
            return $(window).width();
        };
        $scope.viewDataHeight = function() {
            return $(window).height();
        };
        $scope._arrayControlView = [];
        $scope._controlView = null;
        $scope.controlView = function() {
            if ($(window).width() >= 1200) {
                $scope._controlView = 4;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 4;
                }
            } else if ($(window).width() >= 992) {
                $scope._controlView = 4;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 4;
                }
            } else if ($(window).width() >= 768) {
                $scope._controlView = 3;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 3;
                }
            } else if ($(window).width() < 768) {
                $scope._controlView = 3;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 3;
                }
            }
            return $scope._controlView;
        };
        $scope.controlView();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debugcategory !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryMenuDropdownA', function($rootScope, $routeParams) {
    var templateName = 'componentCategoryMenuDropdownA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        _font: '@font',
        imgpath: '@imgpath',
        _menustart: '@menustart',
        refid: '@refid',
        _color: '@color',
        _backgroundcolor: '@backgroundcolor',
        _backgroundcolordropdown: '@backgroundcolordropdown',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.activeMenu = function() {
            /*document.getElementById("activeMenu").classList.toggle("show");
            $('body').css('position','fixed');*/
            if (!angular.element('._headings').hasClass('active')) {
                angular.element('._headings').addClass('active')
            } else {
                angular.element('._headings').removeClass('active')
            }
        };
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._heading = '';
        if (typeof $scope._viewRouteParams().referral_name !== 'undefined' && typeof $scope._viewRouteParams().referral_name != '') {
            $scope._heading = $scope._viewRouteParams().referral_name;
        } else {
            $scope._heading = $scope._menustart;
        }
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.myFunctionDropdown = function(len) {
            if (len > 0) {
                if ($scope._viewRouteParams().referral_name != 'สั่งอาหาร') {
                    $scope.activeMenu();
                    document.getElementById("myDropdown").classList.toggle("show");
                }
            }
        }
        $scope.onclick = function(event) {
            if (!event.target.matches('.dropbtn')) {
                var dropdowns = document.getElementsByClassName("dropdown-content");
                var i;
                for (i = 0; i < dropdowns.length; i++) {
                    var openDropdown = dropdowns[i];
                    if (openDropdown.classList.contains('show')) {
                        openDropdown.classList.remove('show');
                    }
                }
            }
        }
        $scope._category_id = false;
        $scope._get_category_id = function() {
            if (typeof $scope.refid !== 'undefined') {
                var dataSend = {
                    'txt_referral_id': $scope.refid,
                };
            }
            GAEAPI.get('referral/id', dataSend, $scope).then(function(res) {
                if (res.ok === 1) {
                    $scope._category_id = res.data;
                    /*$scope._heading = $scope._category_id.referral_name;*/
                }
            });
        };
        $scope._get_category_id();
        $scope._page_lists = false;
        $scope._page_lists_load = false;
        $scope._get_page_lists = function() {
            $scope._clear_page_lists();
            var dataSend = {
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'page_lastest_create'
            };
            GAEAPI.get('page/lists', dataSend, $scope).then(function(res) {
                $scope._page_lists_load = true;
                if (res.ok === 1) {
                    $scope._page_lists = res.data.dataList;
                    angular.forEach($scope._page_lists, function(item, key) {
                        if (item.page_search_url == "") {
                            item.page_search_url = item.page_id;
                        }
                    });
                }
            });
        };
        $scope._clear_page_lists = function() {
            $scope._page_lists = false;
            $scope._page_lists_load = false;
        };
        $scope._get_page_lists();
        $scope._page_category = false;
        $scope._page_category_load = false;
        $scope._get_page_category = function() {
            $scope._clear_page_lists();
            if (typeof $scope.refid !== 'undefined') {
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_parent_id': $scope.refid,
                };
            } else {
                var dataSend = {
                    'txt_referral_type_id': 11,
                };
            }
            GAEAPI.get('referral/map', dataSend, $scope).then(function(res) {
                $scope._page_category_load = true;
                if (res.ok === 1) {
                    $scope._page_category = res.data;
                }
            });
        };
        $scope._clear_page_category = function() {
            $scope._page_category = false;
            $scope._page_category_load = false;
        };
        $scope._get_page_category();
        $scope.displayImage = function(image_url, prefix) {
            var urlreturn = GAEAPI.getGaeImageUrl(image_url, prefix);
            return urlreturn;
        }
        $scope.viewDataWidth = function() {
            return $(window).width();
        };
        $scope.viewDataHeight = function() {
            return $(window).height();
        };
        $scope._testspeed = null;
        $scope._arrayControlView = [];
        $scope._controlView = null;
        $scope.controlView = function() {
            if ($(window).width() >= 1200) {
                $scope._controlView = 4;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 4;
                }
            } else if ($(window).width() >= 992) {
                $scope._controlView = 4;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 4;
                }
            } else if ($(window).width() >= 768) {
                $scope._controlView = 3;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 5; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 3;
                }
            } else if ($(window).width() < 768) {
                $scope._controlView = 3;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 3;
                }
            }
            return $scope._controlView;
        };
        $scope.controlView();
        $scope.showDebug = function() {
            return (typeof $routeParams.debugcategorymenu !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentCategorySilde', function($rootScope, $routeParams) {
    var templateName = 'componentCategorySilde';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        refid:'@refid',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.mkCarouselData = function(elem) {
            console.debug('mkCarouselData: trigger');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 10,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    prevArrow: '',
                    nextArrow: '',
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 10,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 8,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: 6,
                        }
                    }, {
                        breakpoint: 692,
                        settings: {
                            slidesToShow: 4,
                        }
                    },{
                        breakpoint: 540,
                        settings: {
                            slidesToShow: 2,
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._dataArray = [];
        $scope._dataArrayDone = false;
        $scope._getDataArray = function() {
            if(typeof $scope.refid !== 'undefined'){
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_parent_id': $scope.refid,
                };
            }else{
                 var dataSend = {
                    'txt_referral_type_id': 11,
                };
            }
            GAEAPI.get('referral/map', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    console.log("_dataArray",$scope._dataArray);
                }
            });
        };
        $scope._getDataArray();
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.openCity = function(evt, cityName) {
            var i, tabcontent, tablinks;
            tabcontent = document.getElementsByClassName("tabcontent");
            for (i = 0; i < tabcontent.length; i++) {
                tabcontent[i].style.display = "none";
            }
            tablinks = document.getElementsByClassName("tablinks");
            for (i = 0; i < tablinks.length; i++) {
                tablinks[i].className = tablinks[i].className.replace(" active", "");
            }
            document.getElementById(cityName).style.display = "block";
            evt.currentTarget.className += " active";
        }
        $scope.displayImage = function(image_url, prefix) {return GAEAPI.getGaeImageUrl(image_url, prefix);}
    };
    return promise;
});_ui_share_app.directive('componentCategoryTable', function($rootScope, $routeParams) {
    var templateName = 'componentCategoryTable';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(name, data) {
                    console.log('componentCategoryTable : ', name, data);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(array, api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(array, api, dataSend);
                },
                getApi: function(array, api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(array, output);
                    });
                },
                titleUrl: function(str) {
                    var url = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    return url;
                },
                locationUrl: function(template, data) {
                    $location.url(template + data).replace();
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.dataArrayPageState = {
            load: false,
            done: false,
            cur_page: 1,
            per_page: 300,
            total_rows: 0
        };
        $scope.dataMapArray = [];
        $scope.dataMapArrayState = $scope.getData().stateData(false, false);
        $scope.dataArray = [];
        $scope.dataArrayState = $scope.getData().stateData(false, false);
        /* category */
        /* $scope.getData().getRouteParams(function(params) {
            $scope.dataArrayState = $scope.getData().stateData(true, false);
            var txt_filter_json = {};
            var dataSend = {
                'txt_referral_type_id': 11,
                'cur_page': $scope.dataArrayPageState.cur_page,
                'per_page': $scope.dataArrayPageState.per_page,
                'txt_sortby': $scope.sort,
                'txt_filter_json': JSON.stringify(txt_filter_json)
            };
            $scope.getData().dataSend(0, 'referral/lists', dataSend, function(array, api, dataSend) {
                $scope.getData().getApi(array, api, dataSend, function(array, output) {
                    $scope.dataArray = output.data.dataList;
                    $scope.dataArrayPageState.total_rows = output.data.total_rows;
                    $scope.dataArrayState = $scope.getData().stateData(false, true);
                    for (var i = 0; i < output.data.dataList.length; i++) {
                        var txt_filter_json = {};
                        var dataSend = {
                            'txt_referral_id': output.data.dataList[i].referral_id
                        };
                        $scope.getData().dataSend(i, 'referral/relation', dataSend, function(array, api, dataSend) {
                            $scope.getData().getApi(array, api, dataSend, function(array, output) {
                                $scope.dataMapArray[array] = output.data;
                            });
                        });
                    }
                });
            });
        }); */
        /* category */
        /* product */
        $scope.getData().getRouteParams(function(params) {
            $scope.dataArrayState = $scope.getData().stateData(true, false);
            var txt_filter_json = {};
            var dataSend = {
                'cur_page': $scope.dataArrayPageState.cur_page,
                'per_page': $scope.dataArrayPageState.per_page,
                'txt_filter_json': JSON.stringify(txt_filter_json)
            };
            $scope.getData().dataSend(0, 'product/lists', dataSend, function(array, api, dataSend) {
                $scope.getData().getApi(array, api, dataSend, function(array, output) {
                    $scope.dataArray = output.data.dataList;
                    $scope.dataArrayPageState.total_rows = output.data.total_rows;
                    $scope.dataArrayState = $scope.getData().stateData(false, true);
                });
            });
        });
        /* product */
        $scope.loadMore = function() {
            var getFunction = {
                consoleLog: function(name, data) {
                    console.log('componentCategoryTable : ', name, data);
                },
                stateData: function(state) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", state);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    return state;
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        /* category */
        /* $scope.load = function() {
            if ($scope.dataArrayPageState.load != true) {
                $scope.dataArrayPageState.load = $scope.loadMore().stateData(true);
                $scope.dataArrayPageState.cur_page++;
                $scope.getData().getRouteParams(function(params) {
                    $scope.dataArrayState = $scope.getData().stateData(true, false);
                    var txt_filter_json = {};
                    var dataSend = {
                        'txt_referral_type_id': 11,
                        'cur_page': $scope.dataArrayPageState.cur_page,
                        'per_page': $scope.dataArrayPageState.per_page,
                        'txt_sortby': $scope.sort,
                        'txt_filter_json': JSON.stringify(txt_filter_json)
                    };
                    $scope.getData().dataSend(0, 'referral/lists', dataSend, function(array, api, dataSend) {
                        $scope.getData().getApi(array, api, dataSend, function(array, output) {
                            if ($scope.dataArray.length < output.data.total_rows) {
                                var oldData = $scope.dataArray;
                                $scope.dataArray = oldData.concat(output.data.dataList);
                                $scope.dataArrayPageState.total_rows = output.data.total_rows;
                                for (var i = 0; i < output.data.dataList.length; i++) {
                                    var txt_filter_json = {};
                                    var dataSend = {
                                        'txt_referral_id': output.data.dataList[i].referral_id
                                    };
                                    var int_array = ($scope.dataArrayPageState.per_page * ($scope.dataArrayPageState.cur_page - 1)) + i;
                                    $scope.getData().dataSend(int_array, 'referral/relation', dataSend, function(array, api, dataSend) {
                                        $scope.getData().getApi(array, api, dataSend, function(array, output) {
                                            $scope.dataMapArray[array] = output.data;
                                        });
                                    });
                                }
                            } else {
                                $scope.dataArrayPageState.cur_page--;
                            }
                            $scope.dataArrayPageState.load = $scope.loadMore().stateData(false);
                            $scope.dataArrayState = $scope.getData().stateData(false, true);
                        });
                    });
                });
            }
        }; */
        /* category */
        /* product */
        $scope.load = function() {
            if ($scope.dataArrayPageState.load != true) {
                $scope.dataArrayPageState.load = $scope.loadMore().stateData(true);
                $scope.dataArrayPageState.cur_page++;
                $scope.getData().getRouteParams(function(params) {
                    $scope.dataArrayState = $scope.getData().stateData(true, false);
                    var txt_filter_json = {};
                    var dataSend = {
                        'cur_page': $scope.dataArrayPageState.cur_page,
                        'per_page': $scope.dataArrayPageState.per_page,
                        'txt_filter_json': JSON.stringify(txt_filter_json)
                    };
                    $scope.getData().dataSend(0, 'product/lists', dataSend, function(array, api, dataSend) {
                        $scope.getData().getApi(array, api, dataSend, function(array, output) {
                            if ($scope.dataArray.length < output.data.total_rows) {
                                var oldData = $scope.dataArray;
                                $scope.dataArray = oldData.concat(output.data.dataList);
                                $scope.dataArrayPageState.total_rows = output.data.total_rows;
                            } else {
                                $scope.dataArrayPageState.cur_page--;
                            }
                            $scope.dataArrayPageState.load = $scope.loadMore().stateData(false);
                            $scope.dataArrayState = $scope.getData().stateData(false, true);
                        });
                    });
                });
            }
        };
        /* product */
        /* download */
        $scope.imageDownload = function(url, fileName) {
            var xhr = new XMLHttpRequest();
            xhr.open("GET", url, true);
            xhr.responseType = "blob";
            xhr.onload = function() {
                var urlCreator = window.URL || window.webkitURL;
                var imageUrl = urlCreator.createObjectURL(this.response);
                var tag = document.createElement('a');
                tag.href = imageUrl;
                tag.download = fileName;
                document.body.appendChild(tag);
                tag.click();
                document.body.removeChild(tag);
            }
            xhr.send();
        };
        /* download */
    };
    return promise;
});_ui_share_app.directive('componentCategoryCustomslideA', function($rootScope, $routeParams) {
    var componentMain = 'componentCategory';
    var componentChild = 'customslideA';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + componentChild + '/' + componentChild + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        dataItem: '=data',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {};
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
      
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        /*$scope.test_json =  JSON.stringify($scope.data);
        $scope.dataItem = JSON.parse($scope.test_json);*/
        $scope.slideProductDeal = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 3000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryCustomslideB', function($rootScope, $routeParams) {
    var componentMain = 'componentCategory';
    var componentChild = 'customslideB';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + componentChild + '/' + componentChild + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        dataItem: '=data',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {};
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        /*$scope.test_json =  JSON.stringify($scope.data);
        $scope.dataItem = JSON.parse($scope.test_json);*/
        $scope.slideProductDeal = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 3000,
                    slidesToShow: 3,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 3,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 2,
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            slidesToShow: 2,
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            slidesToShow: 1,
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryCardA', function ($rootScope, $routeParams) {
    var templateName = 'componentCategoryCardA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        childcomponent: '@childcomponent',
        imgpath: '@imgpath',
        stylebutton :'@stylebutton',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
        $scope.ref_id = $routeParams.referral_id;
        /* 
        * fetch only referral category type (tree-list);
        * @params none
        * @return {Array}
        */
        $scope.ReferralDisplayArray = [];
        $scope.FetchDisplayCategory = function (ref_id) {
            $scope.ReferralDisplayArray = [];
            $scope.ReferralBrandArray = [];
            var d = {'txt_referral_type_id': 11,'txt_sortby':'referral_sort_index_asc_name_asc'};
            if(typeof ref_id !== 'undefined'){
                d.txt_parent_id = ref_id;
            }            
            GAEAPI.get('referral/map', d, $scope).then(function (e) {
                if (e.ok === 1) {
                    $scope.ReferralDisplayArray = e.data;
                }
                console.log("referral display", d, e.data, ref_id);
            });
        };
        /*if (!$scope.ReferralDisplayArray.length) {
            $scope.FetchDisplayCategory();
        }*/
        /*
        * view current routeParams
        * @params (default)
        * @return function
        */
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        /*
        * params listener
        * @params (default)
        * @return function
        */
        $scope.$watch('ref_id', function (newValue, oldValue) {
            if (!newValue || newValue == 0){
                return $scope.FetchDisplayCategory();
            }
            $scope.FetchDisplayCategory(newValue);
        });
        /* Check if seo enable */
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        /* Check if child array exist */
        $scope.checkChild = function(object){
            return (!object.referral_sub_array.length) ? true : false;
        };
        $scope.buildTitleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridA', function ($rootScope, $routeParams) {
    var templateName = 'componentCategoryGridA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
    	primary:'@primary',
    	color:'@color',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	$scope.dataArray = [];
    	$scope.getData = function(){
    		var jsonFilter = JSON.stringify({'type_number':$scope.type});
    		var d = {
    			'txt_referral_type_id': 11
    		};
    		GAEAPI.get('referral/map',d,$scope).then(function(e){
    			if(e.ok === 1){
    				$scope.dataArray = e.data;
    			}
    		});
    	};
    	$scope.getData();
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridC', function ($rootScope, $routeParams) {
    var templateName = 'componentCategoryGridC';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
    	primary:'@primary',
    	color:'@color',
        name:'@name',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	$scope.dataArray = [];
    	$scope.getData = function(){
    		var jsonFilter = JSON.stringify({'type_number':$scope.type});
    		var d = {
    			'txt_referral_type_id': 11
    		};
    		GAEAPI.get('referral/map',d,$scope).then(function(e){
    			if(e.ok === 1){
    				$scope.dataArray = e.data;
    			}
    		});
    	};
    	$scope.getData();
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridCa', function ($rootScope, $routeParams) {
    var componentMain = 'componentCategoryGridC';
    var componentChild = 'a';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + componentChild + '/' + componentChild+ '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
    	primary:'@primary',
    	color:'@color',
        name:'@name',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	$scope.dataArray = [];
    	$scope.getData = function(){
    		var jsonFilter = JSON.stringify({'type_number':$scope.type});
    		var d = {
    			'txt_referral_type_id': 11
    		};
    		GAEAPI.get('referral/map',d,$scope).then(function(e){
    			if(e.ok === 1){
    				$scope.dataArray = e.data;
    			}
    		});
    	};
    	$scope.getData();
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridF', function ($rootScope, $routeParams) {
    var templateName = 'componentCategoryGridF';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    	primary:'@primary',
    	color:'@color',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	$scope.dataArray = [];
    	$scope.getData = function(){
            var d = {
    			'txt_referral_type_id': 11,
                'cur_page':1,
                'per_page' : 2,
                'txt_sortby' : 'referral_oldest_create'
    		};
    		GAEAPI.get('referral/lists',d,$scope).then(function(e){
                if(e.ok === 1){
    				$scope.dataArray = e.data.dataList;
                    
    			}
    		});
    	};
    	$scope.getData();
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridG', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCategoryGridG';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        'auto':'@auto',
        'feature':'@feature',
        'referralid':'@referralid',
        'imgpath':'@imgpath',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval) {      
        $scope.use_auto = (typeof $scope.auto !== 'undefined' && $scope.auto == 'true') ? true : false; 
        $scope.use_feature = (typeof $scope.feature !== 'undefined' && $scope.feature == 'true') ? true : false; 
        /**
        * Check if object array available for "website application" or "Mobile application" or "Featured"
        * @params object array
        * return true | false (default)
        */
        $scope._showWeb = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 18) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showApp = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 19) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showFeature = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 16) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /*
        * view current routeParams
        * @params (default)
        * @return function
        */
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        $scope.data = [];
        $scope.data_done = false;
        /* Get referral data (all)
        * @params none
        * @return array
        */
        $scope.getData = function(){
            $scope.data = [];
            $scope.data_done = false;
            var filterJson = {'badge_id_array':[18]};
            if($scope.use_feature){
                filterJson.badge_id_array.push(16);
            }
            var d = {
                'txt_referral_type_id':11,                
            };
            GAEAPI.get('referral/map',d,$scope).then(function(e){
                if(e.ok == 1){
                    console.log("3a : before", e.data);
                    if($scope.use_feature){
                        var dummy = [];
                        angular.forEach(e.data, function(item,key){
                            if($scope._showFeature(item.referral_badge)){
                                dummy.push(item);
                            }
                        });
                        $scope.data = dummy;
                        $scope.data_done = true;
                        $scope.buildImageSlider($scope.data);    
                        console.log("3a : dummy", dummy);
                        console.log("3a", $scope.data);
                    } else{
                        $scope.data = e.data;
                        $scope.data_done = true;
                        $scope.buildImageSlider($scope.data);   
                        console.log("3a", $scope.data); 
                    }                    
                }
            });
        };
        /* Get referral data (by referral_id)
        * @params id = referral_id
        * @return array
        */
        $scope.getDataReferral = function(id){
            $scope.data = [];
            $scope.data_done = false;
            var d = {
                'txt_referral_id':id
            };
            GAEAPI.get('referral/id_map',d,$scope).then(function(e){
                if(e.ok == 1){
                    $scope.data[0] = e.data;
                    $scope.data_done = true;
                    $scope.buildImageSlider($scope.data);
                }
            });
        };
        /*
        * params listener
        * @params newValue
        * @params oldValue
        * @return function
        */
        $scope.$watch('auto', function (newValue, oldValue) {
            if (!newValue){
                if(typeof $scope.referralid !== 'undefined' && $scope.referralid !== ''){
                    return $scope.getDataReferral($scope.referralid);
                } else {
                    return $scope.getData();
                }
            }
            $scope.getData();
        });
        /*
        * check if image array exist or build dummy image array
        * @params arrayObject = object array
        * @return array
        */
        $scope.buildImageSlider = function(){
            var imageArray = function(idx){
                if(idx == 0){
                    return [
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1.jpg'},
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},
                    ];
                } else if(idx == 1){
                    return [
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_1.png'},
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_2.png'},
                    ];
                } else {
                    return [
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2_1.png'},
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},
                    ];
                }
            };
            var imageBannerArray = function(idx){
                if(idx == 0){
                    return [
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1.jpg'},
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2.jpg'},
                    ];   
                } else if(idx == 1) {
                    return [
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1_1.png'},
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1_2.png'},
                    ];
                } else {
                    return [
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2_1.png'},
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2_2.png'},
                    ];
                }
            };
            angular.forEach($scope.data, function(item, key){
                if(!item.referral_image.length){
                    item.referral_image = imageArray(key);                    
                }
                item.referral_image_banner = imageBannerArray(key);
            });
        };
        /* Make Carousel */
        $scope._makeProductToCarousel = function (keyCustom) {
            var elementName = '[data-id="' + keyCustom + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                
            };            
            return sliderProvider(elementName, optionsParmas, "", keyCustom);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(){          
            return  "-" + (($('.row.slick-slider[data-id="'+$scope._uniqueKey+'"]').height() / 2) + 34) + "px";
        };
        /* Carousel Arrow Click */
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        /* Carousel Arrow Click */
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Event Listener when ng-repeat end */
        $rootScope.$on('repeatend', function() {           
            if($('[data-id*="gallery-"]').length){
                $('[data-id*="gallery-"]').not('.slick-initialized').each(function(Key,Object){
                    if($(this).find('.imageItem').length > 0){
                        $scope._makeProductToCarousel($(this).attr('data-id'));
                    }
                });
            }
        });
        /* Check if seo enable */
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridH', function ($rootScope, $routeParams, sliderProvider, $location) {
    var templateName = 'componentCategoryGridH';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        'auto':'@auto',
        'feature':'@feature',
        'referralid':'@referralid',
        'imgpath':'@imgpath',
        'margin':'@margin',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $window) {      
        $scope.use_auto = (typeof $scope.auto !== 'undefined' && $scope.auto == 'true') ? true : false; 
        $scope.use_feature = (typeof $scope.feature !== 'undefined' && $scope.feature == 'true') ? true : false; 
        /**
        * Check if object array available for "website application" or "Mobile application" or "Featured"
        * @params object array
        * return true | false (default)
        */
        $scope._showWeb = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 18) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showApp = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 19) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showFeature = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 16) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        /* --------- START : 1 ------------*/
        /* Extract sub referral id from parent */
        $scope._mergeSubReferral = function(originalArray, r){
            if(!r.referral_sub_array.length){
                return originalArray;
            }
            var a = [];
            angular.forEach(r.referral_sub_array, function(i, k) {
                if($scope._showFeature(i.referral_badge)){
                    a.push(parseInt(i.referral_id));                    
                    $scope.dummyFeatureName.push(i);
                    if(i.referral_image.length){
                        $scope.dummyReferralImage.push(i.referral_image[0]);
                    }                    
                }                
                if(i.referral_sub_array.length > 0){
                    angular.forEach(i.referral_sub_array, function(ii,kk){
                        if($scope._showFeature(ii.referral_badge)){
                            a.push(parseInt(ii.referral_id));
                            $scope.dummyFeatureName.push(ii);
                            if(ii.referral_image.length){
                                $scope.dummyReferralImage.push(ii.referral_image[0]);
                            }
                        }  
                        if(ii.referral_sub_array.length > 0){
                            angular.forEach(ii.referral_sub_array, function(iii,kkk){
                                if($scope._showFeature(iii.referral_badge)){
                                    a.push(parseInt(iii.referral_id));
                                    $scope.dummyFeatureName.push(iii);
                                    if(iii.referral_image.length){
                                        $scope.dummyReferralImage.push(iii.referral_image[0]);
                                    }
                                } 
                                if(iii.referral_sub_array.length > 0){
                                    angular.forEach(iii.referral_sub_array, function(iiii,kkk){
                                        if($scope._showFeature(iiii.referral_badge)){
                                            a.push(parseInt(iiii.referral_id));
                                            $scope.dummyFeatureName.push(iiii);
                                            if(iiii.referral_image.length){
                                                $scope.dummyReferralImage.push(iiii.referral_image[0]);
                                            }
                                        }  
                                    });
                                } 
                            });
                        }
                    });
                }
            });
            return (a.length) ? a.concat(originalArray) : originalArray;
        };
        /* --------- END : 1 ------------*/
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /*
        * view current routeParams
        * @params (default)
        * @return function
        */
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        $scope.data = [];
        $scope.data_done = false;
        $scope.dummyFeatureName = [];
        $scope.dummyReferralImage = [];
        /* Get referral data (all)
        * @params none
        * @return array
        */
        
        /*
        $scope.getData = function(){
            $scope.data = [];
            $scope.data_done = false;
            $scope.dummyFeatureName = [];
            var filterJson = {'badge_id_array':[18]};
            
            var d = {
                'txt_referral_type_id':11,                
            };
            var dummy = [];
            GAEAPI.get('referral/map',d,$scope).then(function(e){
                if(e.ok == 1){
                    console.log("3a : before", e.data);
                    if($scope.use_feature){
                        var dummyReferral = [];
                        dummy = [];
                        angular.forEach(e.data, function(item, key){
                            item.referral_product_array = [];
                            if($scope._showFeature(item.referral_badge)){
                                dummyReferral.push(item);
                                dummy.push(parseInt(item.referral_id));
                                if(item.referral_sub_array.length){
                                    dummy = $scope._mergeSubReferral(dummy, item);                                    
                                }
                            }
                        });
                        $scope.data = dummyReferral;
                        $scope.data_done = true;
                        $scope.buildImageSlider($scope.data);   
                    } else{
                        dummy = [];
                        angular.forEach(e.data, function(item, key){
                            dummy.push(parseInt(item.referral_id));
                            if(item.referral_sub_array.length){
                                dummy = $scope._mergeSubReferral(dummy, item);                                    
                            }                        
                        });
                        $scope.data = e.data;
                        $scope.data_done = true;
                        $scope.buildImageSlider($scope.data);   
                    }
                }
                if(dummy.length){
                    $scope.getDataProductByReferralArray(dummy);
                }
            });
        };
        */
        
        var referralDisplayClass = function(){
            var object = {
                getOnlyBadgeIdArray(badgeArray){
                    var result = [];
                    for(var index in badgeArray){
                        var badgeData = badgeArray[index];
                        var badge_id = GAEAPI.getValue(badgeData["badge_id"],"");
                        if(badge_id!=""){
                            result.push(badge_id);
                        }
                    }
                    return result;
                },
                getOnlyReferralIdArray(referralArray){
                    var result = [];
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var referral_id = GAEAPI.getValue(referralData["referral_id"],"");
                        if(referral_id!=""){
                            result.push(referral_id);
                        }
                    }
                    return result;
                },
                getAllSubReferral(referralArray,resultArray){
                    var self = this;
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var badgeIdArray =  self.getOnlyBadgeIdArray(referralData.referral_badge);
                        if(badgeIdArray.indexOf("16")>=0){
                            resultArray.push(referralData);
                        }
                
                        var subReferralArray = GAEAPI.getValue(referralData["referral_sub_array"],[]);
                        if(subReferralArray.length>0){
                            self.getAllSubReferral(subReferralArray,resultArray);
                        }
                    }
                },
                getImageDataArray(referralArray,imageArray){
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var referralImageArray = GAEAPI.getValue(referralData["referral_banner_array"],[]);
                        if(referralImageArray.length>0){
                            imageArray.push(referralImageArray[0]);
                        }
                    }
                },
                getImageBannerDataArray(referralArray,imageArray){
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var referralBannerArray = GAEAPI.getValue(referralData["referral_image"],[]);
                        if(referralBannerArray.length>0){
                            for(indexTwo in referralBannerArray){
                                if(referralBannerArray[indexTwo]["banner_is_enable"] != 0){
                                    imageArray.push(referralBannerArray[indexTwo]);
                                }
                            }                           
                        }
                    }
                },
                generateCategoryDisplay(index,referralArray,callback){
                    var self = this;
                    if(referralArray.length<=index){
                        if(callback){callback();}
                        return false;
                    }
                    
                    var referralData = referralArray[index];
                    var referral_id = GAEAPI.getValue(referralData["referral_id"],"");
                    var subReferralIdArray = [];
                    console.log("subReferralIdArray : start 1",subReferralIdArray);
                    console.log("subReferralIdArray : start 1",referralData);
                    self.getAllSubReferral(referralData.referral_sub_array,subReferralIdArray);
                    console.log("subReferralIdArray : function 2 getAllSubReferral",subReferralIdArray);
                    console.log("subReferralIdArray : function 2 getAllSubReferral",referralData);
                    referralData["referral_sub_array_two_d"] = referralData.referral_sub_array;
                    referralData["referral_feature_name"] = subReferralIdArray;
                    var resultIdArray = self.getOnlyReferralIdArray(subReferralIdArray);
                    resultIdArray.push(referral_id);
                    referralData["id_array"] = resultIdArray;
                     console.log("data_product_array_55 : ",resultIdArray);
                     var dataSend = {
                        'cur_page': 1,
                        'per_page': 8,
                        'txt_filter_json':JSON.stringify({'badge_id_array':[18,16],'referral_id_array_or':resultIdArray})
                    };
                    console.log("product/lists : generateCategoryDisplay : dataSend ",dataSend);
                    GAEAPI.get("product/lists",dataSend,$scope).then(function(res){
                        console.log("product/lists : generateCategoryDisplay : res : ",res);
                        var productArray = [];
                        if(res.ok==1){
                            productArray = res.data.dataList;
                        }
                        referralData["referral_product_array"] = productArray;
                    });
                    
                    console.log("generateCategoryDisplay : index : "+index+" : ",referralData);
                    self.generateCategoryDisplay((index+1),referralArray,callback);
                    var badgeIdArray =  self.getOnlyBadgeIdArray(referralData.referral_badge);
                    if(badgeIdArray.indexOf("16")>=0){
                        $scope.data.push(referralData);
                        console.log("data_array_first_top",$scope.data);
                        var imageArray = GAEAPI.getValue(referralData["referral_image"],[]);
                        self.getImageDataArray(subReferralIdArray,imageArray);
                        referralData["referral_image_all_array"] = imageArray;
                    }
                
                }
            };
            return object;
        }
        var referralDisplay  = referralDisplayClass();
        var mapDataArray = [];
        $scope.getData = function(){
            $scope.data = [];
            $scope.data_done = false;
            $scope.dummyFeatureName = [];
            var filterJson = {'badge_id_array':[18]};
            
            var dataSend = {
                'txt_referral_type_id':11,   
                'txt_sortby' : "referral_sort_index_desc_name_asc",             
            };
            var dummy = [];
            console.log('referral/map : dataSend : ',dataSend);
            GAEAPI.get('referral/map',dataSend,$scope).then(function(res){
                console.log('referral/map : res : ',res);
                if(res.ok==1){
                    mapDataArray = res.data;
                    referralDisplay.generateCategoryDisplay(0,mapDataArray,function(){
                        $scope.data_done = true;
                    });
                }
            });
        };  
        
        $scope.data_product = [];
        $scope.data_product_done = false;
        /* Get product list by referral array
        * @params {objectArray} referral array
        * @return array
        */
        $scope.getDataProductByReferralArray = function(objectArray){
            var d = {
                'cur_page': 1,
                'per_page': 8,
                'txt_filter_json':JSON.stringify({'badge_id_array':[18,16],'referral_id_array_in':objectArray})
            };
            var dummy = [];
            $scope.data_product_done = false;
            GAEAPI.get('product/lists',d,$scope).then(function(e){
                if(e.ok === 1){
                    $scope.data_product = e.data.dataList;
                    $scope.data_product_done = true;
                    angular.forEach($scope.data, function(item,key){
                        item.referral_feature_name = $scope.dummyFeatureName;
                        item.referral_product_array = e.data.dataList;
                        item.referral_image_all_array = $scope.dummyReferralImage;
                    });
                    console.log("getDataProductByReferralArray: referral data",$scope.data);
                    console.log("getDataProductByReferralArray: referral_id_array_in",objectArray);
                    console.log("getDataProductByReferralArray: params",d);
                    console.log("getDataProductByReferralArray: data",e);
                }
            });
        };
        /* Get referral data (by referral_id)
        * @params id = referral_id
        * @return array
        */
        $scope.getDataReferral = function(id){
            $scope.data = [];
            $scope.data_done = false;
            var d = {
                'txt_referral_id':id
            };
            GAEAPI.get('referral/id_map',d,$scope).then(function(e){
                if(e.ok == 1){
                    $scope.data[0] = e.data;
                    $scope.data_done = true;
                    $scope.buildImageSlider($scope.data);
                    console.log("data_array_first",e.data);
                }
            });
        };
        /*
        * params listener
        * @params newValue
        * @params oldValue
        * @return function
        */
        $scope.$watch('use_auto', function (newValue, oldValue) {
            if (!newValue && typeof $scope.referralid !== 'undefined' && $scope.referralid !== ''){
                return $scope.getDataReferral($scope.referralid);                
            }
            $scope.getData();
        });
        /*
        * check if image array exist or build dummy image array
        * @params arrayObject = object array
        * @return array
        */
        $scope.dummyArrayImageGallery = [
        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_1.png'},
        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_2.png'},
        ];
        $scope.buildImageSlider = function(){
            var imageArray = function(idx){
                if(idx == 0){
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1.jpg'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},
                    ];
                } else if(idx == 1){
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_2.png'},
                    ];
                } else {
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},
                    ];
                }
            };
            var imageBannerArray = function(idx){
                if(idx == 0){
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1.jpg'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2.jpg'},
                    ];   
                } else if(idx == 1) {
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1_2.png'},
                    ];
                } else {
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2_2.png'},
                    ];
                }
            };
            angular.forEach($scope.data, function(item, key){
                if(!item.referral_image.length){
                    item.referral_image = imageArray(key);                    
                }
                item.referral_image_banner = imageBannerArray(key);
            });
        };
        /* Make Carousel */
        $scope._makeProductToCarousel = function (keyCustom, type) {
            var elementName = '[data-id="' + keyCustom + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                
            };          
            return sliderProvider(elementName, optionsParmas, "", keyCustom);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(){          
            return  "-" + (($('.row.slick-slider[data-id="'+$scope._uniqueKey+'"]').height() / 2) + 34) + "px";
        };
        /* Carousel Arrow Click */
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        /* Carousel Arrow Click */
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Event Listener when ng-repeat end */
        $rootScope.$on('repeatend', function() {  
            $timeout(function(){
                if($('.gallery-block[data-id]').length){
                    $('.gallery-block[data-id]').not('.slick-initialized').each(function(Key,Object){
                        if($(this).find('.imageItem').length > 0){
                            $scope._makeProductToCarousel($(this).attr('data-id'), 'gallery');
                        }
                    });
                }   
            },500); 
        });
        /*angular.element($window).bind('load', function(){*/
            if($location.path() == '/' || $location.path() == '/home'){
                var checkSliderImageProduct = setInterval(function(){
                    console.log("checking...", $('.cart-block').not('.slick-initialized').length);
                    if($('.cart-block.slick-initialized').length == $('.cart-block').length && $scope.data_product.length > 0){
                        clearInterval(checkSliderImageProduct);
                        return;
                    } else {                
                        $('.cart-block').not('.slick-initialized').each(function(){
                            if($(this).find('.row-product').length){
                                var elementName = '[data-id="' + $(this).data('id') + '"]';
                                var paramsOptions = {
                                    autoplay: (window.location.host !== 'localhost') ? true : false,
                                    slidesToShow: 1,
                                    slidesToScroll: 1,
                                    dots: true,
                                    arrows: false,
                                    centerMode: false,
                                    infinite: true,
                                    variableWidth: false,
                                };
                                sliderProvider(elementName, paramsOptions, "", $(this).data('id'));
                            }
                        });
                    }
                },1000);    
            }
            
        /*});*/
        $scope.displayImage = function(image_url, prefix) {return GAEAPI.getGaeImageUrl(image_url, prefix);}
        /* Check if seo enable */
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        /* Calculate discount (simple mode)
        * @params {expensivePrice}
        * @params {salePrice}
        * @return int
        */
        $scope.calculateDiscount = function(expensivePrice, salePrice){
            var dif = expensivePrice - salePrice;
            return parseInt(dif * 100 / expensivePrice);
        };
        /* Open Link in other windows */
        $scope.openWindows = function(stringUrl){
            return window.open(stringUrl, '_blank', 'location=yes,height='+$(window).height()+',width='+$(window).width()+',scrollbars=yes,status=yes');
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridI', function ($rootScope, $routeParams, sliderProvider, $location) {
    var templateName = 'componentCategoryGridI';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        'auto':'@auto',
        'feature':'@feature',
        'referralid':'@referralid',
        'imgpath':'@imgpath',
        'margin':'@margin',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $window) {      
        $scope.use_auto = (typeof $scope.auto !== 'undefined' && $scope.auto == 'true') ? true : false; 
        $scope.use_feature = (typeof $scope.feature !== 'undefined' && $scope.feature == 'true') ? true : false; 
        /**
        * Check if object array available for "website application" or "Mobile application" or "Featured"
        * @params object array
        * return true | false (default)
        */
        $scope._showWeb = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 18) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showApp = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 19) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showFeature = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 16) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        /* --------- START : 1 ------------*/
        /* Extract sub referral id from parent */
        $scope._mergeSubReferral = function(originalArray, r){
            if(!r.referral_sub_array.length){
                return originalArray;
            }
            var a = [];
            angular.forEach(r.referral_sub_array, function(i, k) {
                if($scope._showFeature(i.referral_badge)){
                    a.push(parseInt(i.referral_id));                    
                    $scope.dummyFeatureName.push(i);
                    if(i.referral_image.length){
                        $scope.dummyReferralImage.push(i.referral_image[0]);
                    }                    
                }                
                if(i.referral_sub_array.length > 0){
                    angular.forEach(i.referral_sub_array, function(ii,kk){
                        if($scope._showFeature(ii.referral_badge)){
                            a.push(parseInt(ii.referral_id));
                            $scope.dummyFeatureName.push(ii);
                            if(ii.referral_image.length){
                                $scope.dummyReferralImage.push(ii.referral_image[0]);
                            }
                        }  
                        if(ii.referral_sub_array.length > 0){
                            angular.forEach(ii.referral_sub_array, function(iii,kkk){
                                if($scope._showFeature(iii.referral_badge)){
                                    a.push(parseInt(iii.referral_id));
                                    $scope.dummyFeatureName.push(iii);
                                    if(iii.referral_image.length){
                                        $scope.dummyReferralImage.push(iii.referral_image[0]);
                                    }
                                } 
                                if(iii.referral_sub_array.length > 0){
                                    angular.forEach(iii.referral_sub_array, function(iiii,kkk){
                                        if($scope._showFeature(iiii.referral_badge)){
                                            a.push(parseInt(iiii.referral_id));
                                            $scope.dummyFeatureName.push(iiii);
                                            if(iiii.referral_image.length){
                                                $scope.dummyReferralImage.push(iiii.referral_image[0]);
                                            }
                                        }  
                                    });
                                } 
                            });
                        }
                    });
                }
            });
            return (a.length) ? a.concat(originalArray) : originalArray;
        };
        /* --------- END : 1 ------------*/
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /*
        * view current routeParams
        * @params (default)
        * @return function
        */
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        $scope.data = [];
        $scope.data_done = false;
        $scope.dummyFeatureName = [];
        $scope.dummyReferralImage = [];
        /* Get referral data (all)
        * @params none
        * @return array
        */
        
        /*
        $scope.getData = function(){
            $scope.data = [];
            $scope.data_done = false;
            $scope.dummyFeatureName = [];
            var filterJson = {'badge_id_array':[18]};
            
            var d = {
                'txt_referral_type_id':11,                
            };
            var dummy = [];
            GAEAPI.get('referral/map',d,$scope).then(function(e){
                if(e.ok == 1){
                    console.log("3a : before", e.data);
                    if($scope.use_feature){
                        var dummyReferral = [];
                        dummy = [];
                        angular.forEach(e.data, function(item, key){
                            item.referral_product_array = [];
                            if($scope._showFeature(item.referral_badge)){
                                dummyReferral.push(item);
                                dummy.push(parseInt(item.referral_id));
                                if(item.referral_sub_array.length){
                                    dummy = $scope._mergeSubReferral(dummy, item);                                    
                                }
                            }
                        });
                        $scope.data = dummyReferral;
                        $scope.data_done = true;
                        $scope.buildImageSlider($scope.data);   
                    } else{
                        dummy = [];
                        angular.forEach(e.data, function(item, key){
                            dummy.push(parseInt(item.referral_id));
                            if(item.referral_sub_array.length){
                                dummy = $scope._mergeSubReferral(dummy, item);                                    
                            }                        
                        });
                        $scope.data = e.data;
                        $scope.data_done = true;
                        $scope.buildImageSlider($scope.data);   
                    }
                }
                if(dummy.length){
                    $scope.getDataProductByReferralArray(dummy);
                }
            });
        };
        */
        
        var referralDisplayClass = function(){
            var object = {
                getOnlyBadgeIdArray(badgeArray){
                    var result = [];
                    for(var index in badgeArray){
                        var badgeData = badgeArray[index];
                        var badge_id = GAEAPI.getValue(badgeData["badge_id"],"");
                        if(badge_id!=""){
                            result.push(badge_id);
                        }
                    }
                    return result;
                },
                getOnlyReferralIdArray(referralArray){
                    var result = [];
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var referral_id = GAEAPI.getValue(referralData["referral_id"],"");
                        if(referral_id!=""){
                            result.push(referral_id);
                        }
                    }
                    return result;
                },
                getAllSubReferral(referralArray,resultArray){
                    var self = this;
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var badgeIdArray =  self.getOnlyBadgeIdArray(referralData.referral_badge);
                        if(badgeIdArray.indexOf("16")>=0){
                            resultArray.push(referralData);
                        }
                
                        var subReferralArray = GAEAPI.getValue(referralData["referral_sub_array"],[]);
                        if(subReferralArray.length>0){
                            self.getAllSubReferral(subReferralArray,resultArray);
                        }
                    }
                },
                getImageDataArray(referralArray,imageArray){
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var referralImageArray = GAEAPI.getValue(referralData["referral_banner_array"],[]);
                        if(referralImageArray.length>0){
                            imageArray.push(referralImageArray[0]);
                        }
                    }
                },
                getImageBannerDataArray(referralArray,imageArray){
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var referralBannerArray = GAEAPI.getValue(referralData["referral_image"],[]);
                        if(referralBannerArray.length>0){
                            for(indexTwo in referralBannerArray){
                                if(referralBannerArray[indexTwo]["banner_is_enable"] != 0){
                                    imageArray.push(referralBannerArray[indexTwo]);
                                }
                            }                           
                        }
                    }
                },
                generateCategoryDisplay(index,referralArray,callback){
                    var self = this;
                    if(referralArray.length<=index){
                        if(callback){callback();}
                        return false;
                    }
                    
                    var referralData = referralArray[index];
                    var referral_id = GAEAPI.getValue(referralData["referral_id"],"");
                    var subReferralIdArray = [];
                    self.getAllSubReferral(referralData.referral_sub_array,subReferralIdArray);
                    referralData["referral_feature_name"] = subReferralIdArray;
                    var resultIdArray = self.getOnlyReferralIdArray(subReferralIdArray);
                    resultIdArray.push(referral_id);
                    referralData["id_array"] = resultIdArray;
                     var dataSend = {
                        'cur_page': 1,
                        'per_page': 8,
                        'txt_json_filter':JSON.stringify({'badge_id_array':[18,16],'referral_id_array_in':resultIdArray})
                    };
                    console.log("product/lists : dataSend : ",dataSend);
                    GAEAPI.get("product/lists",dataSend,$scope).then(function(res){
                        console.log("product/lists : res : ",res);
                        var productArray = [];
                        if(res.ok==1){
                            productArray = res.data.dataList;
                        }
                        referralData["referral_product_array"] = productArray;
                        console.log("product/lists : referralData : ",referralData);
                    });
                    
                    console.log("generateCategoryDisplay : index : "+index+" : ",referralData);
                    self.generateCategoryDisplay((index+1),referralArray,callback);
                    var badgeIdArray =  self.getOnlyBadgeIdArray(referralData.referral_badge);
                    if(badgeIdArray.indexOf("16")>=0){
                        $scope.data.push(referralData);
                        var imageArray = GAEAPI.getValue(referralData["referral_image"],[]);
                        self.getImageDataArray(subReferralIdArray,imageArray);
                        referralData["referral_image_all_array"] = imageArray;
                    }
                
                }
            };
            return object;
        }
        var referralDisplay  = referralDisplayClass();
        var mapDataArray = [];
        $scope.getData = function(){
            $scope.data = [];
            $scope.data_done = false;
            $scope.dummyFeatureName = [];
            var filterJson = {'badge_id_array':[18]};
            
            var dataSend = {
                'txt_referral_type_id':11,                
            };
            var dummy = [];
            console.log('referral/map : dataSend : ',dataSend);
            GAEAPI.get('referral/map',dataSend,$scope).then(function(res){
                console.log('referral/map : res : ',res);
                if(res.ok==1){
                    mapDataArray = res.data;
                    referralDisplay.generateCategoryDisplay(0,mapDataArray,function(){
                        $scope.data_done = true;
                    });
                }
            });
        };  
        
        $scope.data_product = [];
        $scope.data_product_done = false;
        /* Get product list by referral array
        * @params {objectArray} referral array
        * @return array
        */
        $scope.getDataProductByReferralArray = function(objectArray){
            var d = {
                'cur_page': 1,
                'per_page': 8,
                'txt_json_filter':JSON.stringify({'badge_id_array':[18,16],'referral_id_array_in':objectArray})
            };
            var dummy = [];
            $scope.data_product_done = false;
            GAEAPI.get('product/lists',d,$scope).then(function(e){
                if(e.ok === 1){
                    $scope.data_product = e.data.dataList;
                    $scope.data_product_done = true;
                    angular.forEach($scope.data, function(item,key){
                        item.referral_feature_name = $scope.dummyFeatureName;
                        item.referral_product_array = e.data.dataList;
                        item.referral_image_all_array = $scope.dummyReferralImage;
                    });
                    console.log("getDataProductByReferralArray: referral data",$scope.data);
                    console.log("getDataProductByReferralArray: referral_id_array_in",objectArray);
                    console.log("getDataProductByReferralArray: params",d);
                    console.log("getDataProductByReferralArray: data",e);
                }
            });
        };
        /* Get referral data (by referral_id)
        * @params id = referral_id
        * @return array
        */
        $scope.getDataReferral = function(id){
            $scope.data = [];
            $scope.data_done = false;
            var d = {
                'txt_referral_id':id
            };
            GAEAPI.get('referral/id_map',d,$scope).then(function(e){
                if(e.ok == 1){
                    $scope.data[0] = e.data;
                    $scope.data_done = true;
                    $scope.buildImageSlider($scope.data);
                }
            });
        };
        /*
        * params listener
        * @params newValue
        * @params oldValue
        * @return function
        */
        $scope.$watch('use_auto', function (newValue, oldValue) {
            if (!newValue && typeof $scope.referralid !== 'undefined' && $scope.referralid !== ''){
                return $scope.getDataReferral($scope.referralid);                
            }
            $scope.getData();
        });
        /*
        * check if image array exist or build dummy image array
        * @params arrayObject = object array
        * @return array
        */
        $scope.dummyArrayImageGallery = [
        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_1.png'},
        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_2.png'},
        ];
        $scope.buildImageSlider = function(){
            var imageArray = function(idx){
                if(idx == 0){
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1.jpg'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},
                    ];
                } else if(idx == 1){
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_2.png'},
                    ];
                } else {
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},
                    ];
                }
            };
            var imageBannerArray = function(idx){
                if(idx == 0){
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1.jpg'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2.jpg'},
                    ];   
                } else if(idx == 1) {
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1_2.png'},
                    ];
                } else {
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2_2.png'},
                    ];
                }
            };
            angular.forEach($scope.data, function(item, key){
                if(!item.referral_image.length){
                    item.referral_image = imageArray(key);                    
                }
                item.referral_image_banner = imageBannerArray(key);
            });
        };
        /* Make Carousel */
        $scope._makeProductToCarousel = function (keyCustom, type) {
            var elementName = '[data-id="' + keyCustom + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                
            };          
            return sliderProvider(elementName, optionsParmas, "", keyCustom);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(){          
            return  "-" + (($('.row.slick-slider[data-id="'+$scope._uniqueKey+'"]').height() / 2) + 34) + "px";
        };
        /* Carousel Arrow Click */
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        /* Carousel Arrow Click */
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Event Listener when ng-repeat end */
        $rootScope.$on('repeatend', function() {  
            $timeout(function(){
                if($('.gallery-block[data-id]').length){
                    $('.gallery-block[data-id]').not('.slick-initialized').each(function(Key,Object){
                        if($(this).find('.imageItem').length > 0){
                            $scope._makeProductToCarousel($(this).attr('data-id'), 'gallery');
                        }
                    });
                }   
            },500); 
        });
        /*angular.element($window).bind('load', function(){*/
            if($location.path() == '/' || $location.path() == '/home'){
                var checkSliderImageProduct = setInterval(function(){
                    console.log("checking...", $('.cart-block').not('.slick-initialized').length);
                    if($('.cart-block.slick-initialized').length == $('.cart-block').length && $scope.data_product.length > 0){
                        clearInterval(checkSliderImageProduct);
                        return;
                    } else {                
                        $('.cart-block').not('.slick-initialized').each(function(){
                            if($(this).find('.row-product').length){
                                var elementName = '[data-id="' + $(this).data('id') + '"]';
                                var paramsOptions = {
                                    autoplay: (window.location.host !== 'localhost') ? true : false,
                                    slidesToShow: 1,
                                    slidesToScroll: 1,
                                    dots: true,
                                    arrows: false,
                                    centerMode: false,
                                    infinite: true,
                                    variableWidth: false,
                                };
                                sliderProvider(elementName, paramsOptions, "", $(this).data('id'));
                            }
                        });
                    }
                },1000);    
            }
            
        /*});*/
        
        /* Check if seo enable */
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        /* Calculate discount (simple mode)
        * @params {expensivePrice}
        * @params {salePrice}
        * @return int
        */
        $scope.calculateDiscount = function(expensivePrice, salePrice){
            var dif = expensivePrice - salePrice;
            return parseInt(dif * 100 / expensivePrice);
        };
        /* Open Link in other windows */
        $scope.openWindows = function(stringUrl){
            return window.open(stringUrl, '_blank', 'location=yes,height='+$(window).height()+',width='+$(window).width()+',scrollbars=yes,status=yes');
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryLanding', function ($rootScope, $routeParams, $location) {
	var templateName = 'componentCategoryLanding';
	var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
	var promise = {};
	promise.restrict = 'AE';
	promise.scope = {
	};
	promise.link = function (scope, element, attr) {};
	promise.templateUrl = templatePathUrl;
	promise.transclude = true;
	promise.controller = function ($scope, $timeout, $interval, $window) { 
		$scope.viewRouteParams=function(){
			return $routeParams || false;
		};
		$scope.data = [];
		$scope.data_none_multi = [];
		$scope.data_multi = [];
		$scope.data_parent = false;
		$scope.data_load = false;
		
		$scope.getData=function(){
			$scope.data = [];
			$scope.data_none_multi = [];
			$scope.data_multi = [];
			if(typeof $routeParams.referral_id !== 'undefined' && $routeParams.referral_id != 0){
				var d = {'txt_referral_type_id':11,'txt_parent_id':$routeParams.referral_id};				
			} else {
				var d = {'txt_referral_type_id':11};				
			}
			GAEAPI.get('referral/map',d).then(function(e){
				if(e.data.length > 0){
					
					$scope.data = e.data;
					console.log("category-landing : no",d,e);
					angular.forEach($scope.data, function(item){
						if(item.referral_sub_array.length > 0){
							$scope.data_multi.push(item);
							$scope.data_load = true;
						} else {
							$scope.data_none_multi.push(item);
							$scope.getParentData(item.referral_parent_id);
							$scope.data_load = true;
						}
					});		
				} else {
					$timeout(function(){
							$scope.data_load = true;
					},2000);
					
					$scope.matchReferral.root_id='';
					$scope.matchReferral.referral_parent_id='';
					$scope.matchReferral.referral_id='';
					console.log("category-landing : new", $routeParams.referral_id);
					return $scope.getRelation($routeParams.referral_id);
				}
			});
		};
		$scope.getData();
		$scope.getParentData = function(id){
			if($scope.data_parent==false){
				var d = {'txt_referral_id':id};
				GAEAPI.get('referral/id',d).then(function(e){
					if(e.ok == 1){
						$scope.data_parent = e.data;
					}
				});
			}
		};
		$scope.$watch('data_none_multi',function(newValue,oldValue){
			if(!newValue.length || !newValue){
				return;
			}
			
		});
		$scope.displayImage = function(image_url, prefix) {
            return GAEAPI.getGaeImageUrl(image_url, prefix);
        };
		$scope.relation = [];
		$scope.matchReferral = {
			root_id:'',
			referral_parent_id:'',
			referral_id:'',
		};
		$scope.matchCount = 0;
		$scope.getRelation = function(refId){
			console.log("category-landing: getRelation", refId);
			$scope.matchReferral.referral_id = refId;
			
			$scope.matchCount = $scope.matchCount+1;
			GAEAPI.get('referral/relation',{'txt_referral_id':refId}).then(function(e){
				if(e.data.length){
					/*$scope.relation = e.data;*/
					var first = 0;
					var last = e.data.length - 1;
					console.log("category-landing: e.data", e.data);
					console.log("category-landing: fist-last", first, last);
					if(parseInt(e.data[first].referral_parent_id) <= 0){
						console.log("category-landing: root_id", e.data[first].referral_id);
						console.log("category-landing: -root_id",parseInt(e.data[first].referral_parent_id));
						$scope.matchReferral.root_id = e.data[first].referral_id;
						$scope.matchCount = $scope.matchCount+1;
					}
					if(parseInt(e.data[last].referral_parent_id) > 0){
						console.log("category-landing: referral_parent_id", e.data[last].referral_parent_id);
						console.log("category-landing: -referral_parent_id", parseInt(e.data[last].referral_parent_id));
						$scope.matchReferral.referral_parent_id = e.data[last].referral_parent_id;
						$scope.matchCount = $scope.matchCount+1;
					} 
					
				}
			});
		};
		$scope.$watch('matchCount',function(newValue,oldValue){
			console.log("category-landing: matchCount", newValue);
			if(newValue >= 2){
				console.log("category-landing: matchCount : ready", $scope.matchReferral);
				$timeout(function(){
					window.location.href="category-lists?root_id="+$scope.matchReferral.root_id+"&referral_parent_id="+$scope.matchReferral.referral_parent_id+"&referral_id="+$scope.matchReferral.referral_id+"&referral_type=category";
				},100);
				
			}
		});
		
		
	};
	return promise;
});
_ui_share_app.directive('componentCategoryLandingB', function ($rootScope, $routeParams, $location) {
	var templateName = 'componentCategoryLandingB';
	var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
	var promise = {};
	promise.restrict = 'AE';
	promise.scope = {
	};
	promise.link = function (scope, element, attr) {};
	promise.templateUrl = templatePathUrl;
	promise.transclude = true;
	promise.controller = function ($scope, $timeout, $interval, $window) { 
		$scope.viewRouteParams=function(){
			return $routeParams || false;
		};
		 $scope._params = $routeParams.referral_id;
		$scope.data = [];
		$scope.data_none_multi = [];
		$scope.data_multi = [];
		$scope.data_parent = false;
		$scope.data_load = false;
		
		$scope.getData=function(){
			$scope.data = [];
			$scope.data_none_multi = [];
			$scope.data_multi = [];
			if(typeof $routeParams.referral_id !== 'undefined' && $routeParams.referral_id != 0){
				var d = {'txt_referral_type_id':11,'txt_parent_id':$routeParams.referral_id};				
			} else {
				var d = {'txt_referral_type_id':11};				
			}
			GAEAPI.get('referral/map',d).then(function(e){
				if(e.data.length > 0){
					
					$scope.data = e.data;
					console.log("category-landing : no",d,e);
					angular.forEach($scope.data, function(item){
						if(item.referral_sub_array.length > 0){
							$scope.data_multi.push(item);
							$scope.data_load = true;
						} else {
							$scope.data_none_multi.push(item);
							$scope.getParentData(item.referral_parent_id);
							$scope.data_load = true;
						}
					});		
				} else {
					$timeout(function(){
							$scope.data_load = true;
					},2000);
					
					$scope.matchReferral.root_id='';
					$scope.matchReferral.referral_parent_id='';
					$scope.matchReferral.referral_id='';
					console.log("category-landing : new", $routeParams.referral_id);
					return $scope.getRelation($routeParams.referral_id);
				}
			});
		};
		$scope.getData();
		$scope.getParentData = function(id){
			if($scope.data_parent==false){
				var d = {'txt_referral_id':id};
				GAEAPI.get('referral/id',d).then(function(e){
					if(e.ok == 1){
						$scope.data_parent = e.data;
					}
				});
			}
		};
		$scope._data_referral_relate_ = [];
        $scope._get_referral_relate_ = function (array) {
            
                var dataSend = {
                    'txt_referral_id': array,
                };
                GAEAPI.get('referral/relation', dataSend).then(function (e) {         
                    if (e.ok === 1) {
                        $scope._data_referral_relate_ = e.data;
                    }
                });
        };
		$scope.$watch('data_none_multi',function(newValue,oldValue){
			if(!newValue.length || !newValue){
				return;
			}
			
		});
		$scope.$watch('_params', function(newValue, oldValue) {
            if(newValue){
               $scope._get_referral_relate_(newValue);
            }
            if (!newValue) return;
        });
		$scope.displayImage = function(image_url, prefix) {
            return GAEAPI.getGaeImageUrl(image_url, prefix);
        };
		$scope.relation = [];
		$scope.matchReferral = {
			root_id:'',
			referral_parent_id:'',
			referral_id:'',
		};
		$scope.matchCount = 0;
		$scope.getRelation = function(refId){
			console.log("category-landing: getRelation", refId);
			$scope.matchReferral.referral_id = refId;
			
			$scope.matchCount = $scope.matchCount+1;
			GAEAPI.get('referral/relation',{'txt_referral_id':refId}).then(function(e){
				if(e.data.length){
					/*$scope.relation = e.data;*/
					var first = 0;
					var last = e.data.length - 1;
					console.log("category-landing: e.data", e.data);
					console.log("category-landing: fist-last", first, last);
					if(parseInt(e.data[first].referral_parent_id) <= 0){
						console.log("category-landing: root_id", e.data[first].referral_id);
						console.log("category-landing: -root_id",parseInt(e.data[first].referral_parent_id));
						$scope.matchReferral.root_id = e.data[first].referral_id;
						$scope.matchCount = $scope.matchCount+1;
					}
					if(parseInt(e.data[last].referral_parent_id) > 0){
						console.log("category-landing: referral_parent_id", e.data[last].referral_parent_id);
						console.log("category-landing: -referral_parent_id", parseInt(e.data[last].referral_parent_id));
						$scope.matchReferral.referral_parent_id = e.data[last].referral_parent_id;
						$scope.matchCount = $scope.matchCount+1;
					} 
					
				}
			});
		};
		$scope.$watch('matchCount',function(newValue,oldValue){
			console.log("category-landing: matchCount", newValue);
			if(newValue >= 2){
				console.log("category-landing: matchCount : ready", $scope.matchReferral);
				$timeout(function(){
					window.location.href="category-lists?root_id="+$scope.matchReferral.root_id+"&referral_parent_id="+$scope.matchReferral.referral_parent_id+"&referral_id="+$scope.matchReferral.referral_id+"&referral_type=category";
				},100);
				
			}
		});
		
		
	};
	return promise;
});
_ui_share_app.directive('componentCategoryLandingC', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryLandingC';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {};
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope.data = [];
        $scope.data_none_multi = [];
        $scope.data_multi = [];
        $scope.data_parent = false;
        $scope.data_load = false;
        $scope.getData = function() {
            $scope.data = [];
            $scope.data_none_multi = [];
            $scope.data_multi = [];
            if (typeof $routeParams.referral_id !== 'undefined' && $routeParams.referral_id != 0) {
                var d = {
                    'txt_referral_type_id': 11,
                    'txt_parent_id': $routeParams.referral_id
                };
            } else {
                var d = {
                    'txt_referral_type_id': 11
                };
            }
            GAEAPI.get('referral/map', d, $scope).then(function(e) {
                if (e.data.length > 0) {
                    $scope.data = e.data;
                    console.log("category-landing : no", d, e);
                    angular.forEach($scope.data, function(item) {
                        if (item.referral_sub_array.length > 0) {
                            $scope.data_multi.push(item);
                            $scope.data_load = true;
                        } else {
                            $scope.data_none_multi.push(item);
                            $scope.getParentData(item.referral_parent_id);
                            $scope.data_load = true;
                        }
                    });
                } else {
                    $timeout(function() {
                        $scope.data_load = true;
                    }, 300);
                    $scope.matchReferral.root_id = '';
                    $scope.matchReferral.referral_parent_id = '';
                    $scope.matchReferral.referral_id = '';
                    console.log("category-landing : new", $routeParams.referral_id);
                    return $scope.getRelation($routeParams.referral_id);
                }
            });
        };
        $scope.getData();
        $scope.getParentData = function(id) {
            if ($scope.data_parent == false) {
                var d = {
                    'txt_referral_id': id
                };
                GAEAPI.get('referral/id', d, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data_parent = e.data;
                    }
                });
            }
        };
        // $scope.$watch('data_none_multi',function(newValue,oldValue){
        // 	if(!newValue.length || !newValue){
        // 		return;
        // 	}
        // });
        $scope.displayImage = function(image_url, prefix) {
            return GAEAPI.getGaeImageUrl(image_url, prefix);
        };
        $scope.relation = [];
        $scope.matchReferral = {
            root_id: '',
            referral_parent_id: '',
            referral_id: '',
            referral_name: '',
        };
        $scope.matchCount = 0;
        $scope.getRelation = function(refId) {
            console.log("category-landing: getRelation", refId);
            $scope.matchReferral.referral_id = refId;
            $scope.matchReferral.referral_name = $scope.viewRouteParams().referral_name;
            $scope.matchCount = $scope.matchCount + 1;
            GAEAPI.get('referral/relation', {
                'txt_referral_id': refId
            }, $scope).then(function(e) {
                if (e.data.length) {
                    /*$scope.relation = e.data;*/
                    var first = 0;
                    var last = e.data.length - 1;
                    console.log("category-landing: e.data", e.data);
                    console.log("category-landing: fist-last", first, last);
                    if (parseInt(e.data[first].referral_parent_id) <= 0) {
                        console.log("category-landing: root_id", e.data[first].referral_id);
                        console.log("category-landing: -root_id", parseInt(e.data[first].referral_parent_id));
                        $scope.matchReferral.root_id = e.data[first].referral_id;
                        $scope.matchCount = $scope.matchCount + 1;
                    }
                    if (parseInt(e.data[last].referral_parent_id) > 0) {
                        console.log("category-landing: referral_parent_id", e.data[last].referral_parent_id);
                        console.log("category-landing: -referral_parent_id", parseInt(e.data[last].referral_parent_id));
                        $scope.matchReferral.referral_parent_id = e.data[last].referral_parent_id;
                        $scope.matchCount = $scope.matchCount + 1;
                    }
                }
            });
        };
        $scope.$watch('matchCount', function(newValue, oldValue) {
            console.log("category-landing: matchCount", newValue);
            if (newValue >= 2) {
                console.log("category-landing: matchCount : ready", $scope.matchReferral);
                $timeout(function() {
  					var url = "category-lists?root_id=" + $scope.matchReferral.root_id + "&referral_parent_id=" + $scope.matchReferral.referral_parent_id + "&referral_id=" + $scope.matchReferral.referral_id + "&referral_type=category" + "&referral_name=" + $scope.matchReferral.referral_name;
                	$location.url(url).replace();
                    // window.location.href = "category-lists?root_id=" + $scope.matchReferral.root_id + "&referral_parent_id=" + $scope.matchReferral.referral_parent_id + "&referral_id=" + $scope.matchReferral.referral_id + "&referral_type=category" + "&referral_name=" + $scope.matchReferral.referral_name;
                }, 100);
            }
        });
    };
    return promise;
});
_ui_share_app.directive('componentCategoryLandingD', function ($rootScope, $routeParams, $location) {
	var templateName = 'componentCategoryLandingD';
	var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
	var promise = {};
	promise.restrict = 'AE';
	promise.scope = {
	};
	promise.link = function (scope, element, attr) {};
	promise.templateUrl = templatePathUrl;
	promise.transclude = true;
	promise.controller = function ($scope, $timeout, $interval, $window) { 
		$scope.viewRouteParams=function(){
			return $routeParams || false;
		};
		 $scope._params = $routeParams.referral_id;
		$scope.data = [];
		$scope.data_none_multi = [];
		$scope.data_multi = [];
		$scope.data_parent = false;
		$scope.data_load = false;
		
		$scope.getData=function(){
			$scope.data = [];
			$scope.data_none_multi = [];
			$scope.data_multi = [];
			if(typeof $routeParams.referral_id !== 'undefined' && $routeParams.referral_id != 0){
				var d = {'txt_referral_type_id':11,'txt_parent_id':$routeParams.referral_id};				
			} else {
				var d = {'txt_referral_type_id':11};				
			}
			GAEAPI.get('referral/map',d , $scope).then(function(e){
				if(e.data.length > 0){
					
					$scope.data = e.data;
					console.log("category-landing : no",d,e);
					angular.forEach($scope.data, function(item){
						if(item.referral_sub_array.length > 0){
							$scope.data_multi.push(item);
							$scope.data_load = true;
						} else {
							$scope.data_none_multi.push(item);
							$scope.getParentData(item.referral_parent_id);
							$scope.data_load = true;
						}
					});		
				} else {
					$timeout(function(){
							$scope.data_load = true;
					},2000);
					
					$scope.matchReferral.root_id='';
					$scope.matchReferral.referral_parent_id='';
					$scope.matchReferral.referral_id='';
					console.log("category-landing : new", $routeParams.referral_id);
					return $scope.getRelation($routeParams.referral_id);
				}
			});
		};
		$scope.getData();
		$scope.getParentData = function(id){
			if($scope.data_parent==false){
				var d = {'txt_referral_id':id};
				GAEAPI.get('referral/id',d , $scope).then(function(e){
					if(e.ok == 1){
						$scope.data_parent = e.data;
					}
				});
			}
		};
		$scope._data_referral_relate_ = [];
        $scope._get_referral_relate_ = function (array) {
            
                var dataSend = {
                    'txt_referral_id': array,
                };
                GAEAPI.get('referral/relation', dataSend ,$scope).then(function (e) {         
                    if (e.ok === 1) {
                        $scope._data_referral_relate_ = e.data;
                    }
                });
        };
		$scope.$watch('data_none_multi',function(newValue,oldValue){
			if(!newValue.length || !newValue){
				return;
			}
			
		});
		$scope.$watch('_params', function(newValue, oldValue) {
            if(newValue){
               $scope._get_referral_relate_(newValue);
            }
            if (!newValue) return;
        });
		$scope.displayImage = function(image_url, prefix) {
            return GAEAPI.getGaeImageUrl(image_url, prefix);
        };
		$scope.relation = [];
		$scope.matchReferral = {
			root_id:'',
			referral_parent_id:'',
			referral_id:'',
		};
		$scope.matchCount = 0;
		$scope.getRelation = function(refId){
			console.log("category-landing: getRelation", refId);
			$scope.matchReferral.referral_id = refId;
			
			$scope.matchCount = $scope.matchCount+1;
			GAEAPI.get('referral/relation',{'txt_referral_id':refId},$scope).then(function(e){
				if(e.data.length){
					/*$scope.relation = e.data;*/
					var first = 0;
					var last = e.data.length - 1;
					console.log("category-landing: e.data", e.data);
					console.log("category-landing: fist-last", first, last);
					if(parseInt(e.data[first].referral_parent_id) <= 0){
						console.log("category-landing: root_id", e.data[first].referral_id);
						console.log("category-landing: -root_id",parseInt(e.data[first].referral_parent_id));
						$scope.matchReferral.root_id = e.data[first].referral_id;
						$scope.matchCount = $scope.matchCount+1;
					}
					if(parseInt(e.data[last].referral_parent_id) > 0){
						console.log("category-landing: referral_parent_id", e.data[last].referral_parent_id);
						console.log("category-landing: -referral_parent_id", parseInt(e.data[last].referral_parent_id));
						$scope.matchReferral.referral_parent_id = e.data[last].referral_parent_id;
						$scope.matchCount = $scope.matchCount+1;
					} 
					
				}
			});
		};
		$scope.$watch('matchCount',function(newValue,oldValue){
			console.log("category-landing: matchCount", newValue);
			if(newValue >= 2){
				console.log("category-landing: matchCount : ready", $scope.matchReferral);
				$timeout(function(){
					window.location.href="category-lists?root_id="+$scope.matchReferral.root_id+"&referral_parent_id="+$scope.matchReferral.referral_parent_id+"&referral_id="+$scope.matchReferral.referral_id+"&referral_type=category";
				},100);
				
			}
		});
		
		
	};
	return promise;
});
_ui_share_app.directive('componentCategoryMenuDropdown', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCategoryMenuDropdown';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {};
    promise.controller = function ($scope, $timeout, $interval, $window, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.myFunctionDropdown = function () {
            document.getElementById("myDropdown").classList.toggle("show");
        }
        $scope.onclick = function (event) {
            if (!event.target.matches('.dropbtn')) {
                var dropdowns = document.getElementsByClassName("dropdown-content");
                var i;
                for (i = 0; i < dropdowns.length; i++) {
                    var openDropdown = dropdowns[i];
                    if (openDropdown.classList.contains('show')) {
                        openDropdown.classList.remove('show');
                    }
                }
            }
        }
        $scope._page_lists = false;
        $scope._page_lists_load = false;
        $scope._get_page_lists = function () {
            $scope._clear_page_lists();
            var dataSend = {
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'page_lastest_create'
            };
            GAEAPI.get('page/lists', dataSend ,$scope).then(function (res) {
                $scope._page_lists_load = true;
                if (res.ok === 1) {
                    $scope._page_lists = res.data.dataList;
                    angular.forEach($scope._page_lists, function (item, key) {
                        if (item.page_search_url == "") {
                            item.page_search_url = item.page_id;
                        }
                    });
                }
            });
        };
        $scope._clear_page_lists = function () {
            $scope._page_lists = false;
            $scope._page_lists_load = false;
        };
        /*$scope._get_page_lists();*/
        /*$scope._page_category = (typeof window.referralMap !== 'undefined') ? window.referralMap.data : false;*/
        $scope._page_category_load = false;
        $scope._get_page_category = function () {
            /*$scope._clear_page_lists();
             
             var dataSend = {
             'txt_referral_type_id': 11,
             'txt_sortby': 'referral_sort_index_asc_name_asc'
             };
             GAEAPI.get('referral/map', dataSend).then(function(res) {
             $scope._page_category_load = true;
             if (res.ok === 1) {
             $scope._page_category = res.data;
             }
             });*/
        };
        $scope._clear_page_category = function () {
            $scope._page_category = false;
            $scope._page_category_load = false;
        };
        /*$scope._get_page_category();*/
        $scope.requestApiArray = [];
        $scope.chainRerrealRequest = function (txt_referral_type_id, txt_parent_id, callbackData, childCount) {
            var dataSend = {
                'cur_page': 1,
                'per_page': (txt_parent_id <= 0) ? 20 : childCount,
                'txt_referral_type_id': txt_referral_type_id,
                'txt_parent_id': txt_parent_id,
                'txt_badge_id': 18,
                'txt_sortby' : 'referral_sort_index_asc_name_asc',
                'base_shop_name': 'myhappyphone',
            };
            if (parseInt(txt_referral_type_id) > 0) {
                dataSend.txt_view_referral_child = 1;
            }
            $http.get(GURL.base_api_url() + 'referral/short_lists', {params: dataSend} , $scope).then(function (res) {
                $scope.requestApiArray[txt_referral_type_id] = $timeout(function () {
                    var e = res.data;
                    if (e.ok === 1) {
                        if (typeof callbackData == undefined || callbackData == undefined) {
                            $scope._page_category = e.data.dataList;
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                        } else {
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                            return callbackData(e);
                        }
                    }
                }, 20);
            });
        };
        $scope.chainRerrealRequest(11, 0);
        $scope.chainReferralHover = function (objectParent, level) {
            console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_count);
            if (objectParent.referral_sub_count > 0 && objectParent.referral_sub_array.length <= 0) {
                $scope.chainRerrealRequest(11, objectParent.referral_id, function (e) {
                    if (e.ok === 1 && e.data.dataList.length) {
                        objectParent.referral_sub_array = e.data.dataList;
                        console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_array);
                    }
                }, objectParent.referral_sub_count);
            }
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryMenuDropdownAa', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCategoryMenuDropdownAa';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s.toLowerCase();
        };
        $scope.dropdown = false;
        $scope.myFunctionDropdown = function() {
            document.getElementById("myDropdown").classList.toggle("show");
            var dropdown = $(".dropdown-menu").height() + 11;
            console.log("myFunctionDropdown - content : ", dropdown);
            $('.dropdown-menu').css('min-height', dropdown);
        };
        $("#myDropdown").mouseenter(function() {}).mouseleave(function() {
            document.getElementById("myDropdown").classList.toggle("show");
            var dropdown = $(".dropdown-menu").height() + 11;
            console.log("myFunctionDropdown - content : ", dropdown);
            $('.dropdown-menu').css('min-height', dropdown);
        });
        $scope.onclick = function(event) {
            if (!event.target.matches('.dropbtn')) {
                var dropdowns = document.getElementsByClassName("dropdown-content");
                var i;
                for (i = 0; i < dropdowns.length; i++) {
                    var openDropdown = dropdowns[i];
                    if (openDropdown.classList.contains('show')) {
                        openDropdown.classList.remove('show');
                    }
                }
            }
        };
        $scope._page_lists = false;
        $scope._page_lists_load = false;
        $scope._get_page_lists = function() {
            $scope._clear_page_lists();
            var dataSend = {
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'page_lastest_create'
            };
            GAEAPI.get('page/lists', dataSend, $scope).then(function(res) {
                $scope._page_lists_load = true;
                if (res.ok === 1) {
                    $scope._page_lists = res.data.dataList;
                    angular.forEach($scope._page_lists, function(item, key) {
                        if (item.page_search_url == "") {
                            item.page_search_url = item.page_id;
                        }
                    });
                }
            });
        };
        $scope._clear_page_lists = function() {
            $scope._page_lists = false;
            $scope._page_lists_load = false;
        };
        /*$scope._get_page_lists();*/
        /*$scope._page_category = (typeof window.referralMap !== 'undefined') ? window.referralMap.data : false;*/
        $scope._page_category_load = false;
        $scope._get_page_category = function() {
            /*$scope._clear_page_lists();
             
             var dataSend = {
             'txt_referral_type_id': 11,
             'txt_sortby': 'referral_sort_index_asc_name_asc'
             };
             GAEAPI.get('referral/map', dataSend).then(function(res) {
             $scope._page_category_load = true;
             if (res.ok === 1) {
             $scope._page_category = res.data;
             }
             });*/
        };
        $scope._clear_page_category = function() {
            $scope._page_category = false;
            $scope._page_category_load = false;
        };
        /*$scope._get_page_category();*/
        $scope.requestApiArray = [];
        $scope.chainRerrealRequest = function(txt_referral_type_id, txt_parent_id, callbackData, childCount) {
            var dataSend = {
                'cur_page': 1,
                'per_page': (txt_parent_id <= 0) ? 20 : childCount,
                'txt_referral_type_id': txt_referral_type_id,
                'txt_parent_id': txt_parent_id,
                'txt_badge_id': 18,
                'txt_sortby': 'referral_sort_index_asc_name_desc',
                'base_shop_name': 'proplugin',
            };
            if (parseInt(txt_referral_type_id) > 0) {
                dataSend.txt_view_referral_child = 1;
            }
            $http.get(GURL.base_api_url() + 'referral/short_lists', {
                params: dataSend
            }, $scope).then(function(res) {
                console.log("chainRerrealRequest : dataSend : ", dataSend);
                $scope.requestApiArray[txt_referral_type_id] = $timeout(function() {
                    var e = res.data;
                    console.log("chainRerrealRequest : e  : ", e);
                    if (e.ok === 1) {
                        if (typeof callbackData == undefined || callbackData == undefined) {
                            $scope._page_category = e.data.dataList;
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                        } else {
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                            return callbackData(e);
                        }
                    }
                }, 20);
            });
        };
        $scope.chainRerrealRequest(11, 0);
        $scope.chainReferralHover = function(objectParent, level) {
            console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_count);
            if (objectParent.referral_sub_count > 0 && objectParent.referral_sub_array.length <= 0) {
                $scope.chainRerrealRequest(11, objectParent.referral_id, function(e) {
                    if (e.ok === 1 && e.data.dataList.length) {
                        objectParent.referral_sub_array = e.data.dataList;
                        console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_array);
                    }
                }, objectParent.referral_sub_count);
            }
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryMenuDropdownAb', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCategoryMenuDropdownAb';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s.toLowerCase();
        };
        $scope.dropdown = false;
        $scope.myFunctionDropdown = function() {
            document.getElementById("myDropdown").classList.toggle("show");
        };
        $("#myDropdown").mouseenter(function() {}).mouseleave(function() {
            document.getElementById("myDropdown").classList.toggle("show");
        });
        $scope.onclick = function(event) {
            if (!event.target.matches('.dropbtn')) {
                var dropdowns = document.getElementsByClassName("dropdown-content");
                var i;
                for (i = 0; i < dropdowns.length; i++) {
                    var openDropdown = dropdowns[i];
                    if (openDropdown.classList.contains('show')) {
                        openDropdown.classList.remove('show');
                    }
                }
            }
        };
        $scope._page_lists = false;
        $scope._page_lists_load = false;
        $scope._get_page_lists = function() {
            $scope._clear_page_lists();
            var dataSend = {
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'page_lastest_create'
            };
            GAEAPI.get('page/lists', dataSend, $scope).then(function(res) {
                $scope._page_lists_load = true;
                if (res.ok === 1) {
                    $scope._page_lists = res.data.dataList;
                    angular.forEach($scope._page_lists, function(item, key) {
                        if (item.page_search_url == "") {
                            item.page_search_url = item.page_id;
                        }
                    });
                }
            });
        };
        $scope._clear_page_lists = function() {
            $scope._page_lists = false;
            $scope._page_lists_load = false;
        };
        /*$scope._get_page_lists();*/
        /*$scope._page_category = (typeof window.referralMap !== 'undefined') ? window.referralMap.data : false;*/
        $scope._page_category_load = false;
        $scope._get_page_category = function() {
            /*$scope._clear_page_lists();
             
             var dataSend = {
             'txt_referral_type_id': 11,
             'txt_sortby': 'referral_sort_index_asc_name_asc'
             };
             GAEAPI.get('referral/map', dataSend).then(function(res) {
             $scope._page_category_load = true;
             if (res.ok === 1) {
             $scope._page_category = res.data;
             }
             });*/
        };
        $scope._clear_page_category = function() {
            $scope._page_category = false;
            $scope._page_category_load = false;
        };
        /*$scope._get_page_category();*/
        $scope.requestApiArray = [];
        $scope.chainRerrealRequest = function(txt_referral_type_id, txt_parent_id, callbackData, childCount) {
            var dataSend = {
                'cur_page': 1,
                'per_page': (txt_parent_id <= 0) ? 20 : childCount,
                'txt_referral_type_id': txt_referral_type_id,
                'txt_parent_id': txt_parent_id,
                'txt_badge_id': 18,
                'base_shop_name': 'supercheap'
            };
            if (parseInt(txt_referral_type_id) > 0) {
                dataSend.txt_view_referral_child = 1;
            }
            $http.get(GURL.base_api_url() + 'referral/short_lists', {
                params: dataSend
            }, $scope).then(function(res) {
                $scope.requestApiArray[txt_referral_type_id] = $timeout(function() {
                    var e = res.data;
                    if (e.ok === 1) {
                        if (typeof callbackData == undefined || callbackData == undefined) {
                            $scope._page_category = e.data.dataList;
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                        } else {
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                            return callbackData(e);
                        }
                    }
                }, 20);
            });
        };
        $scope.chainRerrealRequest(11, 0);
        $scope.chainReferralHover = function(objectParent, level) {
            console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_count);
            if (objectParent.referral_sub_count > 0 && objectParent.referral_sub_array.length <= 0) {
                $scope.chainRerrealRequest(11, objectParent.referral_id, function(e) {
                    if (e.ok === 1 && e.data.dataList.length) {
                        objectParent.referral_sub_array = e.data.dataList;
                        console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_array);
                    }
                }, objectParent.referral_sub_count);
            }
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryMenuDropdownAc', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCategoryMenuDropdownAc';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        category: '@category',
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.forbidden = false;
        $scope.$watch('category', function(newCategory, oldCategory) {
            $scope.newCat = (newCategory == undefined || newCategory == '') ? 'หมวดหมู่' : newCategory;
            $scope.oldCat = oldCategory;
        });
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s.toLowerCase();
        };
        $scope.dropdown = false;
        $scope.myFunctionDropdown = function() {
            document.getElementById("myDropdown").classList.toggle("show");
            var dropdown = $(".dropdown-menu").height() + 11;
            console.log("myFunctionDropdown - content : ", dropdown);
            $('.dropdown-menu').css('min-height', dropdown);
        };
        $("#myDropdown").mouseenter(function() {}).mouseleave(function() {
            document.getElementById("myDropdown").classList.toggle("show");
            var dropdown = $(".dropdown-menu").height() + 11;
            console.log("myFunctionDropdown - content : ", dropdown);
            $('.dropdown-menu').css('min-height', dropdown);
        });
        $scope.onclick = function(event) {
            if (!event.target.matches('.dropbtn')) {
                var dropdowns = document.getElementsByClassName("dropdown-content");
                var i;
                for (i = 0; i < dropdowns.length; i++) {
                    var openDropdown = dropdowns[i];
                    if (openDropdown.classList.contains('show')) {
                        openDropdown.classList.remove('show');
                    }
                }
            }
        };
        $scope.requestApiArray = [];
        $scope.chainRerrealRequest = function(txt_referral_type_id, txt_parent_id, callbackData, childCount) {
            var dataSend = {
                'cur_page': 1,
                'per_page': (txt_parent_id <= 0) ? 20 : childCount,
                'txt_referral_type_id': txt_referral_type_id,
                'txt_parent_id': txt_parent_id,
                'txt_badge_id': 18,
                'txt_sortby': 'referral_sort_index_asc_name_desc',
                'base_shop_name': 'bypshop',
            };
            if (parseInt(txt_referral_type_id) > 0) {
                dataSend.txt_view_referral_child = 1;
            }
            $http.get(GURL.base_api_url() + 'referral/short_lists', {
                params: dataSend
            }, $scope).then(function(res) {
                console.log("chainRerrealRequest : dataSend : ", dataSend);
                $scope.requestApiArray[txt_referral_type_id] = $timeout(function() {
                    var e = res.data;
                    console.log("chainRerrealRequest : e  : ", e);
                    if (e.ok === 1) {
                        if (typeof callbackData == undefined || callbackData == undefined) {
                            $scope._page_category = e.data.dataList;
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                        } else {
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                            return callbackData(e);
                        }
                    }
                }, 20);
            });
        };
        $scope.chainRerrealRequest(11, 0);
        $scope.chainReferralHover = function(objectParent, level) {
            console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_count);
            if (objectParent.referral_sub_count > 0 && objectParent.referral_sub_array.length <= 0) {
                $scope.chainRerrealRequest(11, objectParent.referral_id, function(e) {
                    if (e.ok === 1 && e.data.dataList.length) {
                        objectParent.referral_sub_array = e.data.dataList;
                        console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_array);
                    }
                }, objectParent.referral_sub_count);
            }
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryMenuDropdownAd', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCategoryMenuDropdownAd';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s.toLowerCase();
        };
        $scope.dropdown = false;
        $scope.myFunctionDropdown = function() {
            document.getElementById("myDropdown").classList.toggle("show");
            var dropdown = $(".dropdown-menu").height() + 11;
            console.log("myFunctionDropdown - content : ", dropdown);
            $('.dropdown-menu').css('min-height', dropdown);
        };
        $("#myDropdown").mouseenter(function() {}).mouseleave(function() {
            document.getElementById("myDropdown").classList.toggle("show");
            var dropdown = $(".dropdown-menu").height() + 11;
            console.log("myFunctionDropdown - content : ", dropdown);
            $('.dropdown-menu').css('min-height', dropdown);
        });
        $scope.onclick = function(event) {
            if (!event.target.matches('.dropbtn')) {
                var dropdowns = document.getElementsByClassName("dropdown-content");
                var i;
                for (i = 0; i < dropdowns.length; i++) {
                    var openDropdown = dropdowns[i];
                    if (openDropdown.classList.contains('show')) {
                        openDropdown.classList.remove('show');
                    }
                }
            }
        };
        $scope.requestApiArray = [];
        $scope.chainRerrealRequest = function(txt_referral_type_id, txt_parent_id, callbackData, childCount) {
            var dataSend = {
                'cur_page': 1,
                'per_page': (txt_parent_id <= 0) ? 20 : childCount,
                'txt_referral_type_id': txt_referral_type_id,
                'txt_parent_id': txt_parent_id,
                'txt_badge_id': 18,
                'txt_sortby': 'referral_sort_index_asc_name_desc',
                'base_shop_name': 'maeju',
            };
            if (parseInt(txt_referral_type_id) > 0) {
                dataSend.txt_view_referral_child = 1;
            }
            $http.get(GURL.base_api_url() + 'referral/short_lists', {
                params: dataSend
            }, $scope).then(function(res) {
                console.log("chainRerrealRequest : dataSend : ", dataSend);
                $scope.requestApiArray[txt_referral_type_id] = $timeout(function() {
                    var e = res.data;
                    console.log("chainRerrealRequest : e  : ", e);
                    if (e.ok === 1) {
                        if (typeof callbackData == undefined || callbackData == undefined) {
                            $scope._page_category = e.data.dataList;
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                        } else {
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                            return callbackData(e);
                        }
                    }
                }, 20);
            });
        };
        $scope.chainRerrealRequest(11, 0);
        $scope.chainReferralHover = function(objectParent, level) {
            console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_count);
            if (objectParent.referral_sub_count > 0 && objectParent.referral_sub_array.length <= 0) {
                $scope.chainRerrealRequest(11, objectParent.referral_id, function(e) {
                    if (e.ok === 1 && e.data.dataList.length) {
                        objectParent.referral_sub_array = e.data.dataList;
                        console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_array);
                    }
                }, objectParent.referral_sub_count);
            }
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategorySetSlide', function ($rootScope, $routeParams) {
    var templateName = 'componentCategorySetSlide';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
        /* 
        * fetch only referral category type (tree-list);
        * @params none
        * @return {Array}
        */
    $scope.category_All18 = [];
    $scope.get_category_All18 = function () {
        var txt_filter_json = {
            'badge_id_array': [18]
        };
        var dataSend = {
            'txt_referral_type_id': 11,
            'txt_sortby': 'referral_name_a-z',
            'txt_filter_json': JSON.stringify(txt_filter_json),
        };
        GAEAPI.get('referral/map', dataSend , $scope).then(function (res) {
            if (res.ok === 1) {
                $scope.category_All18 = res.data;
                 console.log("esdoiwpfel :", $scope.category_All18);
            }            
        });
    };
    $scope.get_category_All18();
   
        $scope.testaa = '';
        $scope.ykey =function(refid){
            var dataSend = {
                'txt_referral_type_id': 11,
                'txt_parent_id': refid,
            };
            GAEAPI.get('referral/map', dataSend, $scope).then(function (res) { 
                if(res.ok != 1){
                    return;
                }
                if(res.data.length > 0){
                    $scope.testaa = 'yes';
                    return $scope.testaa;
                }else{
                     $scope.testaa = 'no';
                    return $scope.testaa;
                }
                
            });
        };
        /*
        * view current routeParams
        * @params (default)
        * @return function
        */
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        /*
        * params listener
        * @params (default)
        * @return function
        */
        /* Check if seo enable */
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        /* Check if child array exist */
        $scope.checkChild = function(object){
            return (!object.referral_sub_array.length) ? true : false;
        };
        $scope.buildTitleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategorySlideHome', function ($rootScope, $routeParams, sliderProvider, carouselData) {
    var templateName = 'componentCategorySlideHome';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        size:'@size',
        margin:'@margin',
        name: '@name',
        refid: '@refid',
       
    };
    /*promise.link = function (scope, element, attr) {};*/
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.watchCallbackArray = function(){
            var r = [];
            for(var i = 0; i < 6; i++){
                r.push({
                    banner_image:[{image_url:'extensions/themes/gae_default301/staticfiles/images/default/180x150.jpg'}],
                    callback_array:true
                });
            }
            return r;
        };
        
        $scope.$watch('refid',function(newValue,oldValue){
            if(newValue){
                $scope.getdata(newValue);
            }
            
        });
        $scope.data = [];
        $scope.data_desktop = [];
        $scope.data_mobile = [];
        $scope.type = 'categoryslide';
        $scope.done = false;
        $scope.prev_win_size = $(window).width();
        $scope.getdata = function(newvalue){
            var dataSend = {
                'txt_referral_type_id': 11,
                'txt_parent_id': newvalue,
            };
            GAEAPI.get('referral/map', dataSend, $scope).then(function (res) { 
                if(res.ok != 1){
                    return;
                }
                
                if(res.data.length > 0){
                    $scope.data = res.data;
                }else{
                    $scope.data = [];
                    $scope.getproductdata(newvalue);
                }
                
            });
        };
        $scope.data_product = [];
        $scope.getproductdata = function(referal_id){
            var txt_filter_json = {
                'referral_id_array': [referal_id],
                'badge_id_array':[18],
            };
            var data_sent = {
                'cur_page': 1,
                'per_page': 12,
                'txt_filter_json': JSON.stringify(txt_filter_json),
            };
            GAEAPI.get('product/lists', data_sent , $scope).then(function (res) {
                if (res.ok === 1) {
                    $scope.data_product = res.data.dataList;
                }
            });
        };
        $scope.viewData = function(){
            return ($(window).width() > 991) ? $scope.data_desktop : $scope.data_mobile;
        };
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.imageSize = function(){
            return angular.element("img.image_lazy_loaded").length;
        };
        $scope.initSlider = function(){
            var elementName = '.component_carousel_map[data-id="'+$scope._key()+'"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 4,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false
            };
            optionsParmas.responsive = [
            {
                breakpoint: 1200,
                settings: {
                    slidesToShow: 3,
                    slidesToScroll: 1,
                    variableWidth: false,
                    centerMode: false
                }
            }, {
                breakpoint: 769,
                settings: {
                    slidesToShow: 2,
                    slidesToScroll: 1,
                    variableWidth: false,
                    centerMode: false
                }
            }, {
                breakpoint: 601,
                settings: {
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    variableWidth: false,
                    centerMode: false,
                }
            }, {
                breakpoint: 481,
                settings: {
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    variableWidth: false,
                    centerMode: false,
                    dots: false,
                    arrows: false,
                }
            }
            ];
            var extraOptions = {
                animate: false
            };
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
            angular.element($window).bind('resize',function(){
                if($scope.prev_win_size != $(window).width()){
                    if($(elementName).hasClass('slick-initialized') || $(elementName).hasClass('slick-slider')){
                        $(elementName).slick('unslick');                       
                    }
                    setTimeout(function(){  
                        if($(elementName).hasClass('slick-initialized') || $(elementName).hasClass('slick-slider')){
                            $(elementName).slick('unslick');                       
                        }                      
                        sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);                        
                    }, 3000);                    
                }
            });
        };
        $scope.checkHide = function(){
            var r = false;
            if(angular.element('.component_carousel_map.slick-initialized[data-id="'+$scope._key()+'"]').length){
                r = true;
            }
            return r;
        };
        $scope.viewLink = function(i){
            $window.location.href=i;
        };
        /**
         * Check if object array available for "website application" or "Mobile application"
         * @params object array
         * return true | false (default)
         */
         $scope._showWeb = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 18) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showApp = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 19) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        /* Watch when finish repeat */
        $rootScope.$on('repeatend', function() {
            if($('.component_carousel_map[data-id="'+$scope._key()+'"]').not('.slick-initialized')){
                $timeout(function(){
                    $scope.initSlider();
                }, 500);                
            }            
        });
        $scope.checkHide = function(){
            return ($('.component_carousel_map.slick-initialized[data-id="'+$scope._key()+'"]').length > 0) ? true : false;
        };
        $scope.slickGoLeft=function(){
            setTimeout(function () {
                $('.component_carousel_map[data-id="'+$scope._key()+'"]').slick('slickPrev');
            }, 100);
        };
        
        $scope.slickGoRight=function(){
            setTimeout(function () {
                $('.component_carousel_map[data-id="'+$scope._key()+'"]').slick('slickNext');
            }, 100);
        };
        $scope.checkSeo=function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentClientImage', function ($rootScope, $routeParams) {
    var templateName = 'componentClientImage';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        component: '@component',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	
    };
    return promise;
});
_ui_share_app.directive('componentClientImageA', function ($rootScope, $routeParams) {
    var templateName = 'componentClientImageA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        component: '@component',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	
    };
    return promise;
});
_ui_share_app.factory('$componentCollection', function componentCollection($routeParams, $timeout) {
    return
});_ui_share_app.directive('componentCollectionIdTypeA', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCollectionIdTypeA';
    var componentMain = 'componentCollection';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        col: '@col',
        component: '@component',
        stylebutton: '@stylebutton',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope._dataArray = [];
        $scope._dataTime = {
            start: 0,
            end: 0
        };
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            console.log("CHECK COLLECTION READY ");
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_collection_id': id,
            };
            GAEAPI.get('collection/id', dataSend).then(function(output) {
                console.log("CHECK COLLECTION START ", output);
                if (output.ok === 1) {
                    var item = output.data;
                    $scope._dataArray = item;
                    $scope._dataTime.start = item.collection_lifetime.lifetime_start_time;
                    $scope._dataTime.end = item.collection_lifetime.lifetime_end_time;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope.collectionData = false;
        $scope.collectionDataSend = false;
        $scope.isLoadMore = false;
        $scope.isLoadMoreHide = false;
        $scope.getDetail = function(id) {
            var dataSend = {
                'txt_collection_id': id,
                'cur_page': ($scope.collectionDataSend) ? $scope.collectionDataSend.cur_page : 1,
                'per_page': ($scope.collectionDataSend) ? $scope.collectionDataSend.per_page : 12,
                'txt_badge_id': 18
            };
            $scope.collectionDataSend = dataSend;
            GAEAPI.get('collection/short_id', dataSend).then(function(e) {
                console.log("collection/id: res", e);
                if (dataSend.cur_page > 1) {
                    var oldProductArray = $scope.collectionData.collection_product_array;
                    var currentData = e.data.collection_product_array;
                    var mergeProductArray = oldProductArray.concat(currentData);
                    $scope.collectionData.collection_product_array = mergeProductArray;
                } else {
                    $scope.collectionData = e.data;
                }
                $scope.isLoadMore = false;
                var maxPage = parseInt($scope.collectionData.collection_product_pagination.total_page);
                var nextPage = parseInt($scope.collectionData.collection_product_pagination.next_page);
                if (dataSend.cur_page >= maxPage) {
                    $scope.isLoadMoreHide = true;
                }
            });
        };
        $scope.getDetail($scope._idUrl($scope._viewRouteParams().collection_id));
        $scope.loadMore = function() {
            $scope.collectionDataSend.cur_page = $scope.collectionDataSend.cur_page + 1;
            $scope.isLoadMore = true;
            $timeout(function() {
                $scope.getDetail($scope._idUrl($scope._viewRouteParams().collection_id));
            }, 100);
        };
        $scope.timeHide = function(timestampStart, timestampEnd) {
            var dates = new Date().getTime();
            var datesLen = dates.toString().length;
            var timeStart = String(timestampStart);
            var timeEnd = String(timestampEnd);
            var subdate = parseInt(dates.toString().substring(0, timeEnd.length));
            var end = timestampEnd - subdate;
            return (timestampEnd == -1) ? 1 : end;
        };
        $scope.timeReplace = function(timestampStart, timestampEnd) {
            var dates = new Date().getTime();
            var datesLen = dates.toString().length;
            var timeStart = String(timestampStart);
            var timeEnd = String(timestampEnd);
            var subdate = parseInt(dates.toString().substring(0, timeEnd.length));
            var end = timestampEnd - subdate;
            if (timestampEnd == -1) {
                end = 1;
            }
            if (end <= 0) {
                if ($scope._dataTime.end == "-1" || $scope._dataTime.end == -1) {
                    return;
                }
                window.location.href = 'home';
            }
        };
        $scope.check = function() {
            return {
                start: function(inputTimeStamp) {
                    var todayTimeStamp = (new Date().getTime() / 1000);
                    var targetTimeStamp = parseInt(inputTimeStamp);
                    return (targetTimeStamp <= todayTimeStamp) ? true : false;
                },
                end: function(inputTimeStamp) {
                    var todayTimeStamp = (new Date().getTime() / 1000);
                    var targetTimeStamp = parseInt(inputTimeStamp);
                    if (parseInt(targetTimeStamp) == -1) {
                        return true;
                    }
                    return (targetTimeStamp > todayTimeStamp) ? true : false;
                },
            }
        };
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.dates = new Date();
                $scope.timeReplace($scope._dataTime.start, $scope._dataTime.end);
                $scope.timeCountStart();
            }, 1000);
        };
        $scope.$watch('col', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            $scope._col = newValue.toString().split(",");
        });
        $scope.getCol = function(n) {
            return (typeof $scope._col != 'undefined') ? (typeof $scope._col[n] != 'undefined' && $scope._col[n] != '') ? $scope._col[n] : 12 : 12;
        };
        $scope.checkShop = function() {
            if (CUR_THEME.shop_id() == "646") {
                return 646;
            } else {
                return false;
            }
        };
        $scope.showWeb = function(objArr) {
            var show = false;
            for (var i = 0; i < objArr.length; i++) {
                if (parseInt(objArr[i].badge_id) == 18) {
                    show = true;
                    break;
                }
            }
            return show;
        };
    };
    return promise;
});_ui_share_app.directive('componentCollectionIdTypeB', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCollectionIdTypeB';
    var componentMain = 'componentCollection';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.viewRouteParams = function() {
            return $routeParams;
        };
    };
    return promise;
});_ui_share_app.directive('componentCollectionIdTypeC', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCollectionIdTypeC';
    var componentMain = 'componentCollection';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        margin: '@margin',
        card: '@card',
        stylebutton: '@stylebutton',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window, $http) {
        $scope._component = {
            name: "componentCollectionIdTypeC",
            show: (window.location.hostname == "localhost") ? true : false
        };
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        /* scope */
        $scope._name = ($scope.name != undefined && $scope.name != "") ? $scope.name : "default";
        $scope._margin = ($scope.margin != undefined && $scope.margin != "") ? {
            margin: $scope.margin
        } : {
            margin: 0
        };
        $scope._card = ($scope.card != undefined && $scope.card != "") ? $scope.card : "c";
        $scope._stylebutton = ($scope.stylebutton != undefined && $scope.stylebutton != "") ? $scope.stylebutton : "border_button_small";
        /* scope */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._component.show) {
                        console.log($scope._component.name, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(_self, params, state);
                },
                getCollectionId: function(params, callback) {
                    var _self = this;
                    var collection_id = (params.collection_id != undefined) ? params.collection_id.split("-", 1).join("") : false;
                    _self.consoleLog("getBranchId", "collection_id", collection_id);
                    callback(collection_id);
                },
                formatDataSend: function(data, callback) {
                    var _self = this;
                    _self.consoleLog("formatDataSend", "data", data);
                    callback(data);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData", "state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend", "api", api);
                    _self.consoleLog("dataSend", "dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi", "ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.consoleLog("getApi", "res_api", res_api);
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi", "res_ok", res_ok);
                            state = _self.stateData(false, true);
                            _self.consoleLog("checkGetApi", "state", state);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        /* get api */
        $scope.data_api = {
            load_more: {
                load: false,
                cur_page: 1,
                per_page: 12,
                total_rows: 0
            },
            collection_id: {
                data_send: {},
                api: "collection/short_id",
                ok: false,
                data_array: [],
                data_array_state: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.loadMore = function() {
            if (!$scope.data_api.load_more.load) {
                $scope.data_api.load_more.cur_page++;
                $scope.data_api.load_more.load = true;
                $scope.getData().getRouteParams(function(_self, params, state) {
                    _self.getCollectionId(params, function(res_collection_id) {
                        _self.formatDataSend($scope.data_api.collection_id, function(res_data) {
                            var filter_json = {};
                            var dataSend = {
                                'txt_collection_id': res_collection_id,
                                'cur_page': $scope.data_api.load_more.cur_page,
                                'per_page': $scope.data_api.load_more.per_page,
                                'txt_badge_id': 18,
                                'txt_filter_json': JSON.stringify(filter_json)
                            };
                            res_data.data_send = dataSend;
                            _self.dataSend(res_data.api, res_data.data_send, function(res_api, res_data_send) {
                                _self.getApi(res_api, res_data_send, function(res_ok, res_api, res_state) {
                                    res_data.ok = res_ok;
                                    if (res_data.data_array.collection_product_array.length < res_api.data.collection_product_pagination.total_rows) {
                                        var oldData = res_data.data_array.collection_product_array;
                                        res_data.data_array.collection_product_array = oldData.concat(res_api.data.collection_product_array);
                                        $scope.data_api.load_more.total_rows = res_api.data.collection_product_pagination.total_rows;
                                        _self.consoleLog("getApiData", "res_data", res_data);
                                    } else {
                                        $scope.data_api.load_more.cur_page--;
                                    }
                                    $scope.data_api.load_more.load = false;
                                });
                            });
                        });
                    });
                });
            }
        }
        $scope.getData().getRouteParams(function(_self, params, state) {
            $scope.data_api.collection_id.data_array_state = state;
            _self.getCollectionId(params, function(res_collection_id) {
                _self.formatDataSend($scope.data_api.collection_id, function(res_data) {
                    var filter_json = {};
                    var dataSend = {
                        'txt_collection_id': res_collection_id,
                        'cur_page': $scope.data_api.load_more.cur_page,
                        'per_page': $scope.data_api.load_more.per_page,
                        'txt_badge_id': 18,
                        'txt_filter_json': JSON.stringify(filter_json)
                    };
                    res_data.data_send = dataSend;
                    _self.dataSend(res_data.api, res_data.data_send, function(res_api, res_data_send) {
                        _self.getApi(res_api, res_data_send, function(res_ok, res_api, res_state) {
                            res_data.ok = res_ok;
                            res_data.data_array = res_api.data;
                            res_data.data_array_state = res_state;
                            _self.consoleLog("getApiData", "res_data", res_data);
                            $scope.data_api.load_more.total_rows = res_api.data.collection_product_pagination.total_rows;
                        });
                    });
                });
            });
        });
        /* get api */
    };
    return promise;
});_ui_share_app.directive('componentCollectionSlideTypeA', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCollectionSlideTypeA';
    var componentMain = 'componentCollection';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        sortby: '@sortby',
        component: '@component',
        stylebutton: '@stylebutton',
        margintopic: '@margintopic',
        margincard: '@margincard',
        limit: '@limit',
        iconsize: '@iconsize',
        iconnext: '@iconnext',
        iconback: '@iconback',
        showresult: '@showresult',
        dots: '@dots',
        arrows: '@arrows',
        autoplay: '@autoplay',
        centermode: '@centermode',
        variablewidth: '@variablewidth',
        infinite: '@infinite',
        slidestoscroll: '@slidestoscroll',
        lg: '@lg',
        md: '@md',
        sm: '@sm',
        xs: '@xs',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'topic_top': '?topicTop',
    };
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._component = (typeof $scope.component !== 'undefined' && $scope.component !== '') ? $scope.component : 'null';
        $scope._limit = parseInt((typeof $scope.limit !== 'undefined' && typeof $scope.limit !== '') ? $scope.limit : 6);
        $scope._sortby = (typeof $scope.sortby !== 'undefined' && typeof $scope.sortby !== '') ? $scope.sortby : 'collection_create_time_DESC';
        $scope._iconsize = (typeof $scope.iconsize !== 'undefined' && typeof $scope.iconsize !== '') ? $scope.iconsize : 30;
        $scope._iconback = (typeof $scope.iconback !== 'undefined' && typeof $scope.iconback !== '') ? $scope.iconback : 'icnt_outline_backbig02_light@2x.png';
        $scope._iconnext = (typeof $scope.iconnext !== 'undefined' && typeof $scope.iconnext !== '') ? $scope.iconnext : 'icnt_outline_nextbig02_light@2x.png';
        $scope._dots = Boolean((typeof $scope.dots !== 'undefined' && typeof $scope.dots !== '') ? $scope.dots : true);
        $scope._arrows = Boolean((typeof $scope.arrows !== 'undefined' && typeof $scope.arrows !== '') ? $scope.arrows : true);
        $scope._autoplay = Boolean((typeof $scope.autoplay !== 'undefined' && typeof $scope.autoplay !== '') ? $scope.autoplay : true);
        $scope._centerMode = Boolean((typeof $scope.centermode !== 'undefined' && typeof $scope.centermode !== '') ? $scope.centerMode : false);
        $scope._variableWidth = Boolean((typeof $scope.variablewidth !== 'undefined' && typeof $scope.variablewidth !== '') ? $scope.variablewidth : false);
        $scope._infinite = Boolean((typeof $scope.infinite !== 'undefined' && typeof $scope.infinite !== '') ? $scope.infinite : true);
        $scope._slidesToScroll = parseInt((typeof $scope.slidestoscroll !== 'undefined' && typeof $scope.slidestoscroll !== '') ? $scope.slidestoscroll : 4);
        $scope._col_lg = parseInt((typeof $scope.lg !== 'undefined' && typeof $scope.lg !== '') ? $scope.lg : 4);
        $scope._col_md = parseInt((typeof $scope.md !== 'undefined' && typeof $scope.md !== '') ? $scope.md : 3);
        $scope._col_sm = parseInt((typeof $scope.sm !== 'undefined' && typeof $scope.sm !== '') ? $scope.sm : 2);
        $scope._col_xs = parseInt((typeof $scope.xs !== 'undefined' && typeof $scope.xs !== '') ? $scope.xs : 1);
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getCollectionArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'cur_page': 1,
                'per_page': $scope._limit,
                'txt_sortby': $scope._sortby,
            };
            console.log('dataSend_collection_short_lists', dataSend);
            GAEAPI.get('collection/short_lists', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data.dataList;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getCollectionArray();
        $scope.mkCarousel = function(elem) {
            $('.component-collection-slide-id-type-a').css('height', '0');
            $('.component-collection-slide-id-type-a').css('opacity', '0');
            console.log("col-lg-md-xs-sm : ", $scope._col_lg, $scope._col_md, $scope._col_xs, $scope._col_sm);
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: $scope._dots,
                    arrows: $scope._arrows,
                    autoplay: $scope._autoplay,
                    centerMode: $scope._centerMode,
                    variableWidth: $scope._variableWidth,
                    autoplaySpeed: 4000,
                    slidesToShow: $scope._col_lg,
                    slidesToScroll: 1,
                    infinite: $scope._infinite,
                    speed: 600,
                    prevArrow: '
',
                    responsive: [{
                        breakpoint: 1199,
                        settings: {
                            slidesToShow: 3,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 2,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: 1,
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._dataArray = [];
        $scope._dataArrayDone = false;
        $scope._getDataArray = function(id) {
            var dataSend = {
                'txt_referral_id': id
            };
            GAEAPI.get('referral/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    console.log("_dataArray", $scope._dataArray);
                }
            });
        };
        $scope._getDataArray($scope.referralid);
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.openCity = function(evt, cityName) {
            var i, tabcontent, tablinks;
            tabcontent = document.getElementsByClassName("tabcontent");
            for (i = 0; i < tabcontent.length; i++) {
                tabcontent[i].style.display = "none";
            }
            tablinks = document.getElementsByClassName("tablinks");
            for (i = 0; i < tablinks.length; i++) {
                tablinks[i].className = tablinks[i].className.replace(" active", "");
            }
            document.getElementById(cityName).style.display = "block";
            evt.currentTarget.className += " active";
        }
        $scope.displayImage = function(image_url, prefix) {
            return GAEAPI.getGaeImageUrl(image_url, prefix);
        }
    };
    return promise;
});_ui_share_app.directive('componentCategoryFeaturedSildeA', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryFeaturedSildeA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.carousel = function(cover_in, carousel_in) {
            $scope.getData().consoleLog("imageCarousel : cover_in : ", cover_in);
            $scope.getData().consoleLog("imageCarousel : carousel_in :", carousel_in);
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: false,
                    autoplay: true,
                    autoplaySpeed: 5000,
                    slidesToShow: 4,
                    slidesToScroll: 4,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                    responsive: [{
                        breakpoint: 1199,
                        settings: {
                            slidesToShow: 4,
                            slidesToScroll: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 3,
                            slidesToScroll: 3,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: 2,
                            slidesToScroll: 2,
                        }
                    }]
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1500);
        };
        $scope.getData = function() {
            var data = {
                consoleLog: function(name, data) {
                    /* console.log(name, data); */
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(number, api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(number, api, dataSend);
                },
                getApi: function(number, api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(number, output);
                    });
                },
                titleUrl: function(str) {
                    var url = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    return url;
                },
                locationUrlProductDetail: function(product_id, product_title) {
                    var _self = this;
                    var url = 'product-detail/';
                    url += product_id + '-';
                    url += _self.titleUrl(product_title);
                    _self.locationUrl(url, '');
                },
                locationUrl: function(url) {
                    if (url != "") {
                        $location.url(url).replace();
                    }
                },
                windowLocation: function(url) {
                    if (url != "") {
                        window.location.href = url;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return data;
        };
        $scope.dataArray = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataSet = [{
            number: 0,
            api: "referral/lists",
            dataSend: {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 5,
                'txt_sortby': 'referral_sort_index_asc_time_desc',
                'txt_filter_json': JSON.stringify({
                    "badge_id_array": [16]
                })
            },
        }, {
            number: 1,
            api: "product/lists",
            dataSend: {},
        }];
        $scope.getData().dataSend($scope.dataSet[0].number, $scope.dataSet[0].api, $scope.dataSet[0].dataSend, function(number, api, dataSend) {
            $scope.dataArrayState = $scope.getData().stateData(true, false);
            $scope.getData().getApi(0, api, dataSend, function(number, output) {
                $scope.dataArray = output.data.dataList;
                $scope.dataArrayState = $scope.getData().stateData(false, true);
                $scope.getData().consoleLog("getData : dataArray :  ", $scope.dataArray);
                for (var a = 0; a < output.data.dataList.length; a++) {
                    $scope.dataArray[a].referral_product_carousel = a;
                    $scope.dataArray[a].referral_product_state = $scope.getData().stateData(true, false);
                    $scope.dataArray[a].referral_products = [];
                    var filter_json = {
                        referral_id_array: [output.data.dataList[a].referral_id],
                    }
                    $scope.dataSet[1].dataSend = {
                        'cur_page': 1,
                        'per_page': 8,
                        'txt_sortby': 'product_lastest_create',
                        'txt_filter_json': JSON.stringify(filter_json)
                    }
                    $scope.getData().dataSend(a, $scope.dataSet[1].api, $scope.dataSet[1].dataSend, function(a, api, dataSend) {
                        $scope.getData().getApi(a, api, dataSend, function(number, output) {
                            $scope.dataArray[number].referral_products = output.data.dataList;
                            $scope.dataArray[a].referral_product_state = $scope.getData().stateData(false, true);
                            $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                            $scope.getData().consoleLog("getData : a            : ", a);
                            $scope.getData().consoleLog("getData : product_lists : ", $scope.dataArray[number].referral_products);
                            $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                            $scope.getData().consoleLog("getData : dataArray : ", $scope.dataArray);
                        });
                    });
                }
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentCategoryFeaturedTabsTypeA', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryFeaturedTabsTypeA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.getData = function() {
            var data = {
                consoleLog: function(name, data) {
                    /* console.log(name, data); */
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(number1, number2, api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : number1   : ", number1);
                    _self.consoleLog("getData : number2   : ", number2);
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(number1, number2, api, dataSend);
                },
                getApi: function(number1, number2, api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : number1   : ", number1);
                        _self.consoleLog("getData : number2   : ", number2);
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(number1, number2, output);
                    });
                },
                main: function() {
                    var _self = this;
                },
                titleUrl: function(str) {
                    var url = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    return url;
                },
                locationUrlProductDetail: function(product_id, product_title) {
                    var _self = this;
                    var url = 'product-detail/';
                    url += product_id + '-';
                    url += _self.titleUrl(product_title);
                    _self.locationUrl(url, '');
                },
                locationUrl: function(template, data) {
                    $location.url(template + data).replace();
                },
                getHeight: function() {
                    return ($(window).width() > 767) ? 100 : 60;
                }
            }
            return data;
        };
        $scope.buy = function() {
            var data = {
                buyProcess: function(product_id, product_total_stock) {
                    var _self = this;
                    if (product_total_stock != '0') {
                        _self.isSelected(product_id, function(selected) {
                            console.log("buy : buyProcess : isSelected : ", selected);
                            if (!selected) {
                                _self.isProgress(product_id, function(progress) {
                                    console.log("buy : buyProcess : isProgress : ", progress);
                                    if (!progress) {
                                        var root_virtual_cart_type_b = $('#root-virtual-cart-type-b').hasClass('show');
                                        if (!root_virtual_cart_type_b) {
                                            $virtualCartTypeB.isCart();
                                        } else {
                                            $virtualCartTypeB.isLoad();
                                        }
                                        UiCart.delegate.product.add(product_id, 1, 0, function(output) {
                                            console.log("buy : buyProcess : add : ", output);
                                            if (!root_virtual_cart_type_b) {
                                                $virtualCartTypeB.isCart();
                                            } else {
                                                $virtualCartTypeB.isLoad();
                                            }
                                        });
                                    }
                                });
                            }
                        });
                    } else {
                        alert("สินค้าหมดแล้วนะค่ะ");
                    }
                },
                isSelected: function(product_id, callback) {
                    var selected = UiCart.delegate.product.isSelected(product_id);
                    callback(selected);
                },
                isProgress: function(product_id, callback) {
                    var progress = UiCart.delegate.product.isProgress(product_id);
                    callback(progress);
                }
            }
            return data;
        };
        $scope.tags = {
            index: '0'
        };
        $scope.dataArray = [];
        $scope.dataSet = [{
            api: "referral/short_lists",
            dataSend: {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 10,
                'txt_badge_id': 16,
                'txt_parent_id': 0,
                'txt_sortby': 'referral_sort_index_asc_time_desc',
            },
        }, {
            api: "referral/map",
            dataSend: {},
        }, {
            api: "product/lists",
            dataSend: {},
        }];
        $scope.getData().dataSend(0, 0, $scope.dataSet[0].api, $scope.dataSet[0].dataSend, function(number1, number2, api, dataSend) {
            $scope.getData().getApi(number1, number2, api, dataSend, function(number1, number2, output) {
                $scope.dataArray = output.data.dataList;
                $scope.getData().consoleLog("getData : dataArray :  ", $scope.dataArray);
                for (var a = 0; a < output.data.dataList.length; a++) {
                    $scope.getData().getRouteParams(function(params) {
                        if (typeof params.root_id != 'undefined') {
                            $scope.tags.index = params.root_id.toString();
                        } else {
                            $scope.tags.index = output.data.dataList[0].referral_id.toString();
                        }
                    });
                    $scope.dataArray[a].referral_sub_array_state = $scope.getData().stateData(true, false);
                    $scope.dataArray[a].referral_sub_array = [];
                    $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                    $scope.getData().consoleLog("getData : number        : ", a);
                    $scope.getData().consoleLog("getData : referral_id   : ", output.data.dataList[a].referral_id);
                    $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                    $scope.dataSet[1].dataSend = {
                        'txt_referral_type_id': 11,
                        'txt_parent_id': output.data.dataList[a].referral_id
                    }
                    $scope.getData().dataSend(a, 0, $scope.dataSet[1].api, $scope.dataSet[1].dataSend, function(number1, number2, api, dataSend) {
                        $scope.getData().getApi(number1, number2, api, dataSend, function(number1, number2, output) {
                            $scope.dataArray[number1].referral_sub_array = output.data;
                            $scope.dataArray[number1].referral_sub_array_state = $scope.getData().stateData(false, true);
                            $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                            $scope.getData().consoleLog("getData : number1               : ", number1);
                            $scope.getData().consoleLog("getData : referral_sub_array   : ", $scope.dataArray[number1].referral_sub_array);
                            $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                            for (var b = 0; b < output.data.length; b++) {
                                $scope.dataArray[number1].referral_sub_array[b].product_state = $scope.getData().stateData(true, false);
                                $scope.dataArray[number1].referral_sub_array[b].product_list = [];
                                $scope.getData().consoleLog("getData : dataSend to getApi to for : for : ", "------- dataSet.dataArray -------");
                                $scope.getData().consoleLog("getData : number2        : ", b);
                                $scope.getData().consoleLog("getData : referral_id   : ", output.data[b].referral_id);
                                $scope.getData().consoleLog("getData : dataSend to getApi to for : for : ", "------- dataSet.dataArray -------");
                                var filter_json = {
                                    "referral_id_array": [output.data[b].referral_id],
                                }
                                $scope.dataSet[2].dataSend = {
                                    'cur_page': 1,
                                    'per_page': 200,
                                    'txt_sortby': 'product_lastest_create',
                                    'txt_filter_json': JSON.stringify(filter_json)
                                }
                                $scope.getData().dataSend(number1, b, $scope.dataSet[2].api, $scope.dataSet[2].dataSend, function(number1, number2, api, dataSend) {
                                    $scope.getData().getApi(number1, number2, api, dataSend, function(number1, number2, output) {
                                        $scope.getData().consoleLog("getData : getApi : output : ", output);
                                        $scope.dataArray[number1].referral_sub_array[number2].product_list = output.data.dataList;
                                        $scope.dataArray[number1].referral_sub_array[number2].product_state = $scope.getData().stateData(false, true);
                                        $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                                        $scope.getData().consoleLog("getData : number1      : ", number1);
                                        $scope.getData().consoleLog("getData : number2      : ", number2);
                                        $scope.getData().consoleLog("getData : product_list : ", $scope.dataArray[number1].referral_sub_array[number2].product_list);
                                        $scope.getData().consoleLog("getData : dataSend to getApi to for : ", "------- dataSet.dataArray -------");
                                        $scope.getData().getRouteParams(function(params) {
                                            if (typeof params.referral_id != 'undefined' && typeof params.referral_id != '0') {
                                                $timeout(function() {
                                                    $('html, body').animate({
                                                        scrollTop: $("div[id='" + params.referral_id + "']").offset().top - $scope.getData().getHeight()
                                                    }, 200);
                                                }, 1000);
                                            }
                                        });
                                    });
                                });
                            }
                        });
                    });
                }
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentCategoryFeaturedTabsTypeB', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryFeaturedTabsTypeB';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(name, data) {
                    console.log('componentCategoryFeaturedTabsTypeB : ', name, data);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(load, done) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : load : ", load);
                    _self.consoleLog("getData : done : ", done);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: load,
                        done: done
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                titleUrl: function(str) {
                    var url = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    return url;
                },
                locationUrl: function(template) {
                    $location.url(template).replace();
                },
                categoryUrl: function(rootId, referralId) {
                    var _self = this;
                    var template = "category-lists";
                    var res_template = template.concat("?root_id=", rootId, "&referral_id=", referralId, "&referral_type=category");
                    _self.locationUrl(res_template);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.cover_top = "products";
        $scope.state = "";
        $scope.dataArrayMain = [];
        $scope.dataArrayMainState = $scope.getData().stateData(false, false);
        $scope.dataArray = [];
        $scope.dataArrayState = $scope.getData().stateData(false, false);
        $scope.getData().getRouteParams(function(params) {
            $scope.routeParams = params;
            $scope.dataArrayState = $scope.getData().stateData(true, false);
            if (params.root_id == undefined && params.referral_id == undefined && params.sendtag == undefined && params.badge_id == undefined) {
                $scope.cover_top = "products";
                $scope.state = "main_category";
                var txt_filter_json = {
                    badge_id_array: [16, 18]
                };
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_sortby': 'referral_sort_index_asc_name_desc',
                    'txt_filter_json': JSON.stringify(txt_filter_json)
                };
                $scope.dataArrayMainState = $scope.getData().stateData(true, false);
                $scope.getData().dataSend('referral/map', dataSend, function(api, dataSend) {
                    $scope.getData().getApi(api, dataSend, function(output) {
                        $scope.dataArrayMain = output.data;
                        $scope.dataArrayMainState = $scope.getData().stateData(false, true);
                        for (var i = 0; i < output.data.length; i++) {
                            var loop = 0;
                            var txt_filter_json = {};
                            var dataSend = {
                                'txt_referral_type_id': 11,
                                'txt_parent_id': output.data[i].referral_id,
                                'txt_sortby': 'referral_sort_index_asc_name_desc',
                                'txt_filter_json': JSON.stringify(txt_filter_json)
                            };
                            $scope.dataArrayState = $scope.getData().stateData(true, false);
                            $scope.getData().dataSend('referral/map', dataSend, function(api, dataSend) {
                                $scope.getData().getApi(api, dataSend, function(res_output) {
                                    var oldData = $scope.dataArray;
                                    $scope.dataArray = oldData.concat(res_output.data);
                                    loop = loop + 1;
                                    if (output.data.length == loop) {
                                        $scope.dataArrayState = $scope.getData().stateData(false, true);
                                    }
                                });
                            });
                        }
                    });
                });
            } else if (params.root_id == '0' && params.referral_id != undefined && params.sendtag == undefined && params.badge_id == undefined) {
                $scope.state = "sub_category";
                var dataSend = {
                    'txt_referral_id': params.referral_id
                };
                $scope.getData().dataSend('referral/id', dataSend, function(api, dataSend) {
                    $scope.getData().getApi(api, dataSend, function(output) {
                        console.log("referral/id : output.data : ", output.data);
                        $scope.cover_top = output.data.referral_name;
                    });
                });
                var txt_filter_json = {
                    'badge_id_array': [16, 18]
                };
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_sortby': 'referral_sort_index_asc_name_desc',
                    'txt_filter_json': JSON.stringify(txt_filter_json)
                };
                $scope.dataArrayMainState = $scope.getData().stateData(true, false);
                $scope.getData().dataSend('referral/map', dataSend, function(api, dataSend) {
                    $scope.getData().getApi(api, dataSend, function(output) {
                        $scope.dataArrayMain = output.data;
                        $scope.dataArrayMainState = $scope.getData().stateData(false, true);
                    });
                });
                var txt_filter_json = {};
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_parent_id': params.referral_id,
                    'txt_sortby': 'referral_sort_index_asc_name_desc',
                    'txt_filter_json': JSON.stringify(txt_filter_json)
                };
                $scope.dataArrayState = $scope.getData().stateData(true, false);
                $scope.getData().dataSend('referral/map', dataSend, function(api, dataSend) {
                    $scope.getData().getApi(api, dataSend, function(output) {
                        $scope.dataArray = output.data;
                        $scope.dataArrayState = $scope.getData().stateData(false, true);
                    });
                });
            } else if (params.root_id != '0' && params.referral_id != undefined && params.sendtag == undefined && params.badge_id == undefined) {
                $scope.state = "sub_category";
                var dataSend = {
                    'txt_referral_id': params.referral_id
                };
                $scope.getData().dataSend('referral/id', dataSend, function(api, dataSend) {
                    $scope.getData().getApi(api, dataSend, function(output) {
                        $scope.cover_top = output.data.referral_name;
                    });
                });
                var txt_filter_json = {
                    'badge_id_array': [16, 18]
                };
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_sortby': 'referral_sort_index_asc_name_desc',
                    'txt_filter_json': JSON.stringify(txt_filter_json)
                };
                $scope.dataArrayMainState = $scope.getData().stateData(true, false);
                $scope.getData().dataSend('referral/map', dataSend, function(api, dataSend) {
                    $scope.getData().getApi(api, dataSend, function(output) {
                        $scope.dataArrayMain = output.data;
                        $scope.dataArrayMainState = $scope.getData().stateData(false, true);
                    });
                });
                $scope.dataArrayState = $scope.getData().stateData(false, true);
            } else if (params.root_id == undefined && params.referral_id == undefined && params.sendtag != undefined && params.badge_id == undefined) {
                $scope.state = "sendtag_products";
                $scope.dataArrayState = $scope.getData().stateData(false, true);
            } else if (params.root_id == undefined && params.referral_id == undefined && params.sendtag == undefined && params.badge_id != undefined) {
                $scope.state = "badge_products";
                $scope.dataArrayState = $scope.getData().stateData(false, true);
            } else {
                $scope.dataArrayState = $scope.getData().stateData(false, true);
            }
        });
    };
    return promise;
});_ui_share_app.directive('componentCategoryFeaturedTabsTypeBp', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryFeaturedTabsTypeBp';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        referralid: '@referralid',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope._component = {
            name: "componentCategoryFeaturedTabsTypeBp",
            show: (window.location.hostname == "localhost") ? true : false
        };
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        /* scope */
        $scope._name = ($scope.name != undefined && $scope.name != "") ? $scope.name : "default";
        $scope._margin = ($scope.margin != undefined && $scope.margin != "") ? {
            margin: $scope.margin
        } : {
            margin: 0
        };
        $scope._limit = ($scope.limit != undefined && $scope.limit != "") ? parseInt($scope.limit) : 1;
        /* scope */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._component.show) {
                        console.log($scope._component.name, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(_self, params, state);
                },
                getBlogId: function(params, callback) {
                    var _self = this;
                    var blog_id = (params.blog_id != undefined) ? params.blog_id.split("-", 1).join("") : false;
                    _self.consoleLog("getBlogId", "blog_id", blog_id);
                    callback(blog_id);
                },
                formatDataSend: function(data, callback) {
                    var _self = this;
                    _self.consoleLog("formatDataSend", "data", data);
                    callback(data);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData", "state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend", "api", api);
                    _self.consoleLog("dataSend", "dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi", "ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.consoleLog("getApi", "res_api", res_api);
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi", "res_ok", res_ok);
                            state = _self.stateData(false, true);
                            _self.consoleLog("checkGetApi", "state", state);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getDate: function(locale, format, lifetime, callback) {
                    var _self = this;
                    locale = (locale == '') ? 'en' : locale;
                    format = (format == '') ? 'LL' : format;
                    lifetime = (lifetime != "-1" && lifetime != "") ? lifetime : "";
                    if (lifetime != "") {
                        moment.locale(locale);
                        lifetime = moment.unix(parseInt(lifetime)).format(format);
                    }
                    _self.consoleLog("getDate", "lifetime", lifetime);
                    callback(lifetime);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                getCur: function(index, total, show, start, end, callback) {
                    var _self = this;
                    if (index == 1 && total > show) {
                        end = show;
                    } else if (index == total && total > show) {
                        start = total - (show - 1);
                    } else if (index < show && index <= (show / 2) && total > show) {
                        end = show;
                    } else if (index > (show / 2) && (index + (show / 2)) <= total && total > show) {
                        start = (index - ((show / 2) - 1));
                        end = (index + ((show / 2)));
                    } else if (index < total && total > show) {
                        start = total - (show - 1);
                    }
                    _self.getCurArray(start, end, function(res_cur_page_array) {
                        _self.consoleLog("getCur", "res_cur_page_array", res_cur_page_array);
                        callback(res_cur_page_array);
                    });
                },
                getCurArray: function(start, end, callback) {
                    var _self = this;
                    var cur_page_array = [];
                    for (var i = start; i <= end; i++) {
                        var item = {
                            state: true,
                            number: i
                        }
                        cur_page_array.push(item);
                    }
                    _self.consoleLog("getCurArray", "cur_page_array", cur_page_array);
                    callback(cur_page_array);
                },
                getCurPageArray: function(curPage, perPage, totalRows, callback) {
                    var _self = this;
                    var show = 6;
                    var cur_pages = Math.round(totalRows / perPage);
                    var cur_page_array = [];
                    var cur = {
                        start: 1,
                        end: cur_pages
                    }
                    _self.getCur(curPage, cur_pages, show, cur.start, cur.end, function(res_cur_page_array) {
                        cur_page_array = res_cur_page_array;
                    });
                    _self.consoleLog("getCurPageArray", "cur_page_array", cur_page_array);
                    callback(cur_page_array);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getPages = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._component.show) {
                        console.log($scope._component.name, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageBlog: function(page_name, blog_id, blog_name_url) {
                    var _self = this;
                    var page = page_name;
                    page = (blog_id == '' || blog_name_url == '') ? page : page + "/" + blog_id + "-" + blog_name_url;
                    _self.locationUrlReplace(page);
                }
            }
            return getFunction;
        };
        $scope.getCur = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._component.show) {
                        console.log($scope._component.name, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getLeft: function() {
                    var _self = this;
                    var index = ($scope.data_api.load_more.cur_page - 1 != 0) ? $scope.data_api.load_more.cur_page - 1 : false;
                    _self.consoleLog("getLeft", "index", index);
                    if (index != false) {
                        $scope.loadPage(index);
                    }
                },
                getRight: function() {
                    var _self = this;
                    var _self = this;
                    var cur_pages = Math.round($scope.data_api.load_more.total_rows / $scope.data_api.load_more.per_page);
                    var index = ($scope.data_api.load_more.cur_page + 1 < cur_pages) ? $scope.data_api.load_more.cur_page + 1 : false;
                    _self.consoleLog("getRight", "index", index);
                    if (index != false) {
                        $scope.loadPage(index);
                    }
                },
            }
            return getFunction;
        };
        /* get api */
        $scope.data_api = {
            blog_id: false,
            load_more: {
                load: false,
                cur_page: 1,
                cur_page_array: [],
                per_page: 9,
                total_rows: 0
            },
            product: {
                data_send: {},
                api: "product/lists",
                ok: false,
                data_array: [],
                data_array_state: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.loadPage = function(index) {
            $scope.data_api.product = {
                data_send: {},
                api: "product/lists",
                ok: false,
                data_array: [],
                data_array_state: {
                    load: false,
                    done: false
                }
            }
            $scope.data_api.load_more.cur_page = parseInt(index);
            $scope.getData().getRouteParams(function(_self, params, state) {
                $scope.data_api.product.data_array_state = state;
                _self.getBlogId(params, function(res_blog_id) {
                    _self.formatDataSend($scope.data_api.product, function(res_data) {
                        var filter_json = {
                            "referral_id_array": [$scope.referralid],
                        }
                        var dataSend = {
                            'cur_page': $scope.data_api.load_more.cur_page,
                            'per_page': $scope.data_api.load_more.per_page,
                            'txt_sortby': 'product_lastest_create',
                            'txt_filter_json': JSON.stringify(filter_json)
                        }
                        res_data.data_send = dataSend;
                        _self.dataSend(res_data.api, res_data.data_send, function(res_api, res_data_send) {
                            _self.getApi(res_api, res_data_send, function(res_ok, res_api, res_state) {
                                res_data.ok = res_ok;
                                res_data.data_array = res_api.data.dataList;
                                res_data.data_array_state = res_state;
                                _self.consoleLog("getApiData", "res_data", res_data);
                                $scope.data_api.load_more.total_rows = res_api.data.total_rows;
                                _self.getCurPageArray($scope.data_api.load_more.cur_page, $scope.data_api.load_more.per_page, res_api.data.total_rows, function(res_cur_page_array) {
                                    $scope.data_api.load_more.cur_page_array = res_cur_page_array;
                                });
                            });
                        });
                    });
                });
            });
        };
        $scope.getData().getRouteParams(function(_self, params, state) {
            $scope.data_api.product.data_array_state = state;
            _self.getBlogId(params, function(res_blog_id) {
                _self.formatDataSend($scope.data_api.product, function(res_data) {
                    var filter_json = {
                        "referral_id_array": [$scope.referralid],
                    }
                    var dataSend = {
                        'cur_page': $scope.data_api.load_more.cur_page,
                        'per_page': $scope.data_api.load_more.per_page,
                        'txt_sortby': 'product_lastest_create',
                        'txt_filter_json': JSON.stringify(filter_json)
                    }
                    res_data.data_send = dataSend;
                    _self.dataSend(res_data.api, res_data.data_send, function(res_api, res_data_send) {
                        _self.getApi(res_api, res_data_send, function(res_ok, res_api, res_state) {
                            res_data.ok = res_ok;
                            res_data.data_array = res_api.data.dataList;
                            res_data.data_array_state = res_state;
                            _self.consoleLog("getApiData", "res_data", res_data);
                            $scope.data_api.load_more.total_rows = res_api.data.total_rows;
                            _self.getCurPageArray($scope.data_api.load_more.cur_page, $scope.data_api.load_more.per_page, res_api.data.total_rows, function(res_cur_page_array) {
                                $scope.data_api.load_more.cur_page_array = res_cur_page_array;
                            });
                        });
                    });
                });
            });
        });
        /* get api */
    };
    return promise;
});_ui_share_app.directive('componentCategoryFeaturedTypeA', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryFeaturedTypeA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.getData = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                locationUrl: function(url) {
                    if (url != "") {
                        $location.url(url).replace();
                    }
                },
                windowLocation: function(url) {
                    if (url != "") {
                        window.location.href = url;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return data;
        };
        $scope.dataArray = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataSet = [{
            api: "referral/lists",
            dataSend: {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 5,
                'txt_sortby': 'referral_sort_index_asc_time_desc',
                'txt_filter_json': JSON.stringify({
                    "badge_id_array": [16]
                })
            },
        }];
        $scope.getData().dataSend($scope.dataSet[0].api, $scope.dataSet[0].dataSend, function(api, dataSend) {
            $scope.dataArrayState = $scope.getData().stateData(true, false);
            $scope.getData().getApi(api, dataSend, function(output) {
                $scope.dataArray = output.data.dataList;
                $scope.dataArrayState = $scope.getData().stateData(false, true);
                $scope.getData().consoleLog("getData : dataArray :  ", $scope.dataArray);
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentCategoryIdA', function($rootScope, $routeParams) {
    var templateName = 'componentCategoryIdA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        referralid: '@referralid',
        size: '@size',
        sizelist: '@sizelist',
        sort: '@sort',
        col: '@col',
        component: '@component',
        stylebutton: '@stylebutton',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.size = (typeof $scope.size !== 'undefined') ? $scope.size : 8;
        $scope.sizelist = (typeof $scope.sizelist !== 'undefined') ? $scope.sizelist : 4;
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(referralid) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var txt_filter_json = {
                'referral_id_array': [referralid]
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': $scope.sizelist,
                'txt_sortby': $scope.sort,
                'txt_filter_json': JSON.stringify(txt_filter_json)
            };
            GAEAPI.get('product/lists', dataSend, $scope).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data.dataList;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope.referralid);
        $scope.$watch('col', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            $scope._col = newValue.toString().split(",");
        });
        $scope.getCol = function(n) {
            return (typeof $scope._col != 'undefined') ? (typeof $scope._col[n] != 'undefined' && $scope._col[n] != '') ? $scope._col[n] : 12 : 12;
        };
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryListsA', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryListsA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        pagename: '@pagename',
        categorycol: '@categorycol',
        productcol: '@productcol',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.params_referral_id = $routeParams.referral_id;
        $scope.tab = "";
        $scope.view = 'category';
        $scope.viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope.$watch('categorycol', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            $scope._categorycol = newValue.toString().split(",");
        });
        $scope.getCategoryCol = function(n) {
            return (typeof $scope._categorycol != 'undefined') ? (typeof $scope._categorycol[n] != 'undefined' && $scope._categorycol[n] != '') ? $scope._categorycol[n] : 12 : 12;
        };
        $scope.$watch('productcol', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            $scope._productcol = newValue.toString().split(",");
        });
        $scope.getProductCol = function(n) {
            return (typeof $scope._productcol != 'undefined') ? (typeof $scope._productcol[n] != 'undefined' && $scope._productcol[n] != '') ? $scope._productcol[n] : 12 : 12;
        };
        $scope._dataArrayLength = 0;
        $scope._dataArrayId = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArrayId = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {};
            var dataSend = {
                'txt_referral_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log("componentCategoryListsA _getDataArrayId dataSend : ", dataSend);
            GAEAPI.get('referral/id', dataSend, $scope).then(function(output) {
                if (output.ok === 1) {
                    $scope._dataArrayId = output.data;
                    console.log("componentCategoryListsA _getDataArrayId _dataArrayId : ", $scope._dataArrayId);
                    $scope.tab = output.data.referral_name;
                    console.log("componentCategoryListsA _getDataArrayId tab : ", $scope.tab);
                    $scope._getDataArrayProduct(id);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope._dataArrayProduct = [];
        $scope._getDataArrayProduct = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {
                "referral_id_array": [id],
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 24,
                'txt_sortby': 'product_lastest_create',
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log("componentCategoryListsA _getDataArrayProduct dataSend : ", dataSend);
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok === 1) {
                    $scope._dataArrayProduct = output.data.dataList;
                    $scope._dataArrayLength = output.data.dataList.length;
                    console.log("componentCategoryListsA _getDataArrayProduct _dataArrayProduct : ", $scope._dataArrayProduct);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._getDataArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_referral_type_id': 11,
                'txt_sortby': 'referral_sort_index_asc_name_asc'
            };
            console.log("componentCategoryListsA _getDataArray dataSend : ", dataSend);
            GAEAPI.get('referral/map', dataSend, $scope).then(function(output) {
                if (output.ok === 1) {
                    $scope._dataArray = output.data;
                    $scope._dataArrayLength = output.data.length;
                    console.log("componentCategoryListsA _getDataArray _dataArray : ", $scope._dataArray);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        // $scope.intab = function(id, data) {
        //     $scope.tab = data;
        //     console.log('intab : ', id, data);
        //     $scope._getDataArrayId(id);
        // };
        $scope.$watch('params_referral_id', function(newValue, oldValue) {
            console.log("params_referral_id : ", newValue, oldValue);
            if (newValue != undefined) {
                $scope._getDataArray();
                $scope._getDataArrayId(newValue);
                $scope.view = 'product';
            } else {
                $scope._getDataArray();
                $scope.view = 'category';
            }
        });
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryListsIdA', function($rootScope, $routeParams) {
    var templateName = 'componentCategoryListsIdA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        refid: '@refid',
        _font: '@font',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            if (typeof $scope.refid !== 'undefined') {
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_parent_id': id,
                };
            } else {
                var dataSend = {
                    'txt_referral_type_id': 11,
                };
            }
            GAEAPI.get('referral/map', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope.refid);
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryListsProductA', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryListsProductA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        referralid: '@referralid',
        productcol: '@productcol',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope.$watch('productcol', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            $scope._productcol = newValue.toString().split(",");
        });
        $scope.getProductCol = function(n) {
            return (typeof $scope._productcol != 'undefined') ? (typeof $scope._productcol[n] != 'undefined' && $scope._productcol[n] != '') ? $scope._productcol[n] : 12 : 12;
        };
        $scope._dataArrayProduct = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArrayProduct = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {
                "referral_id_array": [id],
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 100,
                'txt_sortby': 'product_lastest_create',
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log("componentCategoryListsA _getDataArrayProduct dataSend : ", dataSend);
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok === 1) {
                    $scope._dataArrayProduct = output.data.dataList;
                    console.log("componentCategoryListsA _getDataArrayProduct _dataArrayProduct : ", $scope._dataArrayProduct);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.$watch('referralid', function(newValue, oldValue) {
            console.log("referralid : ", newValue, oldValue);
            if (newValue != undefined) {
                $scope._getDataArrayProduct(newValue);
            }
        });
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryMapA', function($rootScope, $routeParams) {
    var templateName = 'componentCategoryMapA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        refid: '@refid',
        _font: '@font',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope._dataArray = [];
        $scope._dataArrayDone = false;
        $scope._getDataArray = function() {
            if (typeof $scope.refid !== 'undefined') {
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_parent_id': $scope.refid,
                };
            } else {
                var dataSend = {
                    'txt_referral_type_id': 11,
                };
            }
            GAEAPI.get('referral/map', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope._dataArrayDone = true;
                    console.log("_dataArray", $scope._dataArray);
                }
            });
        };
        $scope._getDataArray();
        $scope.viewDataWidth = function() {
            return $(window).width();
        };
        $scope.viewDataHeight = function() {
            return $(window).height();
        };
        $scope._arrayControlView = [];
        $scope._controlView = null;
        $scope.controlView = function() {
            if ($(window).width() >= 1200) {
                $scope._controlView = 4;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 4;
                }
            } else if ($(window).width() >= 992) {
                $scope._controlView = 4;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 4;
                }
            } else if ($(window).width() >= 768) {
                $scope._controlView = 3;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 3;
                }
            } else if ($(window).width() < 768) {
                $scope._controlView = 3;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 3;
                }
            }
            return $scope._controlView;
        };
        $scope.controlView();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debugcategory !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryMenuDropdownA', function($rootScope, $routeParams) {
    var templateName = 'componentCategoryMenuDropdownA';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        _font: '@font',
        imgpath: '@imgpath',
        _menustart: '@menustart',
        refid: '@refid',
        _color: '@color',
        _backgroundcolor: '@backgroundcolor',
        _backgroundcolordropdown: '@backgroundcolordropdown',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.activeMenu = function() {
            /*document.getElementById("activeMenu").classList.toggle("show");
            $('body').css('position','fixed');*/
            if (!angular.element('._headings').hasClass('active')) {
                angular.element('._headings').addClass('active')
            } else {
                angular.element('._headings').removeClass('active')
            }
        };
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._heading = '';
        if (typeof $scope._viewRouteParams().referral_name !== 'undefined' && typeof $scope._viewRouteParams().referral_name != '') {
            $scope._heading = $scope._viewRouteParams().referral_name;
        } else {
            $scope._heading = $scope._menustart;
        }
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.myFunctionDropdown = function(len) {
            if (len > 0) {
                if ($scope._viewRouteParams().referral_name != 'สั่งอาหาร') {
                    $scope.activeMenu();
                    document.getElementById("myDropdown").classList.toggle("show");
                }
            }
        }
        $scope.onclick = function(event) {
            if (!event.target.matches('.dropbtn')) {
                var dropdowns = document.getElementsByClassName("dropdown-content");
                var i;
                for (i = 0; i < dropdowns.length; i++) {
                    var openDropdown = dropdowns[i];
                    if (openDropdown.classList.contains('show')) {
                        openDropdown.classList.remove('show');
                    }
                }
            }
        }
        $scope._category_id = false;
        $scope._get_category_id = function() {
            if (typeof $scope.refid !== 'undefined') {
                var dataSend = {
                    'txt_referral_id': $scope.refid,
                };
            }
            GAEAPI.get('referral/id', dataSend, $scope).then(function(res) {
                if (res.ok === 1) {
                    $scope._category_id = res.data;
                    /*$scope._heading = $scope._category_id.referral_name;*/
                }
            });
        };
        $scope._get_category_id();
        $scope._page_lists = false;
        $scope._page_lists_load = false;
        $scope._get_page_lists = function() {
            $scope._clear_page_lists();
            var dataSend = {
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'page_lastest_create'
            };
            GAEAPI.get('page/lists', dataSend, $scope).then(function(res) {
                $scope._page_lists_load = true;
                if (res.ok === 1) {
                    $scope._page_lists = res.data.dataList;
                    angular.forEach($scope._page_lists, function(item, key) {
                        if (item.page_search_url == "") {
                            item.page_search_url = item.page_id;
                        }
                    });
                }
            });
        };
        $scope._clear_page_lists = function() {
            $scope._page_lists = false;
            $scope._page_lists_load = false;
        };
        $scope._get_page_lists();
        $scope._page_category = false;
        $scope._page_category_load = false;
        $scope._get_page_category = function() {
            $scope._clear_page_lists();
            if (typeof $scope.refid !== 'undefined') {
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_parent_id': $scope.refid,
                };
            } else {
                var dataSend = {
                    'txt_referral_type_id': 11,
                };
            }
            GAEAPI.get('referral/map', dataSend, $scope).then(function(res) {
                $scope._page_category_load = true;
                if (res.ok === 1) {
                    $scope._page_category = res.data;
                }
            });
        };
        $scope._clear_page_category = function() {
            $scope._page_category = false;
            $scope._page_category_load = false;
        };
        $scope._get_page_category();
        $scope.displayImage = function(image_url, prefix) {
            var urlreturn = GAEAPI.getGaeImageUrl(image_url, prefix);
            return urlreturn;
        }
        $scope.viewDataWidth = function() {
            return $(window).width();
        };
        $scope.viewDataHeight = function() {
            return $(window).height();
        };
        $scope._testspeed = null;
        $scope._arrayControlView = [];
        $scope._controlView = null;
        $scope.controlView = function() {
            if ($(window).width() >= 1200) {
                $scope._controlView = 4;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 4;
                }
            } else if ($(window).width() >= 992) {
                $scope._controlView = 4;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 4;
                }
            } else if ($(window).width() >= 768) {
                $scope._controlView = 3;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 5; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 3;
                }
            } else if ($(window).width() < 768) {
                $scope._controlView = 3;
                $scope._arrayControlView[0] = 0;
                for (var i = 1; i <= 10; i++) {
                    $scope._arrayControlView[i] = $scope._arrayControlView[i - 1] + 3;
                }
            }
            return $scope._controlView;
        };
        $scope.controlView();
        $scope.showDebug = function() {
            return (typeof $routeParams.debugcategorymenu !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentCategorySilde', function($rootScope, $routeParams) {
    var templateName = 'componentCategorySilde';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        refid:'@refid',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.mkCarouselData = function(elem) {
            console.debug('mkCarouselData: trigger');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 10,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    prevArrow: '',
                    nextArrow: '',
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 10,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 8,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: 6,
                        }
                    }, {
                        breakpoint: 692,
                        settings: {
                            slidesToShow: 4,
                        }
                    },{
                        breakpoint: 540,
                        settings: {
                            slidesToShow: 2,
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._dataArray = [];
        $scope._dataArrayDone = false;
        $scope._getDataArray = function() {
            if(typeof $scope.refid !== 'undefined'){
                var dataSend = {
                    'txt_referral_type_id': 11,
                    'txt_parent_id': $scope.refid,
                };
            }else{
                 var dataSend = {
                    'txt_referral_type_id': 11,
                };
            }
            GAEAPI.get('referral/map', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    console.log("_dataArray",$scope._dataArray);
                }
            });
        };
        $scope._getDataArray();
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.openCity = function(evt, cityName) {
            var i, tabcontent, tablinks;
            tabcontent = document.getElementsByClassName("tabcontent");
            for (i = 0; i < tabcontent.length; i++) {
                tabcontent[i].style.display = "none";
            }
            tablinks = document.getElementsByClassName("tablinks");
            for (i = 0; i < tablinks.length; i++) {
                tablinks[i].className = tablinks[i].className.replace(" active", "");
            }
            document.getElementById(cityName).style.display = "block";
            evt.currentTarget.className += " active";
        }
        $scope.displayImage = function(image_url, prefix) {return GAEAPI.getGaeImageUrl(image_url, prefix);}
    };
    return promise;
});_ui_share_app.directive('componentCategoryTable', function($rootScope, $routeParams) {
    var templateName = 'componentCategoryTable';
    var componentMain = 'componentCategory';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(name, data) {
                    console.log('componentCategoryTable : ', name, data);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(array, api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(array, api, dataSend);
                },
                getApi: function(array, api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(array, output);
                    });
                },
                titleUrl: function(str) {
                    var url = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    return url;
                },
                locationUrl: function(template, data) {
                    $location.url(template + data).replace();
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.dataArrayPageState = {
            load: false,
            done: false,
            cur_page: 1,
            per_page: 300,
            total_rows: 0
        };
        $scope.dataMapArray = [];
        $scope.dataMapArrayState = $scope.getData().stateData(false, false);
        $scope.dataArray = [];
        $scope.dataArrayState = $scope.getData().stateData(false, false);
        /* category */
        /* $scope.getData().getRouteParams(function(params) {
            $scope.dataArrayState = $scope.getData().stateData(true, false);
            var txt_filter_json = {};
            var dataSend = {
                'txt_referral_type_id': 11,
                'cur_page': $scope.dataArrayPageState.cur_page,
                'per_page': $scope.dataArrayPageState.per_page,
                'txt_sortby': $scope.sort,
                'txt_filter_json': JSON.stringify(txt_filter_json)
            };
            $scope.getData().dataSend(0, 'referral/lists', dataSend, function(array, api, dataSend) {
                $scope.getData().getApi(array, api, dataSend, function(array, output) {
                    $scope.dataArray = output.data.dataList;
                    $scope.dataArrayPageState.total_rows = output.data.total_rows;
                    $scope.dataArrayState = $scope.getData().stateData(false, true);
                    for (var i = 0; i < output.data.dataList.length; i++) {
                        var txt_filter_json = {};
                        var dataSend = {
                            'txt_referral_id': output.data.dataList[i].referral_id
                        };
                        $scope.getData().dataSend(i, 'referral/relation', dataSend, function(array, api, dataSend) {
                            $scope.getData().getApi(array, api, dataSend, function(array, output) {
                                $scope.dataMapArray[array] = output.data;
                            });
                        });
                    }
                });
            });
        }); */
        /* category */
        /* product */
        $scope.getData().getRouteParams(function(params) {
            $scope.dataArrayState = $scope.getData().stateData(true, false);
            var txt_filter_json = {};
            var dataSend = {
                'cur_page': $scope.dataArrayPageState.cur_page,
                'per_page': $scope.dataArrayPageState.per_page,
                'txt_filter_json': JSON.stringify(txt_filter_json)
            };
            $scope.getData().dataSend(0, 'product/lists', dataSend, function(array, api, dataSend) {
                $scope.getData().getApi(array, api, dataSend, function(array, output) {
                    $scope.dataArray = output.data.dataList;
                    $scope.dataArrayPageState.total_rows = output.data.total_rows;
                    $scope.dataArrayState = $scope.getData().stateData(false, true);
                });
            });
        });
        /* product */
        $scope.loadMore = function() {
            var getFunction = {
                consoleLog: function(name, data) {
                    console.log('componentCategoryTable : ', name, data);
                },
                stateData: function(state) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", state);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    return state;
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        /* category */
        /* $scope.load = function() {
            if ($scope.dataArrayPageState.load != true) {
                $scope.dataArrayPageState.load = $scope.loadMore().stateData(true);
                $scope.dataArrayPageState.cur_page++;
                $scope.getData().getRouteParams(function(params) {
                    $scope.dataArrayState = $scope.getData().stateData(true, false);
                    var txt_filter_json = {};
                    var dataSend = {
                        'txt_referral_type_id': 11,
                        'cur_page': $scope.dataArrayPageState.cur_page,
                        'per_page': $scope.dataArrayPageState.per_page,
                        'txt_sortby': $scope.sort,
                        'txt_filter_json': JSON.stringify(txt_filter_json)
                    };
                    $scope.getData().dataSend(0, 'referral/lists', dataSend, function(array, api, dataSend) {
                        $scope.getData().getApi(array, api, dataSend, function(array, output) {
                            if ($scope.dataArray.length < output.data.total_rows) {
                                var oldData = $scope.dataArray;
                                $scope.dataArray = oldData.concat(output.data.dataList);
                                $scope.dataArrayPageState.total_rows = output.data.total_rows;
                                for (var i = 0; i < output.data.dataList.length; i++) {
                                    var txt_filter_json = {};
                                    var dataSend = {
                                        'txt_referral_id': output.data.dataList[i].referral_id
                                    };
                                    var int_array = ($scope.dataArrayPageState.per_page * ($scope.dataArrayPageState.cur_page - 1)) + i;
                                    $scope.getData().dataSend(int_array, 'referral/relation', dataSend, function(array, api, dataSend) {
                                        $scope.getData().getApi(array, api, dataSend, function(array, output) {
                                            $scope.dataMapArray[array] = output.data;
                                        });
                                    });
                                }
                            } else {
                                $scope.dataArrayPageState.cur_page--;
                            }
                            $scope.dataArrayPageState.load = $scope.loadMore().stateData(false);
                            $scope.dataArrayState = $scope.getData().stateData(false, true);
                        });
                    });
                });
            }
        }; */
        /* category */
        /* product */
        $scope.load = function() {
            if ($scope.dataArrayPageState.load != true) {
                $scope.dataArrayPageState.load = $scope.loadMore().stateData(true);
                $scope.dataArrayPageState.cur_page++;
                $scope.getData().getRouteParams(function(params) {
                    $scope.dataArrayState = $scope.getData().stateData(true, false);
                    var txt_filter_json = {};
                    var dataSend = {
                        'cur_page': $scope.dataArrayPageState.cur_page,
                        'per_page': $scope.dataArrayPageState.per_page,
                        'txt_filter_json': JSON.stringify(txt_filter_json)
                    };
                    $scope.getData().dataSend(0, 'product/lists', dataSend, function(array, api, dataSend) {
                        $scope.getData().getApi(array, api, dataSend, function(array, output) {
                            if ($scope.dataArray.length < output.data.total_rows) {
                                var oldData = $scope.dataArray;
                                $scope.dataArray = oldData.concat(output.data.dataList);
                                $scope.dataArrayPageState.total_rows = output.data.total_rows;
                            } else {
                                $scope.dataArrayPageState.cur_page--;
                            }
                            $scope.dataArrayPageState.load = $scope.loadMore().stateData(false);
                            $scope.dataArrayState = $scope.getData().stateData(false, true);
                        });
                    });
                });
            }
        };
        /* product */
        /* download */
        $scope.imageDownload = function(url, fileName) {
            var xhr = new XMLHttpRequest();
            xhr.open("GET", url, true);
            xhr.responseType = "blob";
            xhr.onload = function() {
                var urlCreator = window.URL || window.webkitURL;
                var imageUrl = urlCreator.createObjectURL(this.response);
                var tag = document.createElement('a');
                tag.href = imageUrl;
                tag.download = fileName;
                document.body.appendChild(tag);
                tag.click();
                document.body.removeChild(tag);
            }
            xhr.send();
        };
        /* download */
    };
    return promise;
});_ui_share_app.directive('componentCategoryCustomslideA', function($rootScope, $routeParams) {
    var componentMain = 'componentCategory';
    var componentChild = 'customslideA';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + componentChild + '/' + componentChild + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        dataItem: '=data',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {};
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
      
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        /*$scope.test_json =  JSON.stringify($scope.data);
        $scope.dataItem = JSON.parse($scope.test_json);*/
        $scope.slideProductDeal = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 3000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryCustomslideB', function($rootScope, $routeParams) {
    var componentMain = 'componentCategory';
    var componentChild = 'customslideB';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + componentChild + '/' + componentChild + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        dataItem: '=data',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {};
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        /*$scope.test_json =  JSON.stringify($scope.data);
        $scope.dataItem = JSON.parse($scope.test_json);*/
        $scope.slideProductDeal = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 3000,
                    slidesToShow: 3,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 3,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 2,
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            slidesToShow: 2,
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            slidesToShow: 1,
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryCardA', function ($rootScope, $routeParams) {
    var templateName = 'componentCategoryCardA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        childcomponent: '@childcomponent',
        imgpath: '@imgpath',
        stylebutton :'@stylebutton',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
        $scope.ref_id = $routeParams.referral_id;
        /* 
        * fetch only referral category type (tree-list);
        * @params none
        * @return {Array}
        */
        $scope.ReferralDisplayArray = [];
        $scope.FetchDisplayCategory = function (ref_id) {
            $scope.ReferralDisplayArray = [];
            $scope.ReferralBrandArray = [];
            var d = {'txt_referral_type_id': 11,'txt_sortby':'referral_sort_index_asc_name_asc'};
            if(typeof ref_id !== 'undefined'){
                d.txt_parent_id = ref_id;
            }            
            GAEAPI.get('referral/map', d, $scope).then(function (e) {
                if (e.ok === 1) {
                    $scope.ReferralDisplayArray = e.data;
                }
                console.log("referral display", d, e.data, ref_id);
            });
        };
        /*if (!$scope.ReferralDisplayArray.length) {
            $scope.FetchDisplayCategory();
        }*/
        /*
        * view current routeParams
        * @params (default)
        * @return function
        */
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        /*
        * params listener
        * @params (default)
        * @return function
        */
        $scope.$watch('ref_id', function (newValue, oldValue) {
            if (!newValue || newValue == 0){
                return $scope.FetchDisplayCategory();
            }
            $scope.FetchDisplayCategory(newValue);
        });
        /* Check if seo enable */
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        /* Check if child array exist */
        $scope.checkChild = function(object){
            return (!object.referral_sub_array.length) ? true : false;
        };
        $scope.buildTitleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridA', function ($rootScope, $routeParams) {
    var templateName = 'componentCategoryGridA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
    	primary:'@primary',
    	color:'@color',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	$scope.dataArray = [];
    	$scope.getData = function(){
    		var jsonFilter = JSON.stringify({'type_number':$scope.type});
    		var d = {
    			'txt_referral_type_id': 11
    		};
    		GAEAPI.get('referral/map',d,$scope).then(function(e){
    			if(e.ok === 1){
    				$scope.dataArray = e.data;
    			}
    		});
    	};
    	$scope.getData();
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridC', function ($rootScope, $routeParams) {
    var templateName = 'componentCategoryGridC';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
    	primary:'@primary',
    	color:'@color',
        name:'@name',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	$scope.dataArray = [];
    	$scope.getData = function(){
    		var jsonFilter = JSON.stringify({'type_number':$scope.type});
    		var d = {
    			'txt_referral_type_id': 11
    		};
    		GAEAPI.get('referral/map',d,$scope).then(function(e){
    			if(e.ok === 1){
    				$scope.dataArray = e.data;
    			}
    		});
    	};
    	$scope.getData();
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridCa', function ($rootScope, $routeParams) {
    var componentMain = 'componentCategoryGridC';
    var componentChild = 'a';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + componentChild + '/' + componentChild+ '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
    	primary:'@primary',
    	color:'@color',
        name:'@name',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	$scope.dataArray = [];
    	$scope.getData = function(){
    		var jsonFilter = JSON.stringify({'type_number':$scope.type});
    		var d = {
    			'txt_referral_type_id': 11
    		};
    		GAEAPI.get('referral/map',d,$scope).then(function(e){
    			if(e.ok === 1){
    				$scope.dataArray = e.data;
    			}
    		});
    	};
    	$scope.getData();
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridF', function ($rootScope, $routeParams) {
    var templateName = 'componentCategoryGridF';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    	primary:'@primary',
    	color:'@color',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	$scope.dataArray = [];
    	$scope.getData = function(){
            var d = {
    			'txt_referral_type_id': 11,
                'cur_page':1,
                'per_page' : 2,
                'txt_sortby' : 'referral_oldest_create'
    		};
    		GAEAPI.get('referral/lists',d,$scope).then(function(e){
                if(e.ok === 1){
    				$scope.dataArray = e.data.dataList;
                    
    			}
    		});
    	};
    	$scope.getData();
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridG', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCategoryGridG';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        'auto':'@auto',
        'feature':'@feature',
        'referralid':'@referralid',
        'imgpath':'@imgpath',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval) {      
        $scope.use_auto = (typeof $scope.auto !== 'undefined' && $scope.auto == 'true') ? true : false; 
        $scope.use_feature = (typeof $scope.feature !== 'undefined' && $scope.feature == 'true') ? true : false; 
        /**
        * Check if object array available for "website application" or "Mobile application" or "Featured"
        * @params object array
        * return true | false (default)
        */
        $scope._showWeb = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 18) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showApp = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 19) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showFeature = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 16) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /*
        * view current routeParams
        * @params (default)
        * @return function
        */
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        $scope.data = [];
        $scope.data_done = false;
        /* Get referral data (all)
        * @params none
        * @return array
        */
        $scope.getData = function(){
            $scope.data = [];
            $scope.data_done = false;
            var filterJson = {'badge_id_array':[18]};
            if($scope.use_feature){
                filterJson.badge_id_array.push(16);
            }
            var d = {
                'txt_referral_type_id':11,                
            };
            GAEAPI.get('referral/map',d,$scope).then(function(e){
                if(e.ok == 1){
                    console.log("3a : before", e.data);
                    if($scope.use_feature){
                        var dummy = [];
                        angular.forEach(e.data, function(item,key){
                            if($scope._showFeature(item.referral_badge)){
                                dummy.push(item);
                            }
                        });
                        $scope.data = dummy;
                        $scope.data_done = true;
                        $scope.buildImageSlider($scope.data);    
                        console.log("3a : dummy", dummy);
                        console.log("3a", $scope.data);
                    } else{
                        $scope.data = e.data;
                        $scope.data_done = true;
                        $scope.buildImageSlider($scope.data);   
                        console.log("3a", $scope.data); 
                    }                    
                }
            });
        };
        /* Get referral data (by referral_id)
        * @params id = referral_id
        * @return array
        */
        $scope.getDataReferral = function(id){
            $scope.data = [];
            $scope.data_done = false;
            var d = {
                'txt_referral_id':id
            };
            GAEAPI.get('referral/id_map',d,$scope).then(function(e){
                if(e.ok == 1){
                    $scope.data[0] = e.data;
                    $scope.data_done = true;
                    $scope.buildImageSlider($scope.data);
                }
            });
        };
        /*
        * params listener
        * @params newValue
        * @params oldValue
        * @return function
        */
        $scope.$watch('auto', function (newValue, oldValue) {
            if (!newValue){
                if(typeof $scope.referralid !== 'undefined' && $scope.referralid !== ''){
                    return $scope.getDataReferral($scope.referralid);
                } else {
                    return $scope.getData();
                }
            }
            $scope.getData();
        });
        /*
        * check if image array exist or build dummy image array
        * @params arrayObject = object array
        * @return array
        */
        $scope.buildImageSlider = function(){
            var imageArray = function(idx){
                if(idx == 0){
                    return [
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1.jpg'},
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},
                    ];
                } else if(idx == 1){
                    return [
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_1.png'},
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_2.png'},
                    ];
                } else {
                    return [
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2_1.png'},
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},
                    ];
                }
            };
            var imageBannerArray = function(idx){
                if(idx == 0){
                    return [
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1.jpg'},
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2.jpg'},
                    ];   
                } else if(idx == 1) {
                    return [
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1_1.png'},
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1_2.png'},
                    ];
                } else {
                    return [
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2_1.png'},
                        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2_2.png'},
                    ];
                }
            };
            angular.forEach($scope.data, function(item, key){
                if(!item.referral_image.length){
                    item.referral_image = imageArray(key);                    
                }
                item.referral_image_banner = imageBannerArray(key);
            });
        };
        /* Make Carousel */
        $scope._makeProductToCarousel = function (keyCustom) {
            var elementName = '[data-id="' + keyCustom + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                
            };            
            return sliderProvider(elementName, optionsParmas, "", keyCustom);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(){          
            return  "-" + (($('.row.slick-slider[data-id="'+$scope._uniqueKey+'"]').height() / 2) + 34) + "px";
        };
        /* Carousel Arrow Click */
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        /* Carousel Arrow Click */
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Event Listener when ng-repeat end */
        $rootScope.$on('repeatend', function() {           
            if($('[data-id*="gallery-"]').length){
                $('[data-id*="gallery-"]').not('.slick-initialized').each(function(Key,Object){
                    if($(this).find('.imageItem').length > 0){
                        $scope._makeProductToCarousel($(this).attr('data-id'));
                    }
                });
            }
        });
        /* Check if seo enable */
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridH', function ($rootScope, $routeParams, sliderProvider, $location) {
    var templateName = 'componentCategoryGridH';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        'auto':'@auto',
        'feature':'@feature',
        'referralid':'@referralid',
        'imgpath':'@imgpath',
        'margin':'@margin',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $window) {      
        $scope.use_auto = (typeof $scope.auto !== 'undefined' && $scope.auto == 'true') ? true : false; 
        $scope.use_feature = (typeof $scope.feature !== 'undefined' && $scope.feature == 'true') ? true : false; 
        /**
        * Check if object array available for "website application" or "Mobile application" or "Featured"
        * @params object array
        * return true | false (default)
        */
        $scope._showWeb = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 18) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showApp = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 19) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showFeature = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 16) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        /* --------- START : 1 ------------*/
        /* Extract sub referral id from parent */
        $scope._mergeSubReferral = function(originalArray, r){
            if(!r.referral_sub_array.length){
                return originalArray;
            }
            var a = [];
            angular.forEach(r.referral_sub_array, function(i, k) {
                if($scope._showFeature(i.referral_badge)){
                    a.push(parseInt(i.referral_id));                    
                    $scope.dummyFeatureName.push(i);
                    if(i.referral_image.length){
                        $scope.dummyReferralImage.push(i.referral_image[0]);
                    }                    
                }                
                if(i.referral_sub_array.length > 0){
                    angular.forEach(i.referral_sub_array, function(ii,kk){
                        if($scope._showFeature(ii.referral_badge)){
                            a.push(parseInt(ii.referral_id));
                            $scope.dummyFeatureName.push(ii);
                            if(ii.referral_image.length){
                                $scope.dummyReferralImage.push(ii.referral_image[0]);
                            }
                        }  
                        if(ii.referral_sub_array.length > 0){
                            angular.forEach(ii.referral_sub_array, function(iii,kkk){
                                if($scope._showFeature(iii.referral_badge)){
                                    a.push(parseInt(iii.referral_id));
                                    $scope.dummyFeatureName.push(iii);
                                    if(iii.referral_image.length){
                                        $scope.dummyReferralImage.push(iii.referral_image[0]);
                                    }
                                } 
                                if(iii.referral_sub_array.length > 0){
                                    angular.forEach(iii.referral_sub_array, function(iiii,kkk){
                                        if($scope._showFeature(iiii.referral_badge)){
                                            a.push(parseInt(iiii.referral_id));
                                            $scope.dummyFeatureName.push(iiii);
                                            if(iiii.referral_image.length){
                                                $scope.dummyReferralImage.push(iiii.referral_image[0]);
                                            }
                                        }  
                                    });
                                } 
                            });
                        }
                    });
                }
            });
            return (a.length) ? a.concat(originalArray) : originalArray;
        };
        /* --------- END : 1 ------------*/
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /*
        * view current routeParams
        * @params (default)
        * @return function
        */
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        $scope.data = [];
        $scope.data_done = false;
        $scope.dummyFeatureName = [];
        $scope.dummyReferralImage = [];
        /* Get referral data (all)
        * @params none
        * @return array
        */
        
        /*
        $scope.getData = function(){
            $scope.data = [];
            $scope.data_done = false;
            $scope.dummyFeatureName = [];
            var filterJson = {'badge_id_array':[18]};
            
            var d = {
                'txt_referral_type_id':11,                
            };
            var dummy = [];
            GAEAPI.get('referral/map',d,$scope).then(function(e){
                if(e.ok == 1){
                    console.log("3a : before", e.data);
                    if($scope.use_feature){
                        var dummyReferral = [];
                        dummy = [];
                        angular.forEach(e.data, function(item, key){
                            item.referral_product_array = [];
                            if($scope._showFeature(item.referral_badge)){
                                dummyReferral.push(item);
                                dummy.push(parseInt(item.referral_id));
                                if(item.referral_sub_array.length){
                                    dummy = $scope._mergeSubReferral(dummy, item);                                    
                                }
                            }
                        });
                        $scope.data = dummyReferral;
                        $scope.data_done = true;
                        $scope.buildImageSlider($scope.data);   
                    } else{
                        dummy = [];
                        angular.forEach(e.data, function(item, key){
                            dummy.push(parseInt(item.referral_id));
                            if(item.referral_sub_array.length){
                                dummy = $scope._mergeSubReferral(dummy, item);                                    
                            }                        
                        });
                        $scope.data = e.data;
                        $scope.data_done = true;
                        $scope.buildImageSlider($scope.data);   
                    }
                }
                if(dummy.length){
                    $scope.getDataProductByReferralArray(dummy);
                }
            });
        };
        */
        
        var referralDisplayClass = function(){
            var object = {
                getOnlyBadgeIdArray(badgeArray){
                    var result = [];
                    for(var index in badgeArray){
                        var badgeData = badgeArray[index];
                        var badge_id = GAEAPI.getValue(badgeData["badge_id"],"");
                        if(badge_id!=""){
                            result.push(badge_id);
                        }
                    }
                    return result;
                },
                getOnlyReferralIdArray(referralArray){
                    var result = [];
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var referral_id = GAEAPI.getValue(referralData["referral_id"],"");
                        if(referral_id!=""){
                            result.push(referral_id);
                        }
                    }
                    return result;
                },
                getAllSubReferral(referralArray,resultArray){
                    var self = this;
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var badgeIdArray =  self.getOnlyBadgeIdArray(referralData.referral_badge);
                        if(badgeIdArray.indexOf("16")>=0){
                            resultArray.push(referralData);
                        }
                
                        var subReferralArray = GAEAPI.getValue(referralData["referral_sub_array"],[]);
                        if(subReferralArray.length>0){
                            self.getAllSubReferral(subReferralArray,resultArray);
                        }
                    }
                },
                getImageDataArray(referralArray,imageArray){
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var referralImageArray = GAEAPI.getValue(referralData["referral_banner_array"],[]);
                        if(referralImageArray.length>0){
                            imageArray.push(referralImageArray[0]);
                        }
                    }
                },
                getImageBannerDataArray(referralArray,imageArray){
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var referralBannerArray = GAEAPI.getValue(referralData["referral_image"],[]);
                        if(referralBannerArray.length>0){
                            for(indexTwo in referralBannerArray){
                                if(referralBannerArray[indexTwo]["banner_is_enable"] != 0){
                                    imageArray.push(referralBannerArray[indexTwo]);
                                }
                            }                           
                        }
                    }
                },
                generateCategoryDisplay(index,referralArray,callback){
                    var self = this;
                    if(referralArray.length<=index){
                        if(callback){callback();}
                        return false;
                    }
                    
                    var referralData = referralArray[index];
                    var referral_id = GAEAPI.getValue(referralData["referral_id"],"");
                    var subReferralIdArray = [];
                    console.log("subReferralIdArray : start 1",subReferralIdArray);
                    console.log("subReferralIdArray : start 1",referralData);
                    self.getAllSubReferral(referralData.referral_sub_array,subReferralIdArray);
                    console.log("subReferralIdArray : function 2 getAllSubReferral",subReferralIdArray);
                    console.log("subReferralIdArray : function 2 getAllSubReferral",referralData);
                    referralData["referral_sub_array_two_d"] = referralData.referral_sub_array;
                    referralData["referral_feature_name"] = subReferralIdArray;
                    var resultIdArray = self.getOnlyReferralIdArray(subReferralIdArray);
                    resultIdArray.push(referral_id);
                    referralData["id_array"] = resultIdArray;
                     console.log("data_product_array_55 : ",resultIdArray);
                     var dataSend = {
                        'cur_page': 1,
                        'per_page': 8,
                        'txt_filter_json':JSON.stringify({'badge_id_array':[18,16],'referral_id_array_or':resultIdArray})
                    };
                    console.log("product/lists : generateCategoryDisplay : dataSend ",dataSend);
                    GAEAPI.get("product/lists",dataSend,$scope).then(function(res){
                        console.log("product/lists : generateCategoryDisplay : res : ",res);
                        var productArray = [];
                        if(res.ok==1){
                            productArray = res.data.dataList;
                        }
                        referralData["referral_product_array"] = productArray;
                    });
                    
                    console.log("generateCategoryDisplay : index : "+index+" : ",referralData);
                    self.generateCategoryDisplay((index+1),referralArray,callback);
                    var badgeIdArray =  self.getOnlyBadgeIdArray(referralData.referral_badge);
                    if(badgeIdArray.indexOf("16")>=0){
                        $scope.data.push(referralData);
                        console.log("data_array_first_top",$scope.data);
                        var imageArray = GAEAPI.getValue(referralData["referral_image"],[]);
                        self.getImageDataArray(subReferralIdArray,imageArray);
                        referralData["referral_image_all_array"] = imageArray;
                    }
                
                }
            };
            return object;
        }
        var referralDisplay  = referralDisplayClass();
        var mapDataArray = [];
        $scope.getData = function(){
            $scope.data = [];
            $scope.data_done = false;
            $scope.dummyFeatureName = [];
            var filterJson = {'badge_id_array':[18]};
            
            var dataSend = {
                'txt_referral_type_id':11,   
                'txt_sortby' : "referral_sort_index_desc_name_asc",             
            };
            var dummy = [];
            console.log('referral/map : dataSend : ',dataSend);
            GAEAPI.get('referral/map',dataSend,$scope).then(function(res){
                console.log('referral/map : res : ',res);
                if(res.ok==1){
                    mapDataArray = res.data;
                    referralDisplay.generateCategoryDisplay(0,mapDataArray,function(){
                        $scope.data_done = true;
                    });
                }
            });
        };  
        
        $scope.data_product = [];
        $scope.data_product_done = false;
        /* Get product list by referral array
        * @params {objectArray} referral array
        * @return array
        */
        $scope.getDataProductByReferralArray = function(objectArray){
            var d = {
                'cur_page': 1,
                'per_page': 8,
                'txt_filter_json':JSON.stringify({'badge_id_array':[18,16],'referral_id_array_in':objectArray})
            };
            var dummy = [];
            $scope.data_product_done = false;
            GAEAPI.get('product/lists',d,$scope).then(function(e){
                if(e.ok === 1){
                    $scope.data_product = e.data.dataList;
                    $scope.data_product_done = true;
                    angular.forEach($scope.data, function(item,key){
                        item.referral_feature_name = $scope.dummyFeatureName;
                        item.referral_product_array = e.data.dataList;
                        item.referral_image_all_array = $scope.dummyReferralImage;
                    });
                    console.log("getDataProductByReferralArray: referral data",$scope.data);
                    console.log("getDataProductByReferralArray: referral_id_array_in",objectArray);
                    console.log("getDataProductByReferralArray: params",d);
                    console.log("getDataProductByReferralArray: data",e);
                }
            });
        };
        /* Get referral data (by referral_id)
        * @params id = referral_id
        * @return array
        */
        $scope.getDataReferral = function(id){
            $scope.data = [];
            $scope.data_done = false;
            var d = {
                'txt_referral_id':id
            };
            GAEAPI.get('referral/id_map',d,$scope).then(function(e){
                if(e.ok == 1){
                    $scope.data[0] = e.data;
                    $scope.data_done = true;
                    $scope.buildImageSlider($scope.data);
                    console.log("data_array_first",e.data);
                }
            });
        };
        /*
        * params listener
        * @params newValue
        * @params oldValue
        * @return function
        */
        $scope.$watch('use_auto', function (newValue, oldValue) {
            if (!newValue && typeof $scope.referralid !== 'undefined' && $scope.referralid !== ''){
                return $scope.getDataReferral($scope.referralid);                
            }
            $scope.getData();
        });
        /*
        * check if image array exist or build dummy image array
        * @params arrayObject = object array
        * @return array
        */
        $scope.dummyArrayImageGallery = [
        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_1.png'},
        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_2.png'},
        ];
        $scope.buildImageSlider = function(){
            var imageArray = function(idx){
                if(idx == 0){
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1.jpg'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},
                    ];
                } else if(idx == 1){
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_2.png'},
                    ];
                } else {
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},
                    ];
                }
            };
            var imageBannerArray = function(idx){
                if(idx == 0){
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1.jpg'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2.jpg'},
                    ];   
                } else if(idx == 1) {
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1_2.png'},
                    ];
                } else {
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2_2.png'},
                    ];
                }
            };
            angular.forEach($scope.data, function(item, key){
                if(!item.referral_image.length){
                    item.referral_image = imageArray(key);                    
                }
                item.referral_image_banner = imageBannerArray(key);
            });
        };
        /* Make Carousel */
        $scope._makeProductToCarousel = function (keyCustom, type) {
            var elementName = '[data-id="' + keyCustom + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                
            };          
            return sliderProvider(elementName, optionsParmas, "", keyCustom);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(){          
            return  "-" + (($('.row.slick-slider[data-id="'+$scope._uniqueKey+'"]').height() / 2) + 34) + "px";
        };
        /* Carousel Arrow Click */
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        /* Carousel Arrow Click */
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Event Listener when ng-repeat end */
        $rootScope.$on('repeatend', function() {  
            $timeout(function(){
                if($('.gallery-block[data-id]').length){
                    $('.gallery-block[data-id]').not('.slick-initialized').each(function(Key,Object){
                        if($(this).find('.imageItem').length > 0){
                            $scope._makeProductToCarousel($(this).attr('data-id'), 'gallery');
                        }
                    });
                }   
            },500); 
        });
        /*angular.element($window).bind('load', function(){*/
            if($location.path() == '/' || $location.path() == '/home'){
                var checkSliderImageProduct = setInterval(function(){
                    console.log("checking...", $('.cart-block').not('.slick-initialized').length);
                    if($('.cart-block.slick-initialized').length == $('.cart-block').length && $scope.data_product.length > 0){
                        clearInterval(checkSliderImageProduct);
                        return;
                    } else {                
                        $('.cart-block').not('.slick-initialized').each(function(){
                            if($(this).find('.row-product').length){
                                var elementName = '[data-id="' + $(this).data('id') + '"]';
                                var paramsOptions = {
                                    autoplay: (window.location.host !== 'localhost') ? true : false,
                                    slidesToShow: 1,
                                    slidesToScroll: 1,
                                    dots: true,
                                    arrows: false,
                                    centerMode: false,
                                    infinite: true,
                                    variableWidth: false,
                                };
                                sliderProvider(elementName, paramsOptions, "", $(this).data('id'));
                            }
                        });
                    }
                },1000);    
            }
            
        /*});*/
        $scope.displayImage = function(image_url, prefix) {return GAEAPI.getGaeImageUrl(image_url, prefix);}
        /* Check if seo enable */
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        /* Calculate discount (simple mode)
        * @params {expensivePrice}
        * @params {salePrice}
        * @return int
        */
        $scope.calculateDiscount = function(expensivePrice, salePrice){
            var dif = expensivePrice - salePrice;
            return parseInt(dif * 100 / expensivePrice);
        };
        /* Open Link in other windows */
        $scope.openWindows = function(stringUrl){
            return window.open(stringUrl, '_blank', 'location=yes,height='+$(window).height()+',width='+$(window).width()+',scrollbars=yes,status=yes');
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryGridI', function ($rootScope, $routeParams, sliderProvider, $location) {
    var templateName = 'componentCategoryGridI';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        'auto':'@auto',
        'feature':'@feature',
        'referralid':'@referralid',
        'imgpath':'@imgpath',
        'margin':'@margin',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $window) {      
        $scope.use_auto = (typeof $scope.auto !== 'undefined' && $scope.auto == 'true') ? true : false; 
        $scope.use_feature = (typeof $scope.feature !== 'undefined' && $scope.feature == 'true') ? true : false; 
        /**
        * Check if object array available for "website application" or "Mobile application" or "Featured"
        * @params object array
        * return true | false (default)
        */
        $scope._showWeb = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 18) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showApp = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 19) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showFeature = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 16) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        /* --------- START : 1 ------------*/
        /* Extract sub referral id from parent */
        $scope._mergeSubReferral = function(originalArray, r){
            if(!r.referral_sub_array.length){
                return originalArray;
            }
            var a = [];
            angular.forEach(r.referral_sub_array, function(i, k) {
                if($scope._showFeature(i.referral_badge)){
                    a.push(parseInt(i.referral_id));                    
                    $scope.dummyFeatureName.push(i);
                    if(i.referral_image.length){
                        $scope.dummyReferralImage.push(i.referral_image[0]);
                    }                    
                }                
                if(i.referral_sub_array.length > 0){
                    angular.forEach(i.referral_sub_array, function(ii,kk){
                        if($scope._showFeature(ii.referral_badge)){
                            a.push(parseInt(ii.referral_id));
                            $scope.dummyFeatureName.push(ii);
                            if(ii.referral_image.length){
                                $scope.dummyReferralImage.push(ii.referral_image[0]);
                            }
                        }  
                        if(ii.referral_sub_array.length > 0){
                            angular.forEach(ii.referral_sub_array, function(iii,kkk){
                                if($scope._showFeature(iii.referral_badge)){
                                    a.push(parseInt(iii.referral_id));
                                    $scope.dummyFeatureName.push(iii);
                                    if(iii.referral_image.length){
                                        $scope.dummyReferralImage.push(iii.referral_image[0]);
                                    }
                                } 
                                if(iii.referral_sub_array.length > 0){
                                    angular.forEach(iii.referral_sub_array, function(iiii,kkk){
                                        if($scope._showFeature(iiii.referral_badge)){
                                            a.push(parseInt(iiii.referral_id));
                                            $scope.dummyFeatureName.push(iiii);
                                            if(iiii.referral_image.length){
                                                $scope.dummyReferralImage.push(iiii.referral_image[0]);
                                            }
                                        }  
                                    });
                                } 
                            });
                        }
                    });
                }
            });
            return (a.length) ? a.concat(originalArray) : originalArray;
        };
        /* --------- END : 1 ------------*/
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /*
        * view current routeParams
        * @params (default)
        * @return function
        */
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        $scope.data = [];
        $scope.data_done = false;
        $scope.dummyFeatureName = [];
        $scope.dummyReferralImage = [];
        /* Get referral data (all)
        * @params none
        * @return array
        */
        
        /*
        $scope.getData = function(){
            $scope.data = [];
            $scope.data_done = false;
            $scope.dummyFeatureName = [];
            var filterJson = {'badge_id_array':[18]};
            
            var d = {
                'txt_referral_type_id':11,                
            };
            var dummy = [];
            GAEAPI.get('referral/map',d,$scope).then(function(e){
                if(e.ok == 1){
                    console.log("3a : before", e.data);
                    if($scope.use_feature){
                        var dummyReferral = [];
                        dummy = [];
                        angular.forEach(e.data, function(item, key){
                            item.referral_product_array = [];
                            if($scope._showFeature(item.referral_badge)){
                                dummyReferral.push(item);
                                dummy.push(parseInt(item.referral_id));
                                if(item.referral_sub_array.length){
                                    dummy = $scope._mergeSubReferral(dummy, item);                                    
                                }
                            }
                        });
                        $scope.data = dummyReferral;
                        $scope.data_done = true;
                        $scope.buildImageSlider($scope.data);   
                    } else{
                        dummy = [];
                        angular.forEach(e.data, function(item, key){
                            dummy.push(parseInt(item.referral_id));
                            if(item.referral_sub_array.length){
                                dummy = $scope._mergeSubReferral(dummy, item);                                    
                            }                        
                        });
                        $scope.data = e.data;
                        $scope.data_done = true;
                        $scope.buildImageSlider($scope.data);   
                    }
                }
                if(dummy.length){
                    $scope.getDataProductByReferralArray(dummy);
                }
            });
        };
        */
        
        var referralDisplayClass = function(){
            var object = {
                getOnlyBadgeIdArray(badgeArray){
                    var result = [];
                    for(var index in badgeArray){
                        var badgeData = badgeArray[index];
                        var badge_id = GAEAPI.getValue(badgeData["badge_id"],"");
                        if(badge_id!=""){
                            result.push(badge_id);
                        }
                    }
                    return result;
                },
                getOnlyReferralIdArray(referralArray){
                    var result = [];
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var referral_id = GAEAPI.getValue(referralData["referral_id"],"");
                        if(referral_id!=""){
                            result.push(referral_id);
                        }
                    }
                    return result;
                },
                getAllSubReferral(referralArray,resultArray){
                    var self = this;
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var badgeIdArray =  self.getOnlyBadgeIdArray(referralData.referral_badge);
                        if(badgeIdArray.indexOf("16")>=0){
                            resultArray.push(referralData);
                        }
                
                        var subReferralArray = GAEAPI.getValue(referralData["referral_sub_array"],[]);
                        if(subReferralArray.length>0){
                            self.getAllSubReferral(subReferralArray,resultArray);
                        }
                    }
                },
                getImageDataArray(referralArray,imageArray){
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var referralImageArray = GAEAPI.getValue(referralData["referral_banner_array"],[]);
                        if(referralImageArray.length>0){
                            imageArray.push(referralImageArray[0]);
                        }
                    }
                },
                getImageBannerDataArray(referralArray,imageArray){
                    for(var index in referralArray){
                        var referralData = referralArray[index];
                        var referralBannerArray = GAEAPI.getValue(referralData["referral_image"],[]);
                        if(referralBannerArray.length>0){
                            for(indexTwo in referralBannerArray){
                                if(referralBannerArray[indexTwo]["banner_is_enable"] != 0){
                                    imageArray.push(referralBannerArray[indexTwo]);
                                }
                            }                           
                        }
                    }
                },
                generateCategoryDisplay(index,referralArray,callback){
                    var self = this;
                    if(referralArray.length<=index){
                        if(callback){callback();}
                        return false;
                    }
                    
                    var referralData = referralArray[index];
                    var referral_id = GAEAPI.getValue(referralData["referral_id"],"");
                    var subReferralIdArray = [];
                    self.getAllSubReferral(referralData.referral_sub_array,subReferralIdArray);
                    referralData["referral_feature_name"] = subReferralIdArray;
                    var resultIdArray = self.getOnlyReferralIdArray(subReferralIdArray);
                    resultIdArray.push(referral_id);
                    referralData["id_array"] = resultIdArray;
                     var dataSend = {
                        'cur_page': 1,
                        'per_page': 8,
                        'txt_json_filter':JSON.stringify({'badge_id_array':[18,16],'referral_id_array_in':resultIdArray})
                    };
                    console.log("product/lists : dataSend : ",dataSend);
                    GAEAPI.get("product/lists",dataSend,$scope).then(function(res){
                        console.log("product/lists : res : ",res);
                        var productArray = [];
                        if(res.ok==1){
                            productArray = res.data.dataList;
                        }
                        referralData["referral_product_array"] = productArray;
                        console.log("product/lists : referralData : ",referralData);
                    });
                    
                    console.log("generateCategoryDisplay : index : "+index+" : ",referralData);
                    self.generateCategoryDisplay((index+1),referralArray,callback);
                    var badgeIdArray =  self.getOnlyBadgeIdArray(referralData.referral_badge);
                    if(badgeIdArray.indexOf("16")>=0){
                        $scope.data.push(referralData);
                        var imageArray = GAEAPI.getValue(referralData["referral_image"],[]);
                        self.getImageDataArray(subReferralIdArray,imageArray);
                        referralData["referral_image_all_array"] = imageArray;
                    }
                
                }
            };
            return object;
        }
        var referralDisplay  = referralDisplayClass();
        var mapDataArray = [];
        $scope.getData = function(){
            $scope.data = [];
            $scope.data_done = false;
            $scope.dummyFeatureName = [];
            var filterJson = {'badge_id_array':[18]};
            
            var dataSend = {
                'txt_referral_type_id':11,                
            };
            var dummy = [];
            console.log('referral/map : dataSend : ',dataSend);
            GAEAPI.get('referral/map',dataSend,$scope).then(function(res){
                console.log('referral/map : res : ',res);
                if(res.ok==1){
                    mapDataArray = res.data;
                    referralDisplay.generateCategoryDisplay(0,mapDataArray,function(){
                        $scope.data_done = true;
                    });
                }
            });
        };  
        
        $scope.data_product = [];
        $scope.data_product_done = false;
        /* Get product list by referral array
        * @params {objectArray} referral array
        * @return array
        */
        $scope.getDataProductByReferralArray = function(objectArray){
            var d = {
                'cur_page': 1,
                'per_page': 8,
                'txt_json_filter':JSON.stringify({'badge_id_array':[18,16],'referral_id_array_in':objectArray})
            };
            var dummy = [];
            $scope.data_product_done = false;
            GAEAPI.get('product/lists',d,$scope).then(function(e){
                if(e.ok === 1){
                    $scope.data_product = e.data.dataList;
                    $scope.data_product_done = true;
                    angular.forEach($scope.data, function(item,key){
                        item.referral_feature_name = $scope.dummyFeatureName;
                        item.referral_product_array = e.data.dataList;
                        item.referral_image_all_array = $scope.dummyReferralImage;
                    });
                    console.log("getDataProductByReferralArray: referral data",$scope.data);
                    console.log("getDataProductByReferralArray: referral_id_array_in",objectArray);
                    console.log("getDataProductByReferralArray: params",d);
                    console.log("getDataProductByReferralArray: data",e);
                }
            });
        };
        /* Get referral data (by referral_id)
        * @params id = referral_id
        * @return array
        */
        $scope.getDataReferral = function(id){
            $scope.data = [];
            $scope.data_done = false;
            var d = {
                'txt_referral_id':id
            };
            GAEAPI.get('referral/id_map',d,$scope).then(function(e){
                if(e.ok == 1){
                    $scope.data[0] = e.data;
                    $scope.data_done = true;
                    $scope.buildImageSlider($scope.data);
                }
            });
        };
        /*
        * params listener
        * @params newValue
        * @params oldValue
        * @return function
        */
        $scope.$watch('use_auto', function (newValue, oldValue) {
            if (!newValue && typeof $scope.referralid !== 'undefined' && $scope.referralid !== ''){
                return $scope.getDataReferral($scope.referralid);                
            }
            $scope.getData();
        });
        /*
        * check if image array exist or build dummy image array
        * @params arrayObject = object array
        * @return array
        */
        $scope.dummyArrayImageGallery = [
        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_1.png'},
        {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_2.png'},
        ];
        $scope.buildImageSlider = function(){
            var imageArray = function(idx){
                if(idx == 0){
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1.jpg'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},
                    ];
                } else if(idx == 1){
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1_2.png'},
                    ];
                } else {
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},
                    ];
                }
            };
            var imageBannerArray = function(idx){
                if(idx == 0){
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1.jpg'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2.jpg'},
                    ];   
                } else if(idx == 1) {
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1_2.png'},
                    ];
                } else {
                    return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2_1.png'},
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2_2.png'},
                    ];
                }
            };
            angular.forEach($scope.data, function(item, key){
                if(!item.referral_image.length){
                    item.referral_image = imageArray(key);                    
                }
                item.referral_image_banner = imageBannerArray(key);
            });
        };
        /* Make Carousel */
        $scope._makeProductToCarousel = function (keyCustom, type) {
            var elementName = '[data-id="' + keyCustom + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                
            };          
            return sliderProvider(elementName, optionsParmas, "", keyCustom);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(){          
            return  "-" + (($('.row.slick-slider[data-id="'+$scope._uniqueKey+'"]').height() / 2) + 34) + "px";
        };
        /* Carousel Arrow Click */
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        /* Carousel Arrow Click */
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Event Listener when ng-repeat end */
        $rootScope.$on('repeatend', function() {  
            $timeout(function(){
                if($('.gallery-block[data-id]').length){
                    $('.gallery-block[data-id]').not('.slick-initialized').each(function(Key,Object){
                        if($(this).find('.imageItem').length > 0){
                            $scope._makeProductToCarousel($(this).attr('data-id'), 'gallery');
                        }
                    });
                }   
            },500); 
        });
        /*angular.element($window).bind('load', function(){*/
            if($location.path() == '/' || $location.path() == '/home'){
                var checkSliderImageProduct = setInterval(function(){
                    console.log("checking...", $('.cart-block').not('.slick-initialized').length);
                    if($('.cart-block.slick-initialized').length == $('.cart-block').length && $scope.data_product.length > 0){
                        clearInterval(checkSliderImageProduct);
                        return;
                    } else {                
                        $('.cart-block').not('.slick-initialized').each(function(){
                            if($(this).find('.row-product').length){
                                var elementName = '[data-id="' + $(this).data('id') + '"]';
                                var paramsOptions = {
                                    autoplay: (window.location.host !== 'localhost') ? true : false,
                                    slidesToShow: 1,
                                    slidesToScroll: 1,
                                    dots: true,
                                    arrows: false,
                                    centerMode: false,
                                    infinite: true,
                                    variableWidth: false,
                                };
                                sliderProvider(elementName, paramsOptions, "", $(this).data('id'));
                            }
                        });
                    }
                },1000);    
            }
            
        /*});*/
        
        /* Check if seo enable */
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        /* Calculate discount (simple mode)
        * @params {expensivePrice}
        * @params {salePrice}
        * @return int
        */
        $scope.calculateDiscount = function(expensivePrice, salePrice){
            var dif = expensivePrice - salePrice;
            return parseInt(dif * 100 / expensivePrice);
        };
        /* Open Link in other windows */
        $scope.openWindows = function(stringUrl){
            return window.open(stringUrl, '_blank', 'location=yes,height='+$(window).height()+',width='+$(window).width()+',scrollbars=yes,status=yes');
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategoryLanding', function ($rootScope, $routeParams, $location) {
	var templateName = 'componentCategoryLanding';
	var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
	var promise = {};
	promise.restrict = 'AE';
	promise.scope = {
	};
	promise.link = function (scope, element, attr) {};
	promise.templateUrl = templatePathUrl;
	promise.transclude = true;
	promise.controller = function ($scope, $timeout, $interval, $window) { 
		$scope.viewRouteParams=function(){
			return $routeParams || false;
		};
		$scope.data = [];
		$scope.data_none_multi = [];
		$scope.data_multi = [];
		$scope.data_parent = false;
		$scope.data_load = false;
		
		$scope.getData=function(){
			$scope.data = [];
			$scope.data_none_multi = [];
			$scope.data_multi = [];
			if(typeof $routeParams.referral_id !== 'undefined' && $routeParams.referral_id != 0){
				var d = {'txt_referral_type_id':11,'txt_parent_id':$routeParams.referral_id};				
			} else {
				var d = {'txt_referral_type_id':11};				
			}
			GAEAPI.get('referral/map',d).then(function(e){
				if(e.data.length > 0){
					
					$scope.data = e.data;
					console.log("category-landing : no",d,e);
					angular.forEach($scope.data, function(item){
						if(item.referral_sub_array.length > 0){
							$scope.data_multi.push(item);
							$scope.data_load = true;
						} else {
							$scope.data_none_multi.push(item);
							$scope.getParentData(item.referral_parent_id);
							$scope.data_load = true;
						}
					});		
				} else {
					$timeout(function(){
							$scope.data_load = true;
					},2000);
					
					$scope.matchReferral.root_id='';
					$scope.matchReferral.referral_parent_id='';
					$scope.matchReferral.referral_id='';
					console.log("category-landing : new", $routeParams.referral_id);
					return $scope.getRelation($routeParams.referral_id);
				}
			});
		};
		$scope.getData();
		$scope.getParentData = function(id){
			if($scope.data_parent==false){
				var d = {'txt_referral_id':id};
				GAEAPI.get('referral/id',d).then(function(e){
					if(e.ok == 1){
						$scope.data_parent = e.data;
					}
				});
			}
		};
		$scope.$watch('data_none_multi',function(newValue,oldValue){
			if(!newValue.length || !newValue){
				return;
			}
			
		});
		$scope.displayImage = function(image_url, prefix) {
            return GAEAPI.getGaeImageUrl(image_url, prefix);
        };
		$scope.relation = [];
		$scope.matchReferral = {
			root_id:'',
			referral_parent_id:'',
			referral_id:'',
		};
		$scope.matchCount = 0;
		$scope.getRelation = function(refId){
			console.log("category-landing: getRelation", refId);
			$scope.matchReferral.referral_id = refId;
			
			$scope.matchCount = $scope.matchCount+1;
			GAEAPI.get('referral/relation',{'txt_referral_id':refId}).then(function(e){
				if(e.data.length){
					/*$scope.relation = e.data;*/
					var first = 0;
					var last = e.data.length - 1;
					console.log("category-landing: e.data", e.data);
					console.log("category-landing: fist-last", first, last);
					if(parseInt(e.data[first].referral_parent_id) <= 0){
						console.log("category-landing: root_id", e.data[first].referral_id);
						console.log("category-landing: -root_id",parseInt(e.data[first].referral_parent_id));
						$scope.matchReferral.root_id = e.data[first].referral_id;
						$scope.matchCount = $scope.matchCount+1;
					}
					if(parseInt(e.data[last].referral_parent_id) > 0){
						console.log("category-landing: referral_parent_id", e.data[last].referral_parent_id);
						console.log("category-landing: -referral_parent_id", parseInt(e.data[last].referral_parent_id));
						$scope.matchReferral.referral_parent_id = e.data[last].referral_parent_id;
						$scope.matchCount = $scope.matchCount+1;
					} 
					
				}
			});
		};
		$scope.$watch('matchCount',function(newValue,oldValue){
			console.log("category-landing: matchCount", newValue);
			if(newValue >= 2){
				console.log("category-landing: matchCount : ready", $scope.matchReferral);
				$timeout(function(){
					window.location.href="category-lists?root_id="+$scope.matchReferral.root_id+"&referral_parent_id="+$scope.matchReferral.referral_parent_id+"&referral_id="+$scope.matchReferral.referral_id+"&referral_type=category";
				},100);
				
			}
		});
		
		
	};
	return promise;
});
_ui_share_app.directive('componentCategoryLandingB', function ($rootScope, $routeParams, $location) {
	var templateName = 'componentCategoryLandingB';
	var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
	var promise = {};
	promise.restrict = 'AE';
	promise.scope = {
	};
	promise.link = function (scope, element, attr) {};
	promise.templateUrl = templatePathUrl;
	promise.transclude = true;
	promise.controller = function ($scope, $timeout, $interval, $window) { 
		$scope.viewRouteParams=function(){
			return $routeParams || false;
		};
		 $scope._params = $routeParams.referral_id;
		$scope.data = [];
		$scope.data_none_multi = [];
		$scope.data_multi = [];
		$scope.data_parent = false;
		$scope.data_load = false;
		
		$scope.getData=function(){
			$scope.data = [];
			$scope.data_none_multi = [];
			$scope.data_multi = [];
			if(typeof $routeParams.referral_id !== 'undefined' && $routeParams.referral_id != 0){
				var d = {'txt_referral_type_id':11,'txt_parent_id':$routeParams.referral_id};				
			} else {
				var d = {'txt_referral_type_id':11};				
			}
			GAEAPI.get('referral/map',d).then(function(e){
				if(e.data.length > 0){
					
					$scope.data = e.data;
					console.log("category-landing : no",d,e);
					angular.forEach($scope.data, function(item){
						if(item.referral_sub_array.length > 0){
							$scope.data_multi.push(item);
							$scope.data_load = true;
						} else {
							$scope.data_none_multi.push(item);
							$scope.getParentData(item.referral_parent_id);
							$scope.data_load = true;
						}
					});		
				} else {
					$timeout(function(){
							$scope.data_load = true;
					},2000);
					
					$scope.matchReferral.root_id='';
					$scope.matchReferral.referral_parent_id='';
					$scope.matchReferral.referral_id='';
					console.log("category-landing : new", $routeParams.referral_id);
					return $scope.getRelation($routeParams.referral_id);
				}
			});
		};
		$scope.getData();
		$scope.getParentData = function(id){
			if($scope.data_parent==false){
				var d = {'txt_referral_id':id};
				GAEAPI.get('referral/id',d).then(function(e){
					if(e.ok == 1){
						$scope.data_parent = e.data;
					}
				});
			}
		};
		$scope._data_referral_relate_ = [];
        $scope._get_referral_relate_ = function (array) {
            
                var dataSend = {
                    'txt_referral_id': array,
                };
                GAEAPI.get('referral/relation', dataSend).then(function (e) {         
                    if (e.ok === 1) {
                        $scope._data_referral_relate_ = e.data;
                    }
                });
        };
		$scope.$watch('data_none_multi',function(newValue,oldValue){
			if(!newValue.length || !newValue){
				return;
			}
			
		});
		$scope.$watch('_params', function(newValue, oldValue) {
            if(newValue){
               $scope._get_referral_relate_(newValue);
            }
            if (!newValue) return;
        });
		$scope.displayImage = function(image_url, prefix) {
            return GAEAPI.getGaeImageUrl(image_url, prefix);
        };
		$scope.relation = [];
		$scope.matchReferral = {
			root_id:'',
			referral_parent_id:'',
			referral_id:'',
		};
		$scope.matchCount = 0;
		$scope.getRelation = function(refId){
			console.log("category-landing: getRelation", refId);
			$scope.matchReferral.referral_id = refId;
			
			$scope.matchCount = $scope.matchCount+1;
			GAEAPI.get('referral/relation',{'txt_referral_id':refId}).then(function(e){
				if(e.data.length){
					/*$scope.relation = e.data;*/
					var first = 0;
					var last = e.data.length - 1;
					console.log("category-landing: e.data", e.data);
					console.log("category-landing: fist-last", first, last);
					if(parseInt(e.data[first].referral_parent_id) <= 0){
						console.log("category-landing: root_id", e.data[first].referral_id);
						console.log("category-landing: -root_id",parseInt(e.data[first].referral_parent_id));
						$scope.matchReferral.root_id = e.data[first].referral_id;
						$scope.matchCount = $scope.matchCount+1;
					}
					if(parseInt(e.data[last].referral_parent_id) > 0){
						console.log("category-landing: referral_parent_id", e.data[last].referral_parent_id);
						console.log("category-landing: -referral_parent_id", parseInt(e.data[last].referral_parent_id));
						$scope.matchReferral.referral_parent_id = e.data[last].referral_parent_id;
						$scope.matchCount = $scope.matchCount+1;
					} 
					
				}
			});
		};
		$scope.$watch('matchCount',function(newValue,oldValue){
			console.log("category-landing: matchCount", newValue);
			if(newValue >= 2){
				console.log("category-landing: matchCount : ready", $scope.matchReferral);
				$timeout(function(){
					window.location.href="category-lists?root_id="+$scope.matchReferral.root_id+"&referral_parent_id="+$scope.matchReferral.referral_parent_id+"&referral_id="+$scope.matchReferral.referral_id+"&referral_type=category";
				},100);
				
			}
		});
		
		
	};
	return promise;
});
_ui_share_app.directive('componentCategoryLandingC', function($rootScope, $routeParams, $location) {
    var templateName = 'componentCategoryLandingC';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {};
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope.data = [];
        $scope.data_none_multi = [];
        $scope.data_multi = [];
        $scope.data_parent = false;
        $scope.data_load = false;
        $scope.getData = function() {
            $scope.data = [];
            $scope.data_none_multi = [];
            $scope.data_multi = [];
            if (typeof $routeParams.referral_id !== 'undefined' && $routeParams.referral_id != 0) {
                var d = {
                    'txt_referral_type_id': 11,
                    'txt_parent_id': $routeParams.referral_id
                };
            } else {
                var d = {
                    'txt_referral_type_id': 11
                };
            }
            GAEAPI.get('referral/map', d, $scope).then(function(e) {
                if (e.data.length > 0) {
                    $scope.data = e.data;
                    console.log("category-landing : no", d, e);
                    angular.forEach($scope.data, function(item) {
                        if (item.referral_sub_array.length > 0) {
                            $scope.data_multi.push(item);
                            $scope.data_load = true;
                        } else {
                            $scope.data_none_multi.push(item);
                            $scope.getParentData(item.referral_parent_id);
                            $scope.data_load = true;
                        }
                    });
                } else {
                    $timeout(function() {
                        $scope.data_load = true;
                    }, 300);
                    $scope.matchReferral.root_id = '';
                    $scope.matchReferral.referral_parent_id = '';
                    $scope.matchReferral.referral_id = '';
                    console.log("category-landing : new", $routeParams.referral_id);
                    return $scope.getRelation($routeParams.referral_id);
                }
            });
        };
        $scope.getData();
        $scope.getParentData = function(id) {
            if ($scope.data_parent == false) {
                var d = {
                    'txt_referral_id': id
                };
                GAEAPI.get('referral/id', d, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data_parent = e.data;
                    }
                });
            }
        };
        // $scope.$watch('data_none_multi',function(newValue,oldValue){
        // 	if(!newValue.length || !newValue){
        // 		return;
        // 	}
        // });
        $scope.displayImage = function(image_url, prefix) {
            return GAEAPI.getGaeImageUrl(image_url, prefix);
        };
        $scope.relation = [];
        $scope.matchReferral = {
            root_id: '',
            referral_parent_id: '',
            referral_id: '',
            referral_name: '',
        };
        $scope.matchCount = 0;
        $scope.getRelation = function(refId) {
            console.log("category-landing: getRelation", refId);
            $scope.matchReferral.referral_id = refId;
            $scope.matchReferral.referral_name = $scope.viewRouteParams().referral_name;
            $scope.matchCount = $scope.matchCount + 1;
            GAEAPI.get('referral/relation', {
                'txt_referral_id': refId
            }, $scope).then(function(e) {
                if (e.data.length) {
                    /*$scope.relation = e.data;*/
                    var first = 0;
                    var last = e.data.length - 1;
                    console.log("category-landing: e.data", e.data);
                    console.log("category-landing: fist-last", first, last);
                    if (parseInt(e.data[first].referral_parent_id) <= 0) {
                        console.log("category-landing: root_id", e.data[first].referral_id);
                        console.log("category-landing: -root_id", parseInt(e.data[first].referral_parent_id));
                        $scope.matchReferral.root_id = e.data[first].referral_id;
                        $scope.matchCount = $scope.matchCount + 1;
                    }
                    if (parseInt(e.data[last].referral_parent_id) > 0) {
                        console.log("category-landing: referral_parent_id", e.data[last].referral_parent_id);
                        console.log("category-landing: -referral_parent_id", parseInt(e.data[last].referral_parent_id));
                        $scope.matchReferral.referral_parent_id = e.data[last].referral_parent_id;
                        $scope.matchCount = $scope.matchCount + 1;
                    }
                }
            });
        };
        $scope.$watch('matchCount', function(newValue, oldValue) {
            console.log("category-landing: matchCount", newValue);
            if (newValue >= 2) {
                console.log("category-landing: matchCount : ready", $scope.matchReferral);
                $timeout(function() {
  					var url = "category-lists?root_id=" + $scope.matchReferral.root_id + "&referral_parent_id=" + $scope.matchReferral.referral_parent_id + "&referral_id=" + $scope.matchReferral.referral_id + "&referral_type=category" + "&referral_name=" + $scope.matchReferral.referral_name;
                	$location.url(url).replace();
                    // window.location.href = "category-lists?root_id=" + $scope.matchReferral.root_id + "&referral_parent_id=" + $scope.matchReferral.referral_parent_id + "&referral_id=" + $scope.matchReferral.referral_id + "&referral_type=category" + "&referral_name=" + $scope.matchReferral.referral_name;
                }, 100);
            }
        });
    };
    return promise;
});
_ui_share_app.directive('componentCategoryLandingD', function ($rootScope, $routeParams, $location) {
	var templateName = 'componentCategoryLandingD';
	var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
	var promise = {};
	promise.restrict = 'AE';
	promise.scope = {
	};
	promise.link = function (scope, element, attr) {};
	promise.templateUrl = templatePathUrl;
	promise.transclude = true;
	promise.controller = function ($scope, $timeout, $interval, $window) { 
		$scope.viewRouteParams=function(){
			return $routeParams || false;
		};
		 $scope._params = $routeParams.referral_id;
		$scope.data = [];
		$scope.data_none_multi = [];
		$scope.data_multi = [];
		$scope.data_parent = false;
		$scope.data_load = false;
		
		$scope.getData=function(){
			$scope.data = [];
			$scope.data_none_multi = [];
			$scope.data_multi = [];
			if(typeof $routeParams.referral_id !== 'undefined' && $routeParams.referral_id != 0){
				var d = {'txt_referral_type_id':11,'txt_parent_id':$routeParams.referral_id};				
			} else {
				var d = {'txt_referral_type_id':11};				
			}
			GAEAPI.get('referral/map',d , $scope).then(function(e){
				if(e.data.length > 0){
					
					$scope.data = e.data;
					console.log("category-landing : no",d,e);
					angular.forEach($scope.data, function(item){
						if(item.referral_sub_array.length > 0){
							$scope.data_multi.push(item);
							$scope.data_load = true;
						} else {
							$scope.data_none_multi.push(item);
							$scope.getParentData(item.referral_parent_id);
							$scope.data_load = true;
						}
					});		
				} else {
					$timeout(function(){
							$scope.data_load = true;
					},2000);
					
					$scope.matchReferral.root_id='';
					$scope.matchReferral.referral_parent_id='';
					$scope.matchReferral.referral_id='';
					console.log("category-landing : new", $routeParams.referral_id);
					return $scope.getRelation($routeParams.referral_id);
				}
			});
		};
		$scope.getData();
		$scope.getParentData = function(id){
			if($scope.data_parent==false){
				var d = {'txt_referral_id':id};
				GAEAPI.get('referral/id',d , $scope).then(function(e){
					if(e.ok == 1){
						$scope.data_parent = e.data;
					}
				});
			}
		};
		$scope._data_referral_relate_ = [];
        $scope._get_referral_relate_ = function (array) {
            
                var dataSend = {
                    'txt_referral_id': array,
                };
                GAEAPI.get('referral/relation', dataSend ,$scope).then(function (e) {         
                    if (e.ok === 1) {
                        $scope._data_referral_relate_ = e.data;
                    }
                });
        };
		$scope.$watch('data_none_multi',function(newValue,oldValue){
			if(!newValue.length || !newValue){
				return;
			}
			
		});
		$scope.$watch('_params', function(newValue, oldValue) {
            if(newValue){
               $scope._get_referral_relate_(newValue);
            }
            if (!newValue) return;
        });
		$scope.displayImage = function(image_url, prefix) {
            return GAEAPI.getGaeImageUrl(image_url, prefix);
        };
		$scope.relation = [];
		$scope.matchReferral = {
			root_id:'',
			referral_parent_id:'',
			referral_id:'',
		};
		$scope.matchCount = 0;
		$scope.getRelation = function(refId){
			console.log("category-landing: getRelation", refId);
			$scope.matchReferral.referral_id = refId;
			
			$scope.matchCount = $scope.matchCount+1;
			GAEAPI.get('referral/relation',{'txt_referral_id':refId},$scope).then(function(e){
				if(e.data.length){
					/*$scope.relation = e.data;*/
					var first = 0;
					var last = e.data.length - 1;
					console.log("category-landing: e.data", e.data);
					console.log("category-landing: fist-last", first, last);
					if(parseInt(e.data[first].referral_parent_id) <= 0){
						console.log("category-landing: root_id", e.data[first].referral_id);
						console.log("category-landing: -root_id",parseInt(e.data[first].referral_parent_id));
						$scope.matchReferral.root_id = e.data[first].referral_id;
						$scope.matchCount = $scope.matchCount+1;
					}
					if(parseInt(e.data[last].referral_parent_id) > 0){
						console.log("category-landing: referral_parent_id", e.data[last].referral_parent_id);
						console.log("category-landing: -referral_parent_id", parseInt(e.data[last].referral_parent_id));
						$scope.matchReferral.referral_parent_id = e.data[last].referral_parent_id;
						$scope.matchCount = $scope.matchCount+1;
					} 
					
				}
			});
		};
		$scope.$watch('matchCount',function(newValue,oldValue){
			console.log("category-landing: matchCount", newValue);
			if(newValue >= 2){
				console.log("category-landing: matchCount : ready", $scope.matchReferral);
				$timeout(function(){
					window.location.href="category-lists?root_id="+$scope.matchReferral.root_id+"&referral_parent_id="+$scope.matchReferral.referral_parent_id+"&referral_id="+$scope.matchReferral.referral_id+"&referral_type=category";
				},100);
				
			}
		});
		
		
	};
	return promise;
});
_ui_share_app.directive('componentCategoryMenuDropdown', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCategoryMenuDropdown';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {};
    promise.controller = function ($scope, $timeout, $interval, $window, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.myFunctionDropdown = function () {
            document.getElementById("myDropdown").classList.toggle("show");
        }
        $scope.onclick = function (event) {
            if (!event.target.matches('.dropbtn')) {
                var dropdowns = document.getElementsByClassName("dropdown-content");
                var i;
                for (i = 0; i < dropdowns.length; i++) {
                    var openDropdown = dropdowns[i];
                    if (openDropdown.classList.contains('show')) {
                        openDropdown.classList.remove('show');
                    }
                }
            }
        }
        $scope._page_lists = false;
        $scope._page_lists_load = false;
        $scope._get_page_lists = function () {
            $scope._clear_page_lists();
            var dataSend = {
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'page_lastest_create'
            };
            GAEAPI.get('page/lists', dataSend ,$scope).then(function (res) {
                $scope._page_lists_load = true;
                if (res.ok === 1) {
                    $scope._page_lists = res.data.dataList;
                    angular.forEach($scope._page_lists, function (item, key) {
                        if (item.page_search_url == "") {
                            item.page_search_url = item.page_id;
                        }
                    });
                }
            });
        };
        $scope._clear_page_lists = function () {
            $scope._page_lists = false;
            $scope._page_lists_load = false;
        };
        /*$scope._get_page_lists();*/
        /*$scope._page_category = (typeof window.referralMap !== 'undefined') ? window.referralMap.data : false;*/
        $scope._page_category_load = false;
        $scope._get_page_category = function () {
            /*$scope._clear_page_lists();
             
             var dataSend = {
             'txt_referral_type_id': 11,
             'txt_sortby': 'referral_sort_index_asc_name_asc'
             };
             GAEAPI.get('referral/map', dataSend).then(function(res) {
             $scope._page_category_load = true;
             if (res.ok === 1) {
             $scope._page_category = res.data;
             }
             });*/
        };
        $scope._clear_page_category = function () {
            $scope._page_category = false;
            $scope._page_category_load = false;
        };
        /*$scope._get_page_category();*/
        $scope.requestApiArray = [];
        $scope.chainRerrealRequest = function (txt_referral_type_id, txt_parent_id, callbackData, childCount) {
            var dataSend = {
                'cur_page': 1,
                'per_page': (txt_parent_id <= 0) ? 20 : childCount,
                'txt_referral_type_id': txt_referral_type_id,
                'txt_parent_id': txt_parent_id,
                'txt_badge_id': 18,
                'txt_sortby' : 'referral_sort_index_asc_name_asc',
                'base_shop_name': 'myhappyphone',
            };
            if (parseInt(txt_referral_type_id) > 0) {
                dataSend.txt_view_referral_child = 1;
            }
            $http.get(GURL.base_api_url() + 'referral/short_lists', {params: dataSend} , $scope).then(function (res) {
                $scope.requestApiArray[txt_referral_type_id] = $timeout(function () {
                    var e = res.data;
                    if (e.ok === 1) {
                        if (typeof callbackData == undefined || callbackData == undefined) {
                            $scope._page_category = e.data.dataList;
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                        } else {
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                            return callbackData(e);
                        }
                    }
                }, 20);
            });
        };
        $scope.chainRerrealRequest(11, 0);
        $scope.chainReferralHover = function (objectParent, level) {
            console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_count);
            if (objectParent.referral_sub_count > 0 && objectParent.referral_sub_array.length <= 0) {
                $scope.chainRerrealRequest(11, objectParent.referral_id, function (e) {
                    if (e.ok === 1 && e.data.dataList.length) {
                        objectParent.referral_sub_array = e.data.dataList;
                        console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_array);
                    }
                }, objectParent.referral_sub_count);
            }
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryMenuDropdownAa', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCategoryMenuDropdownAa';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s.toLowerCase();
        };
        $scope.dropdown = false;
        $scope.myFunctionDropdown = function() {
            document.getElementById("myDropdown").classList.toggle("show");
            var dropdown = $(".dropdown-menu").height() + 11;
            console.log("myFunctionDropdown - content : ", dropdown);
            $('.dropdown-menu').css('min-height', dropdown);
        };
        $("#myDropdown").mouseenter(function() {}).mouseleave(function() {
            document.getElementById("myDropdown").classList.toggle("show");
            var dropdown = $(".dropdown-menu").height() + 11;
            console.log("myFunctionDropdown - content : ", dropdown);
            $('.dropdown-menu').css('min-height', dropdown);
        });
        $scope.onclick = function(event) {
            if (!event.target.matches('.dropbtn')) {
                var dropdowns = document.getElementsByClassName("dropdown-content");
                var i;
                for (i = 0; i < dropdowns.length; i++) {
                    var openDropdown = dropdowns[i];
                    if (openDropdown.classList.contains('show')) {
                        openDropdown.classList.remove('show');
                    }
                }
            }
        };
        $scope._page_lists = false;
        $scope._page_lists_load = false;
        $scope._get_page_lists = function() {
            $scope._clear_page_lists();
            var dataSend = {
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'page_lastest_create'
            };
            GAEAPI.get('page/lists', dataSend, $scope).then(function(res) {
                $scope._page_lists_load = true;
                if (res.ok === 1) {
                    $scope._page_lists = res.data.dataList;
                    angular.forEach($scope._page_lists, function(item, key) {
                        if (item.page_search_url == "") {
                            item.page_search_url = item.page_id;
                        }
                    });
                }
            });
        };
        $scope._clear_page_lists = function() {
            $scope._page_lists = false;
            $scope._page_lists_load = false;
        };
        /*$scope._get_page_lists();*/
        /*$scope._page_category = (typeof window.referralMap !== 'undefined') ? window.referralMap.data : false;*/
        $scope._page_category_load = false;
        $scope._get_page_category = function() {
            /*$scope._clear_page_lists();
             
             var dataSend = {
             'txt_referral_type_id': 11,
             'txt_sortby': 'referral_sort_index_asc_name_asc'
             };
             GAEAPI.get('referral/map', dataSend).then(function(res) {
             $scope._page_category_load = true;
             if (res.ok === 1) {
             $scope._page_category = res.data;
             }
             });*/
        };
        $scope._clear_page_category = function() {
            $scope._page_category = false;
            $scope._page_category_load = false;
        };
        /*$scope._get_page_category();*/
        $scope.requestApiArray = [];
        $scope.chainRerrealRequest = function(txt_referral_type_id, txt_parent_id, callbackData, childCount) {
            var dataSend = {
                'cur_page': 1,
                'per_page': (txt_parent_id <= 0) ? 20 : childCount,
                'txt_referral_type_id': txt_referral_type_id,
                'txt_parent_id': txt_parent_id,
                'txt_badge_id': 18,
                'txt_sortby': 'referral_sort_index_asc_name_desc',
                'base_shop_name': 'proplugin',
            };
            if (parseInt(txt_referral_type_id) > 0) {
                dataSend.txt_view_referral_child = 1;
            }
            $http.get(GURL.base_api_url() + 'referral/short_lists', {
                params: dataSend
            }, $scope).then(function(res) {
                console.log("chainRerrealRequest : dataSend : ", dataSend);
                $scope.requestApiArray[txt_referral_type_id] = $timeout(function() {
                    var e = res.data;
                    console.log("chainRerrealRequest : e  : ", e);
                    if (e.ok === 1) {
                        if (typeof callbackData == undefined || callbackData == undefined) {
                            $scope._page_category = e.data.dataList;
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                        } else {
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                            return callbackData(e);
                        }
                    }
                }, 20);
            });
        };
        $scope.chainRerrealRequest(11, 0);
        $scope.chainReferralHover = function(objectParent, level) {
            console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_count);
            if (objectParent.referral_sub_count > 0 && objectParent.referral_sub_array.length <= 0) {
                $scope.chainRerrealRequest(11, objectParent.referral_id, function(e) {
                    if (e.ok === 1 && e.data.dataList.length) {
                        objectParent.referral_sub_array = e.data.dataList;
                        console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_array);
                    }
                }, objectParent.referral_sub_count);
            }
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryMenuDropdownAb', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCategoryMenuDropdownAb';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s.toLowerCase();
        };
        $scope.dropdown = false;
        $scope.myFunctionDropdown = function() {
            document.getElementById("myDropdown").classList.toggle("show");
        };
        $("#myDropdown").mouseenter(function() {}).mouseleave(function() {
            document.getElementById("myDropdown").classList.toggle("show");
        });
        $scope.onclick = function(event) {
            if (!event.target.matches('.dropbtn')) {
                var dropdowns = document.getElementsByClassName("dropdown-content");
                var i;
                for (i = 0; i < dropdowns.length; i++) {
                    var openDropdown = dropdowns[i];
                    if (openDropdown.classList.contains('show')) {
                        openDropdown.classList.remove('show');
                    }
                }
            }
        };
        $scope._page_lists = false;
        $scope._page_lists_load = false;
        $scope._get_page_lists = function() {
            $scope._clear_page_lists();
            var dataSend = {
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'page_lastest_create'
            };
            GAEAPI.get('page/lists', dataSend, $scope).then(function(res) {
                $scope._page_lists_load = true;
                if (res.ok === 1) {
                    $scope._page_lists = res.data.dataList;
                    angular.forEach($scope._page_lists, function(item, key) {
                        if (item.page_search_url == "") {
                            item.page_search_url = item.page_id;
                        }
                    });
                }
            });
        };
        $scope._clear_page_lists = function() {
            $scope._page_lists = false;
            $scope._page_lists_load = false;
        };
        /*$scope._get_page_lists();*/
        /*$scope._page_category = (typeof window.referralMap !== 'undefined') ? window.referralMap.data : false;*/
        $scope._page_category_load = false;
        $scope._get_page_category = function() {
            /*$scope._clear_page_lists();
             
             var dataSend = {
             'txt_referral_type_id': 11,
             'txt_sortby': 'referral_sort_index_asc_name_asc'
             };
             GAEAPI.get('referral/map', dataSend).then(function(res) {
             $scope._page_category_load = true;
             if (res.ok === 1) {
             $scope._page_category = res.data;
             }
             });*/
        };
        $scope._clear_page_category = function() {
            $scope._page_category = false;
            $scope._page_category_load = false;
        };
        /*$scope._get_page_category();*/
        $scope.requestApiArray = [];
        $scope.chainRerrealRequest = function(txt_referral_type_id, txt_parent_id, callbackData, childCount) {
            var dataSend = {
                'cur_page': 1,
                'per_page': (txt_parent_id <= 0) ? 20 : childCount,
                'txt_referral_type_id': txt_referral_type_id,
                'txt_parent_id': txt_parent_id,
                'txt_badge_id': 18,
                'base_shop_name': 'supercheap'
            };
            if (parseInt(txt_referral_type_id) > 0) {
                dataSend.txt_view_referral_child = 1;
            }
            $http.get(GURL.base_api_url() + 'referral/short_lists', {
                params: dataSend
            }, $scope).then(function(res) {
                $scope.requestApiArray[txt_referral_type_id] = $timeout(function() {
                    var e = res.data;
                    if (e.ok === 1) {
                        if (typeof callbackData == undefined || callbackData == undefined) {
                            $scope._page_category = e.data.dataList;
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                        } else {
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                            return callbackData(e);
                        }
                    }
                }, 20);
            });
        };
        $scope.chainRerrealRequest(11, 0);
        $scope.chainReferralHover = function(objectParent, level) {
            console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_count);
            if (objectParent.referral_sub_count > 0 && objectParent.referral_sub_array.length <= 0) {
                $scope.chainRerrealRequest(11, objectParent.referral_id, function(e) {
                    if (e.ok === 1 && e.data.dataList.length) {
                        objectParent.referral_sub_array = e.data.dataList;
                        console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_array);
                    }
                }, objectParent.referral_sub_count);
            }
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryMenuDropdownAc', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCategoryMenuDropdownAc';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        category: '@category',
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.forbidden = false;
        $scope.$watch('category', function(newCategory, oldCategory) {
            $scope.newCat = (newCategory == undefined || newCategory == '') ? 'หมวดหมู่' : newCategory;
            $scope.oldCat = oldCategory;
        });
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s.toLowerCase();
        };
        $scope.dropdown = false;
        $scope.myFunctionDropdown = function() {
            document.getElementById("myDropdown").classList.toggle("show");
            var dropdown = $(".dropdown-menu").height() + 11;
            console.log("myFunctionDropdown - content : ", dropdown);
            $('.dropdown-menu').css('min-height', dropdown);
        };
        $("#myDropdown").mouseenter(function() {}).mouseleave(function() {
            document.getElementById("myDropdown").classList.toggle("show");
            var dropdown = $(".dropdown-menu").height() + 11;
            console.log("myFunctionDropdown - content : ", dropdown);
            $('.dropdown-menu').css('min-height', dropdown);
        });
        $scope.onclick = function(event) {
            if (!event.target.matches('.dropbtn')) {
                var dropdowns = document.getElementsByClassName("dropdown-content");
                var i;
                for (i = 0; i < dropdowns.length; i++) {
                    var openDropdown = dropdowns[i];
                    if (openDropdown.classList.contains('show')) {
                        openDropdown.classList.remove('show');
                    }
                }
            }
        };
        $scope.requestApiArray = [];
        $scope.chainRerrealRequest = function(txt_referral_type_id, txt_parent_id, callbackData, childCount) {
            var dataSend = {
                'cur_page': 1,
                'per_page': (txt_parent_id <= 0) ? 20 : childCount,
                'txt_referral_type_id': txt_referral_type_id,
                'txt_parent_id': txt_parent_id,
                'txt_badge_id': 18,
                'txt_sortby': 'referral_sort_index_asc_name_desc',
                'base_shop_name': 'bypshop',
            };
            if (parseInt(txt_referral_type_id) > 0) {
                dataSend.txt_view_referral_child = 1;
            }
            $http.get(GURL.base_api_url() + 'referral/short_lists', {
                params: dataSend
            }, $scope).then(function(res) {
                console.log("chainRerrealRequest : dataSend : ", dataSend);
                $scope.requestApiArray[txt_referral_type_id] = $timeout(function() {
                    var e = res.data;
                    console.log("chainRerrealRequest : e  : ", e);
                    if (e.ok === 1) {
                        if (typeof callbackData == undefined || callbackData == undefined) {
                            $scope._page_category = e.data.dataList;
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                        } else {
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                            return callbackData(e);
                        }
                    }
                }, 20);
            });
        };
        $scope.chainRerrealRequest(11, 0);
        $scope.chainReferralHover = function(objectParent, level) {
            console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_count);
            if (objectParent.referral_sub_count > 0 && objectParent.referral_sub_array.length <= 0) {
                $scope.chainRerrealRequest(11, objectParent.referral_id, function(e) {
                    if (e.ok === 1 && e.data.dataList.length) {
                        objectParent.referral_sub_array = e.data.dataList;
                        console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_array);
                    }
                }, objectParent.referral_sub_count);
            }
        };
    };
    return promise;
});_ui_share_app.directive('componentCategoryMenuDropdownAd', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCategoryMenuDropdownAd';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s.toLowerCase();
        };
        $scope.dropdown = false;
        $scope.myFunctionDropdown = function() {
            document.getElementById("myDropdown").classList.toggle("show");
            var dropdown = $(".dropdown-menu").height() + 11;
            console.log("myFunctionDropdown - content : ", dropdown);
            $('.dropdown-menu').css('min-height', dropdown);
        };
        $("#myDropdown").mouseenter(function() {}).mouseleave(function() {
            document.getElementById("myDropdown").classList.toggle("show");
            var dropdown = $(".dropdown-menu").height() + 11;
            console.log("myFunctionDropdown - content : ", dropdown);
            $('.dropdown-menu').css('min-height', dropdown);
        });
        $scope.onclick = function(event) {
            if (!event.target.matches('.dropbtn')) {
                var dropdowns = document.getElementsByClassName("dropdown-content");
                var i;
                for (i = 0; i < dropdowns.length; i++) {
                    var openDropdown = dropdowns[i];
                    if (openDropdown.classList.contains('show')) {
                        openDropdown.classList.remove('show');
                    }
                }
            }
        };
        $scope.requestApiArray = [];
        $scope.chainRerrealRequest = function(txt_referral_type_id, txt_parent_id, callbackData, childCount) {
            var dataSend = {
                'cur_page': 1,
                'per_page': (txt_parent_id <= 0) ? 20 : childCount,
                'txt_referral_type_id': txt_referral_type_id,
                'txt_parent_id': txt_parent_id,
                'txt_badge_id': 18,
                'txt_sortby': 'referral_sort_index_asc_name_desc',
                'base_shop_name': 'maeju',
            };
            if (parseInt(txt_referral_type_id) > 0) {
                dataSend.txt_view_referral_child = 1;
            }
            $http.get(GURL.base_api_url() + 'referral/short_lists', {
                params: dataSend
            }, $scope).then(function(res) {
                console.log("chainRerrealRequest : dataSend : ", dataSend);
                $scope.requestApiArray[txt_referral_type_id] = $timeout(function() {
                    var e = res.data;
                    console.log("chainRerrealRequest : e  : ", e);
                    if (e.ok === 1) {
                        if (typeof callbackData == undefined || callbackData == undefined) {
                            $scope._page_category = e.data.dataList;
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                        } else {
                            $timeout.cancel($scope.requestApiArray[txt_referral_type_id]);
                            return callbackData(e);
                        }
                    }
                }, 20);
            });
        };
        $scope.chainRerrealRequest(11, 0);
        $scope.chainReferralHover = function(objectParent, level) {
            console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_count);
            if (objectParent.referral_sub_count > 0 && objectParent.referral_sub_array.length <= 0) {
                $scope.chainRerrealRequest(11, objectParent.referral_id, function(e) {
                    if (e.ok === 1 && e.data.dataList.length) {
                        objectParent.referral_sub_array = e.data.dataList;
                        console.log(objectParent.referral_name, ' child => ', objectParent.referral_sub_array);
                    }
                }, objectParent.referral_sub_count);
            }
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategorySetSlide', function ($rootScope, $routeParams) {
    var templateName = 'componentCategorySetSlide';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
        /* 
        * fetch only referral category type (tree-list);
        * @params none
        * @return {Array}
        */
    $scope.category_All18 = [];
    $scope.get_category_All18 = function () {
        var txt_filter_json = {
            'badge_id_array': [18]
        };
        var dataSend = {
            'txt_referral_type_id': 11,
            'txt_sortby': 'referral_name_a-z',
            'txt_filter_json': JSON.stringify(txt_filter_json),
        };
        GAEAPI.get('referral/map', dataSend , $scope).then(function (res) {
            if (res.ok === 1) {
                $scope.category_All18 = res.data;
                 console.log("esdoiwpfel :", $scope.category_All18);
            }            
        });
    };
    $scope.get_category_All18();
   
        $scope.testaa = '';
        $scope.ykey =function(refid){
            var dataSend = {
                'txt_referral_type_id': 11,
                'txt_parent_id': refid,
            };
            GAEAPI.get('referral/map', dataSend, $scope).then(function (res) { 
                if(res.ok != 1){
                    return;
                }
                if(res.data.length > 0){
                    $scope.testaa = 'yes';
                    return $scope.testaa;
                }else{
                     $scope.testaa = 'no';
                    return $scope.testaa;
                }
                
            });
        };
        /*
        * view current routeParams
        * @params (default)
        * @return function
        */
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        /*
        * params listener
        * @params (default)
        * @return function
        */
        /* Check if seo enable */
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        /* Check if child array exist */
        $scope.checkChild = function(object){
            return (!object.referral_sub_array.length) ? true : false;
        };
        $scope.buildTitleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentCategorySlideHome', function ($rootScope, $routeParams, sliderProvider, carouselData) {
    var templateName = 'componentCategorySlideHome';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        size:'@size',
        margin:'@margin',
        name: '@name',
        refid: '@refid',
       
    };
    /*promise.link = function (scope, element, attr) {};*/
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.watchCallbackArray = function(){
            var r = [];
            for(var i = 0; i < 6; i++){
                r.push({
                    banner_image:[{image_url:'extensions/themes/gae_default301/staticfiles/images/default/180x150.jpg'}],
                    callback_array:true
                });
            }
            return r;
        };
        
        $scope.$watch('refid',function(newValue,oldValue){
            if(newValue){
                $scope.getdata(newValue);
            }
            
        });
        $scope.data = [];
        $scope.data_desktop = [];
        $scope.data_mobile = [];
        $scope.type = 'categoryslide';
        $scope.done = false;
        $scope.prev_win_size = $(window).width();
        $scope.getdata = function(newvalue){
            var dataSend = {
                'txt_referral_type_id': 11,
                'txt_parent_id': newvalue,
            };
            GAEAPI.get('referral/map', dataSend, $scope).then(function (res) { 
                if(res.ok != 1){
                    return;
                }
                
                if(res.data.length > 0){
                    $scope.data = res.data;
                }else{
                    $scope.data = [];
                    $scope.getproductdata(newvalue);
                }
                
            });
        };
        $scope.data_product = [];
        $scope.getproductdata = function(referal_id){
            var txt_filter_json = {
                'referral_id_array': [referal_id],
                'badge_id_array':[18],
            };
            var data_sent = {
                'cur_page': 1,
                'per_page': 12,
                'txt_filter_json': JSON.stringify(txt_filter_json),
            };
            GAEAPI.get('product/lists', data_sent , $scope).then(function (res) {
                if (res.ok === 1) {
                    $scope.data_product = res.data.dataList;
                }
            });
        };
        $scope.viewData = function(){
            return ($(window).width() > 991) ? $scope.data_desktop : $scope.data_mobile;
        };
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.imageSize = function(){
            return angular.element("img.image_lazy_loaded").length;
        };
        $scope.initSlider = function(){
            var elementName = '.component_carousel_map[data-id="'+$scope._key()+'"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 4,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false
            };
            optionsParmas.responsive = [
            {
                breakpoint: 1200,
                settings: {
                    slidesToShow: 3,
                    slidesToScroll: 1,
                    variableWidth: false,
                    centerMode: false
                }
            }, {
                breakpoint: 769,
                settings: {
                    slidesToShow: 2,
                    slidesToScroll: 1,
                    variableWidth: false,
                    centerMode: false
                }
            }, {
                breakpoint: 601,
                settings: {
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    variableWidth: false,
                    centerMode: false,
                }
            }, {
                breakpoint: 481,
                settings: {
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    variableWidth: false,
                    centerMode: false,
                    dots: false,
                    arrows: false,
                }
            }
            ];
            var extraOptions = {
                animate: false
            };
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
            angular.element($window).bind('resize',function(){
                if($scope.prev_win_size != $(window).width()){
                    if($(elementName).hasClass('slick-initialized') || $(elementName).hasClass('slick-slider')){
                        $(elementName).slick('unslick');                       
                    }
                    setTimeout(function(){  
                        if($(elementName).hasClass('slick-initialized') || $(elementName).hasClass('slick-slider')){
                            $(elementName).slick('unslick');                       
                        }                      
                        sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);                        
                    }, 3000);                    
                }
            });
        };
        $scope.checkHide = function(){
            var r = false;
            if(angular.element('.component_carousel_map.slick-initialized[data-id="'+$scope._key()+'"]').length){
                r = true;
            }
            return r;
        };
        $scope.viewLink = function(i){
            $window.location.href=i;
        };
        /**
         * Check if object array available for "website application" or "Mobile application"
         * @params object array
         * return true | false (default)
         */
         $scope._showWeb = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 18) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showApp = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 19) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        /* Watch when finish repeat */
        $rootScope.$on('repeatend', function() {
            if($('.component_carousel_map[data-id="'+$scope._key()+'"]').not('.slick-initialized')){
                $timeout(function(){
                    $scope.initSlider();
                }, 500);                
            }            
        });
        $scope.checkHide = function(){
            return ($('.component_carousel_map.slick-initialized[data-id="'+$scope._key()+'"]').length > 0) ? true : false;
        };
        $scope.slickGoLeft=function(){
            setTimeout(function () {
                $('.component_carousel_map[data-id="'+$scope._key()+'"]').slick('slickPrev');
            }, 100);
        };
        
        $scope.slickGoRight=function(){
            setTimeout(function () {
                $('.component_carousel_map[data-id="'+$scope._key()+'"]').slick('slickNext');
            }, 100);
        };
        $scope.checkSeo=function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentClientImage', function ($rootScope, $routeParams) {
    var templateName = 'componentClientImage';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        component: '@component',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	
    };
    return promise;
});
_ui_share_app.directive('componentClientImageA', function ($rootScope, $routeParams) {
    var templateName = 'componentClientImageA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        component: '@component',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	
    };
    return promise;
});
_ui_share_app.factory('$componentCollection', function componentCollection($routeParams, $timeout) {
    return
});_ui_share_app.directive('componentCollectionIdTypeA', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCollectionIdTypeA';
    var componentMain = 'componentCollection';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        col: '@col',
        component: '@component',
        stylebutton: '@stylebutton',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope._dataArray = [];
        $scope._dataTime = {
            start: 0,
            end: 0
        };
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            console.log("CHECK COLLECTION READY ");
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_collection_id': id,
            };
            GAEAPI.get('collection/id', dataSend).then(function(output) {
                console.log("CHECK COLLECTION START ", output);
                if (output.ok === 1) {
                    var item = output.data;
                    $scope._dataArray = item;
                    $scope._dataTime.start = item.collection_lifetime.lifetime_start_time;
                    $scope._dataTime.end = item.collection_lifetime.lifetime_end_time;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope.collectionData = false;
        $scope.collectionDataSend = false;
        $scope.isLoadMore = false;
        $scope.isLoadMoreHide = false;
        $scope.getDetail = function(id) {
            var dataSend = {
                'txt_collection_id': id,
                'cur_page': ($scope.collectionDataSend) ? $scope.collectionDataSend.cur_page : 1,
                'per_page': ($scope.collectionDataSend) ? $scope.collectionDataSend.per_page : 12,
                'txt_badge_id': 18
            };
            $scope.collectionDataSend = dataSend;
            GAEAPI.get('collection/short_id', dataSend).then(function(e) {
                console.log("collection/id: res", e);
                if (dataSend.cur_page > 1) {
                    var oldProductArray = $scope.collectionData.collection_product_array;
                    var currentData = e.data.collection_product_array;
                    var mergeProductArray = oldProductArray.concat(currentData);
                    $scope.collectionData.collection_product_array = mergeProductArray;
                } else {
                    $scope.collectionData = e.data;
                }
                $scope.isLoadMore = false;
                var maxPage = parseInt($scope.collectionData.collection_product_pagination.total_page);
                var nextPage = parseInt($scope.collectionData.collection_product_pagination.next_page);
                if (dataSend.cur_page >= maxPage) {
                    $scope.isLoadMoreHide = true;
                }
            });
        };
        $scope.getDetail($scope._idUrl($scope._viewRouteParams().collection_id));
        $scope.loadMore = function() {
            $scope.collectionDataSend.cur_page = $scope.collectionDataSend.cur_page + 1;
            $scope.isLoadMore = true;
            $timeout(function() {
                $scope.getDetail($scope._idUrl($scope._viewRouteParams().collection_id));
            }, 100);
        };
        $scope.timeHide = function(timestampStart, timestampEnd) {
            var dates = new Date().getTime();
            var datesLen = dates.toString().length;
            var timeStart = String(timestampStart);
            var timeEnd = String(timestampEnd);
            var subdate = parseInt(dates.toString().substring(0, timeEnd.length));
            var end = timestampEnd - subdate;
            return (timestampEnd == -1) ? 1 : end;
        };
        $scope.timeReplace = function(timestampStart, timestampEnd) {
            var dates = new Date().getTime();
            var datesLen = dates.toString().length;
            var timeStart = String(timestampStart);
            var timeEnd = String(timestampEnd);
            var subdate = parseInt(dates.toString().substring(0, timeEnd.length));
            var end = timestampEnd - subdate;
            if (timestampEnd == -1) {
                end = 1;
            }
            if (end <= 0) {
                if ($scope._dataTime.end == "-1" || $scope._dataTime.end == -1) {
                    return;
                }
                window.location.href = 'home';
            }
        };
        $scope.check = function() {
            return {
                start: function(inputTimeStamp) {
                    var todayTimeStamp = (new Date().getTime() / 1000);
                    var targetTimeStamp = parseInt(inputTimeStamp);
                    return (targetTimeStamp <= todayTimeStamp) ? true : false;
                },
                end: function(inputTimeStamp) {
                    var todayTimeStamp = (new Date().getTime() / 1000);
                    var targetTimeStamp = parseInt(inputTimeStamp);
                    if (parseInt(targetTimeStamp) == -1) {
                        return true;
                    }
                    return (targetTimeStamp > todayTimeStamp) ? true : false;
                },
            }
        };
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.dates = new Date();
                $scope.timeReplace($scope._dataTime.start, $scope._dataTime.end);
                $scope.timeCountStart();
            }, 1000);
        };
        $scope.$watch('col', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            $scope._col = newValue.toString().split(",");
        });
        $scope.getCol = function(n) {
            return (typeof $scope._col != 'undefined') ? (typeof $scope._col[n] != 'undefined' && $scope._col[n] != '') ? $scope._col[n] : 12 : 12;
        };
        $scope.checkShop = function() {
            if (CUR_THEME.shop_id() == "646") {
                return 646;
            } else {
                return false;
            }
        };
        $scope.showWeb = function(objArr) {
            var show = false;
            for (var i = 0; i < objArr.length; i++) {
                if (parseInt(objArr[i].badge_id) == 18) {
                    show = true;
                    break;
                }
            }
            return show;
        };
    };
    return promise;
});_ui_share_app.directive('componentCollectionIdTypeB', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCollectionIdTypeB';
    var componentMain = 'componentCollection';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.viewRouteParams = function() {
            return $routeParams;
        };
    };
    return promise;
});_ui_share_app.directive('componentCollectionIdTypeC', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCollectionIdTypeC';
    var componentMain = 'componentCollection';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        margin: '@margin',
        card: '@card',
        stylebutton: '@stylebutton',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window, $http) {
        $scope._component = {
            name: "componentCollectionIdTypeC",
            show: (window.location.hostname == "localhost") ? true : false
        };
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        /* scope */
        $scope._name = ($scope.name != undefined && $scope.name != "") ? $scope.name : "default";
        $scope._margin = ($scope.margin != undefined && $scope.margin != "") ? {
            margin: $scope.margin
        } : {
            margin: 0
        };
        $scope._card = ($scope.card != undefined && $scope.card != "") ? $scope.card : "c";
        $scope._stylebutton = ($scope.stylebutton != undefined && $scope.stylebutton != "") ? $scope.stylebutton : "border_button_small";
        /* scope */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._component.show) {
                        console.log($scope._component.name, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(_self, params, state);
                },
                getCollectionId: function(params, callback) {
                    var _self = this;
                    var collection_id = (params.collection_id != undefined) ? params.collection_id.split("-", 1).join("") : false;
                    _self.consoleLog("getBranchId", "collection_id", collection_id);
                    callback(collection_id);
                },
                formatDataSend: function(data, callback) {
                    var _self = this;
                    _self.consoleLog("formatDataSend", "data", data);
                    callback(data);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData", "state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend", "api", api);
                    _self.consoleLog("dataSend", "dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi", "ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.consoleLog("getApi", "res_api", res_api);
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi", "res_ok", res_ok);
                            state = _self.stateData(false, true);
                            _self.consoleLog("checkGetApi", "state", state);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        /* get api */
        $scope.data_api = {
            load_more: {
                load: false,
                cur_page: 1,
                per_page: 12,
                total_rows: 0
            },
            collection_id: {
                data_send: {},
                api: "collection/short_id",
                ok: false,
                data_array: [],
                data_array_state: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.loadMore = function() {
            if (!$scope.data_api.load_more.load) {
                $scope.data_api.load_more.cur_page++;
                $scope.data_api.load_more.load = true;
                $scope.getData().getRouteParams(function(_self, params, state) {
                    _self.getCollectionId(params, function(res_collection_id) {
                        _self.formatDataSend($scope.data_api.collection_id, function(res_data) {
                            var filter_json = {};
                            var dataSend = {
                                'txt_collection_id': res_collection_id,
                                'cur_page': $scope.data_api.load_more.cur_page,
                                'per_page': $scope.data_api.load_more.per_page,
                                'txt_badge_id': 18,
                                'txt_filter_json': JSON.stringify(filter_json)
                            };
                            res_data.data_send = dataSend;
                            _self.dataSend(res_data.api, res_data.data_send, function(res_api, res_data_send) {
                                _self.getApi(res_api, res_data_send, function(res_ok, res_api, res_state) {
                                    res_data.ok = res_ok;
                                    if (res_data.data_array.collection_product_array.length < res_api.data.collection_product_pagination.total_rows) {
                                        var oldData = res_data.data_array.collection_product_array;
                                        res_data.data_array.collection_product_array = oldData.concat(res_api.data.collection_product_array);
                                        $scope.data_api.load_more.total_rows = res_api.data.collection_product_pagination.total_rows;
                                        _self.consoleLog("getApiData", "res_data", res_data);
                                    } else {
                                        $scope.data_api.load_more.cur_page--;
                                    }
                                    $scope.data_api.load_more.load = false;
                                });
                            });
                        });
                    });
                });
            }
        }
        $scope.getData().getRouteParams(function(_self, params, state) {
            $scope.data_api.collection_id.data_array_state = state;
            _self.getCollectionId(params, function(res_collection_id) {
                _self.formatDataSend($scope.data_api.collection_id, function(res_data) {
                    var filter_json = {};
                    var dataSend = {
                        'txt_collection_id': res_collection_id,
                        'cur_page': $scope.data_api.load_more.cur_page,
                        'per_page': $scope.data_api.load_more.per_page,
                        'txt_badge_id': 18,
                        'txt_filter_json': JSON.stringify(filter_json)
                    };
                    res_data.data_send = dataSend;
                    _self.dataSend(res_data.api, res_data.data_send, function(res_api, res_data_send) {
                        _self.getApi(res_api, res_data_send, function(res_ok, res_api, res_state) {
                            res_data.ok = res_ok;
                            res_data.data_array = res_api.data;
                            res_data.data_array_state = res_state;
                            _self.consoleLog("getApiData", "res_data", res_data);
                            $scope.data_api.load_more.total_rows = res_api.data.collection_product_pagination.total_rows;
                        });
                    });
                });
            });
        });
        /* get api */
    };
    return promise;
});_ui_share_app.directive('componentCollectionSlideTypeA', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentCollectionSlideTypeA';
    var componentMain = 'componentCollection';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        sortby: '@sortby',
        component: '@component',
        stylebutton: '@stylebutton',
        margintopic: '@margintopic',
        margincard: '@margincard',
        limit: '@limit',
        iconsize: '@iconsize',
        iconnext: '@iconnext',
        iconback: '@iconback',
        showresult: '@showresult',
        dots: '@dots',
        arrows: '@arrows',
        autoplay: '@autoplay',
        centermode: '@centermode',
        variablewidth: '@variablewidth',
        infinite: '@infinite',
        slidestoscroll: '@slidestoscroll',
        lg: '@lg',
        md: '@md',
        sm: '@sm',
        xs: '@xs',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'topic_top': '?topicTop',
    };
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._component = (typeof $scope.component !== 'undefined' && $scope.component !== '') ? $scope.component : 'null';
        $scope._limit = parseInt((typeof $scope.limit !== 'undefined' && typeof $scope.limit !== '') ? $scope.limit : 6);
        $scope._sortby = (typeof $scope.sortby !== 'undefined' && typeof $scope.sortby !== '') ? $scope.sortby : 'collection_create_time_DESC';
        $scope._iconsize = (typeof $scope.iconsize !== 'undefined' && typeof $scope.iconsize !== '') ? $scope.iconsize : 30;
        $scope._iconback = (typeof $scope.iconback !== 'undefined' && typeof $scope.iconback !== '') ? $scope.iconback : 'icnt_outline_backbig02_light@2x.png';
        $scope._iconnext = (typeof $scope.iconnext !== 'undefined' && typeof $scope.iconnext !== '') ? $scope.iconnext : 'icnt_outline_nextbig02_light@2x.png';
        $scope._dots = Boolean((typeof $scope.dots !== 'undefined' && typeof $scope.dots !== '') ? $scope.dots : true);
        $scope._arrows = Boolean((typeof $scope.arrows !== 'undefined' && typeof $scope.arrows !== '') ? $scope.arrows : true);
        $scope._autoplay = Boolean((typeof $scope.autoplay !== 'undefined' && typeof $scope.autoplay !== '') ? $scope.autoplay : true);
        $scope._centerMode = Boolean((typeof $scope.centermode !== 'undefined' && typeof $scope.centermode !== '') ? $scope.centerMode : false);
        $scope._variableWidth = Boolean((typeof $scope.variablewidth !== 'undefined' && typeof $scope.variablewidth !== '') ? $scope.variablewidth : false);
        $scope._infinite = Boolean((typeof $scope.infinite !== 'undefined' && typeof $scope.infinite !== '') ? $scope.infinite : true);
        $scope._slidesToScroll = parseInt((typeof $scope.slidestoscroll !== 'undefined' && typeof $scope.slidestoscroll !== '') ? $scope.slidestoscroll : 4);
        $scope._col_lg = parseInt((typeof $scope.lg !== 'undefined' && typeof $scope.lg !== '') ? $scope.lg : 4);
        $scope._col_md = parseInt((typeof $scope.md !== 'undefined' && typeof $scope.md !== '') ? $scope.md : 3);
        $scope._col_sm = parseInt((typeof $scope.sm !== 'undefined' && typeof $scope.sm !== '') ? $scope.sm : 2);
        $scope._col_xs = parseInt((typeof $scope.xs !== 'undefined' && typeof $scope.xs !== '') ? $scope.xs : 1);
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getCollectionArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'cur_page': 1,
                'per_page': $scope._limit,
                'txt_sortby': $scope._sortby,
            };
            console.log('dataSend_collection_short_lists', dataSend);
            GAEAPI.get('collection/short_lists', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data.dataList;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getCollectionArray();
        $scope.mkCarousel = function(elem) {
            $('.component-collection-slide-id-type-a').css('height', '0');
            $('.component-collection-slide-id-type-a').css('opacity', '0');
            console.log("col-lg-md-xs-sm : ", $scope._col_lg, $scope._col_md, $scope._col_xs, $scope._col_sm);
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: $scope._dots,
                    arrows: $scope._arrows,
                    autoplay: $scope._autoplay,
                    centerMode: $scope._centerMode,
                    variableWidth: $scope._variableWidth,
                    autoplaySpeed: 4000,
                    slidesToShow: $scope._col_lg,
                    slidesToScroll: 1,
                    infinite: $scope._infinite,
                    speed: 600,
                    prevArrow: ' ',
                            nextArrow: '
',
                            nextArrow: ' ',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselBar: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: false,
                            infinite: false,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 6,
                            slidesToScroll: 6,
                            speed: 600,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: 5,
                                    slidesToScroll: 5,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: 4,
                                    slidesToScroll: 4,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: 3,
                                    slidesToScroll: 3,
                                }
                            }]
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                slickCarousel: function(carousel, index) {
                    var _self = this;
                    $scope.setCarousel.index = index;
                    setTimeout(function() {
                        $('[data-key="' + carousel + '"]').slick('slickGoTo', index);
                    }, 100);
                },
                prevIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != 0) ? image_index - 1 : image - 1;
                    _self.consoleLog("prevIndex index", $scope.setCarousel.index);
                },
                nextIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != (image - 1)) ? image_index + 1 : 0;
                    _self.consoleLog("nextIndex index", $scope.setCarousel.index);
                }
            }
            return getFunction;
        };
        $scope.getAttribute = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                productAttribute: function(productAttribute, callback) {
                    var _self = this;
                    var attribute = {
                        option_name: "",
                        option_attribute: []
                    };
                    if (productAttribute.option_data != undefined) {
                        if (productAttribute.option_data.variant_array != undefined && productAttribute.option_data.variant_array.length != 0) {
                            for (var a = 0; a < productAttribute.option_data.pclass_array.length; a++) {
                                attribute.option_name = attribute.option_name.concat(productAttribute.option_data.pclass_array[a].pclass_name, " ");
                            }
                            for (var b = 0; b < productAttribute.option_data.variant_array.length; b++) {
                                var product_attribute = {
                                    product_id: productAttribute.option_data.variant_array[b].product_id,
                                    product_sku: productAttribute.option_data.variant_array[b].sku,
                                    product_title: "",
                                    product_price: parseFloat(productAttribute.option_data.variant_array[b].price),
                                    product_compare_price: parseFloat(productAttribute.option_data.variant_array[b].compare_price),
                                    product_total_stock: parseFloat(productAttribute.option_data.variant_array[b].total_stock),
                                    product_image: productAttribute.option_data.variant_array[b].variant_image
                                }
                                for (var c = 0; c < productAttribute.option_data.variant_array[b].option_name_array.length; c++) {
                                    product_attribute.product_title = product_attribute.product_title.concat(productAttribute.option_data.variant_array[b].option_name_array[c], " ");
                                }
                                attribute.option_attribute.push(product_attribute);
                            }
                        }
                    }
                    _self.consoleLog("productAttribute attribute ", attribute);
                    callback(attribute);
                },
                checkDiscountPrice: function(productDiscount, resPrice, resComparePrice, callback) {
                    var _self = this;
                    var price = 0;
                    var compare_price = 0;
                    if (productDiscount.length == 0) {
                        price = parseFloat(resPrice);
                        compare_price = parseFloat(resComparePrice);
                    } else {
                        if (productDiscount.discount_type_id == '101') {
                            price = parseFloat(resPrice) - parseFloat(productDiscount.discount_price);
                            compare_price = parseFloat(resPrice);
                        } else if (productDiscount.discount_type_id == '102') {
                            price = (parseFloat(resPrice) * ((100 - parseFloat(productDiscount.discount_percent)) / 100));
                            compare_price = parseFloat(resPrice);
                        }
                    }
                    callback(price, compare_price);
                },
                checkMinPrice: function(option, callback) {
                    var _self = this;
                    var price_min = parseFloat(option.option_attribute[0].product_price);
                    var compare_price_min = parseFloat(option.option_attribute[0].product_compare_price);
                    var total_stock = parseFloat(option.option_attribute[0].product_total_stock);
                    for (var a = 0; a < option.option_attribute.length; a++) {
                        if (price_min >= parseFloat(option.option_attribute[a].product_price)) {
                            price_min = parseFloat(option.option_attribute[a].product_price);
                            compare_price_min = parseFloat(option.option_attribute[a].product_compare_price);
                            total_stock = parseFloat(option.option_attribute[a].product_total_stock);
                        }
                    }
                    _self.consoleLog("checkPriceMin price_min ", price_min);
                    _self.consoleLog("checkPriceMin compare_price_min ", compare_price_min);
                    _self.consoleLog("checkPriceMin total_stock ", total_stock);
                    callback(price_min, compare_price_min, total_stock);
                },
                getTotalStock: function(totalStock, mixStock, callback) {
                    var _self = this;
                    var total_stock = (totalStock > 0) ? ((totalStock <= mixStock) ? totalStock : mixStock) : ((totalStock == -1) ? mixStock : totalStock);
                    callback(total_stock);
                },
                checkMinPrices: function(api, attribute, callback) {
                    var _self = this;
                    var dataPrice = {
                        product_price: {
                            price_name: 'product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        product_compare_price: {
                            price_name: 'product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_price: {
                            price_name: 'sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_price: {
                            price_name: 'sum_product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_minus_sum_product_price: {
                            price_name: 'sum_product_compare_minus_sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        }
                    }
                    if (attribute.option_attribute.length == 0) {
                        _self.checkDiscountPrice(api.data.product_discount, api.data.product_price, api.data.product_compare_price, function(res_price, res_compare_price) {
                            _self.checkPrice(res_price, function(res_price_ecimals) {
                                dataPrice.product_price.price = res_price;
                                dataPrice.product_price.price_ecimals = res_price_ecimals;
                                dataPrice.sum_product_price.price = res_price;
                                dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                    dataPrice.product_compare_price.price = res_compare_price;
                                    dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    dataPrice.sum_product_compare_price.price = res_compare_price;
                                    dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                    _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                        dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                        dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                        _self.getTotalStock(api.data.product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                            dataPrice.product_price.total_stock = res_total_stock_s;
                                            dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                            callback(dataPrice, false);
                                        });
                                    });
                                });
                            });
                        });
                    } else {
                        _self.checkMinPrice(attribute, function(res_price_min, res_compare_price_min, res_total_stock) {
                            _self.checkDiscountPrice(api.data.product_discount, res_price_min, res_compare_price_min, function(res_price, res_compare_price) {
                                _self.checkPrice(res_price, function(res_price_ecimals) {
                                    dataPrice.product_price.price = res_price;
                                    dataPrice.product_price.price_ecimals = res_price_ecimals;
                                    dataPrice.sum_product_price.price = res_price;
                                    dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                    _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                        dataPrice.product_compare_price.price = res_compare_price;
                                        dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        dataPrice.sum_product_compare_price.price = res_compare_price;
                                        dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                        _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                            dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                            dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                            _self.getTotalStock(res_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                dataPrice.product_price.total_stock = res_total_stock_s;
                                                dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                callback(dataPrice, true);
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    }
                },
                priceIncludes: function(price, includes, callback) {
                    var _self = this;
                    var priceToString = (price == null) ? 0 : price;
                    _self.consoleLog('priceIncludes priceToString : ', priceToString);
                    callback(priceToString.toString().includes(includes));
                },
                checkPrice: function(price, callback) {
                    var _self = this;
                    _self.priceIncludes(price, '.', function(res) {
                        _self.consoleLog("checkPrice res ", res);
                        callback((!res) ? 0 : 2);
                    });
                },
                onSelectOption: function(productId) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = productId;
                    _self.consoleLog("onSelectOption productId ", productId);
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    for (var a = 0; a < $scope.data.attribute.dataArray.option_attribute.length; a++) {
                        _self.consoleLog("onSelectOption option_attribute ", $scope.data.attribute.dataArray.option_attribute[a]);
                        if ($scope.data.attribute.dataArray.option_attribute[a].product_id == productId) {
                            if ($scope.data.attribute.dataArray.option_attribute[a].product_image.length != 0) {
                                if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                                    for (var b = 0; b < $scope.dataApi.product.dataArray.product_image.length; b++) {
                                        if ($scope.dataApi.product.dataArray.product_image[b].image_id == $scope.data.attribute.dataArray.option_attribute[a].product_image[0].image_id) {
                                            $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, b);
                                        }
                                    }
                                }
                            }
                            _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[a].product_price, $scope.data.attribute.dataArray.option_attribute[a].product_compare_price, function(res_price_p, res_compare_price_p) {
                                _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                                    $scope.data.product_price.price = res_price_p;
                                    $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                                    $scope.data.sum_product_price.price = res_price_p;
                                    $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                                    _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                        $scope.data.product_compare_price.price = res_compare_price_p;
                                        $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                        $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                        _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                            $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                            $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                            _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[a].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                $scope.data.product_price.total_stock = res_total_stock_s;
                                                $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                /* stock */
                                                $scope.data.quantity.quantity_max = res_total_stock_s;
                                                $scope.data.quantity.quantity_select = [];
                                                for (var i = 0; i < res_total_stock_s; i++) {
                                                    $scope.data.quantity.quantity_select.push(i + 1);
                                                }
                                                /* stock */
                                            })
                                        });
                                    });
                                });
                            });
                            break;
                        }
                    }
                },
                onClickOption: function(index) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.data.attribute.productId = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    if ($scope.data.attribute.dataArray.option_attribute[index].product_image.length != 0) {
                        if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                            for (var i = 0; i < $scope.dataApi.product.dataArray.product_image.length; i++) {
                                if ($scope.dataApi.product.dataArray.product_image[i].image_id == $scope.data.attribute.dataArray.option_attribute[index].product_image[0].image_id) {
                                    $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, i);
                                }
                            }
                        }
                    }
                    _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[index].product_price, $scope.data.attribute.dataArray.option_attribute[index].product_compare_price, function(res_price_p, res_compare_price_p) {
                        _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                            $scope.data.product_price.price = res_price_p;
                            $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                            $scope.data.sum_product_price.price = res_price_p;
                            $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                            _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                $scope.data.product_compare_price.price = res_compare_price_p;
                                $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                    $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                    $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                    _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[index].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                        $scope.data.product_price.total_stock = res_total_stock_s;
                                        $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                        /* stock */
                                        $scope.data.quantity.quantity_max = res_total_stock_s;
                                        $scope.data.quantity.quantity_select = [];
                                        for (var i = 0; i < res_total_stock_s; i++) {
                                            $scope.data.quantity.quantity_select.push(i + 1);
                                        }
                                        /* stock */
                                    })
                                });
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.getAttributeCustom = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                createArray: function(productCustomTemplates, callback) {
                    var _self = this;
                    var custom_attributes = [];
                    if (productCustomTemplates.templates.length != 0) {
                        if (productCustomTemplates.templates[0].option_sets.length != 0) {
                            _self.getAttributes(productCustomTemplates.templates[0].option_sets, function(res_attributes) {
                                custom_attributes = res_attributes;
                            });
                        }
                    }
                    _self.consoleLog("createArray : productCustomTemplates", productCustomTemplates);
                    _self.consoleLog("createArray : custom_attributes", custom_attributes);
                    callback(custom_attributes, true);
                },
                formatAttribute: function(index, optionSubsetIndex, setType, optionSetArray, callback) {
                    var _self = this;
                    var set_id = (setType == 'attribute') ? optionSetArray.set_id : optionSetArray.subset_id;
                    var attribute = {
                        attribute_index: index,
                        attribute_option_subset_index: optionSubsetIndex,
                        active_option_id: (optionSetArray.option_data.select_id != 0) ? optionSetArray.option_data.select_id : "-1",
                        active_option_index: -1,
                        active_option_index_str: "-1",
                        active_textarea: "",
                        active_array: [],
                        set_id: set_id,
                        name: optionSetArray.name,
                        set_type: optionSetArray.ss_type,
                        option: []
                    }
                    callback(attribute);
                },
                getOption: function(index, optionDataArray, callback) {
                    var _self = this;
                    var options = {
                        index: index,
                        ss_data_id: optionDataArray.ss_data_id,
                        name: optionDataArray.name,
                        image: optionDataArray.image,
                        price: optionDataArray.price,
                        compare_price: 0,
                        total_stock: 0
                    }
                    callback(options);
                },
                getActive: function(index, activeOptionId, activeOptionIdIn, optionDataArray, callback) {
                    var _self = this;
                    var actives_index = (optionDataArray.ss_data_id == activeOptionId) ? index : activeOptionIdIn;
                    var actives = (optionDataArray.ss_data_id != activeOptionId) ? "0" : "1";
                    callback(actives_index, actives);
                },
                getAttributes: function(optionSetArray, callback) {
                    var _self = this;
                    var attributes = [];
                    for (var index = 0; index < optionSetArray.length; index++) {
                        _self.formatAttribute(index, 0, 'attribute', optionSetArray[index], function(res_attribute) {
                            if (optionSetArray[index].option_subsets.length != 0) {
                                for (var option_subset_index = 0; option_subset_index < optionSetArray[index].option_subsets.length; option_subset_index++) {
                                    _self.formatAttribute(index, option_subset_index, res_attribute.set_type, optionSetArray[index].option_subsets[option_subset_index], function(res_attribute_sub) {
                                        var options = [];
                                        var active_option_id = -1;
                                        var active_option_array = [];
                                        for (var option = 0; option < optionSetArray[index].option_subsets[option_subset_index].option_data.options.length; option++) {
                                            _self.getOption(option, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_option) {
                                                options.push(res_option);
                                            });
                                            _self.getActive(option, res_attribute_sub.active_option_id, active_option_id, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_actives_index, res_actives) {
                                                active_option_id = res_actives_index;
                                                active_option_array.push(res_actives);
                                            });
                                        }
                                        res_attribute_sub.option = options;
                                        res_attribute_sub.active_option_index = active_option_id;
                                        res_attribute_sub.active_option_index_str = String(active_option_id);
                                        res_attribute_sub.active_array = active_option_array;
                                        attributes.push(res_attribute_sub);
                                    });
                                }
                            } else {
                                var options = [];
                                var active_option_id = -1;
                                var active_option_array = [];
                                for (var option = 0; option < optionSetArray[index].option_data.options.length; option++) {
                                    _self.getOption(option, optionSetArray[index].option_data.options[option], function(res_option) {
                                        options.push(res_option);
                                    });
                                    _self.getActive(option, res_attribute.active_option_id, active_option_id, optionSetArray[index].option_data.options[option], function(res_actives_index, res_actives) {
                                        active_option_id = res_actives_index;
                                        active_option_array.push(res_actives);
                                    });
                                }
                                res_attribute.option = options;
                                res_attribute.active_option_index = active_option_id;
                                res_attribute.active_option_index_str = String(active_option_id);
                                res_attribute.active_array = active_option_array;
                                attributes.push(res_attribute);
                            }
                        });
                    }
                    callback(attributes)
                },
                getformatQuantity: function(index, attributeCustom, callback) {
                    var _self = this;
                    var quantity = {
                        name: String(index + 1),
                        dataArray: attributeCustom
                    }
                    callback(quantity);
                },
                onClickRadio: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickRadio : index", index);
                    _self.consoleLog("onClickRadio : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickRadio : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickDropdown: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickDropdown : index", index);
                    _self.consoleLog("onClickDropdown : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickDropdown : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickCheckbox: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickCheckbox : index", index);
                    _self.consoleLog("onClickCheckbox : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i == parseInt(index_option)) ? (($scope.data.attribute_custom.dataArray[index].active_array[i] != "0") ? "0" : "1") : $scope.data.attribute_custom.dataArray[index].active_array[i];
                    }
                    _self.consoleLog("onClickCheckbox : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                }
            }
            return getFunction;
        };
        $scope.getReward = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                momentUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    callback(now);
                },
                getCalculator: function(sumProductPrice, reward, callback) {
                    var _self = this;
                    _self.consoleLog("getCalculator : sumProductPrice", sumProductPrice);
                    _self.consoleLog("getCalculator : reward", reward);
                    var point_reward = 0;
                    if (reward.type_id == "100") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    } else if (reward.type_id == "101") {
                        point_reward = reward.reward_amount;
                    } else if (reward.type_id == "102") {
                        point_reward = (reward.reward_percent * sumProductPrice.price) / 100;
                    } else if (reward.type_id == "103") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    }
                    _self.consoleLog("getCalculator : point_reward", point_reward);
                    callback(point_reward);
                },
                getProductReward: function(now, productReward, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (productReward.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(productReward.reward_lifetime.lifetime_start_time);
                        reward.lifetime_end_time = parseInt(productReward.reward_lifetime.lifetime_end_time);
                        reward.type_id = productReward.reward_type_id;
                        reward.amount = parseInt(productReward.reward_amount);
                        reward.percent = parseInt(productReward.reward_percent);
                        reward.every_price = parseInt(productReward.reward_every_price);
                    }
                    _self.consoleLog("getProductReward : reward", reward);
                    callback(reward);
                },
                getPointConfig: function(now, shopPointConfig, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (shopPointConfig.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(shopPointConfig.er_from);
                        reward.lifetime_end_time = parseInt(shopPointConfig.er_to);
                        reward.type_id = "100";
                        reward.amount = parseInt(shopPointConfig.er_earn);
                        reward.every_price = parseInt(shopPointConfig.er_rate);
                    }
                    _self.consoleLog("getPointConfig : reward", reward);
                    callback(reward);
                },
                checkPointReward: function(reward, callback) {
                    var _self = this;
                    var state = false;
                    if (reward.reward_length) {
                        var start = reward.lifetime_start_time < reward.lifetime_time && reward.lifetime_start_time != 0;
                        var end = (reward.lifetime_end_time != -1) ? reward.lifetime_time <= reward.lifetime_end_time && reward.lifetime_end_time != 0 : true;
                        if (start && end) {
                            if (reward.type_id == "100") {
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            } else if (reward.type_id == "101") {
                                var amount = reward.amount != 0;
                                if (amount) {
                                    state = true;
                                }
                            } else if (reward.type_id == "102") {
                                var percent = reward.percent != 0;
                                if (percent) {
                                    state = true;
                                }
                            } else if (reward.type_id == "103") {
                                var percent = reward.percent != 0;
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            }
                        }
                    }
                    callback(state);
                },
                checkReward: function(rewardProduct, rewardPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("checkReward : rewardProduct", rewardProduct);
                    _self.consoleLog("checkReward : rewardPointConfig", rewardPointConfig);
                    var reward = {
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    _self.checkPointReward(rewardProduct, function(res_state_product) {
                        _self.checkPointReward(rewardPointConfig, function(res_state_point_config) {
                            if (res_state_point_config) {
                                reward.type_id = rewardPointConfig.type_id;
                                reward.type_id = rewardPointConfig.type_id;
                                reward.amount = rewardPointConfig.amount;
                                reward.percent = rewardPointConfig.percent;
                                reward.every_price = rewardPointConfig.every_price;
                            } else if (res_state_product) {
                                reward.type_id = rewardProduct.type_id;
                                reward.amount = rewardProduct.amount;
                                reward.percent = rewardProduct.percent;
                                reward.every_price = rewardProduct.every_price;
                            }
                            _self.consoleLog("checkReward : reward", reward);
                            callback(reward);
                        });
                    });
                },
                checkRewardType: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.momentUnix(function(now) {
                        _self.getProductReward(now, productReward, function(res_reward_product) {
                            _self.getPointConfig(now, shopPointConfig, function(res_reward_point_config) {
                                _self.checkReward(res_reward_product, res_reward_point_config, function(res_reward) {
                                    callback(res_reward);
                                });
                            });
                        });
                    });
                },
                createReward: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("createReward : productReward", productReward);
                    _self.consoleLog("createReward : shopPointConfig", shopPointConfig);
                    _self.checkRewardType(productReward, shopPointConfig, function(res_reward) {
                        _self.consoleLog("createReward : res_reward", res_reward);
                        callback(res_reward);
                    });
                }
            }
            return getFunction;
        };
        $scope.getQuantity = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                upDateReward: function() {
                    var _self = this;
                },
                upDateReward: function() {
                    var _self = this;
                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                        $scope.data.reward.point_reward = res_point_reward;
                    });
                },
                upDatePrice: function() {
                    var _self = this;
                    var product_price = $scope.data.product_price.price * $scope.data.quantity.quantity_input;
                    var product_compare_price = $scope.data.product_compare_price.price * $scope.data.quantity.quantity_input;
                    $scope.getAttribute().checkPrice(product_price, function(res_price_ecimals) {
                        $scope.data.sum_product_price.price = product_price;
                        $scope.data.sum_product_price.price_ecimals = res_price_ecimals;
                        $scope.getAttribute().checkPrice(product_compare_price, function(res_compare_price_ecimals) {
                            $scope.data.sum_product_compare_price.price = product_compare_price;
                            $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                            var compare_price_minus_price = ((product_compare_price - product_price) > 0) ? product_compare_price - product_price : 0;
                            $scope.getAttribute().checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                _self.upDateReward();
                            });
                        });
                    });
                },
                input: function(quantityInput) {
                    var _self = this;
                    _self.consoleLog("input : quantityInput", quantityInput);
                    quantityInput = (quantityInput == null) ? 1 : parseInt(quantityInput);
                    _self.consoleLog("input : quantityInput", quantityInput);
                    if (quantityInput != null) {
                        if (quantityInput >= $scope.data.quantity.quantity_max) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_max;
                        }
                        if (quantityInput <= $scope.data.quantity.quantity_min) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                        }
                    } else {
                        $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                    }
                    _self.upDatePrice();
                },
                minus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input - 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_min", $scope.data.quantity.quantity_min);
                    if (quantity >= $scope.data.quantity.quantity_min) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                },
                plus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input + 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_max", $scope.data.quantity.quantity_max);
                    if (quantity <= $scope.data.quantity.quantity_max) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                }
            }
            return getFunction;
        };
        $scope.getBuy = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = params.product_id.split("-", 1).join("");
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                postApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.post(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                UiCartProductAdd: function(productId, quantityInput, promotionId, customOptions, callback) {
                    UiCart.delegate.product.add(productId, quantityInput, promotionId, function(res_data) {
                        callback(res_data);
                    });
                },
                isProgress: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isProgress(productId)) ? true : false;
                    _self.consoleLog("isProgress : productId", productId);
                    _self.consoleLog("isProgress : state", state);
                    callback(state);
                },
                isSelected: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    _self.consoleLog("isSelected : productId", productId);
                    _self.consoleLog("isSelected : state", state);
                    callback(state);
                },
                isSelectedReturn: function(productId) {
                    var _self = this;
                    var ui_cart_state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    if (!$scope.setBuy.state_active) {
                        $scope.setBuy.state_active = true;
                        var state_process = $scope.setBuy.state_process;
                        var state_step = $scope.setBuy.state_step;
                        if (ui_cart_state && !state_process && state_step != 4) /* cart */ {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_active = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else if (!ui_cart_state && !state_process && state_step != 0) /* unset */ {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_active = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        } else {
                            $scope.setBuy.state_active = false;
                        }
                    }
                    return ui_cart_state;
                },
                updateState: function(productId) {
                    _self = this;
                    _self.isSelected(productId, function(res_state) {
                        if (res_state) {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_process = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        }
                        return res_state;
                    });
                },
                uiCart: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    _self.UiCartProductAdd(productId, quantityInput, promotionId, customOptions, function(res_data) {
                        if (res_data) {
                            _self.onTimeout(500, function() {
                                _self.onPass(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onError(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onUnset(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                        });
                                    });
                                });
                            });
                        }
                    });
                },
                postApi: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    var custom_options = {};
                    var dataSend = {
                        'txt_product_id': productId,
                        'txt_amount': quantityInput,
                        'txt_is_clear_cart_before': "0",
                        'txt_custom_options_json': JSON.stringify(custom_options)
                    };
                    _self.dataSend("cart/product_add", dataSend, function(res_api, res_dataSend) {
                        _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                            if (res_ok) {
                                _self.onTimeout(500, function() {
                                    _self.onPass(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onCart(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            });
                                        });
                                    });
                                });
                            } else {
                                _self.onTimeout(500, function() {
                                    _self.onError(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onUnset(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                            });
                                        });
                                    });
                                });
                            }
                        });
                    });
                },
                onProcess: function(data, productId, quantityInput, promotionId, customOptions) {
                    var _self = this;
                    if (!$scope.setBuy.state_process) {
                        $scope.setBuy.state_process = true;
                        _self.isSelected(productId, function(res_state) {
                            if (!res_state) {
                                _self.onLoad($scope.setBuy.state_step, function(res_step) {
                                    if (data.sum_product_price.price != 0 && data.quantity.quantity_max != 0 && (data.attribute.state == (data.attribute.productId != ''))) {
                                        /* UiCart */
                                        _self.uiCart(productId, quantityInput, promotionId, customOptions, res_step);
                                        /* api post offline */
                                        /*_self.postApi(productId, quantityInput, promotionId, customOptions, res_step); */
                                    } else {
                                        _self.onTimeout(500, function() {
                                            _self.onError(res_step, function(res_step) {
                                                _self.onTimeout(1000, function() {
                                                    _self.onUnset(res_step, function(res_step) {
                                                        $scope.setBuy.state_process = false;
                                                        $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                        $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                                    });
                                                });
                                            });
                                        });
                                    }
                                });
                            } else {
                                $scope.setBuy.state_process = false;
                            }
                        });
                    }
                },
                onTimeout: function(time, callback) {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        callback(true)
                    }, time);
                },
                onUnset: function(step, callback) {
                    var _self = this;
                    step = (step == 0) ? 0 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onLoad: function(step, callback) {
                    var _self = this;
                    step = (step == 0 || step == 1) ? 1 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onPass: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 2) ? 2 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onError: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 3) ? 3 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onCart: function(step, callback) {
                    var _self = this;
                    step = (step == 2 || step == 4) ? 4 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                main: function(callback) {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getDetail = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getDetail: function(api, callback) {
                    var _self = this;
                    var description = api.product_description;
                    var info = api.product_more_info;
                    var specificatio = [];
                    if (api.product_attribute.specification_data != undefined) {
                        specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? api.product_attribute.specification_data.pclass_array : [];
                    }
                    var state_specificatio = false;
                    if (api.product_attribute.specification_data != undefined) {
                        state_specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? true : false;
                    }
                    var state_info = (api.product_is_more_info == 1) ? true : false;
                    _self.consoleLog("getDetail : description", description);
                    _self.consoleLog("getDetail : info", info);
                    _self.consoleLog("getDetail : state_info", state_info);
                    callback(description, info, state_info, specificatio, state_specificatio);
                },
                onClickDetail: function(index) {
                    var _self = this;
                    $scope.data.detail.active = index;
                    _self.consoleLog("onClickDetail : data.detail.active", $scope.data.detail.active);
                }
            }
            return getFunction;
        };
        $scope.pages = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageName: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page_name);
                },
                pageUrl: function(page_name, id, name_url) {
                    var _self = this;
                    var page = page_name + "/" + id + "-" + name_url;
                    _self.locationUrlReplace(page);
                }
            }
            return getFunction;
        };
        $scope.countDown = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getLocation: function(callback) {
                    var _self = this;
                    var res_location = $location;
                    _self.consoleLog("getLocation", "res_location", res_location);
                    callback(res_location);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(params);
                },
                getLocationUrlNameProductDetail: function(callback) {
                    var _self = this;
                    _self.getRouteParams(function(res_params) {
                        _self.getLocation(function(res_location) {
                            var url_page_name = "/product-detail/" + res_params.product_id;
                            var res_url_name_product_detail = (res_location.url() == url_page_name) ? true : false;
                            _self.consoleLog("getLocationUrlNameProductDeal", "res_url_name_product_detail", res_url_name_product_detail);
                            callback(res_url_name_product_detail);
                        });
                    });
                },
                getUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    _self.consoleLog("getUnix", "now", now);
                    callback(now);
                },
                getCountDown: function(now, product_lifetime, callback) {
                    var _self = this;
                    var countdown_unix = parseInt(product_lifetime.lifetime_end_time) - now;
                    var milliseconds = moment.duration(countdown_unix * 1000, "milliseconds");
                    var res_countdown = ((milliseconds.days() <= 9) ? '0' + milliseconds.days() : milliseconds.days());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.hours() <= 9) ? '0' + milliseconds.hours() : milliseconds.hours());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.minutes() <= 9) ? '0' + milliseconds.minutes() : milliseconds.minutes());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.seconds() <= 9) ? '0' + milliseconds.seconds() : milliseconds.seconds());
                    _self.consoleLog("getCountDown", "res_countdown", res_countdown);
                    callback(res_countdown, countdown_unix);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                countDownByProduct: function(now, data_array, callback) {
                    var _self = this;
                    if (data_array.length != 0) {
                        if (data_array.product_lifetime.length != 0) {
                            _self.getCountDown(now, data_array.product_lifetime, function(res_count_down, res_countdown_unix) {
                                data_array.product_lifetime.lifetime_countdown = (res_countdown_unix > 0) ? res_count_down : "";
                                if (data_array.product_lifetime.lifetime_countdown == "") {
                                    _self.getNameUrl(data_array.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", data_array.product_set_array[0].product_id, res_name);
                                    });
                                }
                            });
                        }
                    }
                    _self.consoleLog("countDownByProduct", "data_array", data_array);
                    callback(data_array);
                },
                loop: function() {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        _self.getUnix(function(res_now) {
                            _self.countDownByProduct(res_now, $scope.dataApi.product.dataArray, function(data_array) {
                                $scope.dataApi.product.dataArray = data_array;
                                _self.getLocationUrlNameProductDetail(function(res_url_name_product_detail) {
                                    if (res_url_name_product_detail) {
                                        _self.loop();
                                    }
                                });
                            });
                        });
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.control = function() {
            var getFunction = {
                popupVideo: function(state, video_link, video_embed_code) {
                    var _self = this;
                    if (video_embed_code != '') {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    } else if (video_link != '') {
                        window.open(video_link, '_blank');
                    } else {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.data_control = {
            page_video: {
                popup: false,
                shop_video_embed_code: ""
            }
        }
        $scope.countDown().loop();
        /* set carousel  */
        $scope.setCarousel = {
            carousel: 0,
            index: 0
        };
        $scope.getCarousel().getCarousel($scope.setCarousel.carousel, function(res_carousel_id) {
            $scope.setCarousel.carousel = res_carousel_id;
        });
        /* set carousel  */
        /* get product api */
        $scope.dataApi = {
            reward: {
                dataSend: {},
                api: "shop/current",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            product: {
                dataSend: {
                    txt_product_id: 0
                },
                api: "product/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            relation: {
                dataSend: {
                    txt_referral_id: 0
                },
                api: "referral/relation",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.data = {
            resParams: "",
            back: {
                page_name: "",
                data_id: "",
                data_name: ""
            },
            attribute: {
                state: false,
                productId: "",
                dataArray: []
            },
            attribute_custom: {
                state: false,
                dataArray: []
            },
            reward: {
                quantity_name: 'reward',
                type_id: "0",
                reward_amount: 0,
                reward_percent: 0,
                reward_every_price: 0,
                point_reward: 0
            },
            quantity: {
                quantity_name: 'quantity',
                quantity_min: 1,
                quantity_max: 1,
                quantity_input: 1,
                quantity_select: []
            },
            product_price: {
                price_name: 'product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            product_compare_price: {
                price_name: 'product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_price: {
                price_name: 'sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_price: {
                price_name: 'sum_product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_minus_sum_product_price: {
                price_name: 'sum_product_compare_minus_sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            detail: {
                active: '0',
                dataArray: [{
                    index: '0',
                    state: true,
                    en: ($scope.description != undefined && $scope.description != "") ? $scope.description : 'Description',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '1',
                    state: true,
                    en: ($scope.info != undefined && $scope.info != "") ? $scope.info : 'Info',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '2',
                    state: true,
                    en: ($scope.specification != undefined && $scope.specification != "") ? $scope.specification : 'Specification',
                    th: '',
                    data: '',
                    dataArray: []
                }]
            }
        };
        $scope.setBuy = {
            state_active: false,
            state_process: false,
            state_step: 0,
            state_data_font_color: "",
            state_data_background_color: "",
            stepArray: [{
                step: 0,
                name: "unset",
                icon: $scope._icebuyicon,
                state: "เพิ่มในรถเข็น",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 1,
                name: "load",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 2,
                name: "pass",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 3,
                name: "error",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 4,
                name: "cart",
                icon: "",
                state: "ดูรถเข็น",
                data_font_color: "",
                data_background_color: "primary_darkest"
            }]
        };
        /* - get api product/id start - */
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.data.resParams = res_params;
            $scope.getData().getDataPage(res_params, function(res_back_page, res_data_id, res_data_name) {
                $scope.data.back.page_name = res_back_page;
                $scope.data.back.data_id = res_data_id;
                $scope.data.back.data_name = res_data_name;
            });
            $scope.dataApi.product.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                $scope.dataApi.product.dataSend.txt_product_id = (res_product_id != false) ? res_product_id : 0;
                $scope.getData().dataSend($scope.dataApi.product.api, $scope.dataApi.product.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_product, res_state) {
                        $scope.dataApi.product.ok = res_ok;
                        $scope.dataApi.product.dataArray = get_res_api_product.data;
                        $scope.getData().consoleLog("get_res_api_product", get_res_api_product);
                        $scope.dataApi.product.dataArrayState = res_state;
                        /* -- get api shop/current to reward -- */
                        if (res_ok) {
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.reward.dataArrayState = res_state;
                                $scope.getData().dataSend($scope.dataApi.reward.api, $scope.dataApi.reward.dataSend, function(res_api, res_dataSend) {
                                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                                        $scope.dataApi.reward.ok = res_ok;
                                        $scope.dataApi.reward.dataArray = get_res_api_shop.data;
                                        $scope.dataApi.reward.dataArrayState = res_state;
                                        $scope.getReward().createReward($scope.dataApi.product.dataArray.product_reward, get_res_api_shop.data.shop_point_config, function(res_reward) {
                                            $scope.data.reward.type_id = res_reward.type_id;
                                            $scope.data.reward.reward_amount = res_reward.amount;
                                            $scope.data.reward.reward_percent = res_reward.percent;
                                            $scope.data.reward.reward_every_price = res_reward.every_price;
                                            /* --- Wait product/id ,shop/current --- */
                                            /* ---- get attribute ---- */
                                            $scope.getAttribute().productAttribute(get_res_api_product.data.product_attribute, function(res_attribute) {
                                                $scope.data.attribute.dataArray = res_attribute;
                                                $scope.getAttribute().checkMinPrices(get_res_api_product, res_attribute, function(res_data_price, res_state) {
                                                    $scope.data.attribute.state = res_state;
                                                    $scope.data.product_price = res_data_price.product_price;
                                                    $scope.data.product_compare_price = res_data_price.product_compare_price;
                                                    $scope.data.sum_product_price = res_data_price.sum_product_price;
                                                    $scope.data.sum_product_compare_price = res_data_price.sum_product_compare_price;
                                                    $scope.data.sum_product_compare_minus_sum_product_price = res_data_price.sum_product_compare_minus_sum_product_price;
                                                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                                                        $scope.data.reward.point_reward = res_point_reward;
                                                    });
                                                    /* ----- stock ----- */
                                                    $scope.data.quantity.quantity_max = res_data_price.product_price.total_stock;
                                                    $scope.data.quantity.quantity_select = [];
                                                    for (var i = 0; i < res_data_price.product_price.total_stock; i++) {
                                                        $scope.data.quantity.quantity_select.push(i + 1);
                                                    }
                                                    /* ----- stock ----- */
                                                });
                                            });
                                            /* ---- get attribute ---- */
                                            /* ---- get attribute custom ---- */
                                            $scope.getAttributeCustom().createArray(get_res_api_product.data.product_custom_templates, function(res_custom_attribute, res_state) {
                                                $scope.data.attribute_custom.state = res_state;
                                                $scope.data.attribute_custom.dataArray = res_custom_attribute;
                                            });
                                            /* ---- get attribute custom ---- */
                                            /* ---- get detail ---- */
                                            $scope.getDetail().getDetail(get_res_api_product.data, function(res_description, res_info, res_state_info, res_specificatio, res_state_specificatio) {
                                                $scope.data.detail.dataArray[0].data = res_description;
                                                $scope.data.detail.dataArray[1].data = res_info;
                                                $scope.data.detail.dataArray[1].state = res_state_info;
                                                $scope.data.detail.dataArray[2].dataArray = res_specificatio;
                                                $scope.data.detail.dataArray[2].state = res_state_specificatio;
                                            });
                                            /* ---- get detail ---- */
                                            /* ---- update state ---- */
                                            $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                                            /* ---- update state ---- */
                                            /* --- Wait product/id ,shop/current --- */
                                        });
                                    });
                                });
                            });
                            /* -- get api shop/current to reward -- */
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.relation.dataArrayState = res_state;
                                $scope.getData().getReferralId(get_res_api_product.data.product_referral_display, function(res_referral_id) {
                                    $scope.dataApi.relation.dataSend.txt_referral_id = res_referral_id;
                                    $scope.getData().dataSend($scope.dataApi.relation.api, $scope.dataApi.relation.dataSend, function(res_api, res_dataSend) {
                                        $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_referral, res_state) {
                                            $scope.dataApi.relation.ok = res_ok;
                                            $scope.dataApi.relation.dataArray = get_res_api_referral.data;
                                            $scope.dataApi.relation.dataArrayState = res_state;
                                        });
                                    });
                                });
                            });
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                        } else {
                            /* ok = false */
                            if ($scope.dataApi.product.dataArray.length != 0) {
                                /* product deal to product original */
                                if ($scope.dataApi.product.dataArray.product_set_array.length != 0) {
                                    $scope.countDown().getNameUrl($scope.dataApi.product.dataArray.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", $scope.dataApi.product.dataArray.product_set_array[0].product_id, res_name);
                                    });
                                } else {
                                    $scope.pages().pageName("home");
                                }
                            } else {
                                /* product null */
                                $scope.pages().pageName("home");
                            }
                        }
                    });
                });
            });
        });
        /* - get api product/id end - */
        /* get product api */
    };
    return promise;
});_ui_share_app.directive('productDetailPageEb', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageEb';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.product_id = "";
        $scope.product_sku = "";
        $scope.product_code = "";
        $scope.product_price = 0;
        $scope.product_compare_price = 0;
        $scope.promotion_list = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope.nowMoment = moment().unix();
        console.log("promotion_list : ", $scope.promotion_list);
        $scope.dataShopCurrent = [];
        $scope.dataShopPointConfig = [];
        $scope.getShopCurrent = function() {
            var dataSend = {};
            GAEAPI.get('shop/current', dataSend).then(function(output) {
                console.log("getShopCurrent : output : ", output);
                if (output.ok == 1) {
                    $scope.dataShopCurrent = output.data;
                    console.log("getShopCurrent : dataShopCurrent : ", $scope.dataShopCurrent);
                    $scope.dataShopPointConfig = output.data.shop_point_config;
                    console.log("getShopCurrent : dataShopPointConfig : ", $scope.dataShopPointConfig);
                }
            });
        };
        $scope.getShopCurrent();
        $scope.getShopPointConfigRewardState = function(product_price, quantity) {
            var state = 'RewardShop';
            var sup_price = product_price * quantity;
            if ($scope.dataShopPointConfig.length != 0) {
                if (parseInt($scope.dataShopPointConfig.er_rate) != 0 && parseInt($scope.dataShopPointConfig.er_earn) != 0) {
                    if (parseInt($scope.dataShopPointConfig.er_rate) <= sup_price) {
                        state = 'RewardShop';
                        return state;
                    } else {
                        state = 'High';
                        return state;
                    }
                } else {
                    return 'RewardProduct';
                    return state;
                }
            } else {
                return 'RewardProduct';
            }
        };
        $scope.getShopPointConfigReward = function(product_price, quantity) {
            var sup_price = 0;
            var er_rate = 0;
            var er_earn = 0;
            var mathFloor = 0;
            var point = 0;
            // console.log("getShopPointConfigReward : shop_point_config.er_rate : ",$scope.dataShopPointConfig.er_rate);
            if ($scope.dataShopPointConfig.length != 0) {
                sup_price = product_price * quantity;
                er_rate = parseInt($scope.dataShopPointConfig.er_rate);
                er_earn = parseInt($scope.dataShopPointConfig.er_earn);
                mathFloor = Math.floor(sup_price / er_rate);
                point = mathFloor * er_earn;
                return point;
            } else {
                return point;
            }
        }
        $scope._getReward = function(datain, product_price, qty) {
            if (datain.length == 0) {
                return 'Data Reward Error';
            }
            console.log("_getReward : product_price : ", product_price, " qty : ", qty);
            var reward = "NULL";
            if (datain.reward_type_id == "101") {} else if (datain.reward_type_id == "102") {} else if (datain.reward_type_id == "103") {
                var reward_every_price = parseInt(datain.reward_every_price);
                var sum_product_price = Math.round(product_price) * qty;
                var reward_amount = parseInt(datain.reward_amount);
                console.log("_getReward : reward_every_price : ", reward_every_price, " sum_product_price : ", sum_product_price, " reward_amount : ", reward_amount);
                if (reward_every_price <= sum_product_price) {
                    var divided = Math.floor(sum_product_price / reward_every_price);
                    var multiplied = divided * reward_amount;
                    console.log("_getReward : divided : ", divided, " multiplied : ", multiplied);
                    reward = multiplied;
                } else {
                    reward = "ZERO";
                }
            } else {
                return 'Data Reward Type Id Error';
            }
            return reward;
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    if ($scope._dataArray.product_is_promotion != 0) {
                        if ($scope._dataArray.product_promotion) {
                            $scope.promotion_list = $scope._dataArray.product_promotion[0].promotion_id;
                        }
                    }
                    console.log("promotion_list : ", $scope.promotion_list);
                    console.log("_getDataArray _dataArray : ", $scope._dataArray);
                    $scope.product_id = $scope._dataArray.product_id;
                    $scope.dataPreserve = res.data;
                    if (res.data.product_sku != undefined) {
                        $scope.product_sku = res.data.product_sku;
                    }
                    if (res.data.product_code != undefined) {
                        $scope.product_code = res.data.product_code;
                    }
                    console.log("res.data.product_discount : ", res.data.product_discount);
                    if (res.data.product_discount.length != 0) {
                        $scope.product_price = $scope.calculate(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_lifetime.lifetime_start_time, res.data.product_discount.discount_lifetime.lifetime_end_time, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                        $scope.product_compare_price = $scope.pricefull(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_lifetime.lifetime_start_time, res.data.product_discount.discount_lifetime.lifetime_end_time, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    } else {
                        $scope.product_price = res.data.product_price;
                        $scope.product_compare_price = res.data.product_compare_price;
                    }
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.dataTag = res.data.product_tags.split(",");
                    $scope.qtyCurrentSize(res.data.product_total_variant, res.data.product_total_stock);
                    $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope._stateReward = function(datain) {
            var state = false;
            /* console.log("_stateReward : reward_lifetime : ", datain.reward_lifetime); */
            if (datain.length != 0) {
                state = true;
            }
            return state;
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        // $scope.pricefull = function(price, compare_price, discount_id , lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
        //     var pricefull = 0;
        //     if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= nowMoment)) {
        //         if (price != undefined && price != 0) {
        //             pricefull = price;
        //             $scope._pricefullState.pricefull = 'not zero';
        //         } else {
        //             pricefull = 0;
        //             $scope._pricefullState.pricefull = 'zero';
        //         }
        //     } else {
        //         if (compare_price > 0 && compare_price != undefined) {
        //             pricefull = compare_price;
        //             $scope._pricefullState.pricefull = 'not zero';
        //         } else {
        //             $scope._pricefullState.pricefull = 'zero';
        //         }
        //     }
        //     return pricefull;
        // }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            console.log("calculate : ", price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent);
            console.log("calculate : ", lifetime_start_time <= $scope.nowMoment);
            console.log("calculate : ", lifetime_end_time >= $scope.nowMoment);
            console.log("calculate : ", (lifetime_end_time == -1 || lifetime_end_time >= nowMoment));
            var calculate = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        // $scope.calculate = function(price, compare_price, discount_id , lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
        //     var calculate = 0;
        //     if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= nowMoment)) {
        //         if (discount_price != 0 && discount_percent == 0) {
        //             calculate = price - discount_price;
        //         } else if (discount_percent != 0 && discount_price == 0) {
        //             calculate = price - ((discount_percent / 100) * price);
        //         }
        //     } else {
        //         calculate = price
        //     }
        //     if (calculate != undefined && calculate != 0) {
        //         $scope._calculateState.calculate = 'not zero';
        //     } else {
        //         $scope._calculateState.calculate = 'zero';
        //     }
        //     return (calculate > 0) ? calculate : 0;
        // }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    if (product_total_stock >= 50) {
                        for (var i = 0; i < 50; i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    } else {
                        for (var i = 0; i < parseInt(product_total_stock); i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 50; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    if (dataVariants[i].sku != "") {
                        $scope.product_sku = dataVariants[i].sku;
                    } else {
                        $scope.product_sku = $scope._dataArray.product_sku;
                    }
                    if (dataVariants[i].sku != "") {
                        $scope.product_code = dataVariants[i].barcode;
                    } else {
                        $scope.product_code = $scope._dataArray.product_code;
                    }
                    console.log("$scope._dataArray.product_discount : ", $scope._dataArray.product_discount);
                    $scope.product_price = $scope.calculate(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_lifetime.lifetime_start_time, $scope._dataArray.product_discount.discount_lifetime.lifetime_end_time, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_lifetime.lifetime_start_time, $scope._dataArray.product_discount.discount_lifetime.lifetime_end_time, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    $scope.product_price = $scope._dataArray.product_price;
                    $scope.product_compare_price = $scope._dataArray.product_compare_price;
                    $scope.product_sku = $scope._dataArray.product_sku;
                    $scope.product_code = $scope._dataArray.product_code;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope._getDataArray($scope._getIdUrl());
        // setTimeout(function() {
        //      alert($('input[name=radiogroup]:checked').val());
        //  }, 700);
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});_ui_share_app.directive('productDetailPageEc', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageEc';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.product_id = "";
        $scope.product_sku = "";
        $scope.product_code = "";
        $scope.product_price = 0;
        $scope.product_compare_price = 0;
        $scope.promotion_list = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        console.log("promotion_list : ", $scope.promotion_list);
        $scope.dataShopCurrent = [];
        $scope.dataShopPointConfig = [];
        $scope.getShopCurrent = function() {
            var dataSend = {};
            GAEAPI.get('shop/current', dataSend).then(function(output) {
                console.log("getShopCurrent : output : ", output);
                if (output.ok == 1) {
                    $scope.dataShopCurrent = output.data;
                    console.log("getShopCurrent : dataShopCurrent : ", $scope.dataShopCurrent);
                    $scope.dataShopPointConfig = output.data.shop_point_config;
                    console.log("getShopCurrent : dataShopPointConfig : ", $scope.dataShopPointConfig);
                }
            });
        };
        $scope.getShopCurrent();
        $scope.getShopPointConfigRewardState = function(product_price, quantity) {
            var state = 'RewardShop';
            var sup_price = product_price * quantity;
            if ($scope.dataShopPointConfig.length != 0) {
                if (parseFloat($scope.dataShopPointConfig.er_rate) != 0 && parseFloat($scope.dataShopPointConfig.er_earn) != 0) {
                    if (parseFloat($scope.dataShopPointConfig.er_rate) <= sup_price) {
                        state = 'RewardShop';
                        return state;
                    } else {
                        state = 'High';
                        return state;
                    }
                } else {
                    return 'RewardProduct';
                    return state;
                }
            } else {
                return 'RewardProduct';
            }
        };
        $scope.getShopPointConfigReward = function(product_price, quantity) {
            var sup_price = 0;
            var er_rate = 0;
            var er_earn = 0;
            var mathFloor = 0;
            var point = 0;
            // console.log("getShopPointConfigReward : shop_point_config.er_rate : ",$scope.dataShopPointConfig.er_rate);
            if ($scope.dataShopPointConfig.length != 0) {
                sup_price = product_price * quantity;
                er_rate = parseFloat($scope.dataShopPointConfig.er_rate);
                er_earn = parseFloat($scope.dataShopPointConfig.er_earn);
                mathFloor = Math.floor(sup_price / er_rate);
                point = mathFloor * er_earn;
                return point;
            } else {
                return point;
            }
        }
        $scope._getReward = function(datain, product_price, qty) {
            if (datain.length == 0) {
                return 'Data Reward Error';
            }
            console.log("_getReward : product_price : ", product_price, " qty : ", qty);
            var reward = "NULL";
            if (datain.reward_type_id == "101") {} else if (datain.reward_type_id == "102") {} else if (datain.reward_type_id == "103") {
                var reward_every_price = parseFloat(datain.reward_every_price);
                var sum_product_price = Math.round(product_price) * qty;
                var reward_amount = parseFloat(datain.reward_amount);
                console.log("_getReward : reward_every_price : ", reward_every_price, " sum_product_price : ", sum_product_price, " reward_amount : ", reward_amount);
                if (reward_every_price <= sum_product_price) {
                    var divided = Math.floor(sum_product_price / reward_every_price);
                    var multiplied = divided * reward_amount;
                    console.log("_getReward : divided : ", divided, " multiplied : ", multiplied);
                    reward = multiplied;
                } else {
                    reward = "ZERO";
                }
            } else {
                return 'Data Reward Type Id Error';
            }
            return reward;
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    // if ($scope._dataArray.product_is_promotion != 0) {
                    //     $scope.promotion_list = $scope._dataArray.product_promotion[0].promotion_id;
                    // }
                    console.log("promotion_list : ", $scope.promotion_list);
                    console.log("_getDataArray _dataArray : ", $scope._dataArray);
                    $scope.product_id = $scope._dataArray.product_id;
                    $scope.dataPreserve = res.data;
                    if (res.data.product_sku != undefined) {
                        $scope.product_sku = res.data.product_sku;
                    }
                    if (res.data.product_code != undefined) {
                        $scope.product_code = res.data.product_code;
                    }
                    $scope.product_price = $scope.calculate(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.dataTag = res.data.product_tags.split(",");
                    $scope.qtyCurrentSize(res.data.product_total_variant, res.data.product_total_stock);
                    $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope._stateReward = function(datain) {
            var state = false;
            /* console.log("_stateReward : reward_lifetime : ", datain.reward_lifetime); */
            if (datain.length != 0) {
                state = true;
            }
            return state;
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    if (product_total_stock >= 20) {
                        for (var i = 0; i < 20; i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    } else {
                        for (var i = 0; i < parseFloat(product_total_stock); i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseFloat($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseFloat($(".d_qty").val());
            } else {
                check_int = parseFloat($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    if (dataVariants[i].sku != "") {
                        $scope.product_sku = dataVariants[i].sku;
                    } else {
                        $scope.product_sku = $scope._dataArray.product_sku;
                    }
                    if (dataVariants[i].sku != "") {
                        $scope.product_code = dataVariants[i].barcode;
                    } else {
                        $scope.product_code = $scope._dataArray.product_code;
                    }
                    $scope.product_price = $scope.calculate(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    $scope.product_price = $scope._dataArray.product_price;
                    $scope.product_compare_price = $scope._dataArray.product_compare_price;
                    $scope.product_sku = $scope._dataArray.product_sku;
                    $scope.product_code = $scope._dataArray.product_code;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope._getDataArray($scope._getIdUrl());
        // setTimeout(function() {
        //      alert($('input[name=radiogroup]:checked').val());
        //  }, 700);
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
        $scope._isLogin = function() {
            return UiCustomerBox.delegate.get.isLogin();
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageEd', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageEd';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.product_id = "";
        $scope.product_sku = "";
        $scope.product_code = "";
        $scope.product_price = 0;
        $scope.product_compare_price = 0;
        $scope.promotion_list = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        console.log("promotion_list : ", $scope.promotion_list);
        $scope.dataShopCurrent = [];
        $scope.dataShopPointConfig = [];
        $scope.getShopCurrent = function() {
            var dataSend = {};
            GAEAPI.get('shop/current', dataSend).then(function(output) {
                console.log("getShopCurrent : output : ", output);
                if (output.ok == 1) {
                    $scope.dataShopCurrent = output.data;
                    console.log("getShopCurrent : dataShopCurrent : ", $scope.dataShopCurrent);
                    $scope.dataShopPointConfig = output.data.shop_point_config;
                    console.log("getShopCurrent : dataShopPointConfig : ", $scope.dataShopPointConfig);
                }
            });
        };
        $scope.getShopCurrent();
        $scope.getShopPointConfigRewardState = function(product_price, quantity) {
            var state = 'RewardShop';
            var sup_price = product_price * quantity;
            if ($scope.dataShopPointConfig.length != 0) {
                if (parseInt($scope.dataShopPointConfig.er_rate) != 0 && parseInt($scope.dataShopPointConfig.er_earn) != 0) {
                    if (parseInt($scope.dataShopPointConfig.er_rate) <= sup_price) {
                        state = 'RewardShop';
                        return state;
                    } else {
                        state = 'High';
                        return state;
                    }
                } else {
                    return 'RewardProduct';
                    return state;
                }
            } else {
                return 'RewardProduct';
            }
        };
        $scope.getShopPointConfigReward = function(product_price, quantity) {
            var sup_price = 0;
            var er_rate = 0;
            var er_earn = 0;
            var mathFloor = 0;
            var point = 0;
            // console.log("getShopPointConfigReward : shop_point_config.er_rate : ",$scope.dataShopPointConfig.er_rate);
            if ($scope.dataShopPointConfig.length != 0) {
                sup_price = product_price * quantity;
                er_rate = parseInt($scope.dataShopPointConfig.er_rate);
                er_earn = parseInt($scope.dataShopPointConfig.er_earn);
                mathFloor = Math.floor(sup_price / er_rate);
                point = mathFloor * er_earn;
                return point;
            } else {
                return point;
            }
        }
        $scope._getReward = function(datain, product_price, qty) {
            if (datain.length == 0) {
                return 'Data Reward Error';
            }
            console.log("_getReward : product_price : ", product_price, " qty : ", qty);
            var reward = "NULL";
            if (datain.reward_type_id == "101") {} else if (datain.reward_type_id == "102") {} else if (datain.reward_type_id == "103") {
                var reward_every_price = parseInt(datain.reward_every_price);
                var sum_product_price = Math.round(product_price) * qty;
                var reward_amount = parseInt(datain.reward_amount);
                console.log("_getReward : reward_every_price : ", reward_every_price, " sum_product_price : ", sum_product_price, " reward_amount : ", reward_amount);
                if (reward_every_price <= sum_product_price) {
                    var divided = Math.floor(sum_product_price / reward_every_price);
                    var multiplied = divided * reward_amount;
                    console.log("_getReward : divided : ", divided, " multiplied : ", multiplied);
                    reward = multiplied;
                } else {
                    reward = "ZERO";
                }
            } else {
                return 'Data Reward Type Id Error';
            }
            return reward;
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    // if ($scope._dataArray.product_is_promotion != 0) {
                    //     $scope.promotion_list = $scope._dataArray.product_promotion[0].promotion_id;
                    // }
                    console.log("promotion_list : ", $scope.promotion_list);
                    console.log("_getDataArray _dataArray : ", $scope._dataArray);
                    $scope.product_id = $scope._dataArray.product_id;
                    $scope.dataPreserve = res.data;
                    if (res.data.product_sku != undefined) {
                        $scope.product_sku = res.data.product_sku;
                    }
                    if (res.data.product_code != undefined) {
                        $scope.product_code = res.data.product_code;
                    }
                    $scope.product_price = $scope.calculate(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.dataTag = res.data.product_tags.split(",");
                    $scope.qtyCurrentSize(res.data.product_total_variant, res.data.product_total_stock);
                    $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope._stateReward = function(datain) {
            var state = false;
            /* console.log("_stateReward : reward_lifetime : ", datain.reward_lifetime); */
            if (datain.length != 0) {
                state = true;
            }
            return state;
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    if (product_total_stock >= 20) {
                        for (var i = 0; i < 20; i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    } else {
                        for (var i = 0; i < parseInt(product_total_stock); i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    if (dataVariants[i].sku != "") {
                        $scope.product_sku = dataVariants[i].sku;
                    } else {
                        $scope.product_sku = $scope._dataArray.product_sku;
                    }
                    if (dataVariants[i].sku != "") {
                        $scope.product_code = dataVariants[i].barcode;
                    } else {
                        $scope.product_code = $scope._dataArray.product_code;
                    }
                    $scope.product_price = $scope.calculate(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    $scope.product_price = $scope._dataArray.product_price;
                    $scope.product_compare_price = $scope._dataArray.product_compare_price;
                    $scope.product_sku = $scope._dataArray.product_sku;
                    $scope.product_code = $scope._dataArray.product_code;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope._getDataArray($scope._getIdUrl());
        // setTimeout(function() {
        //      alert($('input[name=radiogroup]:checked').val());
        //  }, 700);
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});_ui_share_app.directive('productDetailPageEe', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageEe';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.product_id = "";
        $scope.product_sku = "";
        $scope.product_code = "";
        $scope.product_price = 0;
        $scope.product_compare_price = 0;
        $scope.promotion_list = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        console.log("promotion_list : ", $scope.promotion_list);
        $scope.dataShopCurrent = [];
        $scope.dataShopPointConfig = [];
        $scope.getShopCurrent = function() {
            var dataSend = {};
            GAEAPI.get('shop/current', dataSend).then(function(output) {
                console.log("getShopCurrent : output : ", output);
                if (output.ok == 1) {
                    $scope.dataShopCurrent = output.data;
                    console.log("getShopCurrent : dataShopCurrent : ", $scope.dataShopCurrent);
                    $scope.dataShopPointConfig = output.data.shop_point_config;
                    console.log("getShopCurrent : dataShopPointConfig : ", $scope.dataShopPointConfig);
                }
            });
        };
        $scope.getShopCurrent();
        $scope.getShopPointConfigRewardState = function(product_price, quantity) {
            var state = 'RewardShop';
            var sup_price = product_price * quantity;
            if ($scope.dataShopPointConfig.length != 0) {
                if (parseInt($scope.dataShopPointConfig.er_rate) != 0 && parseInt($scope.dataShopPointConfig.er_earn) != 0) {
                    if (parseInt($scope.dataShopPointConfig.er_rate) <= sup_price) {
                        state = 'RewardShop';
                        return state;
                    } else {
                        state = 'High';
                        return state;
                    }
                } else {
                    return 'RewardProduct';
                    return state;
                }
            } else {
                return 'RewardProduct';
            }
        };
        $scope.getShopPointConfigReward = function(product_price, quantity) {
            var sup_price = 0;
            var er_rate = 0;
            var er_earn = 0;
            var mathFloor = 0;
            var point = 0;
            // console.log("getShopPointConfigReward : shop_point_config.er_rate : ",$scope.dataShopPointConfig.er_rate);
            if ($scope.dataShopPointConfig.length != 0) {
                sup_price = product_price * quantity;
                er_rate = parseInt($scope.dataShopPointConfig.er_rate);
                er_earn = parseInt($scope.dataShopPointConfig.er_earn);
                mathFloor = Math.floor(sup_price / er_rate);
                point = mathFloor * er_earn;
                return point;
            } else {
                return point;
            }
        }
        $scope._getReward = function(datain, product_price, qty) {
            if (datain.length == 0) {
                return 'Data Reward Error';
            }
            console.log("_getReward : product_price : ", product_price, " qty : ", qty);
            var reward = "NULL";
            if (datain.reward_type_id == "101") {} else if (datain.reward_type_id == "102") {} else if (datain.reward_type_id == "103") {
                var reward_every_price = parseInt(datain.reward_every_price);
                var sum_product_price = Math.round(product_price) * qty;
                var reward_amount = parseInt(datain.reward_amount);
                console.log("_getReward : reward_every_price : ", reward_every_price, " sum_product_price : ", sum_product_price, " reward_amount : ", reward_amount);
                if (reward_every_price <= sum_product_price) {
                    var divided = Math.floor(sum_product_price / reward_every_price);
                    var multiplied = divided * reward_amount;
                    console.log("_getReward : divided : ", divided, " multiplied : ", multiplied);
                    reward = multiplied;
                } else {
                    reward = "ZERO";
                }
            } else {
                return 'Data Reward Type Id Error';
            }
            return reward;
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    // if ($scope._dataArray.product_is_promotion != 0) {
                    //     $scope.promotion_list = $scope._dataArray.product_promotion[0].promotion_id;
                    // }
                    console.log("promotion_list : ", $scope.promotion_list);
                    console.log("_getDataArray _dataArray : ", $scope._dataArray);
                    $scope.product_id = $scope._dataArray.product_id;
                    $scope.dataPreserve = res.data;
                    if (res.data.product_sku != undefined) {
                        $scope.product_sku = res.data.product_sku;
                    }
                    if (res.data.product_code != undefined) {
                        $scope.product_code = res.data.product_code;
                    }
                    $scope.product_price = $scope.calculate(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.dataTag = res.data.product_tags.split(",");
                    $scope.qtyCurrentSize(res.data.product_total_variant, res.data.product_total_stock);
                    $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope._stateReward = function(datain) {
            var state = false;
            /* console.log("_stateReward : reward_lifetime : ", datain.reward_lifetime); */
            if (datain.length != 0) {
                state = true;
            }
            return state;
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    if (product_total_stock >= 20) {
                        for (var i = 0; i < 20; i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    } else {
                        for (var i = 0; i < parseInt(product_total_stock); i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    if (dataVariants[i].sku != "") {
                        $scope.product_sku = dataVariants[i].sku;
                    } else {
                        $scope.product_sku = $scope._dataArray.product_sku;
                    }
                    if (dataVariants[i].sku != "") {
                        $scope.product_code = dataVariants[i].barcode;
                    } else {
                        $scope.product_code = $scope._dataArray.product_code;
                    }
                    $scope.product_price = $scope.calculate(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    $scope.product_price = $scope._dataArray.product_price;
                    $scope.product_compare_price = $scope._dataArray.product_compare_price;
                    $scope.product_sku = $scope._dataArray.product_sku;
                    $scope.product_code = $scope._dataArray.product_code;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope._getDataArray($scope._getIdUrl());
        // setTimeout(function() {
        //      alert($('input[name=radiogroup]:checked').val());
        //  }, 700);
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});
_ui_share_app.directive('productDetailPageF', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageF';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        }; 
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* JQ: Scroll event */
        angular.element($window).bind('scroll',function(){
            if(!$scope.data){
                return;
            }
            var curPos = ($(document).scrollTop());
            var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));
            console.debug("Cur pos", curPos, properHeight);
            if(curPos > properHeight){
                angular.element('.block-background .bottom-info').addClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */ 
        $scope.data = false;
        $scope.dataPreserve = false;
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* Get data by product id */        
        GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
            if(e.ok == 1){
                $scope.data = e.data;
                $scope.dataPreserve = e.data;
                $scope.buildVariantOption(e.data);
                $scope.buildDataProductRelate($scope._getPostIdFromURL());
            }
        });          
        
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 6,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        }; 
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };
        $scope.findVariantsData = function(variantsPick){
            function compareArray(array_a, array) {
                if (!array)
                    return false;
                if (array_a.length != array.length)
                    return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i]))
                            return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for(var i = 0; i < dataVariants.length; i++){
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if(compareArray(variantsPick,optionJson)){                    
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;
                } 
            }
        };
        $scope.makeVariantsClick = function(){            
            var s = $timeout(function(){
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx,obj){
                    var optionElementFirst = $(this).find('option[data-index="'+idx+'"]').eq(0);
                    optionElementFirst.prop("selected",true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope.checkColorConfig = function(){
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function () {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };            
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if($('[data-key="'+$scope._uniqueKey+'"]').not('.slick-initialized')){
                $timeout(function(){
                    $scope._makeProductToCarousel();
                }, 500);                
            }            
        });
        $scope.qty_original=1;
        $scope.qty_current=1;
        /* Click SLick Item */
        $scope.slickGoto = function (idx) {
            setTimeout(function () {
                $('[data-key="'+$scope._uniqueKey+'"]').slick('slickGoTo', idx);
            }, 100);
        };
        /* Calcu Nav Arrows */
        $scope.maxHeight = 0;
        $scope.navArrowsCalculate=function(){
            var size = ($('img.img_gallery').eq(0).height() / 2);
            $scope.maxHeight = (size + 18);
            $('img.img_gallery').each(function() {
                if ($(this).height() > $scope.maxHeight) {
                    $scope.maxHeight = $(this).height();
                }
            }); 
            return '-' + $scope.maxHeight + 'px';
        };
        $scope.navArrowWidth = function(){
            return $('#gallery_display').width() + 'px';
        };
        
    };  
    return promise;
});
_ui_share_app.directive('productDetailPageG', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageG';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
        headerheight: '@headerheight',
        controlbutton : '@controlbutton',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
         /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        }; 
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        }; 
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope.data = false;
        $scope.dataPreserve = false;
        /* Get data by product id */        
        GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
            if(e.ok == 1){
                $scope.data = e.data;
                console.log("testtest",$scope.data);
                $scope.dataPreserve = e.data;
                $scope.buildVariantOption(e.data);
                /*$scope.buildDataProductRelate($scope._getPostIdFromURL());*/
            }
        });          
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        }; 
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            /*$scope.makeVariantsClick();*/
            $scope.makeVaraintsClick_Normal();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };        
        $scope.onClickVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };
        $scope.findVariantsData = function(variantsPick){
            function compareArray(array_a, array) {
                if (!array)
                    return false;
                if (array_a.length != array.length)
                    return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i]))
                            return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for(var i = 0; i < dataVariants.length; i++){
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if(compareArray(variantsPick,optionJson)){                    
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;
                } 
            }
        };
        /* Select FIrst Varaint (SELECT) */
        $scope.makeVariantsClick = function(){            
            var s = $timeout(function(){
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx,obj){
                    var optionElementFirst = $(this).find('option[data-index="'+idx+'"]').eq(0);
                    optionElementFirst.prop("selected",true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        }; 
        /* Select FIrst Varaint (Normal click) */
        $scope.makeVaraintsClick_Normal = function(){
            $timeout(function(){
                $('div.variantSelector').each(function(idx,obj){
                    $(this).find('[data-index="'+idx+'"]').eq(0).click();
                });
            },2000);
        };
        $scope.checkColorConfig = function(){
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function () {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                adaptiveHeight: true,
            };            
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if($('[data-key="'+$scope._uniqueKey+'"]').not('.slick-initialized')){
                $timeout(function(){
                    $scope._makeProductToCarousel();
                }, 500);                
            }            
        });
        $scope.qty_original=1;
        $scope.qty_current=1;
        $scope.getShopName = function(){
            return (typeof tttt !== 'undefined') ? tttt.shop_name : '';
        };
        /* Click SLick Item */
        $scope.slickGoto = function (idx) {
            setTimeout(function () {
                $('#gallery_slider').slick('slickGoTo', idx);
            }, 100);
        };
        /* Calcu Nav Arrows */
        $scope.navArrowsCalculate=function(){
            var size = ($('img.img_gallery').eq(0).height() / 2);
            var n = (size + 18) + 20;
            return '-' + n + 'px';
        };
        $scope.navArrowWidth = function(){
            return $('#gallery_slider').width() + 'px';
        };
    };  
    return promise;
});
_ui_share_app.directive('productDetailPageGrip', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageGrip';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0
        };
        $scope.login = function() {
            var login = {
                showLogin: function() {
                    return UiCustomerBox.delegate.get.isLogin();
                },
                isLogin: function(callback) {
                    callback(UiCustomerBox.delegate.get.isLogin());
                },
                totalAmount: function() {
                    return UiCart.delegate.get.totalAmount() || 0;
                },
                pageLogin: function() {
                    var _self = this;
                    _self.isLogin(function(isLogin) {
                        if (!isLogin) {
                            $inloginPopupTypeGrip.open();
                        }
                    });
                }
            }
            return login;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                    }
                }
            }
            return quantity;
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getDataArrayOk: function(output, callback) {
                    var state = false;
                    if (output.ok == 1) {
                        state = true;
                        callback(output, state);
                    }
                    callback(output, state);
                },
                quantity: function(product_stock_track_type_id, product_total_stock, callback) {
                    var total_stock = 0;
                    /* if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    } */
                    if (product_stock_track_type_id == "0") {
                        total_stock = 20;
                    } else if (product_stock_track_type_id == "1") {
                        if (product_total_stock > 0) {
                            total_stock = product_total_stock;
                        } else {
                            total_stock = 0;
                        }
                    }
                    callback(total_stock);
                },
                main: function() {
                    var _self = this;
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        _self.consoleLog("getDataProductArray : output : ", output.data);
                        _self.getDataArrayOk(output, function(output, state) {
                            if (state) {
                                _self.quantity(output.data.product_stock_track_type_id, output.data.product_total_stock, function(total_stock) {
                                    $scope.dataProductBuy.quantity_max = (total_stock >= 5) ? 5 : total_stock;
                                    _self.consoleLog("getDataProductArray : output : ", output.data);
                                    $scope.dataArray = output.data;
                                    $scope.dataProductBuy.price = output.data.product_price;
                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                    $scope.dataArrayState = _self.stateData(false, true);
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                    });
                                });
                            } else {
                                $scope.dataArrayState = _self.stateData(false, true);
                            }
                        });
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
    };
    return promise;
});
_ui_share_app.directive('productDetailPageH', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageH';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
        headerheight: '@headerheight',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        /*angular.element($window).bind('load',function(){
            $('.video_container .video_display').click();
        });*/
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        }; 
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* JQ: Scroll event */
        angular.element($window).bind('scroll',function(){
            if(!$scope.data){
                return;
            }
            var curPos = ($(document).scrollTop());
            var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));
            console.debug("Cur pos", curPos, properHeight);
            if(curPos > properHeight){
                angular.element('.block-background .bottom-info').addClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */ 
        $scope.data = false;
        $scope.dataPreserve = false;
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* Get data by product id */        
        GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
            if(e.ok == 1){
                $scope.data = e.data;
                $scope.dataPreserve = e.data;
                $scope.buildVariantOption(e.data);
                /*$scope.buildDataProductRelate($scope._getPostIdFromURL());*/
            }
        });          
        
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        }; 
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            /*$scope.makeVariantsClick();*/
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };
        $scope.findVariantsData = function(variantsPick){
            function compareArray(array_a, array) {
                if (!array)
                    return false;
                if (array_a.length != array.length)
                    return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i]))
                            return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for(var i = 0; i < dataVariants.length; i++){
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if(compareArray(variantsPick,optionJson)){                    
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;
                } 
            }
        };
        $scope.makeVariantsClick = function(){            
            var s = $timeout(function(){
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx,obj){
                    var optionElementFirst = $(this).find('option[data-index="'+idx+'"]').eq(0);
                    optionElementFirst.prop("selected",true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope.checkColorConfig = function(){
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function () {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };            
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if($('[data-key="'+$scope._uniqueKey+'"]').not('.slick-initialized')){
                $timeout(function(){
                    $scope._makeProductToCarousel();
                }, 500);                
            }            
        });
        $scope.qty_original=1;
        $scope.qty_current=1;
        $scope.qty_change = function(i){
            $scope.qty_current = i;
            console.log("qty_current", i);
        };
    };  
    return promise;
});
_ui_share_app.directive('productDetailPageHub', function($rootScope, $routeParams, $location, sliderProvider) {
    var templateName = 'productDetailPageHub';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon: '@icon',
        stylebutton: '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                state: true,
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                state: true,
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log("productDetailPageHub : ", name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                checkAttributeOption: function(attributeOption, attributeOptionLength, callback) {
                    var _self = this;
                    var attribute = (attributeOption.length == attributeOptionLength) ? true : false;
                    for (var i = 0; i < attributeOption.length; i++) {
                        _self.consoleLog("checkAttributeOption : attributeOption[i] : ", attributeOption[i]);
                        if (attributeOption[i] == undefined) {
                            attribute = false;
                        }
                    }
                    callback(attribute);
                },
                findVariantsData: function(attributeOption, dataVariants, attributeOptionLength, callback) {
                    var _self = this;
                    _self.consoleLog("findVariantsData : attributeOption : ", attributeOption);
                    _self.consoleLog("findVariantsData : dataVariants : ", dataVariants);
                    _self.consoleLog("findVariantsData : attributeOptionLength : ", attributeOptionLength);
                    _self.checkAttributeOption(attributeOption, attributeOptionLength, function(res_attribute_option) {
                        _self.consoleLog("checkAttributeOption : callback : res_attribute_option ", res_attribute_option);
                        var variantsOut = [];
                        for (var i = 0; i < dataVariants.length; i++) {
                            var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                            if (_self.compareArray(attributeOption, optionJson)) {
                                _self.consoleLog("findVariantsData : dataVariants[i] : ", dataVariants[i]);
                                variantsOut = dataVariants[i];
                                break;
                            }
                        }
                        callback(variantsOut, res_attribute_option);
                    });
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var _self = this;
                    var state = true;
                    _self.consoleLog("checkTotalStock : index : ", stateIn);
                    _self.consoleLog("checkTotalStock : quantity_max : ", quantity_max);
                    if (stateIn == false && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, $scope.attribute.attributeOption.length, function(variantsOut, res_attribute_option) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                _self.consoleLog("onClickOption : if : findVariantsData : res_attribute_option : ", res_attribute_option);
                                if (variantsOut.length != 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = variantsOut.product_id;
                                    $scope.dataArray.product_sku = variantsOut.sku;
                                    $scope.dataProductBuy.price = variantsOut.price;
                                    $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                    $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                    if (variantsOut.variant_image != 0) {
                                        if ($scope.dataArray.product_image.length != 0) {
                                            for (var i = 0; i < $scope.dataArray.product_image.length; i++) {
                                                $scope.dataArray.product_image[i].image_id
                                                if ($scope.dataArray.product_image[i].image_id == variantsOut.variant_image[0].image_id) {
                                                    $scope.slickImageGoto(i);
                                                }
                                            }
                                        }
                                    }
                                    _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                        _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                            $scope.buy.state = state;
                                            if ($scope.attribute.variantsTotal != 0) {
                                                $scope.buy.attribute = true;
                                            }
                                        });
                                    });
                                } else if (variantsOut.length == 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = 0;
                                    $scope.dataArray.product_sku = '';
                                    $scope.dataProductBuy.price = 0;
                                    $scope.dataArray.product_compare_price = 0;
                                    $scope.dataProductBuy.quantity_max = 1;
                                    $scope.buy.state = true;
                                    $scope.buy.attribute = true;
                                }
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 100);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log('productDetailPageHub : ', name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    var state_info = (input.product_is_more_info == 1) ? true : false;
                    callback(description, info, state_info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = true;
                    if (stateIn == true && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                checkPriceMin: function(variant, callback) {
                    var _self = this;
                    var priceMin = parseFloat(variant[0].price);
                    var comparePriceMin = parseFloat(variant[0].compare_price);
                    for (var i = 0; i < variant.length; i++) {
                        _self.consoleLog('checkPriceMin : priceMin : ', priceMin);
                        _self.consoleLog('checkPriceMin : variant[i].price : ', variant[i].price);
                        if (priceMin >= parseFloat(variant[i].price)) {
                            priceMin = parseFloat(variant[i].price);
                            comparePriceMin = parseFloat(variant[i].compare_price);
                        }
                    }
                    callback(priceMin, comparePriceMin);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        if (output.data.length != 0) {
                            _self.consoleLog("   : output : ", output.data);
                            _self.quantity(output.data.product_total_stock, function(total_stock) {
                                _self.consoleLog("quantity : total_stock : ", total_stock);
                                $scope.dataProductBuy.quantity_max = total_stock;
                                $scope.dataArray = output.data;
                                _self.productTab(output.data.product_tags, function(productTab) {
                                    $scope.dataArrayTags = productTab;
                                    _self.showTab(output.data, function(description, info, state_info) {
                                        $scope.showTab.dataTab[0].data = description;
                                        $scope.showTab.dataTab[1].data = info;
                                        $scope.showTab.dataTab[1].state = state_info;
                                    });
                                    _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                        _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                        _self.consoleLog("getAttribute : attribute : ", attribute);
                                        _self.consoleLog("getAttribute : variants : ", variants);
                                        _self.checkOption(variants_total, function(state) {
                                            _self.checkTotalStock(state, total_stock, function(state) {
                                                $scope.buy.state = state;
                                                $scope.attribute.attributeOption = attribute;
                                                $scope.attribute.dataVariants = variants;
                                                $scope.attribute.variantsTotal = variants_total;
                                                if (variants_total > 0) {
                                                    _self.checkPriceMin(variants, function(res_price, res_compare_price) {
                                                        $scope.dataProductBuy.price = res_price;
                                                        $scope.dataProductBuy.sumprice = res_price;
                                                        $scope.dataArray.product_compare_price = res_compare_price;
                                                    });
                                                } else {
                                                    $scope.dataProductBuy.price = output.data.product_price;
                                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                                }
                                            });
                                        });
                                    });
                                    _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                        _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                        $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                        if (quantity_break.length) {
                                            $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                        }
                                    });
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                        $scope.dataArrayState = _self.stateData(false, true);
                                    });
                                });
                            });
                        } else {
                            window.history.back();
                        }
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
        $scope.tab_id = 0;
        $scope.tabId = function(id) {
            $scope.tab_id = id;
        };
        $scope.routeParams = function() {
            return $routeParams || false;
        };
        $scope.categoriesData = $scope.routeParams().referral_id || '';
        $scope.setDataCategories = function(input) {
            $scope.categoriesData = input;
            var page = "category-lists";
            if (typeof $scope.categoriesData != 'undefined' && $scope.categoriesData !== "") {
                page += '?root_id=' + '0';
                page += '&referral_id=' + $scope.categoriesData;
            } else {
                delete $scope.categoriesDat;
            }
            $location.url(page).replace();
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageI', function ($rootScope, $routeParams, sliderProvider, $http) {
    var templateName = 'productDetailPageI';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
        background:'@background',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.data = false;
        $scope.dataPreserve = false;
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        if(CUR_THEME.data.shop_id == "395"){
            var req = {
                url:"https://gaedemo101.getappeasy.com/store/api/v1/product/id?txt_product_id="+$scope._getPostIdFromURL(),
                method: "GET",
            };
            $http(req).then(function(res){
                if(res.data.ok == 1){
                    var e = res.data;
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.buildDataProductRelate($scope.id);
                }
            });
        } else {
            GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
                if(e.ok == 1){
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.buildDataProductRelate($scope._getPostIdFromURL());
                }
            });
        }
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 6,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            /*$scope.makeVariantsClick();*/
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            if($index == 0 && option_id == ''){
                return GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
                    if(e.ok == 1){
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
           } else {
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        }            
    };
    $scope.findVariantsData = function(variantsPick){
        function compareArray(array_a, array) {
            if (!array)
                return false;
            if (array_a.length != array.length)
                return false;
            for (var i = 0, l = array_a.length; i < l; i++) {
                if (array_a[i] instanceof Array && array[i] instanceof Array) {
                    if (!compareArray(array_a[i], array[i]))
                        return false;
                } else if (array_a[i] != array[i]) {
                    return false;
                }
            }
            return true;
        }
        var dataVariants = $scope.dataVariants;
        for(var i = 0; i < dataVariants.length; i++){
            var optionJson = angular.fromJson(dataVariants[i].option_id_json);                
            if(compareArray(variantsPick,optionJson)){                
                $scope.data.product_sku = dataVariants[i].sku;
                $scope.data.product_price = dataVariants[i].price;
                $scope.data.product_compare_price = dataVariants[i].compare_price;
                break;                
            } 
        }
        console.log("onSelectVariantItems: Yes", $scope.dataPreserve);
    };
    $rootScope.$on('repeatend',function(){
        /* Slider Send */
        var optionsParmas = {
            autoplay:true,
            slidesToShow:1,
            slidesToScroll:1,
            dots:false,
            arrows:false,
            infinite:true
        };
        var extraOptions = {
            animate: false
        };
        $timeout(function(){
           sliderProvider("#gallery_slider", optionsParmas, "", "", extraOptions);
       },500);
    });
    /* Slick Events */
    $scope._slickGoLeft = function () {
        setTimeout(function () {
            $('#gallery_slider').slick('slickPrev');
        }, 100);
    };
    $scope._slickGoRight = function () {
        setTimeout(function () {
            $('#gallery_slider').slick('slickNext');
        }, 100);
    };
    /* Click SLick Item */
    $scope.slickGoto = function (idx) {
        setTimeout(function () {
            $('#gallery_slider').slick('slickGoTo', idx);
        }, 100);
    };
    /* Calcu Nav Arrows */
    $scope.navArrowsCalculate=function(){
        var size = (500 / 2);
        var n = (size + 18) + 20;
        return '-' + n + 'px';
    };
    $scope.navArrowWidth = function(){
        return $('#gallery_slider').width() + 'px';
    };
};  
return promise;
});
_ui_share_app.directive('productDetailPageInfo', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageInfo';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon: '@icon',
        stylebutton: '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log("productDetailPageMaeju : ", name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                checkAttributeOption: function(attributeOption, attributeOptionLength, callback) {
                    var _self = this;
                    var attribute = (attributeOption.length == attributeOptionLength) ? true : false;
                    for (var i = 0; i < attributeOption.length; i++) {
                        _self.consoleLog("checkAttributeOption : attributeOption[i] : ", attributeOption[i]);
                        if (attributeOption[i] == undefined) {
                            attribute = false;
                        }
                    }
                    callback(attribute);
                },
                findVariantsData: function(attributeOption, dataVariants, attributeOptionLength, callback) {
                    var _self = this;
                    _self.consoleLog("findVariantsData : attributeOption : ", attributeOption);
                    _self.consoleLog("findVariantsData : dataVariants : ", dataVariants);
                    _self.consoleLog("findVariantsData : attributeOptionLength : ", attributeOptionLength);
                    _self.checkAttributeOption(attributeOption, attributeOptionLength, function(res_attribute_option) {
                        _self.consoleLog("checkAttributeOption : callback : res_attribute_option ", res_attribute_option);
                        var variantsOut = [];
                        for (var i = 0; i < dataVariants.length; i++) {
                            var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                            if (_self.compareArray(attributeOption, optionJson)) {
                                _self.consoleLog("findVariantsData : dataVariants[i] : ", dataVariants[i]);
                                variantsOut = dataVariants[i];
                                break;
                            }
                        }
                        callback(variantsOut, res_attribute_option);
                    });
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var _self = this;
                    var state = true;
                    _self.consoleLog("checkTotalStock : index : ", stateIn);
                    _self.consoleLog("checkTotalStock : quantity_max : ", quantity_max);
                    if (stateIn == false && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, $scope.attribute.attributeOption.length, function(variantsOut, res_attribute_option) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                _self.consoleLog("onClickOption : if : findVariantsData : res_attribute_option : ", res_attribute_option);
                                if (variantsOut.length != 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = variantsOut.product_id;
                                    $scope.dataArray.product_sku = variantsOut.sku;
                                    $scope.dataProductBuy.price = variantsOut.price;
                                    $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                    $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                    if (variantsOut.variant_image != 0) {
                                        if ($scope.dataArray.product_image.length != 0) {
                                            for (var i = 0; i < $scope.dataArray.product_image.length; i++) {
                                                $scope.dataArray.product_image[i].image_id
                                                if ($scope.dataArray.product_image[i].image_id == variantsOut.variant_image[0].image_id) {
                                                    $scope.slickImageGoto(i);
                                                }
                                            }
                                        }
                                    }
                                    _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                        _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                            $scope.buy.state = state;
                                            if ($scope.attribute.variantsTotal != 0) {
                                                $scope.buy.attribute = true;
                                            }
                                        });
                                    });
                                } else if (variantsOut.length == 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = 0;
                                    $scope.dataArray.product_sku = '';
                                    $scope.dataProductBuy.price = 0;
                                    $scope.dataArray.product_compare_price = 0;
                                    $scope.dataProductBuy.quantity_max = 1;
                                    $scope.buy.state = true;
                                    $scope.buy.attribute = true;
                                }
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 100);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log('productDetailPageMaeju : ', name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = true;
                    if (stateIn == true && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                checkPriceMin: function(variant, callback) {
                    var _self = this;
                    var priceMin = parseFloat(variant[0].price);
                    var comparePriceMin = parseFloat(variant[0].compare_price);
                    for (var i = 0; i < variant.length; i++) {
                        _self.consoleLog('checkPriceMin : priceMin : ', priceMin);
                        _self.consoleLog('checkPriceMin : variant[i].price : ', variant[i].price);
                        if (priceMin >= parseFloat(variant[i].price)) {
                            priceMin = parseFloat(variant[i].price);
                            comparePriceMin = parseFloat(variant[i].compare_price);
                        }
                    }
                    callback(priceMin, comparePriceMin);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        if (output.data.length != 0) {
                            _self.consoleLog("   : output : ", output.data);
                            _self.quantity(output.data.product_total_stock, function(total_stock) {
                                _self.consoleLog("quantity : total_stock : ", total_stock);
                                $scope.dataProductBuy.quantity_max = total_stock;
                                $scope.dataArray = output.data;
                                _self.productTab(output.data.product_tags, function(productTab) {
                                    $scope.dataArrayTags = productTab;
                                    _self.showTab(output.data, function(description, info) {
                                        $scope.showTab.dataTab[0].data = description;
                                        $scope.showTab.dataTab[1].data = info;
                                    });
                                    _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                        _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                        _self.consoleLog("getAttribute : attribute : ", attribute);
                                        _self.consoleLog("getAttribute : variants : ", variants);
                                        _self.checkOption(variants_total, function(state) {
                                            _self.checkTotalStock(state, total_stock, function(state) {
                                                $scope.buy.state = state;
                                                $scope.attribute.attributeOption = attribute;
                                                $scope.attribute.dataVariants = variants;
                                                $scope.attribute.variantsTotal = variants_total;
                                                if (variants_total > 0) {
                                                    _self.checkPriceMin(variants, function(res_price, res_compare_price) {
                                                        $scope.dataProductBuy.price = res_price;
                                                        $scope.dataProductBuy.sumprice = res_price;
                                                        $scope.dataArray.product_compare_price = res_compare_price;
                                                    });
                                                } else {
                                                    $scope.dataProductBuy.price = output.data.product_price;
                                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                                }
                                            });
                                        });
                                    });
                                    _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                        _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                        $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                        if (quantity_break.length) {
                                            $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                        }
                                    });
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                        $scope.dataArrayState = _self.stateData(false, true);
                                    });
                                });
                            });
                        } else {
                            window.history.back();
                        }
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
        $scope.tab_id = 0;
        $scope.tabId = function(id) {
            $scope.tab_id = id;
        };
        $scope.routeParams = function() {
            return $routeParams || false;
        };
        $scope.categoriesData = $scope.routeParams().referral_id || '';
        $scope.setDataCategories = function(input) {
            $scope.categoriesData = input;
            var page = "category-lists";
            if (typeof $scope.categoriesData != 'undefined' && $scope.categoriesData !== "") {
                page += '?root_id=' + '0';
                page += '&referral_id=' + $scope.categoriesData;
            } else {
                delete $scope.categoriesDat;
            }
            $location.url(page).replace();
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
    };
    return promise;
});
_ui_share_app.directive('productDetailPageK', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageK';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name:'@name',
        imgpath: '@imgpath',
        id:'@id',
        headerheight:'@headerheight',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.getWindowsFit = function(){
            var h = (typeof $scope.headerheight !== 'udnefined' && $scope.headerheight != '') ? $scope.headerheight : 80;
            var a = $(window).height() - 80;
            return a;
        };
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        angular.element($window).bind('scroll',function(){
            var curPos = ($(document).scrollTop());
            /*var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));*/
            var properHeight = $scope.getWindowsFit() * Math.abs(($('div.img_cover').length - 1));
            console.log("Cur pos",curPos, properHeight);
            if(curPos > properHeight){
                angular.element('.block-background .bottom-info').addClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }               
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */
        var optionsParmas = {
            autoplay:true,
            slidesToShow:1,
            slidesToScroll:1,
            dots:true,
            arrows:false,
            infinite:true
        };
        var extraOptions = {
            animate: false
        };
        $timeout(function(){
            sliderProvider("#gallery-slider-1", optionsParmas, "", $scope._uniqueKey, extraOptions);
        },1000);   
        $scope.status_done = true;
         if(CUR_THEME.data.shop_id == "395"){
            var req = {
                url:"https://gaedemo101.getappeasy.com/store/api/v1/product/id?txt_product_id="+$scope._getPostIdFromURL(),
                method: "GET",
            };
            $http(req).then(function(res){
                if(res.data.ok == 1){
                    var e = res.data;
                    $scope._data_product_id = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.buildDataProductRelate($scope.id);
                }
            });
        } else {
             $('.load-effect').addClass('is-active');
             $scope.status_done = true;
            GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
                if(e.ok == 1){
                    setTimeout(function () {
                        $scope.status_done = false;
                     }, 300);
                    $scope._data_product_id = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.buildDataProductRelate($scope._getPostIdFromURL());
                    setTimeout(function () {
                        $('.load-effect').addClass('de-active');
                    }, 300);
                    setTimeout(function () {
                        $('.load-effect').addClass('loaded');
                        $('.load-effect').removeClass('is-active de-active');
                        $('.load-effect').removeClass('loaded');
                        $('html').removeClass('noscroll noscroll-long');
                    }, 1300);
                }
            });
        }
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 6,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            /*$scope.makeVariantsClick();*/
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            if($index == 0 && option_id == ''){
                return GAEAPI.get('product/id',{'txt_product_id':$scope.id}).then(function(e){
                    if(e.ok == 1){
                        $scope._data_product_id = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
           } else {
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        }            
    };
    $scope.findVariantsData = function(variantsPick){
        function compareArray(array_a, array) {
            if (!array)
                return false;
            if (array_a.length != array.length)
                return false;
            for (var i = 0, l = array_a.length; i < l; i++) {
                if (array_a[i] instanceof Array && array[i] instanceof Array) {
                    if (!compareArray(array_a[i], array[i]))
                        return false;
                } else if (array_a[i] != array[i]) {
                    return false;
                }
            }
            return true;
        }
        var dataVariants = $scope.dataVariants;
        for(var i = 0; i < dataVariants.length; i++){
            var optionJson = angular.fromJson(dataVariants[i].option_id_json);                
            if(compareArray(variantsPick,optionJson)){                
                $scope._data_product_id.product_sku = dataVariants[i].sku;
                $scope._data_product_id.product_price = dataVariants[i].price;
                $scope._data_product_id.product_id = dataVariants[i].product_id;
                $scope._data_product_id.product_compare_price = dataVariants[i].compare_price;
                break;                
            } 
        }
        console.log("onSelectVariantItems: Yes", $scope.dataPreserve);
    };
};  
    return promise;
});
_ui_share_app.directive('productDetailPageKrthai', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageKrthai';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        buyicon: '@buyicon',
        buytext: '@buytext',
        viewcarttext: '@viewcarttext',
        buylogin: '@buylogin',
        currency: '@currency',
        checkstaff: '@checkstaff',
        language: '@language',
        btnstyle: '@btnstyle',
        maxstock: '@maxstock',
        videotext: '@videotext',
        description: '@description',
        info: '@info',
        specification: '@specification',
        textbrand:'@textbrand',
        navigationhover: '@navigationhover',
        imageappcoverchecked: '@imageappcoverchecked',
        categorylists:'@categorylists',
        categorylistsurl: '@categorylistsurl',
        backpage: '@backpage',
        backpageurl: '@backpageurl',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $location) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "productDetailPageKrthai";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        /* scope */
        $scope._name = ($scope.name != undefined && $scope.name != "") ? $scope.name : "default";
        $scope._buycol = ($scope.buycol != undefined && $scope.buycol != "") ? parseInt($scope.buycol) : 15;
        $scope._maxstock = ($scope.maxstock != undefined && $scope.maxstock != "") ? parseInt($scope.maxstock) : 20;
        $scope._categorylistsurl = ($scope.categorylistsurl != undefined && $scope.categorylistsurl != "") ? $scope.categorylistsurl : "category-lists";
        $scope._btnstyle = ($scope.btnstyle != undefined && $scope.btnstyle != "") ? $scope.btnstyle : "filled_button_large";
        $scope._buylogin = ($scope.buylogin == "true" || $scope.buylogin == "t") ? true : false;
        $scope._checkstaff = ($scope.checkstaff == "true" || $scope.checkstaff == "t") ? true : false;
        $scope._categorylists = ($scope.categorylists != undefined && $scope.categorylists != "") ? $scope.categorylists : "สินค้า";
        $scope._currency = ($scope.currency != undefined && $scope.currency != "") ? $scope.currency : "THB";
        $scope._buyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope.buyicon : "icnt_outline_cart01_dark.png";
        $scope._buytext = ($scope.buytext != undefined && $scope.buytext != "") ? $scope.buytext : "เพิ่มในรถเข็น";
        $scope._viewcarttext = ($scope.viewcarttext != undefined && $scope.viewcarttext != "") ? $scope.viewcarttext : "ดูรถเข็น";
        $scope._videotext = ($scope.videotext != undefined && $scope.videotext != "") ? $scope.videotext : "Video";
        $scope._icebuyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope._icnPath + $scope.buyicon : $scope._icnPath + "icnt_outline_cart01_dark.png";
        $scope._language = ($scope.language != undefined && $scope.language != "") ? (($scope.language == "en") ? "en" : "th") : "th";
        $scope._textbrand = ($scope.textbrand != undefined && $scope.textbrand != "") ? $scope.textbrand : "Brand";
        $scope._navigationhover = ($scope.navigationhover != undefined && $scope.navigationhover != "") ? $scope.navigationhover : "primary";
        $scope._imageappcoverchecked = ($scope.imageappcoverchecked == "true" || $scope.imageappcoverchecked == "t") ? true : false;
        $scope._backpage = ($scope.backpage != undefined && $scope.backpage != "") ? $scope.backpage : "";
        $scope._backpageurl = ($scope.backpageurl != undefined && $scope.backpageurl != "") ? $scope.backpageurl : "";
        /* scope */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getNamePage: function(arr) {
                    var str = [];
                    for (var i = 0; i < arr.length; i++) {
                        if (i != 0) {
                            str.push(arr[i]);
                        }
                    }
                    return str.join(" ");
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = (params.product_id != undefined) ? params.product_id.split("-", 1).join("") : false;
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getReferralId: function(productReferralDisplay, callback) {
                    var _self = this;
                    var referral_id = 0;
                    if (productReferralDisplay.length != 0) {
                        if (productReferralDisplay.category != undefined) {
                            if (productReferralDisplay.category.length != 0) {
                                referral_id = productReferralDisplay.category[0].referral_id
                            }
                        }
                    }
                    callback(referral_id);
                },
                getStaffId: function(staffId, callback) {
                    var _self = this;
                    var res_staff = {
                        staff_id: (staffId != 0 && staffId != '' && staffId != undefined) ? staffId : '0',
                        status: (staffId != 0 && staffId != '' && staffId != undefined) ? true : false
                    }
                    callback(res_staff);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getCarousel = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carouselA: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            fade: true,
                            dots: false,
                            arrows: false,
                            infinite: true,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '',
                            nextArrow: '',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselB: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: true,
                            arrows: true,
                            infinite: true,
                            autoplay: false,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '
',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselBar: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: false,
                            infinite: false,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 6,
                            slidesToScroll: 6,
                            speed: 600,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: 5,
                                    slidesToScroll: 5,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: 4,
                                    slidesToScroll: 4,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: 3,
                                    slidesToScroll: 3,
                                }
                            }]
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                slickCarousel: function(carousel, index) {
                    var _self = this;
                    $scope.setCarousel.index = index;
                    setTimeout(function() {
                        $('[data-key="' + carousel + '"]').slick('slickGoTo', index);
                    }, 100);
                },
                prevIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != 0) ? image_index - 1 : image - 1;
                    _self.consoleLog("prevIndex index", $scope.setCarousel.index);
                },
                nextIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != (image - 1)) ? image_index + 1 : 0;
                    _self.consoleLog("nextIndex index", $scope.setCarousel.index);
                }
            }
            return getFunction;
        };
        $scope.getAttribute = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                productAttribute: function(productAttribute, callback) {
                    var _self = this;
                    var attribute = {
                        option_name: "",
                        option_attribute: []
                    };
                    if (productAttribute.option_data != undefined) {
                        if (productAttribute.option_data.variant_array != undefined && productAttribute.option_data.variant_array.length != 0) {
                            for (var a = 0; a < productAttribute.option_data.pclass_array.length; a++) {
                                attribute.option_name = attribute.option_name.concat(productAttribute.option_data.pclass_array[a].pclass_name, " ");
                            }
                            for (var b = 0; b < productAttribute.option_data.variant_array.length; b++) {
                                var product_attribute = {
                                    product_id: productAttribute.option_data.variant_array[b].product_id,
                                    product_sku: productAttribute.option_data.variant_array[b].sku,
                                    product_title: "",
                                    product_price: parseFloat(productAttribute.option_data.variant_array[b].price),
                                    product_compare_price: parseFloat(productAttribute.option_data.variant_array[b].compare_price),
                                    product_total_stock: parseFloat(productAttribute.option_data.variant_array[b].total_stock),
                                    product_image: productAttribute.option_data.variant_array[b].variant_image
                                }
                                for (var c = 0; c < productAttribute.option_data.variant_array[b].option_name_array.length; c++) {
                                    product_attribute.product_title = product_attribute.product_title.concat(productAttribute.option_data.variant_array[b].option_name_array[c], " ");
                                }
                                attribute.option_attribute.push(product_attribute);
                            }
                        }
                    }
                    _self.consoleLog("productAttribute attribute ", attribute);
                    callback(attribute);
                },
                checkDiscountPrice: function(productDiscount, resPrice, resComparePrice, callback) {
                    var _self = this;
                    var price = 0;
                    var compare_price = 0;
                    if (productDiscount.length == 0) {
                        price = parseFloat(resPrice);
                        compare_price = parseFloat(resComparePrice);
                    } else {
                        if (productDiscount.discount_type_id == '101') {
                            price = parseFloat(resPrice) - parseFloat(productDiscount.discount_price);
                            compare_price = parseFloat(resPrice);
                        } else if (productDiscount.discount_type_id == '102') {
                            price = (parseFloat(resPrice) * ((100 - parseFloat(productDiscount.discount_percent)) / 100));
                            compare_price = parseFloat(resPrice);
                        }
                    }
                    callback(price, compare_price);
                },
                checkMinPrice: function(option, callback) {
                    var _self = this;
                    var price_min = parseFloat(option.option_attribute[0].product_price);
                    var compare_price_min = parseFloat(option.option_attribute[0].product_compare_price);
                    var total_stock = parseFloat(option.option_attribute[0].product_total_stock);
                    for (var a = 0; a < option.option_attribute.length; a++) {
                        if (price_min >= parseFloat(option.option_attribute[a].product_price)) {
                            price_min = parseFloat(option.option_attribute[a].product_price);
                            compare_price_min = parseFloat(option.option_attribute[a].product_compare_price);
                            total_stock = parseFloat(option.option_attribute[a].product_total_stock);
                        }
                    }
                    _self.consoleLog("checkPriceMin price_min ", price_min);
                    _self.consoleLog("checkPriceMin compare_price_min ", compare_price_min);
                    _self.consoleLog("checkPriceMin total_stock ", total_stock);
                    callback(price_min, compare_price_min, total_stock);
                },
                getTotalStock: function(totalStock, mixStock, callback) {
                    var _self = this;
                    var total_stock = (totalStock > 0) ? ((totalStock <= mixStock) ? totalStock : mixStock) : ((totalStock == -1) ? mixStock : totalStock);
                    callback(total_stock);
                },
                checkMinPrices: function(api, attribute, callback) {
                    var _self = this;
                    var dataPrice = {
                        product_price: {
                            price_name: 'product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        product_compare_price: {
                            price_name: 'product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_price: {
                            price_name: 'sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_price: {
                            price_name: 'sum_product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_minus_sum_product_price: {
                            price_name: 'sum_product_compare_minus_sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        }
                    }
                    if (attribute.option_attribute.length == 0) {
                        _self.checkDiscountPrice(api.data.product_discount, api.data.product_price, api.data.product_compare_price, function(res_price, res_compare_price) {
                            _self.checkPrice(res_price, function(res_price_ecimals) {
                                dataPrice.product_price.price = res_price;
                                dataPrice.product_price.price_ecimals = res_price_ecimals;
                                dataPrice.sum_product_price.price = res_price;
                                dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                    dataPrice.product_compare_price.price = res_compare_price;
                                    dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    dataPrice.sum_product_compare_price.price = res_compare_price;
                                    dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                    _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                        dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                        dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                        _self.getTotalStock(api.data.product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                            dataPrice.product_price.total_stock = res_total_stock_s;
                                            dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                            callback(dataPrice, false);
                                        });
                                    });
                                });
                            });
                        });
                    } else {
                        _self.checkMinPrice(attribute, function(res_price_min, res_compare_price_min, res_total_stock) {
                            _self.checkDiscountPrice(api.data.product_discount, res_price_min, res_compare_price_min, function(res_price, res_compare_price) {
                                _self.checkPrice(res_price, function(res_price_ecimals) {
                                    dataPrice.product_price.price = res_price;
                                    dataPrice.product_price.price_ecimals = res_price_ecimals;
                                    dataPrice.sum_product_price.price = res_price;
                                    dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                    _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                        dataPrice.product_compare_price.price = res_compare_price;
                                        dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        dataPrice.sum_product_compare_price.price = res_compare_price;
                                        dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                        _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                            dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                            dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                            _self.getTotalStock(res_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                dataPrice.product_price.total_stock = res_total_stock_s;
                                                dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                callback(dataPrice, true);
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    }
                },
                priceIncludes: function(price, includes, callback) {
                    var _self = this;
                    var priceToString = (price == null) ? 0 : price;
                    _self.consoleLog('priceIncludes priceToString : ', priceToString);
                    callback(priceToString.toString().includes(includes));
                },
                checkPrice: function(price, callback) {
                    var _self = this;
                    _self.priceIncludes(price, '.', function(res) {
                        _self.consoleLog("checkPrice res ", res);
                        callback((!res) ? 0 : 2);
                    });
                },
                onSelectOption: function(productId) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = productId;
                    _self.consoleLog("onSelectOption productId ", productId);
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    for (var a = 0; a < $scope.data.attribute.dataArray.option_attribute.length; a++) {
                        _self.consoleLog("onSelectOption option_attribute ", $scope.data.attribute.dataArray.option_attribute[a]);
                        if ($scope.data.attribute.dataArray.option_attribute[a].product_id == productId) {
                            if ($scope.data.attribute.dataArray.option_attribute[a].product_image.length != 0) {
                                if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                                    for (var b = 0; b < $scope.dataApi.product.dataArray.product_image.length; b++) {
                                        if ($scope.dataApi.product.dataArray.product_image[b].image_id == $scope.data.attribute.dataArray.option_attribute[a].product_image[0].image_id) {
                                            $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, b);
                                        }
                                    }
                                }
                            }
                            _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[a].product_price, $scope.data.attribute.dataArray.option_attribute[a].product_compare_price, function(res_price_p, res_compare_price_p) {
                                _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                                    $scope.data.product_price.price = res_price_p;
                                    $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                                    $scope.data.sum_product_price.price = res_price_p;
                                    $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                                    _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                        $scope.data.product_compare_price.price = res_compare_price_p;
                                        $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                        $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                        _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                            $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                            $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                            _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[a].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                $scope.data.product_price.total_stock = res_total_stock_s;
                                                $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                /* stock */
                                                $scope.data.quantity.quantity_max = res_total_stock_s;
                                                $scope.data.quantity.quantity_select = [];
                                                for (var i = 0; i < res_total_stock_s; i++) {
                                                    $scope.data.quantity.quantity_select.push(i + 1);
                                                }
                                                /* stock */
                                            })
                                        });
                                    });
                                });
                            });
                            break;
                        }
                    }
                },
                onClickOption: function(index) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.data.attribute.productId = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    if ($scope.data.attribute.dataArray.option_attribute[index].product_image.length != 0) {
                        if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                            for (var i = 0; i < $scope.dataApi.product.dataArray.product_image.length; i++) {
                                if ($scope.dataApi.product.dataArray.product_image[i].image_id == $scope.data.attribute.dataArray.option_attribute[index].product_image[0].image_id) {
                                    $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, i);
                                }
                            }
                        }
                    }
                    _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[index].product_price, $scope.data.attribute.dataArray.option_attribute[index].product_compare_price, function(res_price_p, res_compare_price_p) {
                        _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                            $scope.data.product_price.price = res_price_p;
                            $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                            $scope.data.sum_product_price.price = res_price_p;
                            $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                            _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                $scope.data.product_compare_price.price = res_compare_price_p;
                                $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                    $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                    $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                    _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[index].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                        $scope.data.product_price.total_stock = res_total_stock_s;
                                        $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                        /* stock */
                                        $scope.data.quantity.quantity_max = res_total_stock_s;
                                        $scope.data.quantity.quantity_select = [];
                                        for (var i = 0; i < res_total_stock_s; i++) {
                                            $scope.data.quantity.quantity_select.push(i + 1);
                                        }
                                        /* stock */
                                    })
                                });
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.getAttributeCustom = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                createArray: function(productCustomTemplates, callback) {
                    var _self = this;
                    var custom_attributes = [];
                    if (productCustomTemplates.templates.length != 0) {
                        if (productCustomTemplates.templates[0].option_sets.length != 0) {
                            _self.getAttributes(productCustomTemplates.templates[0].option_sets, function(res_attributes) {
                                custom_attributes = res_attributes;
                            });
                        }
                    }
                    _self.consoleLog("createArray : productCustomTemplates", productCustomTemplates);
                    _self.consoleLog("createArray : custom_attributes", custom_attributes);
                    callback(custom_attributes, true);
                },
                formatAttribute: function(index, optionSubsetIndex, setType, optionSetArray, callback) {
                    var _self = this;
                    var set_id = (setType == 'attribute') ? optionSetArray.set_id : optionSetArray.subset_id;
                    var attribute = {
                        attribute_index: index,
                        attribute_option_subset_index: optionSubsetIndex,
                        active_option_id: (optionSetArray.option_data.select_id != 0) ? optionSetArray.option_data.select_id : "-1",
                        active_option_index: -1,
                        active_option_index_str: "-1",
                        active_textarea: "",
                        active_array: [],
                        set_id: set_id,
                        name: optionSetArray.name,
                        set_type: optionSetArray.ss_type,
                        option: []
                    }
                    callback(attribute);
                },
                getOption: function(index, optionDataArray, callback) {
                    var _self = this;
                    var options = {
                        index: index,
                        ss_data_id: optionDataArray.ss_data_id,
                        name: optionDataArray.name,
                        image: optionDataArray.image,
                        price: optionDataArray.price,
                        compare_price: 0,
                        total_stock: 0
                    }
                    callback(options);
                },
                getActive: function(index, activeOptionId, activeOptionIdIn, optionDataArray, callback) {
                    var _self = this;
                    var actives_index = (optionDataArray.ss_data_id == activeOptionId) ? index : activeOptionIdIn;
                    var actives = (optionDataArray.ss_data_id != activeOptionId) ? "0" : "1";
                    callback(actives_index, actives);
                },
                getAttributes: function(optionSetArray, callback) {
                    var _self = this;
                    var attributes = [];
                    for (var index = 0; index < optionSetArray.length; index++) {
                        _self.formatAttribute(index, 0, 'attribute', optionSetArray[index], function(res_attribute) {
                            if (optionSetArray[index].option_subsets.length != 0) {
                                for (var option_subset_index = 0; option_subset_index < optionSetArray[index].option_subsets.length; option_subset_index++) {
                                    _self.formatAttribute(index, option_subset_index, res_attribute.set_type, optionSetArray[index].option_subsets[option_subset_index], function(res_attribute_sub) {
                                        var options = [];
                                        var active_option_id = -1;
                                        var active_option_array = [];
                                        for (var option = 0; option < optionSetArray[index].option_subsets[option_subset_index].option_data.options.length; option++) {
                                            _self.getOption(option, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_option) {
                                                options.push(res_option);
                                            });
                                            _self.getActive(option, res_attribute_sub.active_option_id, active_option_id, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_actives_index, res_actives) {
                                                active_option_id = res_actives_index;
                                                active_option_array.push(res_actives);
                                            });
                                        }
                                        res_attribute_sub.option = options;
                                        res_attribute_sub.active_option_index = active_option_id;
                                        res_attribute_sub.active_option_index_str = String(active_option_id);
                                        res_attribute_sub.active_array = active_option_array;
                                        attributes.push(res_attribute_sub);
                                    });
                                }
                            } else {
                                var options = [];
                                var active_option_id = -1;
                                var active_option_array = [];
                                for (var option = 0; option < optionSetArray[index].option_data.options.length; option++) {
                                    _self.getOption(option, optionSetArray[index].option_data.options[option], function(res_option) {
                                        options.push(res_option);
                                    });
                                    _self.getActive(option, res_attribute.active_option_id, active_option_id, optionSetArray[index].option_data.options[option], function(res_actives_index, res_actives) {
                                        active_option_id = res_actives_index;
                                        active_option_array.push(res_actives);
                                    });
                                }
                                res_attribute.option = options;
                                res_attribute.active_option_index = active_option_id;
                                res_attribute.active_option_index_str = String(active_option_id);
                                res_attribute.active_array = active_option_array;
                                attributes.push(res_attribute);
                            }
                        });
                    }
                    callback(attributes)
                },
                getformatQuantity: function(index, attributeCustom, callback) {
                    var _self = this;
                    var quantity = {
                        name: String(index + 1),
                        dataArray: attributeCustom
                    }
                    callback(quantity);
                },
                onClickRadio: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickRadio : index", index);
                    _self.consoleLog("onClickRadio : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickRadio : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickDropdown: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickDropdown : index", index);
                    _self.consoleLog("onClickDropdown : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickDropdown : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickCheckbox: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickCheckbox : index", index);
                    _self.consoleLog("onClickCheckbox : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i == parseInt(index_option)) ? (($scope.data.attribute_custom.dataArray[index].active_array[i] != "0") ? "0" : "1") : $scope.data.attribute_custom.dataArray[index].active_array[i];
                    }
                    _self.consoleLog("onClickCheckbox : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                }
            }
            return getFunction;
        };
        $scope.getReward = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                momentUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    callback(now);
                },
                getCalculator: function(sumProductPrice, reward, callback) {
                    var _self = this;
                    _self.consoleLog("getCalculator : sumProductPrice", sumProductPrice);
                    _self.consoleLog("getCalculator : reward", reward);
                    var point_reward = 0;
                    if (reward.type_id == "100") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    } else if (reward.type_id == "101") {
                        point_reward = reward.reward_amount;
                    } else if (reward.type_id == "102") {
                        point_reward = (reward.reward_percent * sumProductPrice.price) / 100;
                    } else if (reward.type_id == "103") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    }
                    _self.consoleLog("getCalculator : point_reward", point_reward);
                    callback(point_reward);
                },
                getProductReward: function(now, productReward, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (productReward.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(productReward.reward_lifetime.lifetime_start_time);
                        reward.lifetime_end_time = parseInt(productReward.reward_lifetime.lifetime_end_time);
                        reward.type_id = productReward.reward_type_id;
                        reward.amount = parseInt(productReward.reward_amount);
                        reward.percent = parseInt(productReward.reward_percent);
                        reward.every_price = parseInt(productReward.reward_every_price);
                    }
                    _self.consoleLog("getProductReward : reward", reward);
                    callback(reward);
                },
                getPointConfig: function(now, shopPointConfig, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (shopPointConfig.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(shopPointConfig.er_from);
                        reward.lifetime_end_time = parseInt(shopPointConfig.er_to);
                        reward.type_id = "100";
                        reward.amount = parseInt(shopPointConfig.er_earn);
                        reward.every_price = parseInt(shopPointConfig.er_rate);
                    }
                    _self.consoleLog("getPointConfig : reward", reward);
                    callback(reward);
                },
                checkPointReward: function(reward, callback) {
                    var _self = this;
                    var state = false;
                    if (reward.reward_length) {
                        var start = reward.lifetime_start_time < reward.lifetime_time && reward.lifetime_start_time != 0;
                        var end = (reward.lifetime_end_time != -1) ? reward.lifetime_time <= reward.lifetime_end_time && reward.lifetime_end_time != 0 : true;
                        if (start && end) {
                            if (reward.type_id == "100") {
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            } else if (reward.type_id == "101") {
                                var amount = reward.amount != 0;
                                if (amount) {
                                    state = true;
                                }
                            } else if (reward.type_id == "102") {
                                var percent = reward.percent != 0;
                                if (percent) {
                                    state = true;
                                }
                            } else if (reward.type_id == "103") {
                                var percent = reward.percent != 0;
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            }
                        }
                    }
                    callback(state);
                },
                checkReward: function(rewardProduct, rewardPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("checkReward : rewardProduct", rewardProduct);
                    _self.consoleLog("checkReward : rewardPointConfig", rewardPointConfig);
                    var reward = {
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    _self.checkPointReward(rewardProduct, function(res_state_product) {
                        _self.checkPointReward(rewardPointConfig, function(res_state_point_config) {
                            if (res_state_point_config) {
                                reward.type_id = rewardPointConfig.type_id;
                                reward.type_id = rewardPointConfig.type_id;
                                reward.amount = rewardPointConfig.amount;
                                reward.percent = rewardPointConfig.percent;
                                reward.every_price = rewardPointConfig.every_price;
                            } else if (res_state_product) {
                                reward.type_id = rewardProduct.type_id;
                                reward.amount = rewardProduct.amount;
                                reward.percent = rewardProduct.percent;
                                reward.every_price = rewardProduct.every_price;
                            }
                            _self.consoleLog("checkReward : reward", reward);
                            callback(reward);
                        });
                    });
                },
                checkRewardType: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.momentUnix(function(now) {
                        _self.getProductReward(now, productReward, function(res_reward_product) {
                            _self.getPointConfig(now, shopPointConfig, function(res_reward_point_config) {
                                _self.checkReward(res_reward_product, res_reward_point_config, function(res_reward) {
                                    callback(res_reward);
                                });
                            });
                        });
                    });
                },
                createReward: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("createReward : productReward", productReward);
                    _self.consoleLog("createReward : shopPointConfig", shopPointConfig);
                    _self.checkRewardType(productReward, shopPointConfig, function(res_reward) {
                        _self.consoleLog("createReward : res_reward", res_reward);
                        callback(res_reward);
                    });
                }
            }
            return getFunction;
        };
        $scope.getQuantity = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                upDateReward: function() {
                    var _self = this;
                },
                upDateReward: function() {
                    var _self = this;
                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                        $scope.data.reward.point_reward = res_point_reward;
                    });
                },
                upDatePrice: function() {
                    var _self = this;
                    var product_price = $scope.data.product_price.price * $scope.data.quantity.quantity_input;
                    var product_compare_price = $scope.data.product_compare_price.price * $scope.data.quantity.quantity_input;
                    $scope.getAttribute().checkPrice(product_price, function(res_price_ecimals) {
                        $scope.data.sum_product_price.price = product_price;
                        $scope.data.sum_product_price.price_ecimals = res_price_ecimals;
                        $scope.getAttribute().checkPrice(product_compare_price, function(res_compare_price_ecimals) {
                            $scope.data.sum_product_compare_price.price = product_compare_price;
                            $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                            var compare_price_minus_price = ((product_compare_price - product_price) > 0) ? product_compare_price - product_price : 0;
                            $scope.getAttribute().checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                _self.upDateReward();
                            });
                        });
                    });
                },
                input: function(quantityInput) {
                    var _self = this;
                    _self.consoleLog("input : quantityInput", quantityInput);
                    quantityInput = (quantityInput == null) ? 1 : parseInt(quantityInput);
                    _self.consoleLog("input : quantityInput", quantityInput);
                    if (quantityInput != null) {
                        if (quantityInput >= $scope.data.quantity.quantity_max) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_max;
                        }
                        if (quantityInput <= $scope.data.quantity.quantity_min) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                        }
                    } else {
                        $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                    }
                    _self.upDatePrice();
                },
                minus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input - 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_min", $scope.data.quantity.quantity_min);
                    if (quantity >= $scope.data.quantity.quantity_min) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                },
                plus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input + 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_max", $scope.data.quantity.quantity_max);
                    if (quantity <= $scope.data.quantity.quantity_max) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                }
            }
            return getFunction;
        };
        $scope.getBuy = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = params.product_id.split("-", 1).join("");
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                postApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.post(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                UiCartProductAdd: function(productId, quantityInput, promotionId, customOptions, callback) {
                    UiCart.delegate.product.add(productId, quantityInput, promotionId, function(res_data) {
                        callback(res_data);
                    });
                },
                isProgress: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isProgress(productId)) ? true : false;
                    _self.consoleLog("isProgress : productId", productId);
                    _self.consoleLog("isProgress : state", state);
                    callback(state);
                },
                isSelected: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    _self.consoleLog("isSelected : productId", productId);
                    _self.consoleLog("isSelected : state", state);
                    callback(state);
                },
                isSelectedReturn: function(productId) {
                    var _self = this;
                    var ui_cart_state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    if (!$scope.setBuy.state_active) {
                        $scope.setBuy.state_active = true;
                        var state_process = $scope.setBuy.state_process;
                        var state_step = $scope.setBuy.state_step;
                        if (ui_cart_state && !state_process && state_step != 4) /* cart */ {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_active = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else if (!ui_cart_state && !state_process && state_step != 0) /* unset */ {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_active = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        } else {
                            $scope.setBuy.state_active = false;
                        }
                    }
                    return ui_cart_state;
                },
                updateState: function(productId) {
                    _self = this;
                    _self.isSelected(productId, function(res_state) {
                        if (res_state) {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_process = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        }
                        return res_state;
                    });
                },
                uiCart: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    _self.UiCartProductAdd(productId, quantityInput, promotionId, customOptions, function(res_data) {
                        if (res_data) {
                            _self.onTimeout(500, function() {
                                _self.onPass(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onError(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onUnset(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                        });
                                    });
                                });
                            });
                        }
                    });
                },
                postApi: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    var custom_options = {};
                    var dataSend = {
                        'txt_product_id': productId,
                        'txt_amount': quantityInput,
                        'txt_is_clear_cart_before': "0",
                        'txt_custom_options_json': JSON.stringify(custom_options)
                    };
                    _self.dataSend("cart/product_add", dataSend, function(res_api, res_dataSend) {
                        _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                            if (res_ok) {
                                _self.onTimeout(500, function() {
                                    _self.onPass(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onCart(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            });
                                        });
                                    });
                                });
                            } else {
                                _self.onTimeout(500, function() {
                                    _self.onError(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onUnset(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                            });
                                        });
                                    });
                                });
                            }
                        });
                    });
                },
                onProcess: function(data, productId, quantityInput, promotionId, customOptions) {
                    var _self = this;
                    if (!$scope.setBuy.state_process) {
                        $scope.setBuy.state_process = true;
                        _self.isSelected(productId, function(res_state) {
                            if (!res_state) {
                                _self.onLoad($scope.setBuy.state_step, function(res_step) {
                                    if (data.sum_product_price.price != 0 && data.quantity.quantity_max != 0 && (data.attribute.state == (data.attribute.productId != ''))) {
                                        /* UiCart */
                                        _self.uiCart(productId, quantityInput, promotionId, customOptions, res_step);
                                        /* api post offline */
                                        /*_self.postApi(productId, quantityInput, promotionId, customOptions, res_step); */
                                    } else {
                                        _self.onTimeout(500, function() {
                                            _self.onError(res_step, function(res_step) {
                                                _self.onTimeout(1000, function() {
                                                    _self.onUnset(res_step, function(res_step) {
                                                        $scope.setBuy.state_process = false;
                                                        $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                        $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                                    });
                                                });
                                            });
                                        });
                                    }
                                });
                            } else {
                                $scope.setBuy.state_process = false;
                            }
                        });
                    }
                },
                onTimeout: function(time, callback) {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        callback(true)
                    }, time);
                },
                onUnset: function(step, callback) {
                    var _self = this;
                    step = (step == 0) ? 0 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onLoad: function(step, callback) {
                    var _self = this;
                    step = (step == 0 || step == 1) ? 1 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onPass: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 2) ? 2 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onError: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 3) ? 3 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onCart: function(step, callback) {
                    var _self = this;
                    step = (step == 2 || step == 4) ? 4 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                main: function(callback) {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getDetail = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getDetail: function(api, callback) {
                    var _self = this;
                    var description = api.product_description;
                    var info = api.product_more_info;
                    var specificatio = [];
                    if (api.product_attribute.specification_data != undefined) {
                        specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? api.product_attribute.specification_data.pclass_array : [];
                    }
                    var state_specificatio = false;
                    if (api.product_attribute.specification_data != undefined) {
                        state_specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? true : false;
                    }
                    var state_info = (api.product_is_more_info == 1) ? true : false;
                    _self.consoleLog("getDetail : description", description);
                    _self.consoleLog("getDetail : info", info);
                    _self.consoleLog("getDetail : state_info", state_info);
                    callback(description, info, state_info, specificatio, state_specificatio);
                },
                onClickDetail: function(index) {
                    var _self = this;
                    $scope.data.detail.active = index;
                    _self.consoleLog("onClickDetail : data.detail.active", $scope.data.detail.active);
                }
            }
            return getFunction;
        };
        $scope.pages = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageName: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page_name);
                },
                pageUrl: function(page_name, id, name_url) {
                    var _self = this;
                    var page = page_name + "/" + id + "-" + name_url;
                    _self.locationUrlReplace(page);
                }
            }
            return getFunction;
        };
        $scope.countDown = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getLocation: function(callback) {
                    var _self = this;
                    var res_location = $location;
                    _self.consoleLog("getLocation", "res_location", res_location);
                    callback(res_location);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(params);
                },
                getLocationUrlNameProductDetail: function(callback) {
                    var _self = this;
                    _self.getRouteParams(function(res_params) {
                        _self.getLocation(function(res_location) {
                            var url_page_name = "/product-detail/" + res_params.product_id;
                            var res_url_name_product_detail = (res_location.url() == url_page_name) ? true : false;
                            _self.consoleLog("getLocationUrlNameProductDeal", "res_url_name_product_detail", res_url_name_product_detail);
                            callback(res_url_name_product_detail);
                        });
                    });
                },
                getUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    _self.consoleLog("getUnix", "now", now);
                    callback(now);
                },
                getCountDown: function(now, product_lifetime, callback) {
                    var _self = this;
                    var countdown_unix = parseInt(product_lifetime.lifetime_end_time) - now;
                    var milliseconds = moment.duration(countdown_unix * 1000, "milliseconds");
                    var res_countdown = ((milliseconds.days() <= 9) ? '0' + milliseconds.days() : milliseconds.days());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.hours() <= 9) ? '0' + milliseconds.hours() : milliseconds.hours());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.minutes() <= 9) ? '0' + milliseconds.minutes() : milliseconds.minutes());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.seconds() <= 9) ? '0' + milliseconds.seconds() : milliseconds.seconds());
                    _self.consoleLog("getCountDown", "res_countdown", res_countdown);
                    callback(res_countdown, countdown_unix);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                countDownByProduct: function(now, data_array, callback) {
                    var _self = this;
                    if (data_array.length != 0) {
                        if (data_array.product_lifetime.length != 0) {
                            _self.getCountDown(now, data_array.product_lifetime, function(res_count_down, res_countdown_unix) {
                                data_array.product_lifetime.lifetime_countdown = (res_countdown_unix > 0) ? res_count_down : "";
                                if (data_array.product_lifetime.lifetime_countdown == "") {
                                    _self.getNameUrl(data_array.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", data_array.product_set_array[0].product_id, res_name);
                                    });
                                }
                            });
                        }
                    }
                    _self.consoleLog("countDownByProduct", "data_array", data_array);
                    callback(data_array);
                },
                loop: function() {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        _self.getUnix(function(res_now) {
                            _self.countDownByProduct(res_now, $scope.dataApi.product.dataArray, function(data_array) {
                                $scope.dataApi.product.dataArray = data_array;
                                _self.getLocationUrlNameProductDetail(function(res_url_name_product_detail) {
                                    if (res_url_name_product_detail) {
                                        _self.loop();
                                    }
                                });
                            });
                        });
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.control = function() {
            var getFunction = {
                popupVideo: function(state, video_link, video_embed_code) {
                    var _self = this;
                    if (video_embed_code != '') {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    } else if (video_link != '') {
                        window.open(video_link, '_blank');
                    } else {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.data_control = {
            page_video: {
                popup: false,
                shop_video_embed_code: ""
            }
        }
        $scope.countDown().loop();
        /* set carousel  */
        $scope.setCarousel = {
            carousel: 0,
            index: 0
        };
        $scope.getCarousel().getCarousel($scope.setCarousel.carousel, function(res_carousel_id) {
            $scope.setCarousel.carousel = res_carousel_id;
        });
        /* set carousel  */
        /* get product api */
        $scope.dataApi = {
            reward: {
                dataSend: {},
                api: "shop/current",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            product: {
                dataSend: {
                    txt_product_id: 0
                },
                api: "product/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            relation: {
                dataSend: {
                    txt_referral_id: 0
                },
                api: "referral/relation",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.data = {
            resParams: "",
            back: {
                page_name: "",
                data_id: "",
                data_name: ""
            },
            attribute: {
                state: false,
                productId: "",
                dataArray: []
            },
            attribute_custom: {
                state: false,
                dataArray: []
            },
            reward: {
                quantity_name: 'reward',
                type_id: "0",
                reward_amount: 0,
                reward_percent: 0,
                reward_every_price: 0,
                point_reward: 0
            },
            quantity: {
                quantity_name: 'quantity',
                quantity_min: 1,
                quantity_max: 1,
                quantity_input: 1,
                quantity_select: []
            },
            product_price: {
                price_name: 'product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            product_compare_price: {
                price_name: 'product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_price: {
                price_name: 'sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_price: {
                price_name: 'sum_product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_minus_sum_product_price: {
                price_name: 'sum_product_compare_minus_sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            detail: {
                active: '0',
                dataArray: [{
                    index: '0',
                    state: true,
                    en: ($scope.description != undefined && $scope.description != "") ? $scope.description : 'Description',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '1',
                    state: true,
                    en: ($scope.info != undefined && $scope.info != "") ? $scope.info : 'Info',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '2',
                    state: true,
                    en: ($scope.specification != undefined && $scope.specification != "") ? $scope.specification : 'Specification',
                    th: '',
                    data: '',
                    dataArray: []
                }]
            }
        };
        $scope.setBuy = {
            state_active: false,
            state_process: false,
            state_step: 0,
            state_data_font_color: "",
            state_data_background_color: "",
            stepArray: [{
                step: 0,
                name: "unset",
                icon: $scope._icebuyicon,
                state: "เพิ่มในรถเข็น",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 1,
                name: "load",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 2,
                name: "pass",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 3,
                name: "error",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 4,
                name: "cart",
                icon: "",
                state: "ดูรถเข็น",
                data_font_color: "",
                data_background_color: "primary_darkest"
            }]
        };
        /* - get api product/id start - */
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.data.resParams = res_params;
            $scope.getData().getDataPage(res_params, function(res_back_page, res_data_id, res_data_name) {
                $scope.data.back.page_name = res_back_page;
                $scope.data.back.data_id = res_data_id;
                $scope.data.back.data_name = res_data_name;
            });
            $scope.dataApi.product.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                $scope.dataApi.product.dataSend.txt_product_id = (res_product_id != false) ? res_product_id : 0;
                $scope.getData().dataSend($scope.dataApi.product.api, $scope.dataApi.product.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_product, res_state) {
                        $scope.dataApi.product.ok = res_ok;
                        $scope.dataApi.product.dataArray = get_res_api_product.data;
                        $scope.getData().consoleLog("get_res_api_product", get_res_api_product);
                        $scope.dataApi.product.dataArrayState = res_state;
                        /* -- get api shop/current to reward -- */
                        if (res_ok) {
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.reward.dataArrayState = res_state;
                                $scope.getData().dataSend($scope.dataApi.reward.api, $scope.dataApi.reward.dataSend, function(res_api, res_dataSend) {
                                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                                        $scope.dataApi.reward.ok = res_ok;
                                        $scope.dataApi.reward.dataArray = get_res_api_shop.data;
                                        $scope.dataApi.reward.dataArrayState = res_state;
                                        $scope.getReward().createReward($scope.dataApi.product.dataArray.product_reward, get_res_api_shop.data.shop_point_config, function(res_reward) {
                                            $scope.data.reward.type_id = res_reward.type_id;
                                            $scope.data.reward.reward_amount = res_reward.amount;
                                            $scope.data.reward.reward_percent = res_reward.percent;
                                            $scope.data.reward.reward_every_price = res_reward.every_price;
                                            /* --- Wait product/id ,shop/current --- */
                                            /* ---- get attribute ---- */
                                            $scope.getAttribute().productAttribute(get_res_api_product.data.product_attribute, function(res_attribute) {
                                                $scope.data.attribute.dataArray = res_attribute;
                                                $scope.getAttribute().checkMinPrices(get_res_api_product, res_attribute, function(res_data_price, res_state) {
                                                    $scope.data.attribute.state = res_state;
                                                    $scope.data.product_price = res_data_price.product_price;
                                                    $scope.data.product_compare_price = res_data_price.product_compare_price;
                                                    $scope.data.sum_product_price = res_data_price.sum_product_price;
                                                    $scope.data.sum_product_compare_price = res_data_price.sum_product_compare_price;
                                                    $scope.data.sum_product_compare_minus_sum_product_price = res_data_price.sum_product_compare_minus_sum_product_price;
                                                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                                                        $scope.data.reward.point_reward = res_point_reward;
                                                    });
                                                    /* ----- stock ----- */
                                                    $scope.data.quantity.quantity_max = res_data_price.product_price.total_stock;
                                                    $scope.data.quantity.quantity_select = [];
                                                    for (var i = 0; i < res_data_price.product_price.total_stock; i++) {
                                                        $scope.data.quantity.quantity_select.push(i + 1);
                                                    }
                                                    /* ----- stock ----- */
                                                });
                                            });
                                            /* ---- get attribute ---- */
                                            /* ---- get attribute custom ---- */
                                            $scope.getAttributeCustom().createArray(get_res_api_product.data.product_custom_templates, function(res_custom_attribute, res_state) {
                                                $scope.data.attribute_custom.state = res_state;
                                                $scope.data.attribute_custom.dataArray = res_custom_attribute;
                                            });
                                            /* ---- get attribute custom ---- */
                                            /* ---- get detail ---- */
                                            $scope.getDetail().getDetail(get_res_api_product.data, function(res_description, res_info, res_state_info, res_specificatio, res_state_specificatio) {
                                                $scope.data.detail.dataArray[0].data = res_description;
                                                $scope.data.detail.dataArray[1].data = res_info;
                                                $scope.data.detail.dataArray[1].state = res_state_info;
                                                $scope.data.detail.dataArray[2].dataArray = res_specificatio;
                                                $scope.data.detail.dataArray[2].state = res_state_specificatio;
                                            });
                                            /* ---- get detail ---- */
                                            /* ---- update state ---- */
                                            $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                                            /* ---- update state ---- */
                                            /* --- Wait product/id ,shop/current --- */
                                        });
                                    });
                                });
                            });
                            /* -- get api shop/current to reward -- */
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.relation.dataArrayState = res_state;
                                $scope.getData().getReferralId(get_res_api_product.data.product_referral_display, function(res_referral_id) {
                                    $scope.dataApi.relation.dataSend.txt_referral_id = res_referral_id;
                                    $scope.getData().dataSend($scope.dataApi.relation.api, $scope.dataApi.relation.dataSend, function(res_api, res_dataSend) {
                                        $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_referral, res_state) {
                                            $scope.dataApi.relation.ok = res_ok;
                                            $scope.dataApi.relation.dataArray = get_res_api_referral.data;
                                            $scope.dataApi.relation.dataArrayState = res_state;
                                        });
                                    });
                                });
                            });
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                        } else {
                            /* ok = false */
                            if ($scope.dataApi.product.dataArray.length != 0) {
                                /* product deal to product original */
                                if ($scope.dataApi.product.dataArray.product_set_array.length != 0) {
                                    $scope.countDown().getNameUrl($scope.dataApi.product.dataArray.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", $scope.dataApi.product.dataArray.product_set_array[0].product_id, res_name);
                                    });
                                } else {
                                    $scope.pages().pageName("home");
                                }
                            } else {
                                /* product null */
                                $scope.pages().pageName("home");
                            }
                        }
                    });
                });
            });
        });
        /* - get api product/id end - */
        /* get product api */
    };
    return promise;
});_ui_share_app.directive('productDetailPageEb', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageEb';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.product_id = "";
        $scope.product_sku = "";
        $scope.product_code = "";
        $scope.product_price = 0;
        $scope.product_compare_price = 0;
        $scope.promotion_list = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope.nowMoment = moment().unix();
        console.log("promotion_list : ", $scope.promotion_list);
        $scope.dataShopCurrent = [];
        $scope.dataShopPointConfig = [];
        $scope.getShopCurrent = function() {
            var dataSend = {};
            GAEAPI.get('shop/current', dataSend).then(function(output) {
                console.log("getShopCurrent : output : ", output);
                if (output.ok == 1) {
                    $scope.dataShopCurrent = output.data;
                    console.log("getShopCurrent : dataShopCurrent : ", $scope.dataShopCurrent);
                    $scope.dataShopPointConfig = output.data.shop_point_config;
                    console.log("getShopCurrent : dataShopPointConfig : ", $scope.dataShopPointConfig);
                }
            });
        };
        $scope.getShopCurrent();
        $scope.getShopPointConfigRewardState = function(product_price, quantity) {
            var state = 'RewardShop';
            var sup_price = product_price * quantity;
            if ($scope.dataShopPointConfig.length != 0) {
                if (parseInt($scope.dataShopPointConfig.er_rate) != 0 && parseInt($scope.dataShopPointConfig.er_earn) != 0) {
                    if (parseInt($scope.dataShopPointConfig.er_rate) <= sup_price) {
                        state = 'RewardShop';
                        return state;
                    } else {
                        state = 'High';
                        return state;
                    }
                } else {
                    return 'RewardProduct';
                    return state;
                }
            } else {
                return 'RewardProduct';
            }
        };
        $scope.getShopPointConfigReward = function(product_price, quantity) {
            var sup_price = 0;
            var er_rate = 0;
            var er_earn = 0;
            var mathFloor = 0;
            var point = 0;
            // console.log("getShopPointConfigReward : shop_point_config.er_rate : ",$scope.dataShopPointConfig.er_rate);
            if ($scope.dataShopPointConfig.length != 0) {
                sup_price = product_price * quantity;
                er_rate = parseInt($scope.dataShopPointConfig.er_rate);
                er_earn = parseInt($scope.dataShopPointConfig.er_earn);
                mathFloor = Math.floor(sup_price / er_rate);
                point = mathFloor * er_earn;
                return point;
            } else {
                return point;
            }
        }
        $scope._getReward = function(datain, product_price, qty) {
            if (datain.length == 0) {
                return 'Data Reward Error';
            }
            console.log("_getReward : product_price : ", product_price, " qty : ", qty);
            var reward = "NULL";
            if (datain.reward_type_id == "101") {} else if (datain.reward_type_id == "102") {} else if (datain.reward_type_id == "103") {
                var reward_every_price = parseInt(datain.reward_every_price);
                var sum_product_price = Math.round(product_price) * qty;
                var reward_amount = parseInt(datain.reward_amount);
                console.log("_getReward : reward_every_price : ", reward_every_price, " sum_product_price : ", sum_product_price, " reward_amount : ", reward_amount);
                if (reward_every_price <= sum_product_price) {
                    var divided = Math.floor(sum_product_price / reward_every_price);
                    var multiplied = divided * reward_amount;
                    console.log("_getReward : divided : ", divided, " multiplied : ", multiplied);
                    reward = multiplied;
                } else {
                    reward = "ZERO";
                }
            } else {
                return 'Data Reward Type Id Error';
            }
            return reward;
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    if ($scope._dataArray.product_is_promotion != 0) {
                        if ($scope._dataArray.product_promotion) {
                            $scope.promotion_list = $scope._dataArray.product_promotion[0].promotion_id;
                        }
                    }
                    console.log("promotion_list : ", $scope.promotion_list);
                    console.log("_getDataArray _dataArray : ", $scope._dataArray);
                    $scope.product_id = $scope._dataArray.product_id;
                    $scope.dataPreserve = res.data;
                    if (res.data.product_sku != undefined) {
                        $scope.product_sku = res.data.product_sku;
                    }
                    if (res.data.product_code != undefined) {
                        $scope.product_code = res.data.product_code;
                    }
                    console.log("res.data.product_discount : ", res.data.product_discount);
                    if (res.data.product_discount.length != 0) {
                        $scope.product_price = $scope.calculate(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_lifetime.lifetime_start_time, res.data.product_discount.discount_lifetime.lifetime_end_time, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                        $scope.product_compare_price = $scope.pricefull(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_lifetime.lifetime_start_time, res.data.product_discount.discount_lifetime.lifetime_end_time, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    } else {
                        $scope.product_price = res.data.product_price;
                        $scope.product_compare_price = res.data.product_compare_price;
                    }
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.dataTag = res.data.product_tags.split(",");
                    $scope.qtyCurrentSize(res.data.product_total_variant, res.data.product_total_stock);
                    $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope._stateReward = function(datain) {
            var state = false;
            /* console.log("_stateReward : reward_lifetime : ", datain.reward_lifetime); */
            if (datain.length != 0) {
                state = true;
            }
            return state;
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        // $scope.pricefull = function(price, compare_price, discount_id , lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
        //     var pricefull = 0;
        //     if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= nowMoment)) {
        //         if (price != undefined && price != 0) {
        //             pricefull = price;
        //             $scope._pricefullState.pricefull = 'not zero';
        //         } else {
        //             pricefull = 0;
        //             $scope._pricefullState.pricefull = 'zero';
        //         }
        //     } else {
        //         if (compare_price > 0 && compare_price != undefined) {
        //             pricefull = compare_price;
        //             $scope._pricefullState.pricefull = 'not zero';
        //         } else {
        //             $scope._pricefullState.pricefull = 'zero';
        //         }
        //     }
        //     return pricefull;
        // }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            console.log("calculate : ", price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent);
            console.log("calculate : ", lifetime_start_time <= $scope.nowMoment);
            console.log("calculate : ", lifetime_end_time >= $scope.nowMoment);
            console.log("calculate : ", (lifetime_end_time == -1 || lifetime_end_time >= nowMoment));
            var calculate = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        // $scope.calculate = function(price, compare_price, discount_id , lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
        //     var calculate = 0;
        //     if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= nowMoment)) {
        //         if (discount_price != 0 && discount_percent == 0) {
        //             calculate = price - discount_price;
        //         } else if (discount_percent != 0 && discount_price == 0) {
        //             calculate = price - ((discount_percent / 100) * price);
        //         }
        //     } else {
        //         calculate = price
        //     }
        //     if (calculate != undefined && calculate != 0) {
        //         $scope._calculateState.calculate = 'not zero';
        //     } else {
        //         $scope._calculateState.calculate = 'zero';
        //     }
        //     return (calculate > 0) ? calculate : 0;
        // }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    if (product_total_stock >= 50) {
                        for (var i = 0; i < 50; i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    } else {
                        for (var i = 0; i < parseInt(product_total_stock); i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 50; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    if (dataVariants[i].sku != "") {
                        $scope.product_sku = dataVariants[i].sku;
                    } else {
                        $scope.product_sku = $scope._dataArray.product_sku;
                    }
                    if (dataVariants[i].sku != "") {
                        $scope.product_code = dataVariants[i].barcode;
                    } else {
                        $scope.product_code = $scope._dataArray.product_code;
                    }
                    console.log("$scope._dataArray.product_discount : ", $scope._dataArray.product_discount);
                    $scope.product_price = $scope.calculate(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_lifetime.lifetime_start_time, $scope._dataArray.product_discount.discount_lifetime.lifetime_end_time, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_lifetime.lifetime_start_time, $scope._dataArray.product_discount.discount_lifetime.lifetime_end_time, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    $scope.product_price = $scope._dataArray.product_price;
                    $scope.product_compare_price = $scope._dataArray.product_compare_price;
                    $scope.product_sku = $scope._dataArray.product_sku;
                    $scope.product_code = $scope._dataArray.product_code;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope._getDataArray($scope._getIdUrl());
        // setTimeout(function() {
        //      alert($('input[name=radiogroup]:checked').val());
        //  }, 700);
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});_ui_share_app.directive('productDetailPageEc', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageEc';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.product_id = "";
        $scope.product_sku = "";
        $scope.product_code = "";
        $scope.product_price = 0;
        $scope.product_compare_price = 0;
        $scope.promotion_list = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        console.log("promotion_list : ", $scope.promotion_list);
        $scope.dataShopCurrent = [];
        $scope.dataShopPointConfig = [];
        $scope.getShopCurrent = function() {
            var dataSend = {};
            GAEAPI.get('shop/current', dataSend).then(function(output) {
                console.log("getShopCurrent : output : ", output);
                if (output.ok == 1) {
                    $scope.dataShopCurrent = output.data;
                    console.log("getShopCurrent : dataShopCurrent : ", $scope.dataShopCurrent);
                    $scope.dataShopPointConfig = output.data.shop_point_config;
                    console.log("getShopCurrent : dataShopPointConfig : ", $scope.dataShopPointConfig);
                }
            });
        };
        $scope.getShopCurrent();
        $scope.getShopPointConfigRewardState = function(product_price, quantity) {
            var state = 'RewardShop';
            var sup_price = product_price * quantity;
            if ($scope.dataShopPointConfig.length != 0) {
                if (parseFloat($scope.dataShopPointConfig.er_rate) != 0 && parseFloat($scope.dataShopPointConfig.er_earn) != 0) {
                    if (parseFloat($scope.dataShopPointConfig.er_rate) <= sup_price) {
                        state = 'RewardShop';
                        return state;
                    } else {
                        state = 'High';
                        return state;
                    }
                } else {
                    return 'RewardProduct';
                    return state;
                }
            } else {
                return 'RewardProduct';
            }
        };
        $scope.getShopPointConfigReward = function(product_price, quantity) {
            var sup_price = 0;
            var er_rate = 0;
            var er_earn = 0;
            var mathFloor = 0;
            var point = 0;
            // console.log("getShopPointConfigReward : shop_point_config.er_rate : ",$scope.dataShopPointConfig.er_rate);
            if ($scope.dataShopPointConfig.length != 0) {
                sup_price = product_price * quantity;
                er_rate = parseFloat($scope.dataShopPointConfig.er_rate);
                er_earn = parseFloat($scope.dataShopPointConfig.er_earn);
                mathFloor = Math.floor(sup_price / er_rate);
                point = mathFloor * er_earn;
                return point;
            } else {
                return point;
            }
        }
        $scope._getReward = function(datain, product_price, qty) {
            if (datain.length == 0) {
                return 'Data Reward Error';
            }
            console.log("_getReward : product_price : ", product_price, " qty : ", qty);
            var reward = "NULL";
            if (datain.reward_type_id == "101") {} else if (datain.reward_type_id == "102") {} else if (datain.reward_type_id == "103") {
                var reward_every_price = parseFloat(datain.reward_every_price);
                var sum_product_price = Math.round(product_price) * qty;
                var reward_amount = parseFloat(datain.reward_amount);
                console.log("_getReward : reward_every_price : ", reward_every_price, " sum_product_price : ", sum_product_price, " reward_amount : ", reward_amount);
                if (reward_every_price <= sum_product_price) {
                    var divided = Math.floor(sum_product_price / reward_every_price);
                    var multiplied = divided * reward_amount;
                    console.log("_getReward : divided : ", divided, " multiplied : ", multiplied);
                    reward = multiplied;
                } else {
                    reward = "ZERO";
                }
            } else {
                return 'Data Reward Type Id Error';
            }
            return reward;
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    // if ($scope._dataArray.product_is_promotion != 0) {
                    //     $scope.promotion_list = $scope._dataArray.product_promotion[0].promotion_id;
                    // }
                    console.log("promotion_list : ", $scope.promotion_list);
                    console.log("_getDataArray _dataArray : ", $scope._dataArray);
                    $scope.product_id = $scope._dataArray.product_id;
                    $scope.dataPreserve = res.data;
                    if (res.data.product_sku != undefined) {
                        $scope.product_sku = res.data.product_sku;
                    }
                    if (res.data.product_code != undefined) {
                        $scope.product_code = res.data.product_code;
                    }
                    $scope.product_price = $scope.calculate(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.dataTag = res.data.product_tags.split(",");
                    $scope.qtyCurrentSize(res.data.product_total_variant, res.data.product_total_stock);
                    $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope._stateReward = function(datain) {
            var state = false;
            /* console.log("_stateReward : reward_lifetime : ", datain.reward_lifetime); */
            if (datain.length != 0) {
                state = true;
            }
            return state;
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    if (product_total_stock >= 20) {
                        for (var i = 0; i < 20; i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    } else {
                        for (var i = 0; i < parseFloat(product_total_stock); i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseFloat($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseFloat($(".d_qty").val());
            } else {
                check_int = parseFloat($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    if (dataVariants[i].sku != "") {
                        $scope.product_sku = dataVariants[i].sku;
                    } else {
                        $scope.product_sku = $scope._dataArray.product_sku;
                    }
                    if (dataVariants[i].sku != "") {
                        $scope.product_code = dataVariants[i].barcode;
                    } else {
                        $scope.product_code = $scope._dataArray.product_code;
                    }
                    $scope.product_price = $scope.calculate(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    $scope.product_price = $scope._dataArray.product_price;
                    $scope.product_compare_price = $scope._dataArray.product_compare_price;
                    $scope.product_sku = $scope._dataArray.product_sku;
                    $scope.product_code = $scope._dataArray.product_code;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope._getDataArray($scope._getIdUrl());
        // setTimeout(function() {
        //      alert($('input[name=radiogroup]:checked').val());
        //  }, 700);
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
        $scope._isLogin = function() {
            return UiCustomerBox.delegate.get.isLogin();
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageEd', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageEd';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.product_id = "";
        $scope.product_sku = "";
        $scope.product_code = "";
        $scope.product_price = 0;
        $scope.product_compare_price = 0;
        $scope.promotion_list = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        console.log("promotion_list : ", $scope.promotion_list);
        $scope.dataShopCurrent = [];
        $scope.dataShopPointConfig = [];
        $scope.getShopCurrent = function() {
            var dataSend = {};
            GAEAPI.get('shop/current', dataSend).then(function(output) {
                console.log("getShopCurrent : output : ", output);
                if (output.ok == 1) {
                    $scope.dataShopCurrent = output.data;
                    console.log("getShopCurrent : dataShopCurrent : ", $scope.dataShopCurrent);
                    $scope.dataShopPointConfig = output.data.shop_point_config;
                    console.log("getShopCurrent : dataShopPointConfig : ", $scope.dataShopPointConfig);
                }
            });
        };
        $scope.getShopCurrent();
        $scope.getShopPointConfigRewardState = function(product_price, quantity) {
            var state = 'RewardShop';
            var sup_price = product_price * quantity;
            if ($scope.dataShopPointConfig.length != 0) {
                if (parseInt($scope.dataShopPointConfig.er_rate) != 0 && parseInt($scope.dataShopPointConfig.er_earn) != 0) {
                    if (parseInt($scope.dataShopPointConfig.er_rate) <= sup_price) {
                        state = 'RewardShop';
                        return state;
                    } else {
                        state = 'High';
                        return state;
                    }
                } else {
                    return 'RewardProduct';
                    return state;
                }
            } else {
                return 'RewardProduct';
            }
        };
        $scope.getShopPointConfigReward = function(product_price, quantity) {
            var sup_price = 0;
            var er_rate = 0;
            var er_earn = 0;
            var mathFloor = 0;
            var point = 0;
            // console.log("getShopPointConfigReward : shop_point_config.er_rate : ",$scope.dataShopPointConfig.er_rate);
            if ($scope.dataShopPointConfig.length != 0) {
                sup_price = product_price * quantity;
                er_rate = parseInt($scope.dataShopPointConfig.er_rate);
                er_earn = parseInt($scope.dataShopPointConfig.er_earn);
                mathFloor = Math.floor(sup_price / er_rate);
                point = mathFloor * er_earn;
                return point;
            } else {
                return point;
            }
        }
        $scope._getReward = function(datain, product_price, qty) {
            if (datain.length == 0) {
                return 'Data Reward Error';
            }
            console.log("_getReward : product_price : ", product_price, " qty : ", qty);
            var reward = "NULL";
            if (datain.reward_type_id == "101") {} else if (datain.reward_type_id == "102") {} else if (datain.reward_type_id == "103") {
                var reward_every_price = parseInt(datain.reward_every_price);
                var sum_product_price = Math.round(product_price) * qty;
                var reward_amount = parseInt(datain.reward_amount);
                console.log("_getReward : reward_every_price : ", reward_every_price, " sum_product_price : ", sum_product_price, " reward_amount : ", reward_amount);
                if (reward_every_price <= sum_product_price) {
                    var divided = Math.floor(sum_product_price / reward_every_price);
                    var multiplied = divided * reward_amount;
                    console.log("_getReward : divided : ", divided, " multiplied : ", multiplied);
                    reward = multiplied;
                } else {
                    reward = "ZERO";
                }
            } else {
                return 'Data Reward Type Id Error';
            }
            return reward;
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    // if ($scope._dataArray.product_is_promotion != 0) {
                    //     $scope.promotion_list = $scope._dataArray.product_promotion[0].promotion_id;
                    // }
                    console.log("promotion_list : ", $scope.promotion_list);
                    console.log("_getDataArray _dataArray : ", $scope._dataArray);
                    $scope.product_id = $scope._dataArray.product_id;
                    $scope.dataPreserve = res.data;
                    if (res.data.product_sku != undefined) {
                        $scope.product_sku = res.data.product_sku;
                    }
                    if (res.data.product_code != undefined) {
                        $scope.product_code = res.data.product_code;
                    }
                    $scope.product_price = $scope.calculate(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.dataTag = res.data.product_tags.split(",");
                    $scope.qtyCurrentSize(res.data.product_total_variant, res.data.product_total_stock);
                    $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope._stateReward = function(datain) {
            var state = false;
            /* console.log("_stateReward : reward_lifetime : ", datain.reward_lifetime); */
            if (datain.length != 0) {
                state = true;
            }
            return state;
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    if (product_total_stock >= 20) {
                        for (var i = 0; i < 20; i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    } else {
                        for (var i = 0; i < parseInt(product_total_stock); i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    if (dataVariants[i].sku != "") {
                        $scope.product_sku = dataVariants[i].sku;
                    } else {
                        $scope.product_sku = $scope._dataArray.product_sku;
                    }
                    if (dataVariants[i].sku != "") {
                        $scope.product_code = dataVariants[i].barcode;
                    } else {
                        $scope.product_code = $scope._dataArray.product_code;
                    }
                    $scope.product_price = $scope.calculate(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    $scope.product_price = $scope._dataArray.product_price;
                    $scope.product_compare_price = $scope._dataArray.product_compare_price;
                    $scope.product_sku = $scope._dataArray.product_sku;
                    $scope.product_code = $scope._dataArray.product_code;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope._getDataArray($scope._getIdUrl());
        // setTimeout(function() {
        //      alert($('input[name=radiogroup]:checked').val());
        //  }, 700);
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});_ui_share_app.directive('productDetailPageEe', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageEe';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.product_id = "";
        $scope.product_sku = "";
        $scope.product_code = "";
        $scope.product_price = 0;
        $scope.product_compare_price = 0;
        $scope.promotion_list = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        console.log("promotion_list : ", $scope.promotion_list);
        $scope.dataShopCurrent = [];
        $scope.dataShopPointConfig = [];
        $scope.getShopCurrent = function() {
            var dataSend = {};
            GAEAPI.get('shop/current', dataSend).then(function(output) {
                console.log("getShopCurrent : output : ", output);
                if (output.ok == 1) {
                    $scope.dataShopCurrent = output.data;
                    console.log("getShopCurrent : dataShopCurrent : ", $scope.dataShopCurrent);
                    $scope.dataShopPointConfig = output.data.shop_point_config;
                    console.log("getShopCurrent : dataShopPointConfig : ", $scope.dataShopPointConfig);
                }
            });
        };
        $scope.getShopCurrent();
        $scope.getShopPointConfigRewardState = function(product_price, quantity) {
            var state = 'RewardShop';
            var sup_price = product_price * quantity;
            if ($scope.dataShopPointConfig.length != 0) {
                if (parseInt($scope.dataShopPointConfig.er_rate) != 0 && parseInt($scope.dataShopPointConfig.er_earn) != 0) {
                    if (parseInt($scope.dataShopPointConfig.er_rate) <= sup_price) {
                        state = 'RewardShop';
                        return state;
                    } else {
                        state = 'High';
                        return state;
                    }
                } else {
                    return 'RewardProduct';
                    return state;
                }
            } else {
                return 'RewardProduct';
            }
        };
        $scope.getShopPointConfigReward = function(product_price, quantity) {
            var sup_price = 0;
            var er_rate = 0;
            var er_earn = 0;
            var mathFloor = 0;
            var point = 0;
            // console.log("getShopPointConfigReward : shop_point_config.er_rate : ",$scope.dataShopPointConfig.er_rate);
            if ($scope.dataShopPointConfig.length != 0) {
                sup_price = product_price * quantity;
                er_rate = parseInt($scope.dataShopPointConfig.er_rate);
                er_earn = parseInt($scope.dataShopPointConfig.er_earn);
                mathFloor = Math.floor(sup_price / er_rate);
                point = mathFloor * er_earn;
                return point;
            } else {
                return point;
            }
        }
        $scope._getReward = function(datain, product_price, qty) {
            if (datain.length == 0) {
                return 'Data Reward Error';
            }
            console.log("_getReward : product_price : ", product_price, " qty : ", qty);
            var reward = "NULL";
            if (datain.reward_type_id == "101") {} else if (datain.reward_type_id == "102") {} else if (datain.reward_type_id == "103") {
                var reward_every_price = parseInt(datain.reward_every_price);
                var sum_product_price = Math.round(product_price) * qty;
                var reward_amount = parseInt(datain.reward_amount);
                console.log("_getReward : reward_every_price : ", reward_every_price, " sum_product_price : ", sum_product_price, " reward_amount : ", reward_amount);
                if (reward_every_price <= sum_product_price) {
                    var divided = Math.floor(sum_product_price / reward_every_price);
                    var multiplied = divided * reward_amount;
                    console.log("_getReward : divided : ", divided, " multiplied : ", multiplied);
                    reward = multiplied;
                } else {
                    reward = "ZERO";
                }
            } else {
                return 'Data Reward Type Id Error';
            }
            return reward;
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    // if ($scope._dataArray.product_is_promotion != 0) {
                    //     $scope.promotion_list = $scope._dataArray.product_promotion[0].promotion_id;
                    // }
                    console.log("promotion_list : ", $scope.promotion_list);
                    console.log("_getDataArray _dataArray : ", $scope._dataArray);
                    $scope.product_id = $scope._dataArray.product_id;
                    $scope.dataPreserve = res.data;
                    if (res.data.product_sku != undefined) {
                        $scope.product_sku = res.data.product_sku;
                    }
                    if (res.data.product_code != undefined) {
                        $scope.product_code = res.data.product_code;
                    }
                    $scope.product_price = $scope.calculate(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.dataTag = res.data.product_tags.split(",");
                    $scope.qtyCurrentSize(res.data.product_total_variant, res.data.product_total_stock);
                    $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope._stateReward = function(datain) {
            var state = false;
            /* console.log("_stateReward : reward_lifetime : ", datain.reward_lifetime); */
            if (datain.length != 0) {
                state = true;
            }
            return state;
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    if (product_total_stock >= 20) {
                        for (var i = 0; i < 20; i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    } else {
                        for (var i = 0; i < parseInt(product_total_stock); i++) {
                            $scope.qty_current_size.push(i + 1);
                        }
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    if (dataVariants[i].sku != "") {
                        $scope.product_sku = dataVariants[i].sku;
                    } else {
                        $scope.product_sku = $scope._dataArray.product_sku;
                    }
                    if (dataVariants[i].sku != "") {
                        $scope.product_code = dataVariants[i].barcode;
                    } else {
                        $scope.product_code = $scope._dataArray.product_code;
                    }
                    $scope.product_price = $scope.calculate(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    $scope.product_price = $scope._dataArray.product_price;
                    $scope.product_compare_price = $scope._dataArray.product_compare_price;
                    $scope.product_sku = $scope._dataArray.product_sku;
                    $scope.product_code = $scope._dataArray.product_code;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope._getDataArray($scope._getIdUrl());
        // setTimeout(function() {
        //      alert($('input[name=radiogroup]:checked').val());
        //  }, 700);
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});
_ui_share_app.directive('productDetailPageF', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageF';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        }; 
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* JQ: Scroll event */
        angular.element($window).bind('scroll',function(){
            if(!$scope.data){
                return;
            }
            var curPos = ($(document).scrollTop());
            var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));
            console.debug("Cur pos", curPos, properHeight);
            if(curPos > properHeight){
                angular.element('.block-background .bottom-info').addClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */ 
        $scope.data = false;
        $scope.dataPreserve = false;
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* Get data by product id */        
        GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
            if(e.ok == 1){
                $scope.data = e.data;
                $scope.dataPreserve = e.data;
                $scope.buildVariantOption(e.data);
                $scope.buildDataProductRelate($scope._getPostIdFromURL());
            }
        });          
        
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 6,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        }; 
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };
        $scope.findVariantsData = function(variantsPick){
            function compareArray(array_a, array) {
                if (!array)
                    return false;
                if (array_a.length != array.length)
                    return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i]))
                            return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for(var i = 0; i < dataVariants.length; i++){
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if(compareArray(variantsPick,optionJson)){                    
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;
                } 
            }
        };
        $scope.makeVariantsClick = function(){            
            var s = $timeout(function(){
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx,obj){
                    var optionElementFirst = $(this).find('option[data-index="'+idx+'"]').eq(0);
                    optionElementFirst.prop("selected",true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope.checkColorConfig = function(){
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function () {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };            
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if($('[data-key="'+$scope._uniqueKey+'"]').not('.slick-initialized')){
                $timeout(function(){
                    $scope._makeProductToCarousel();
                }, 500);                
            }            
        });
        $scope.qty_original=1;
        $scope.qty_current=1;
        /* Click SLick Item */
        $scope.slickGoto = function (idx) {
            setTimeout(function () {
                $('[data-key="'+$scope._uniqueKey+'"]').slick('slickGoTo', idx);
            }, 100);
        };
        /* Calcu Nav Arrows */
        $scope.maxHeight = 0;
        $scope.navArrowsCalculate=function(){
            var size = ($('img.img_gallery').eq(0).height() / 2);
            $scope.maxHeight = (size + 18);
            $('img.img_gallery').each(function() {
                if ($(this).height() > $scope.maxHeight) {
                    $scope.maxHeight = $(this).height();
                }
            }); 
            return '-' + $scope.maxHeight + 'px';
        };
        $scope.navArrowWidth = function(){
            return $('#gallery_display').width() + 'px';
        };
        
    };  
    return promise;
});
_ui_share_app.directive('productDetailPageG', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageG';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
        headerheight: '@headerheight',
        controlbutton : '@controlbutton',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
         /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        }; 
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        }; 
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope.data = false;
        $scope.dataPreserve = false;
        /* Get data by product id */        
        GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
            if(e.ok == 1){
                $scope.data = e.data;
                console.log("testtest",$scope.data);
                $scope.dataPreserve = e.data;
                $scope.buildVariantOption(e.data);
                /*$scope.buildDataProductRelate($scope._getPostIdFromURL());*/
            }
        });          
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        }; 
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            /*$scope.makeVariantsClick();*/
            $scope.makeVaraintsClick_Normal();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };        
        $scope.onClickVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };
        $scope.findVariantsData = function(variantsPick){
            function compareArray(array_a, array) {
                if (!array)
                    return false;
                if (array_a.length != array.length)
                    return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i]))
                            return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for(var i = 0; i < dataVariants.length; i++){
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if(compareArray(variantsPick,optionJson)){                    
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;
                } 
            }
        };
        /* Select FIrst Varaint (SELECT) */
        $scope.makeVariantsClick = function(){            
            var s = $timeout(function(){
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx,obj){
                    var optionElementFirst = $(this).find('option[data-index="'+idx+'"]').eq(0);
                    optionElementFirst.prop("selected",true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        }; 
        /* Select FIrst Varaint (Normal click) */
        $scope.makeVaraintsClick_Normal = function(){
            $timeout(function(){
                $('div.variantSelector').each(function(idx,obj){
                    $(this).find('[data-index="'+idx+'"]').eq(0).click();
                });
            },2000);
        };
        $scope.checkColorConfig = function(){
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function () {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                adaptiveHeight: true,
            };            
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if($('[data-key="'+$scope._uniqueKey+'"]').not('.slick-initialized')){
                $timeout(function(){
                    $scope._makeProductToCarousel();
                }, 500);                
            }            
        });
        $scope.qty_original=1;
        $scope.qty_current=1;
        $scope.getShopName = function(){
            return (typeof tttt !== 'undefined') ? tttt.shop_name : '';
        };
        /* Click SLick Item */
        $scope.slickGoto = function (idx) {
            setTimeout(function () {
                $('#gallery_slider').slick('slickGoTo', idx);
            }, 100);
        };
        /* Calcu Nav Arrows */
        $scope.navArrowsCalculate=function(){
            var size = ($('img.img_gallery').eq(0).height() / 2);
            var n = (size + 18) + 20;
            return '-' + n + 'px';
        };
        $scope.navArrowWidth = function(){
            return $('#gallery_slider').width() + 'px';
        };
    };  
    return promise;
});
_ui_share_app.directive('productDetailPageGrip', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageGrip';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0
        };
        $scope.login = function() {
            var login = {
                showLogin: function() {
                    return UiCustomerBox.delegate.get.isLogin();
                },
                isLogin: function(callback) {
                    callback(UiCustomerBox.delegate.get.isLogin());
                },
                totalAmount: function() {
                    return UiCart.delegate.get.totalAmount() || 0;
                },
                pageLogin: function() {
                    var _self = this;
                    _self.isLogin(function(isLogin) {
                        if (!isLogin) {
                            $inloginPopupTypeGrip.open();
                        }
                    });
                }
            }
            return login;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                    }
                }
            }
            return quantity;
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getDataArrayOk: function(output, callback) {
                    var state = false;
                    if (output.ok == 1) {
                        state = true;
                        callback(output, state);
                    }
                    callback(output, state);
                },
                quantity: function(product_stock_track_type_id, product_total_stock, callback) {
                    var total_stock = 0;
                    /* if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    } */
                    if (product_stock_track_type_id == "0") {
                        total_stock = 20;
                    } else if (product_stock_track_type_id == "1") {
                        if (product_total_stock > 0) {
                            total_stock = product_total_stock;
                        } else {
                            total_stock = 0;
                        }
                    }
                    callback(total_stock);
                },
                main: function() {
                    var _self = this;
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        _self.consoleLog("getDataProductArray : output : ", output.data);
                        _self.getDataArrayOk(output, function(output, state) {
                            if (state) {
                                _self.quantity(output.data.product_stock_track_type_id, output.data.product_total_stock, function(total_stock) {
                                    $scope.dataProductBuy.quantity_max = (total_stock >= 5) ? 5 : total_stock;
                                    _self.consoleLog("getDataProductArray : output : ", output.data);
                                    $scope.dataArray = output.data;
                                    $scope.dataProductBuy.price = output.data.product_price;
                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                    $scope.dataArrayState = _self.stateData(false, true);
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                    });
                                });
                            } else {
                                $scope.dataArrayState = _self.stateData(false, true);
                            }
                        });
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
    };
    return promise;
});
_ui_share_app.directive('productDetailPageH', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageH';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
        headerheight: '@headerheight',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        /*angular.element($window).bind('load',function(){
            $('.video_container .video_display').click();
        });*/
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        }; 
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* JQ: Scroll event */
        angular.element($window).bind('scroll',function(){
            if(!$scope.data){
                return;
            }
            var curPos = ($(document).scrollTop());
            var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));
            console.debug("Cur pos", curPos, properHeight);
            if(curPos > properHeight){
                angular.element('.block-background .bottom-info').addClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */ 
        $scope.data = false;
        $scope.dataPreserve = false;
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* Get data by product id */        
        GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
            if(e.ok == 1){
                $scope.data = e.data;
                $scope.dataPreserve = e.data;
                $scope.buildVariantOption(e.data);
                /*$scope.buildDataProductRelate($scope._getPostIdFromURL());*/
            }
        });          
        
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        }; 
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            /*$scope.makeVariantsClick();*/
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };
        $scope.findVariantsData = function(variantsPick){
            function compareArray(array_a, array) {
                if (!array)
                    return false;
                if (array_a.length != array.length)
                    return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i]))
                            return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for(var i = 0; i < dataVariants.length; i++){
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if(compareArray(variantsPick,optionJson)){                    
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;
                } 
            }
        };
        $scope.makeVariantsClick = function(){            
            var s = $timeout(function(){
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx,obj){
                    var optionElementFirst = $(this).find('option[data-index="'+idx+'"]').eq(0);
                    optionElementFirst.prop("selected",true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope.checkColorConfig = function(){
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function () {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };            
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if($('[data-key="'+$scope._uniqueKey+'"]').not('.slick-initialized')){
                $timeout(function(){
                    $scope._makeProductToCarousel();
                }, 500);                
            }            
        });
        $scope.qty_original=1;
        $scope.qty_current=1;
        $scope.qty_change = function(i){
            $scope.qty_current = i;
            console.log("qty_current", i);
        };
    };  
    return promise;
});
_ui_share_app.directive('productDetailPageHub', function($rootScope, $routeParams, $location, sliderProvider) {
    var templateName = 'productDetailPageHub';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon: '@icon',
        stylebutton: '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                state: true,
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                state: true,
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log("productDetailPageHub : ", name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                checkAttributeOption: function(attributeOption, attributeOptionLength, callback) {
                    var _self = this;
                    var attribute = (attributeOption.length == attributeOptionLength) ? true : false;
                    for (var i = 0; i < attributeOption.length; i++) {
                        _self.consoleLog("checkAttributeOption : attributeOption[i] : ", attributeOption[i]);
                        if (attributeOption[i] == undefined) {
                            attribute = false;
                        }
                    }
                    callback(attribute);
                },
                findVariantsData: function(attributeOption, dataVariants, attributeOptionLength, callback) {
                    var _self = this;
                    _self.consoleLog("findVariantsData : attributeOption : ", attributeOption);
                    _self.consoleLog("findVariantsData : dataVariants : ", dataVariants);
                    _self.consoleLog("findVariantsData : attributeOptionLength : ", attributeOptionLength);
                    _self.checkAttributeOption(attributeOption, attributeOptionLength, function(res_attribute_option) {
                        _self.consoleLog("checkAttributeOption : callback : res_attribute_option ", res_attribute_option);
                        var variantsOut = [];
                        for (var i = 0; i < dataVariants.length; i++) {
                            var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                            if (_self.compareArray(attributeOption, optionJson)) {
                                _self.consoleLog("findVariantsData : dataVariants[i] : ", dataVariants[i]);
                                variantsOut = dataVariants[i];
                                break;
                            }
                        }
                        callback(variantsOut, res_attribute_option);
                    });
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var _self = this;
                    var state = true;
                    _self.consoleLog("checkTotalStock : index : ", stateIn);
                    _self.consoleLog("checkTotalStock : quantity_max : ", quantity_max);
                    if (stateIn == false && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, $scope.attribute.attributeOption.length, function(variantsOut, res_attribute_option) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                _self.consoleLog("onClickOption : if : findVariantsData : res_attribute_option : ", res_attribute_option);
                                if (variantsOut.length != 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = variantsOut.product_id;
                                    $scope.dataArray.product_sku = variantsOut.sku;
                                    $scope.dataProductBuy.price = variantsOut.price;
                                    $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                    $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                    if (variantsOut.variant_image != 0) {
                                        if ($scope.dataArray.product_image.length != 0) {
                                            for (var i = 0; i < $scope.dataArray.product_image.length; i++) {
                                                $scope.dataArray.product_image[i].image_id
                                                if ($scope.dataArray.product_image[i].image_id == variantsOut.variant_image[0].image_id) {
                                                    $scope.slickImageGoto(i);
                                                }
                                            }
                                        }
                                    }
                                    _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                        _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                            $scope.buy.state = state;
                                            if ($scope.attribute.variantsTotal != 0) {
                                                $scope.buy.attribute = true;
                                            }
                                        });
                                    });
                                } else if (variantsOut.length == 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = 0;
                                    $scope.dataArray.product_sku = '';
                                    $scope.dataProductBuy.price = 0;
                                    $scope.dataArray.product_compare_price = 0;
                                    $scope.dataProductBuy.quantity_max = 1;
                                    $scope.buy.state = true;
                                    $scope.buy.attribute = true;
                                }
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 100);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log('productDetailPageHub : ', name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    var state_info = (input.product_is_more_info == 1) ? true : false;
                    callback(description, info, state_info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = true;
                    if (stateIn == true && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                checkPriceMin: function(variant, callback) {
                    var _self = this;
                    var priceMin = parseFloat(variant[0].price);
                    var comparePriceMin = parseFloat(variant[0].compare_price);
                    for (var i = 0; i < variant.length; i++) {
                        _self.consoleLog('checkPriceMin : priceMin : ', priceMin);
                        _self.consoleLog('checkPriceMin : variant[i].price : ', variant[i].price);
                        if (priceMin >= parseFloat(variant[i].price)) {
                            priceMin = parseFloat(variant[i].price);
                            comparePriceMin = parseFloat(variant[i].compare_price);
                        }
                    }
                    callback(priceMin, comparePriceMin);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        if (output.data.length != 0) {
                            _self.consoleLog("   : output : ", output.data);
                            _self.quantity(output.data.product_total_stock, function(total_stock) {
                                _self.consoleLog("quantity : total_stock : ", total_stock);
                                $scope.dataProductBuy.quantity_max = total_stock;
                                $scope.dataArray = output.data;
                                _self.productTab(output.data.product_tags, function(productTab) {
                                    $scope.dataArrayTags = productTab;
                                    _self.showTab(output.data, function(description, info, state_info) {
                                        $scope.showTab.dataTab[0].data = description;
                                        $scope.showTab.dataTab[1].data = info;
                                        $scope.showTab.dataTab[1].state = state_info;
                                    });
                                    _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                        _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                        _self.consoleLog("getAttribute : attribute : ", attribute);
                                        _self.consoleLog("getAttribute : variants : ", variants);
                                        _self.checkOption(variants_total, function(state) {
                                            _self.checkTotalStock(state, total_stock, function(state) {
                                                $scope.buy.state = state;
                                                $scope.attribute.attributeOption = attribute;
                                                $scope.attribute.dataVariants = variants;
                                                $scope.attribute.variantsTotal = variants_total;
                                                if (variants_total > 0) {
                                                    _self.checkPriceMin(variants, function(res_price, res_compare_price) {
                                                        $scope.dataProductBuy.price = res_price;
                                                        $scope.dataProductBuy.sumprice = res_price;
                                                        $scope.dataArray.product_compare_price = res_compare_price;
                                                    });
                                                } else {
                                                    $scope.dataProductBuy.price = output.data.product_price;
                                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                                }
                                            });
                                        });
                                    });
                                    _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                        _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                        $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                        if (quantity_break.length) {
                                            $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                        }
                                    });
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                        $scope.dataArrayState = _self.stateData(false, true);
                                    });
                                });
                            });
                        } else {
                            window.history.back();
                        }
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
        $scope.tab_id = 0;
        $scope.tabId = function(id) {
            $scope.tab_id = id;
        };
        $scope.routeParams = function() {
            return $routeParams || false;
        };
        $scope.categoriesData = $scope.routeParams().referral_id || '';
        $scope.setDataCategories = function(input) {
            $scope.categoriesData = input;
            var page = "category-lists";
            if (typeof $scope.categoriesData != 'undefined' && $scope.categoriesData !== "") {
                page += '?root_id=' + '0';
                page += '&referral_id=' + $scope.categoriesData;
            } else {
                delete $scope.categoriesDat;
            }
            $location.url(page).replace();
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageI', function ($rootScope, $routeParams, sliderProvider, $http) {
    var templateName = 'productDetailPageI';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
        background:'@background',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.data = false;
        $scope.dataPreserve = false;
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        if(CUR_THEME.data.shop_id == "395"){
            var req = {
                url:"https://gaedemo101.getappeasy.com/store/api/v1/product/id?txt_product_id="+$scope._getPostIdFromURL(),
                method: "GET",
            };
            $http(req).then(function(res){
                if(res.data.ok == 1){
                    var e = res.data;
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.buildDataProductRelate($scope.id);
                }
            });
        } else {
            GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
                if(e.ok == 1){
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.buildDataProductRelate($scope._getPostIdFromURL());
                }
            });
        }
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 6,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            /*$scope.makeVariantsClick();*/
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            if($index == 0 && option_id == ''){
                return GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
                    if(e.ok == 1){
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
           } else {
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        }            
    };
    $scope.findVariantsData = function(variantsPick){
        function compareArray(array_a, array) {
            if (!array)
                return false;
            if (array_a.length != array.length)
                return false;
            for (var i = 0, l = array_a.length; i < l; i++) {
                if (array_a[i] instanceof Array && array[i] instanceof Array) {
                    if (!compareArray(array_a[i], array[i]))
                        return false;
                } else if (array_a[i] != array[i]) {
                    return false;
                }
            }
            return true;
        }
        var dataVariants = $scope.dataVariants;
        for(var i = 0; i < dataVariants.length; i++){
            var optionJson = angular.fromJson(dataVariants[i].option_id_json);                
            if(compareArray(variantsPick,optionJson)){                
                $scope.data.product_sku = dataVariants[i].sku;
                $scope.data.product_price = dataVariants[i].price;
                $scope.data.product_compare_price = dataVariants[i].compare_price;
                break;                
            } 
        }
        console.log("onSelectVariantItems: Yes", $scope.dataPreserve);
    };
    $rootScope.$on('repeatend',function(){
        /* Slider Send */
        var optionsParmas = {
            autoplay:true,
            slidesToShow:1,
            slidesToScroll:1,
            dots:false,
            arrows:false,
            infinite:true
        };
        var extraOptions = {
            animate: false
        };
        $timeout(function(){
           sliderProvider("#gallery_slider", optionsParmas, "", "", extraOptions);
       },500);
    });
    /* Slick Events */
    $scope._slickGoLeft = function () {
        setTimeout(function () {
            $('#gallery_slider').slick('slickPrev');
        }, 100);
    };
    $scope._slickGoRight = function () {
        setTimeout(function () {
            $('#gallery_slider').slick('slickNext');
        }, 100);
    };
    /* Click SLick Item */
    $scope.slickGoto = function (idx) {
        setTimeout(function () {
            $('#gallery_slider').slick('slickGoTo', idx);
        }, 100);
    };
    /* Calcu Nav Arrows */
    $scope.navArrowsCalculate=function(){
        var size = (500 / 2);
        var n = (size + 18) + 20;
        return '-' + n + 'px';
    };
    $scope.navArrowWidth = function(){
        return $('#gallery_slider').width() + 'px';
    };
};  
return promise;
});
_ui_share_app.directive('productDetailPageInfo', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageInfo';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon: '@icon',
        stylebutton: '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log("productDetailPageMaeju : ", name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                checkAttributeOption: function(attributeOption, attributeOptionLength, callback) {
                    var _self = this;
                    var attribute = (attributeOption.length == attributeOptionLength) ? true : false;
                    for (var i = 0; i < attributeOption.length; i++) {
                        _self.consoleLog("checkAttributeOption : attributeOption[i] : ", attributeOption[i]);
                        if (attributeOption[i] == undefined) {
                            attribute = false;
                        }
                    }
                    callback(attribute);
                },
                findVariantsData: function(attributeOption, dataVariants, attributeOptionLength, callback) {
                    var _self = this;
                    _self.consoleLog("findVariantsData : attributeOption : ", attributeOption);
                    _self.consoleLog("findVariantsData : dataVariants : ", dataVariants);
                    _self.consoleLog("findVariantsData : attributeOptionLength : ", attributeOptionLength);
                    _self.checkAttributeOption(attributeOption, attributeOptionLength, function(res_attribute_option) {
                        _self.consoleLog("checkAttributeOption : callback : res_attribute_option ", res_attribute_option);
                        var variantsOut = [];
                        for (var i = 0; i < dataVariants.length; i++) {
                            var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                            if (_self.compareArray(attributeOption, optionJson)) {
                                _self.consoleLog("findVariantsData : dataVariants[i] : ", dataVariants[i]);
                                variantsOut = dataVariants[i];
                                break;
                            }
                        }
                        callback(variantsOut, res_attribute_option);
                    });
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var _self = this;
                    var state = true;
                    _self.consoleLog("checkTotalStock : index : ", stateIn);
                    _self.consoleLog("checkTotalStock : quantity_max : ", quantity_max);
                    if (stateIn == false && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, $scope.attribute.attributeOption.length, function(variantsOut, res_attribute_option) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                _self.consoleLog("onClickOption : if : findVariantsData : res_attribute_option : ", res_attribute_option);
                                if (variantsOut.length != 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = variantsOut.product_id;
                                    $scope.dataArray.product_sku = variantsOut.sku;
                                    $scope.dataProductBuy.price = variantsOut.price;
                                    $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                    $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                    if (variantsOut.variant_image != 0) {
                                        if ($scope.dataArray.product_image.length != 0) {
                                            for (var i = 0; i < $scope.dataArray.product_image.length; i++) {
                                                $scope.dataArray.product_image[i].image_id
                                                if ($scope.dataArray.product_image[i].image_id == variantsOut.variant_image[0].image_id) {
                                                    $scope.slickImageGoto(i);
                                                }
                                            }
                                        }
                                    }
                                    _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                        _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                            $scope.buy.state = state;
                                            if ($scope.attribute.variantsTotal != 0) {
                                                $scope.buy.attribute = true;
                                            }
                                        });
                                    });
                                } else if (variantsOut.length == 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = 0;
                                    $scope.dataArray.product_sku = '';
                                    $scope.dataProductBuy.price = 0;
                                    $scope.dataArray.product_compare_price = 0;
                                    $scope.dataProductBuy.quantity_max = 1;
                                    $scope.buy.state = true;
                                    $scope.buy.attribute = true;
                                }
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 100);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log('productDetailPageMaeju : ', name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = true;
                    if (stateIn == true && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                checkPriceMin: function(variant, callback) {
                    var _self = this;
                    var priceMin = parseFloat(variant[0].price);
                    var comparePriceMin = parseFloat(variant[0].compare_price);
                    for (var i = 0; i < variant.length; i++) {
                        _self.consoleLog('checkPriceMin : priceMin : ', priceMin);
                        _self.consoleLog('checkPriceMin : variant[i].price : ', variant[i].price);
                        if (priceMin >= parseFloat(variant[i].price)) {
                            priceMin = parseFloat(variant[i].price);
                            comparePriceMin = parseFloat(variant[i].compare_price);
                        }
                    }
                    callback(priceMin, comparePriceMin);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        if (output.data.length != 0) {
                            _self.consoleLog("   : output : ", output.data);
                            _self.quantity(output.data.product_total_stock, function(total_stock) {
                                _self.consoleLog("quantity : total_stock : ", total_stock);
                                $scope.dataProductBuy.quantity_max = total_stock;
                                $scope.dataArray = output.data;
                                _self.productTab(output.data.product_tags, function(productTab) {
                                    $scope.dataArrayTags = productTab;
                                    _self.showTab(output.data, function(description, info) {
                                        $scope.showTab.dataTab[0].data = description;
                                        $scope.showTab.dataTab[1].data = info;
                                    });
                                    _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                        _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                        _self.consoleLog("getAttribute : attribute : ", attribute);
                                        _self.consoleLog("getAttribute : variants : ", variants);
                                        _self.checkOption(variants_total, function(state) {
                                            _self.checkTotalStock(state, total_stock, function(state) {
                                                $scope.buy.state = state;
                                                $scope.attribute.attributeOption = attribute;
                                                $scope.attribute.dataVariants = variants;
                                                $scope.attribute.variantsTotal = variants_total;
                                                if (variants_total > 0) {
                                                    _self.checkPriceMin(variants, function(res_price, res_compare_price) {
                                                        $scope.dataProductBuy.price = res_price;
                                                        $scope.dataProductBuy.sumprice = res_price;
                                                        $scope.dataArray.product_compare_price = res_compare_price;
                                                    });
                                                } else {
                                                    $scope.dataProductBuy.price = output.data.product_price;
                                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                                }
                                            });
                                        });
                                    });
                                    _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                        _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                        $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                        if (quantity_break.length) {
                                            $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                        }
                                    });
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                        $scope.dataArrayState = _self.stateData(false, true);
                                    });
                                });
                            });
                        } else {
                            window.history.back();
                        }
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
        $scope.tab_id = 0;
        $scope.tabId = function(id) {
            $scope.tab_id = id;
        };
        $scope.routeParams = function() {
            return $routeParams || false;
        };
        $scope.categoriesData = $scope.routeParams().referral_id || '';
        $scope.setDataCategories = function(input) {
            $scope.categoriesData = input;
            var page = "category-lists";
            if (typeof $scope.categoriesData != 'undefined' && $scope.categoriesData !== "") {
                page += '?root_id=' + '0';
                page += '&referral_id=' + $scope.categoriesData;
            } else {
                delete $scope.categoriesDat;
            }
            $location.url(page).replace();
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
    };
    return promise;
});
_ui_share_app.directive('productDetailPageK', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageK';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name:'@name',
        imgpath: '@imgpath',
        id:'@id',
        headerheight:'@headerheight',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.getWindowsFit = function(){
            var h = (typeof $scope.headerheight !== 'udnefined' && $scope.headerheight != '') ? $scope.headerheight : 80;
            var a = $(window).height() - 80;
            return a;
        };
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        angular.element($window).bind('scroll',function(){
            var curPos = ($(document).scrollTop());
            /*var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));*/
            var properHeight = $scope.getWindowsFit() * Math.abs(($('div.img_cover').length - 1));
            console.log("Cur pos",curPos, properHeight);
            if(curPos > properHeight){
                angular.element('.block-background .bottom-info').addClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }               
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */
        var optionsParmas = {
            autoplay:true,
            slidesToShow:1,
            slidesToScroll:1,
            dots:true,
            arrows:false,
            infinite:true
        };
        var extraOptions = {
            animate: false
        };
        $timeout(function(){
            sliderProvider("#gallery-slider-1", optionsParmas, "", $scope._uniqueKey, extraOptions);
        },1000);   
        $scope.status_done = true;
         if(CUR_THEME.data.shop_id == "395"){
            var req = {
                url:"https://gaedemo101.getappeasy.com/store/api/v1/product/id?txt_product_id="+$scope._getPostIdFromURL(),
                method: "GET",
            };
            $http(req).then(function(res){
                if(res.data.ok == 1){
                    var e = res.data;
                    $scope._data_product_id = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.buildDataProductRelate($scope.id);
                }
            });
        } else {
             $('.load-effect').addClass('is-active');
             $scope.status_done = true;
            GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
                if(e.ok == 1){
                    setTimeout(function () {
                        $scope.status_done = false;
                     }, 300);
                    $scope._data_product_id = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.buildDataProductRelate($scope._getPostIdFromURL());
                    setTimeout(function () {
                        $('.load-effect').addClass('de-active');
                    }, 300);
                    setTimeout(function () {
                        $('.load-effect').addClass('loaded');
                        $('.load-effect').removeClass('is-active de-active');
                        $('.load-effect').removeClass('loaded');
                        $('html').removeClass('noscroll noscroll-long');
                    }, 1300);
                }
            });
        }
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 6,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            /*$scope.makeVariantsClick();*/
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            if($index == 0 && option_id == ''){
                return GAEAPI.get('product/id',{'txt_product_id':$scope.id}).then(function(e){
                    if(e.ok == 1){
                        $scope._data_product_id = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
           } else {
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        }            
    };
    $scope.findVariantsData = function(variantsPick){
        function compareArray(array_a, array) {
            if (!array)
                return false;
            if (array_a.length != array.length)
                return false;
            for (var i = 0, l = array_a.length; i < l; i++) {
                if (array_a[i] instanceof Array && array[i] instanceof Array) {
                    if (!compareArray(array_a[i], array[i]))
                        return false;
                } else if (array_a[i] != array[i]) {
                    return false;
                }
            }
            return true;
        }
        var dataVariants = $scope.dataVariants;
        for(var i = 0; i < dataVariants.length; i++){
            var optionJson = angular.fromJson(dataVariants[i].option_id_json);                
            if(compareArray(variantsPick,optionJson)){                
                $scope._data_product_id.product_sku = dataVariants[i].sku;
                $scope._data_product_id.product_price = dataVariants[i].price;
                $scope._data_product_id.product_id = dataVariants[i].product_id;
                $scope._data_product_id.product_compare_price = dataVariants[i].compare_price;
                break;                
            } 
        }
        console.log("onSelectVariantItems: Yes", $scope.dataPreserve);
    };
};  
    return promise;
});
_ui_share_app.directive('productDetailPageKrthai', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageKrthai';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        buyicon: '@buyicon',
        buytext: '@buytext',
        viewcarttext: '@viewcarttext',
        buylogin: '@buylogin',
        currency: '@currency',
        checkstaff: '@checkstaff',
        language: '@language',
        btnstyle: '@btnstyle',
        maxstock: '@maxstock',
        videotext: '@videotext',
        description: '@description',
        info: '@info',
        specification: '@specification',
        textbrand:'@textbrand',
        navigationhover: '@navigationhover',
        imageappcoverchecked: '@imageappcoverchecked',
        categorylists:'@categorylists',
        categorylistsurl: '@categorylistsurl',
        backpage: '@backpage',
        backpageurl: '@backpageurl',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $location) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "productDetailPageKrthai";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        /* scope */
        $scope._name = ($scope.name != undefined && $scope.name != "") ? $scope.name : "default";
        $scope._buycol = ($scope.buycol != undefined && $scope.buycol != "") ? parseInt($scope.buycol) : 15;
        $scope._maxstock = ($scope.maxstock != undefined && $scope.maxstock != "") ? parseInt($scope.maxstock) : 20;
        $scope._categorylistsurl = ($scope.categorylistsurl != undefined && $scope.categorylistsurl != "") ? $scope.categorylistsurl : "category-lists";
        $scope._btnstyle = ($scope.btnstyle != undefined && $scope.btnstyle != "") ? $scope.btnstyle : "filled_button_large";
        $scope._buylogin = ($scope.buylogin == "true" || $scope.buylogin == "t") ? true : false;
        $scope._checkstaff = ($scope.checkstaff == "true" || $scope.checkstaff == "t") ? true : false;
        $scope._categorylists = ($scope.categorylists != undefined && $scope.categorylists != "") ? $scope.categorylists : "สินค้า";
        $scope._currency = ($scope.currency != undefined && $scope.currency != "") ? $scope.currency : "THB";
        $scope._buyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope.buyicon : "icnt_outline_cart01_dark.png";
        $scope._buytext = ($scope.buytext != undefined && $scope.buytext != "") ? $scope.buytext : "เพิ่มในรถเข็น";
        $scope._viewcarttext = ($scope.viewcarttext != undefined && $scope.viewcarttext != "") ? $scope.viewcarttext : "ดูรถเข็น";
        $scope._videotext = ($scope.videotext != undefined && $scope.videotext != "") ? $scope.videotext : "Video";
        $scope._icebuyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope._icnPath + $scope.buyicon : $scope._icnPath + "icnt_outline_cart01_dark.png";
        $scope._language = ($scope.language != undefined && $scope.language != "") ? (($scope.language == "en") ? "en" : "th") : "th";
        $scope._textbrand = ($scope.textbrand != undefined && $scope.textbrand != "") ? $scope.textbrand : "Brand";
        $scope._navigationhover = ($scope.navigationhover != undefined && $scope.navigationhover != "") ? $scope.navigationhover : "primary";
        $scope._imageappcoverchecked = ($scope.imageappcoverchecked == "true" || $scope.imageappcoverchecked == "t") ? true : false;
        $scope._backpage = ($scope.backpage != undefined && $scope.backpage != "") ? $scope.backpage : "";
        $scope._backpageurl = ($scope.backpageurl != undefined && $scope.backpageurl != "") ? $scope.backpageurl : "";
        /* scope */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getNamePage: function(arr) {
                    var str = [];
                    for (var i = 0; i < arr.length; i++) {
                        if (i != 0) {
                            str.push(arr[i]);
                        }
                    }
                    return str.join(" ");
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = (params.product_id != undefined) ? params.product_id.split("-", 1).join("") : false;
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getReferralId: function(productReferralDisplay, callback) {
                    var _self = this;
                    var referral_id = 0;
                    if (productReferralDisplay.length != 0) {
                        if (productReferralDisplay.category != undefined) {
                            if (productReferralDisplay.category.length != 0) {
                                referral_id = productReferralDisplay.category[0].referral_id
                            }
                        }
                    }
                    callback(referral_id);
                },
                getStaffId: function(staffId, callback) {
                    var _self = this;
                    var res_staff = {
                        staff_id: (staffId != 0 && staffId != '' && staffId != undefined) ? staffId : '0',
                        status: (staffId != 0 && staffId != '' && staffId != undefined) ? true : false
                    }
                    callback(res_staff);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getCarousel = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carouselA: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            fade: true,
                            dots: false,
                            arrows: false,
                            infinite: true,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '',
                            nextArrow: '',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselB: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: true,
                            arrows: true,
                            infinite: true,
                            autoplay: false,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: ' ',
                            nextArrow: '
',
                            nextArrow: ' ',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselD: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: true,
                            infinite: true,
                            autoplay: true,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '
',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselD: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: true,
                            infinite: true,
                            autoplay: true,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: ' ',
                            nextArrow: '
',
                            nextArrow: ' ',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselBar: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: false,
                            infinite: false,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 6,
                            slidesToScroll: 6,
                            speed: 600,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: 5,
                                    slidesToScroll: 5,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: 4,
                                    slidesToScroll: 4,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: 3,
                                    slidesToScroll: 3,
                                }
                            }]
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                slickCarousel: function(carousel, index) {
                    var _self = this;
                    $scope.setCarousel.index = index;
                    setTimeout(function() {
                        $('[data-key="' + carousel + '"]').slick('slickGoTo', index);
                    }, 100);
                },
                prevIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != 0) ? image_index - 1 : image - 1;
                    _self.consoleLog("prevIndex index", $scope.setCarousel.index);
                },
                nextIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != (image - 1)) ? image_index + 1 : 0;
                    _self.consoleLog("nextIndex index", $scope.setCarousel.index);
                }
            }
            return getFunction;
        };
        $scope.getAttribute = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                productAttribute: function(productAttribute, callback) {
                    var _self = this;
                    var attribute = {
                        option_name: "",
                        option_attribute: []
                    };
                    if (productAttribute.option_data != undefined) {
                        if (productAttribute.option_data.variant_array != undefined && productAttribute.option_data.variant_array.length != 0) {
                            for (var a = 0; a < productAttribute.option_data.pclass_array.length; a++) {
                                attribute.option_name = attribute.option_name.concat(productAttribute.option_data.pclass_array[a].pclass_name, " ");
                            }
                            for (var b = 0; b < productAttribute.option_data.variant_array.length; b++) {
                                var product_attribute = {
                                    product_id: productAttribute.option_data.variant_array[b].product_id,
                                    product_sku: productAttribute.option_data.variant_array[b].sku,
                                    product_title: "",
                                    product_price: parseFloat(productAttribute.option_data.variant_array[b].price),
                                    product_compare_price: parseFloat(productAttribute.option_data.variant_array[b].compare_price),
                                    product_total_stock: parseFloat(productAttribute.option_data.variant_array[b].total_stock),
                                    product_image: productAttribute.option_data.variant_array[b].variant_image
                                }
                                for (var c = 0; c < productAttribute.option_data.variant_array[b].option_name_array.length; c++) {
                                    product_attribute.product_title = product_attribute.product_title.concat(productAttribute.option_data.variant_array[b].option_name_array[c], " ");
                                }
                                attribute.option_attribute.push(product_attribute);
                            }
                        }
                    }
                    _self.consoleLog("productAttribute attribute ", attribute);
                    callback(attribute);
                },
                checkDiscountPrice: function(productDiscount, resPrice, resComparePrice, callback) {
                    var _self = this;
                    var price = 0;
                    var compare_price = 0;
                    if (productDiscount.length == 0) {
                        price = parseFloat(resPrice);
                        compare_price = parseFloat(resComparePrice);
                    } else {
                        if (productDiscount.discount_type_id == '101') {
                            price = parseFloat(resPrice) - parseFloat(productDiscount.discount_price);
                            compare_price = parseFloat(resPrice);
                        } else if (productDiscount.discount_type_id == '102') {
                            price = (parseFloat(resPrice) * ((100 - parseFloat(productDiscount.discount_percent)) / 100));
                            compare_price = parseFloat(resPrice);
                        }
                    }
                    callback(price, compare_price);
                },
                checkMinPrice: function(option, callback) {
                    var _self = this;
                    var price_min = parseFloat(option.option_attribute[0].product_price);
                    var compare_price_min = parseFloat(option.option_attribute[0].product_compare_price);
                    var total_stock = parseFloat(option.option_attribute[0].product_total_stock);
                    for (var a = 0; a < option.option_attribute.length; a++) {
                        if (price_min >= parseFloat(option.option_attribute[a].product_price)) {
                            price_min = parseFloat(option.option_attribute[a].product_price);
                            compare_price_min = parseFloat(option.option_attribute[a].product_compare_price);
                            total_stock = parseFloat(option.option_attribute[a].product_total_stock);
                        }
                    }
                    _self.consoleLog("checkPriceMin price_min ", price_min);
                    _self.consoleLog("checkPriceMin compare_price_min ", compare_price_min);
                    _self.consoleLog("checkPriceMin total_stock ", total_stock);
                    callback(price_min, compare_price_min, total_stock);
                },
                getTotalStock: function(totalStock, mixStock, callback) {
                    var _self = this;
                    var total_stock = (totalStock > 0) ? ((totalStock <= mixStock) ? totalStock : mixStock) : ((totalStock == -1) ? mixStock : totalStock);
                    callback(total_stock);
                },
                checkMinPrices: function(api, attribute, callback) {
                    var _self = this;
                    var dataPrice = {
                        product_price: {
                            price_name: 'product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        product_compare_price: {
                            price_name: 'product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_price: {
                            price_name: 'sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_price: {
                            price_name: 'sum_product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_minus_sum_product_price: {
                            price_name: 'sum_product_compare_minus_sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        }
                    }
                    if (attribute.option_attribute.length == 0) {
                        _self.checkDiscountPrice(api.data.product_discount, api.data.product_price, api.data.product_compare_price, function(res_price, res_compare_price) {
                            _self.checkPrice(res_price, function(res_price_ecimals) {
                                dataPrice.product_price.price = res_price;
                                dataPrice.product_price.price_ecimals = res_price_ecimals;
                                dataPrice.sum_product_price.price = res_price;
                                dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                    dataPrice.product_compare_price.price = res_compare_price;
                                    dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    dataPrice.sum_product_compare_price.price = res_compare_price;
                                    dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                    _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                        dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                        dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                        _self.getTotalStock(api.data.product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                            dataPrice.product_price.total_stock = res_total_stock_s;
                                            dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                            callback(dataPrice, false);
                                        });
                                    });
                                });
                            });
                        });
                    } else {
                        _self.checkMinPrice(attribute, function(res_price_min, res_compare_price_min, res_total_stock) {
                            _self.checkDiscountPrice(api.data.product_discount, res_price_min, res_compare_price_min, function(res_price, res_compare_price) {
                                _self.checkPrice(res_price, function(res_price_ecimals) {
                                    dataPrice.product_price.price = res_price;
                                    dataPrice.product_price.price_ecimals = res_price_ecimals;
                                    dataPrice.sum_product_price.price = res_price;
                                    dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                    _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                        dataPrice.product_compare_price.price = res_compare_price;
                                        dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        dataPrice.sum_product_compare_price.price = res_compare_price;
                                        dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                        _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                            dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                            dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                            _self.getTotalStock(res_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                dataPrice.product_price.total_stock = res_total_stock_s;
                                                dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                callback(dataPrice, true);
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    }
                },
                priceIncludes: function(price, includes, callback) {
                    var _self = this;
                    var priceToString = (price == null) ? 0 : price;
                    _self.consoleLog('priceIncludes priceToString : ', priceToString);
                    callback(priceToString.toString().includes(includes));
                },
                checkPrice: function(price, callback) {
                    var _self = this;
                    _self.priceIncludes(price, '.', function(res) {
                        _self.consoleLog("checkPrice res ", res);
                        callback((!res) ? 0 : 2);
                    });
                },
                onSelectOption: function(productId) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = productId;
                    _self.consoleLog("onSelectOption productId ", productId);
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    for (var a = 0; a < $scope.data.attribute.dataArray.option_attribute.length; a++) {
                        _self.consoleLog("onSelectOption option_attribute ", $scope.data.attribute.dataArray.option_attribute[a]);
                        if ($scope.data.attribute.dataArray.option_attribute[a].product_id == productId) {
                            if ($scope.data.attribute.dataArray.option_attribute[a].product_image.length != 0) {
                                if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                                    for (var b = 0; b < $scope.dataApi.product.dataArray.product_image.length; b++) {
                                        if ($scope.dataApi.product.dataArray.product_image[b].image_id == $scope.data.attribute.dataArray.option_attribute[a].product_image[0].image_id) {
                                            $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, b);
                                        }
                                    }
                                }
                            }
                            _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[a].product_price, $scope.data.attribute.dataArray.option_attribute[a].product_compare_price, function(res_price_p, res_compare_price_p) {
                                _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                                    $scope.data.product_price.price = res_price_p;
                                    $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                                    $scope.data.sum_product_price.price = res_price_p;
                                    $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                                    _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                        $scope.data.product_compare_price.price = res_compare_price_p;
                                        $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                        $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                        _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                            $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                            $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                            _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[a].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                $scope.data.product_price.total_stock = res_total_stock_s;
                                                $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                /* stock */
                                                $scope.data.quantity.quantity_max = res_total_stock_s;
                                                $scope.data.quantity.quantity_select = [];
                                                for (var i = 0; i < res_total_stock_s; i++) {
                                                    $scope.data.quantity.quantity_select.push(i + 1);
                                                }
                                                /* stock */
                                            })
                                        });
                                    });
                                });
                            });
                            break;
                        }
                    }
                },
                onClickOption: function(index) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.data.attribute.productId = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    if ($scope.data.attribute.dataArray.option_attribute[index].product_image.length != 0) {
                        if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                            for (var i = 0; i < $scope.dataApi.product.dataArray.product_image.length; i++) {
                                if ($scope.dataApi.product.dataArray.product_image[i].image_id == $scope.data.attribute.dataArray.option_attribute[index].product_image[0].image_id) {
                                    $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, i);
                                }
                            }
                        }
                    }
                    _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[index].product_price, $scope.data.attribute.dataArray.option_attribute[index].product_compare_price, function(res_price_p, res_compare_price_p) {
                        _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                            $scope.data.product_price.price = res_price_p;
                            $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                            $scope.data.sum_product_price.price = res_price_p;
                            $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                            _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                $scope.data.product_compare_price.price = res_compare_price_p;
                                $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                    $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                    $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                    _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[index].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                        $scope.data.product_price.total_stock = res_total_stock_s;
                                        $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                        /* stock */
                                        $scope.data.quantity.quantity_max = res_total_stock_s;
                                        $scope.data.quantity.quantity_select = [];
                                        for (var i = 0; i < res_total_stock_s; i++) {
                                            $scope.data.quantity.quantity_select.push(i + 1);
                                        }
                                        /* stock */
                                    })
                                });
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.getAttributeCustom = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                createArray: function(productCustomTemplates, callback) {
                    var _self = this;
                    var custom_attributes = [];
                    if (productCustomTemplates.templates.length != 0) {
                        angular.forEach(productCustomTemplates.templates, function(item, index) {
                            if (item.option_sets.length != 0) {
                                _self.getAttributes(item.option_sets, function(res_attributes) {
                                    custom_attributes = custom_attributes.concat(res_attributes);
                                });
                            }
                        });
                        /* if (productCustomTemplates.templates[0].option_sets.length != 0) {
                            _self.getAttributes(productCustomTemplates.templates[0].option_sets, function(res_attributes) {
                                custom_attributes = res_attributes;
                            });
                        } */
                    }
                    _self.consoleLog("createArray : productCustomTemplates", productCustomTemplates);
                    _self.consoleLog("createArray : custom_attributes", custom_attributes);
                    callback(custom_attributes, true);
                },
                formatAttribute: function(index, optionSubsetIndex, setType, optionSetArray, callback) {
                    var _self = this;
                    var set_id = (setType == 'attribute') ? optionSetArray.set_id : optionSetArray.subset_id;
                    var attribute = {
                        attribute_index: index,
                        attribute_option_subset_index: optionSubsetIndex,
                        active_option_id: (optionSetArray.option_data.select_id != 0) ? optionSetArray.option_data.select_id : "-1",
                        active_option_index: -1,
                        active_option_index_str: "-1",
                        active_textarea: "",
                        active_array: [],
                        set_id: set_id,
                        name: optionSetArray.name,
                        set_type: optionSetArray.ss_type,
                        option: []
                    }
                    callback(attribute);
                },
                getOption: function(index, optionDataArray, callback) {
                    var _self = this;
                    var options = {
                        index: index,
                        ss_data_id: optionDataArray.ss_data_id,
                        name: optionDataArray.name,
                        image: optionDataArray.image,
                        price: optionDataArray.price,
                        compare_price: 0,
                        total_stock: 0
                    }
                    callback(options);
                },
                getActive: function(index, activeOptionId, activeOptionIdIn, optionDataArray, callback) {
                    var _self = this;
                    var actives_index = (optionDataArray.ss_data_id == activeOptionId) ? index : activeOptionIdIn;
                    var actives = (optionDataArray.ss_data_id != activeOptionId) ? "0" : "1";
                    callback(actives_index, actives);
                },
                getAttributes: function(optionSetArray, callback) {
                    var _self = this;
                    var attributes = [];
                    for (var index = 0; index < optionSetArray.length; index++) {
                        _self.formatAttribute(index, 0, 'attribute', optionSetArray[index], function(res_attribute) {
                            if (optionSetArray[index].option_subsets.length != 0) {
                                for (var option_subset_index = 0; option_subset_index < optionSetArray[index].option_subsets.length; option_subset_index++) {
                                    _self.formatAttribute(index, option_subset_index, res_attribute.set_type, optionSetArray[index].option_subsets[option_subset_index], function(res_attribute_sub) {
                                        var options = [];
                                        var active_option_id = -1;
                                        var active_option_array = [];
                                        for (var option = 0; option < optionSetArray[index].option_subsets[option_subset_index].option_data.options.length; option++) {
                                            _self.getOption(option, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_option) {
                                                options.push(res_option);
                                            });
                                            _self.getActive(option, res_attribute_sub.active_option_id, active_option_id, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_actives_index, res_actives) {
                                                active_option_id = res_actives_index;
                                                active_option_array.push(res_actives);
                                            });
                                        }
                                        res_attribute_sub.option = options;
                                        res_attribute_sub.active_option_index = active_option_id;
                                        res_attribute_sub.active_option_index_str = String(active_option_id);
                                        res_attribute_sub.active_array = active_option_array;
                                        attributes.push(res_attribute_sub);
                                    });
                                }
                            } else {
                                var options = [];
                                var active_option_id = -1;
                                var active_option_array = [];
                                for (var option = 0; option < optionSetArray[index].option_data.options.length; option++) {
                                    _self.getOption(option, optionSetArray[index].option_data.options[option], function(res_option) {
                                        options.push(res_option);
                                    });
                                    _self.getActive(option, res_attribute.active_option_id, active_option_id, optionSetArray[index].option_data.options[option], function(res_actives_index, res_actives) {
                                        active_option_id = res_actives_index;
                                        active_option_array.push(res_actives);
                                    });
                                }
                                res_attribute.option = options;
                                res_attribute.active_option_index = active_option_id;
                                res_attribute.active_option_index_str = String(active_option_id);
                                res_attribute.active_array = active_option_array;
                                attributes.push(res_attribute);
                            }
                        });
                    }
                    callback(attributes)
                },
                getformatQuantity: function(index, attributeCustom, callback) {
                    var _self = this;
                    var quantity = {
                        name: String(index + 1),
                        dataArray: attributeCustom
                    }
                    callback(quantity);
                },
                onClickRadio: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickRadio : index", index);
                    _self.consoleLog("onClickRadio : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickRadio : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickDropdown: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickDropdown : index", index);
                    _self.consoleLog("onClickDropdown : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickDropdown : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickCheckbox: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickCheckbox : index", index);
                    _self.consoleLog("onClickCheckbox : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i == parseInt(index_option)) ? (($scope.data.attribute_custom.dataArray[index].active_array[i] != "0") ? "0" : "1") : $scope.data.attribute_custom.dataArray[index].active_array[i];
                    }
                    _self.consoleLog("onClickCheckbox : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                }
            }
            return getFunction;
        };
        $scope.getReward = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                momentUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    callback(now);
                },
                getCalculator: function(sumProductPrice, reward, callback) {
                    var _self = this;
                    _self.consoleLog("getCalculator : sumProductPrice", sumProductPrice);
                    _self.consoleLog("getCalculator : reward", reward);
                    var point_reward = 0;
                    if (reward.type_id == "100") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    } else if (reward.type_id == "101") {
                        point_reward = reward.reward_amount;
                    } else if (reward.type_id == "102") {
                        point_reward = (reward.reward_percent * sumProductPrice.price) / 100;
                    } else if (reward.type_id == "103") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    }
                    _self.consoleLog("getCalculator : point_reward", point_reward);
                    callback(point_reward);
                },
                getProductReward: function(now, productReward, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (productReward.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(productReward.reward_lifetime.lifetime_start_time);
                        reward.lifetime_end_time = parseInt(productReward.reward_lifetime.lifetime_end_time);
                        reward.type_id = productReward.reward_type_id;
                        reward.amount = parseInt(productReward.reward_amount);
                        reward.percent = parseInt(productReward.reward_percent);
                        reward.every_price = parseInt(productReward.reward_every_price);
                    }
                    _self.consoleLog("getProductReward : reward", reward);
                    callback(reward);
                },
                getPointConfig: function(now, shopPointConfig, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (shopPointConfig.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(shopPointConfig.er_from);
                        reward.lifetime_end_time = parseInt(shopPointConfig.er_to);
                        reward.type_id = "100";
                        reward.amount = parseInt(shopPointConfig.er_earn);
                        reward.every_price = parseInt(shopPointConfig.er_rate);
                    }
                    _self.consoleLog("getPointConfig : reward", reward);
                    callback(reward);
                },
                checkPointReward: function(reward, callback) {
                    var _self = this;
                    var state = false;
                    if (reward.reward_length) {
                        var start = reward.lifetime_start_time < reward.lifetime_time && reward.lifetime_start_time != 0;
                        var end = (reward.lifetime_end_time != -1) ? reward.lifetime_time <= reward.lifetime_end_time && reward.lifetime_end_time != 0 : true;
                        if (start && end) {
                            if (reward.type_id == "100") {
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            } else if (reward.type_id == "101") {
                                var amount = reward.amount != 0;
                                if (amount) {
                                    state = true;
                                }
                            } else if (reward.type_id == "102") {
                                var percent = reward.percent != 0;
                                if (percent) {
                                    state = true;
                                }
                            } else if (reward.type_id == "103") {
                                var percent = reward.percent != 0;
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            }
                        }
                    }
                    callback(state);
                },
                checkReward: function(rewardProduct, rewardPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("checkReward : rewardProduct", rewardProduct);
                    _self.consoleLog("checkReward : rewardPointConfig", rewardPointConfig);
                    var reward = {
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    _self.checkPointReward(rewardProduct, function(res_state_product) {
                        _self.checkPointReward(rewardPointConfig, function(res_state_point_config) {
                            if (res_state_point_config) {
                                reward.type_id = rewardPointConfig.type_id;
                                reward.type_id = rewardPointConfig.type_id;
                                reward.amount = rewardPointConfig.amount;
                                reward.percent = rewardPointConfig.percent;
                                reward.every_price = rewardPointConfig.every_price;
                            } else if (res_state_product) {
                                reward.type_id = rewardProduct.type_id;
                                reward.amount = rewardProduct.amount;
                                reward.percent = rewardProduct.percent;
                                reward.every_price = rewardProduct.every_price;
                            }
                            _self.consoleLog("checkReward : reward", reward);
                            callback(reward);
                        });
                    });
                },
                checkRewardType: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.momentUnix(function(now) {
                        _self.getProductReward(now, productReward, function(res_reward_product) {
                            _self.getPointConfig(now, shopPointConfig, function(res_reward_point_config) {
                                _self.checkReward(res_reward_product, res_reward_point_config, function(res_reward) {
                                    callback(res_reward);
                                });
                            });
                        });
                    });
                },
                createReward: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("createReward : productReward", productReward);
                    _self.consoleLog("createReward : shopPointConfig", shopPointConfig);
                    _self.checkRewardType(productReward, shopPointConfig, function(res_reward) {
                        _self.consoleLog("createReward : res_reward", res_reward);
                        callback(res_reward);
                    });
                }
            }
            return getFunction;
        };
        $scope.getQuantity = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                upDateReward: function() {
                    var _self = this;
                },
                upDateReward: function() {
                    var _self = this;
                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                        $scope.data.reward.point_reward = res_point_reward;
                    });
                },
                upDatePrice: function() {
                    var _self = this;
                    var product_price = $scope.data.product_price.price * $scope.data.quantity.quantity_input;
                    var product_compare_price = $scope.data.product_compare_price.price * $scope.data.quantity.quantity_input;
                    $scope.getAttribute().checkPrice(product_price, function(res_price_ecimals) {
                        $scope.data.sum_product_price.price = product_price;
                        $scope.data.sum_product_price.price_ecimals = res_price_ecimals;
                        $scope.getAttribute().checkPrice(product_compare_price, function(res_compare_price_ecimals) {
                            $scope.data.sum_product_compare_price.price = product_compare_price;
                            $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                            var compare_price_minus_price = ((product_compare_price - product_price) > 0) ? product_compare_price - product_price : 0;
                            $scope.getAttribute().checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                _self.upDateReward();
                            });
                        });
                    });
                },
                input: function(quantityInput) {
                    var _self = this;
                    quantityInput = (quantityInput == null) ? 1 : parseInt(quantityInput);
                    _self.consoleLog("input : quantityInput", quantityInput);
                    if (quantityInput != null) {
                        if (quantityInput >= $scope.data.quantity.quantity_max) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_max;
                        }
                        if (quantityInput <= $scope.data.quantity.quantity_min) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                        }
                    } else {
                        $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                    }
                    _self.upDatePrice();
                },
                minus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input - 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_min", $scope.data.quantity.quantity_min);
                    if (quantity >= $scope.data.quantity.quantity_min) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                },
                plus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input + 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_max", $scope.data.quantity.quantity_max);
                    if (quantity <= $scope.data.quantity.quantity_max) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                }
            }
            return getFunction;
        };
        $scope.getBuy = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = params.product_id.split("-", 1).join("");
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                postApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.post(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                UiCartProductAdd: function(productId, quantityInput, promotionId, customOptions, callback) {
                    quantityInput = (quantityInput > $scope.data.quantity.quantity_max) ? $scope.data.quantity.quantity_max : quantityInput;
                    UiCart.delegate.product.add(productId, quantityInput, promotionId, function(res_data) {
                        callback(res_data);
                    });
                },
                isLogin: function(callback) {
                    var buy_login = $scope._buylogin;
                    var is_login = UiCustomerBox.delegate.get.isLogin();
                    var is_state = (buy_login) ? (!is_login) ? true : false : false;
                    callback(is_state);
                },
                formLogin: function(is_state, callback) {
                    if (is_state) {
                        $inloginPopup.open();
                    }
                    callback(is_state);
                },
                getProductStaffId(staff_id_check, callback) {
                    var res_staff_id_check = staff_id_check;
                    var res_staff_id = $scope.dataApi.product.dataArray.product_staff_id;
                    var res_is_state = (res_staff_id != 0 && res_staff_id != '0' && res_staff_id != undefined) ? true : false;
                    callback(res_staff_id_check, res_staff_id, res_is_state);
                },
                isStaffId: function(staff_id_check, callback) { /* todo */
                    var _self = this;
                    _self.getProductStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        callback(res_staff_id_check, res_staff_id, res_is_state);
                    });
                },
                checkCartDuplicateStaff: function(res_staff_id_check, txt_staff_id, res_is_state, callback) {
                    var _self = this
                    var res_is_state = true;
                    if (res_staff_id_check) {
                        var dataSend = {
                            'txt_staff_id': txt_staff_id,
                        };
                        _self.dataSend("cart/duplicate_staff", dataSend, function(res_api, res_dataSend) {
                            _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                                res_is_state = res_api.data.duplicate;
                                callback(res_is_state);
                            });
                        });
                    } else {
                        callback(res_is_state);
                    }
                },
                showAlert: function(res_staff_id_check, res_staff_id, res_is_state, res_api, callback) {
                    var res_state = (res_staff_id_check) ? ((res_api) ? ((res_is_state) ? false : true) : true) : false;
                    if (res_state) {
                        if (!res_api) {
                            if (res_staff_id != '0' && res_staff_id != 0) {
                                $scope.controlAlert().alert('002');
                            } else {
                                $scope.controlAlert().alert('003');
                            }
                        } else {
                            if (!res_is_state) {
                                $scope.controlAlert().alert('003');
                            }
                        }
                    }
                    callback(res_state);
                },
                checkStaff: function(callback) {
                    var _self = this
                    var staff_id_check = $scope._checkstaff;
                    var res_check = false;
                    _self.isStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        _self.checkCartDuplicateStaff(res_staff_id_check, res_staff_id, res_is_state, function(res_api) {
                            _self.showAlert(res_staff_id_check, res_staff_id, res_is_state, res_api, function(res_state) {
                                res_check = res_state;
                                callback(res_check);
                            });
                        });
                    });
                },
                isProgress: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isProgress(productId)) ? true : false;
                    _self.consoleLog("isProgress : productId", productId);
                    _self.consoleLog("isProgress : state", state);
                    callback(state);
                },
                isSelected: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    _self.consoleLog("isSelected : productId", productId);
                    _self.consoleLog("isSelected : state", state);
                    callback(state);
                },
                isSelectedReturn: function(productId) {
                    var _self = this;
                    var ui_cart_state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    if (!$scope.setBuy.state_active) {
                        $scope.setBuy.state_active = true;
                        var state_process = $scope.setBuy.state_process;
                        var state_step = $scope.setBuy.state_step;
                        if (ui_cart_state && !state_process && state_step != 4) /* cart */ {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_active = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else if (!ui_cart_state && !state_process && state_step != 0) /* unset */ {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_active = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        } else {
                            $scope.setBuy.state_active = false;
                        }
                    }
                    return ui_cart_state;
                },
                updateState: function(productId) {
                    _self = this;
                    _self.isSelected(productId, function(res_state) {
                        if (res_state) {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_process = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        }
                        return res_state;
                    });
                },
                uiCart: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    _self.UiCartProductAdd(productId, quantityInput, promotionId, customOptions, function(res_data) {
                        if (res_data) {
                            _self.onTimeout(500, function() {
                                _self.onPass(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            }
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onError(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onUnset(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                        });
                                    });
                                });
                            });
                        }
                    });
                },
                postApiA: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    var custom_options = {};
                    var dataSend = {
                        'txt_product_id': productId,
                        'txt_amount': quantityInput,
                        'txt_is_clear_cart_before': "0",
                        'txt_custom_options_json': JSON.stringify(custom_options)
                    };
                    _self.dataSend("cart/product_add", dataSend, function(res_api, res_dataSend) {
                        _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                            if (res_ok) {
                                _self.onTimeout(500, function() {
                                    _self.onPass(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onCart(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            });
                                        });
                                    });
                                });
                            } else {
                                _self.onTimeout(500, function() {
                                    _self.onError(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onUnset(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                            });
                                        });
                                    });
                                });
                            }
                        });
                    });
                },
                onProcess: function(data, productId, quantityInput, promotionId, customOptions) {
                    var _self = this;
                    _self.isLogin(function(res_is_login) {
                        _self.formLogin(res_is_login, function(res_form) {
                            _self.checkStaff(function(res_is_state) {
                                if (!$scope.setBuy.state_process && !res_form && !res_is_state) {
                                    $scope.setBuy.state_process = true;
                                    _self.isSelected(productId, function(res_state) {
                                        if (!res_state) {
                                            _self.onLoad($scope.setBuy.state_step, function(res_step) {
                                                if (data.sum_product_price.price != 0 && data.quantity.quantity_max != 0 && (data.attribute.state == (data.attribute.productId != ''))) {
                                                    /* UiCart */
                                                    _self.uiCart(productId, quantityInput, promotionId, customOptions, res_step);
                                                    /* api post offline */
                                                    /*_self.postApiA(productId, quantityInput, promotionId, customOptions, res_step); */
                                                } else {
                                                    _self.onTimeout(500, function() {
                                                        _self.onError(res_step, function(res_step) {
                                                            _self.onTimeout(1000, function() {
                                                                _self.onUnset(res_step, function(res_step) {
                                                                    $scope.setBuy.state_process = false;
                                                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                                                });
                                                            });
                                                        });
                                                    });
                                                }
                                            });
                                        } else {
                                            $scope.setBuy.state_process = false;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            } else if ($scope._cart == "viewcart") {
                                                _self.viewCart($scope._cart);
                                            }
                                        }
                                    });
                                }
                            });
                        });
                    });
                },
                onTimeout: function(time, callback) {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        callback(true)
                    }, time);
                },
                onUnset: function(step, callback) {
                    var _self = this;
                    step = (step == 0) ? 0 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onLoad: function(step, callback) {
                    var _self = this;
                    step = (step == 0 || step == 1) ? 1 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onPass: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 2) ? 2 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onError: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 3) ? 3 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onCart: function(step, callback) {
                    var _self = this;
                    step = (step == 2 || step == 4) ? 4 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                trumpComponentCarts: function() {
                    var controlCart = share.getTrumpComponentCarts();
                    var component_carts = $('.cover-cards').hasClass('active');
                    if (!component_carts) {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.cart();
                        }
                    } else {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.load();
                        }
                    }
                },
                viewCart: function(viewcart) {
                    var _self = this;
                    _self.pageUrl(viewcart);
                },
                locationUrlReplace: function(page) {
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                main: function(callback) {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getDetail = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getDetail: function(api, callback) {
                    var _self = this;
                    var description = api.product_description;
                    var info = api.product_more_info;
                    var specificatio = api.product_custom_title;/* [] */
                    /* if (api.product_attribute.specification_data != undefined) {
                        specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? api.product_attribute.specification_data.pclass_array : [];
                    } */
                    var state_specificatio = true;/* false */
                    /* if (api.product_attribute.specification_data != undefined) {
                        state_specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? true : false;
                    }*/
                    var state_info = true;/* (api.product_is_more_info == 1) ? true : false; */
                    _self.consoleLog("getDetail : api", api);
                    _self.consoleLog("getDetail : description", description);
                    _self.consoleLog("getDetail : info", info);
                    _self.consoleLog("getDetail : state_info", state_info);
                    _self.consoleLog("getDetail : specificatio", specificatio);
                    _self.consoleLog("getDetail : state_specificatio", state_specificatio);
                    callback(description, info, state_info, specificatio, state_specificatio);
                },
                onClickDetail: function(index) {
                    var _self = this;
                    $scope.data.detail.active = index;
                    _self.consoleLog("onClickDetail : data.detail.active", $scope.data.detail.active);
                }
            }
            return getFunction;
        };
        $scope.pages = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageName: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page_name);
                },
                pageUrl: function(page_name, id, name_url) {
                    var _self = this;
                    var page = page_name + "/" + id + "-" + name_url;
                    _self.locationUrlReplace(page);
                }
            }
            return getFunction;
        };
        $scope.countDown = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getLocation: function(callback) {
                    var _self = this;
                    var res_location = $location;
                    _self.consoleLog("getLocation", "res_location", res_location);
                    callback(res_location);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(params);
                },
                getLocationUrlNameProductDetail: function(callback) {
                    var _self = this;
                    _self.getRouteParams(function(res_params) {
                        _self.getLocation(function(res_location) {
                            var url_page_name = "/product-detail/" + res_params.product_id;
                            var res_url_name_product_detail = (res_location.url() == url_page_name) ? true : false;
                            _self.consoleLog("getLocationUrlNameProductDeal", "res_url_name_product_detail", res_url_name_product_detail);
                            callback(res_url_name_product_detail);
                        });
                    });
                },
                getUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    _self.consoleLog("getUnix", "now", now);
                    callback(now);
                },
                getCountDown: function(now, product_lifetime, callback) {
                    var _self = this;
                    var countdown_unix = parseInt(product_lifetime.lifetime_end_time) - now;
                    var milliseconds = moment.duration(countdown_unix * 1000, "milliseconds");
                    var res_countdown = ((milliseconds.days() <= 9) ? '0' + milliseconds.days() : milliseconds.days());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.hours() <= 9) ? '0' + milliseconds.hours() : milliseconds.hours());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.minutes() <= 9) ? '0' + milliseconds.minutes() : milliseconds.minutes());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.seconds() <= 9) ? '0' + milliseconds.seconds() : milliseconds.seconds());
                    _self.consoleLog("getCountDown", "res_countdown", res_countdown);
                    callback(res_countdown, countdown_unix);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                countDownByProduct: function(now, data_array, callback) {
                    var _self = this;
                    if (data_array.length != 0) {
                        if (data_array.product_lifetime.length != 0) {
                            _self.getCountDown(now, data_array.product_lifetime, function(res_count_down, res_countdown_unix) {
                                data_array.product_lifetime.lifetime_countdown = (res_countdown_unix > 0) ? res_count_down : "";
                                if (data_array.product_lifetime.lifetime_countdown == "") {
                                    _self.getNameUrl(data_array.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", data_array.product_set_array[0].product_id, res_name);
                                    });
                                }
                            });
                        }
                    }
                    _self.consoleLog("countDownByProduct", "data_array", data_array);
                    callback(data_array);
                },
                loop: function() {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        _self.getUnix(function(res_now) {
                            _self.countDownByProduct(res_now, $scope.dataApi.product.dataArray, function(data_array) {
                                $scope.dataApi.product.dataArray = data_array;
                                _self.getLocationUrlNameProductDetail(function(res_url_name_product_detail) {
                                    if (res_url_name_product_detail) {
                                        _self.loop();
                                    }
                                });
                            });
                        });
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.getPromotion = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                setPromotionId: function(promotion_id) {
                    var _self = this;
                    _self.consoleLog("setPromotionId", "promotion_id", promotion_id);
                    $scope.data.promotion.promotion_id = promotion_id;
                    _self.consoleLog("setPromotionId", "data.promotion.promotion_id", $scope.data.promotion.promotion_id);
                },
            }
            return getFunction;
        };
        $scope.control = function() {
            var getFunction = {
                popupVideo: function(state, video_link, video_embed_code) {
                    var _self = this;
                    if (video_embed_code != '') {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    } else if (video_link != '') {
                        window.open(video_link, '_blank');
                    } else {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.data_control = {
            page_video: {
                popup: false,
                shop_video_embed_code: ""
            }
        }
        $scope.control_alert = {
            alert: {
                error_id: '',
                index: null,
                state: true,
                error: [{
                    id: '001',
                    title: 'การสั่งซื้อ',
                    messages: 'สามารถสั่งซื้อได้เพียงทีละออเดอร์เท่านั้น'
                }, {
                    id: '002',
                    title: 'การเพิ่มสินค้า',
                    messages: 'ไม่สามารถเพิ่มสินค้าของร้านมากกว่า 1 ร้านค้าได้'
                }, {
                    id: '003',
                    title: 'การสั่งซื้อ',
                    messages: 'ไม่สามารถเพิ่มสินค้า(ไม่มีร้านค้า)'
                }]
            }
        };
        $scope.controlAlert = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getErrorMessages: function(error_id, callback) {
                    var _self = this;
                    var messages = {
                        res_error_id: '',
                        res_index: null
                    }
                    angular.forEach($scope.control_alert.alert.error, function(item, index) {
                        if (item.id == error_id) {
                            messages.res_error_id = item.id;
                            messages.res_index = index;
                        }
                    });
                    callback(messages.res_error_id, messages.res_index);
                },
                alert: function(error_id) {
                    var _self = this;
                    _self.getErrorMessages(error_id, function(res_error_id, res_index) {
                        $scope.control_alert.alert.error_id = res_error_id;
                        $scope.control_alert.alert.index = res_index;
                        $scope.control_alert.alert.state = (!$scope.control.alert && res_error_id != '') ? true : false;
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.countDown().loop();
        /* set carousel  */
        $scope.setCarousel = {
            carousel: 0,
            index: 0
        };
        $scope.getCarousel().getCarousel($scope.setCarousel.carousel, function(res_carousel_id) {
            $scope.setCarousel.carousel = res_carousel_id;
        });
        /* set carousel  */
        /* get product api */
        $scope.dataApi = {
            reward: {
                dataSend: {},
                api: "shop/current",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            staff: {
                dataSend: {
                    txt_staff_id: 0
                },
                api: "staff/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            product: {
                dataSend: {
                    txt_product_id: 0
                },
                api: "product/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            relation: {
                dataSend: {
                    txt_referral_id: 0
                },
                api: "referral/relation",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.data = {
            attribute: {
                state: false,
                productId: "",
                dataArray: []
            },
            attribute_custom: {
                state: false,
                dataArray: []
            },
            reward: {
                quantity_name: 'reward',
                type_id: "0",
                reward_amount: 0,
                reward_percent: 0,
                reward_every_price: 0,
                point_reward: 0
            },
            quantity: {
                quantity_name: 'quantity',
                quantity_min: 1,
                quantity_max: 1,
                quantity_input: 1,
                quantity_select: []
            },
            product_price: {
                price_name: 'product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            product_compare_price: {
                price_name: 'product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_price: {
                price_name: 'sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_price: {
                price_name: 'sum_product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_minus_sum_product_price: {
                price_name: 'sum_product_compare_minus_sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            detail: {
                active: '0',
                dataArray: [{
                    index: '0',
                    state: true,
                    en: ($scope.description != undefined && $scope.description != "") ? $scope.description : 'Description',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '1',
                    state: true,
                    en: ($scope.info != undefined && $scope.info != "") ? $scope.info : 'Info',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '2',
                    state: true,
                    en: ($scope.specification != undefined && $scope.specification != "") ? $scope.specification : 'Specification',
                    th: '',
                    data: '',
                    dataArray: []
                }]
            },
            promotion : {
                promotion_id : '0'
            }
        };
        $scope.setBuy = {
            state_active: false,
            state_process: false,
            state_step: 0,
            state_data_font_color: "",
            state_data_background_color: "",
            stepArray: [{
                step: 0,
                name: "unset",
                icon: $scope._icebuyicon,
                state: $scope._buytext,
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 1,
                name: "load",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 2,
                name: "pass",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 3,
                name: "error",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 4,
                name: "cart",
                icon: "",
                state: $scope._viewcarttext,
                data_font_color: "",
                data_background_color: "primary_darkest"
            }]
        };
        /* - get api product/id start - */
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.product.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                $scope.dataApi.product.dataSend.txt_product_id = (res_product_id != false) ? res_product_id : 0;
                $scope.getData().dataSend($scope.dataApi.product.api, $scope.dataApi.product.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_product, res_state) {
                        $scope.dataApi.product.ok = res_ok;
                        if ($scope._imageappcoverchecked) {
                            var images = [];
                            angular.forEach(get_res_api_product.data.product_image,function(image,index_image){
                                if (!image.image_app_cover_checked) {
                                    images.push(image)
                                }
                            });
                            get_res_api_product.data.product_image = images;
                        }
                        angular.element('.load-effect').removeClass('is-active');
                        $scope.dataApi.product.dataArray = get_res_api_product.data;
                        $scope.getData().consoleLog("get_res_api_product", get_res_api_product);
                        $scope.dataApi.product.dataArrayState = res_state;
                        /* -- get api shop/current to reward -- */
                        if (res_ok) {
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.reward.dataArrayState = res_state;
                                $scope.getData().dataSend($scope.dataApi.reward.api, $scope.dataApi.reward.dataSend, function(res_api, res_dataSend) {
                                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                                        $scope.dataApi.reward.ok = res_ok;
                                        $scope.dataApi.reward.dataArray = get_res_api_shop.data;
                                        $scope.dataApi.reward.dataArrayState = res_state;
                                        $scope.getReward().createReward($scope.dataApi.product.dataArray.product_reward, get_res_api_shop.data.shop_point_config, function(res_reward) {
                                            $scope.data.reward.type_id = res_reward.type_id;
                                            $scope.data.reward.reward_amount = res_reward.amount;
                                            $scope.data.reward.reward_percent = res_reward.percent;
                                            $scope.data.reward.reward_every_price = res_reward.every_price;
                                            /* --- Wait product/id ,shop/current --- */
                                            /* ---- get attribute ---- */
                                            $scope.getAttribute().productAttribute(get_res_api_product.data.product_attribute, function(res_attribute) {
                                                $scope.data.attribute.dataArray = res_attribute;
                                                $scope.getAttribute().checkMinPrices(get_res_api_product, res_attribute, function(res_data_price, res_state) {
                                                    $scope.data.attribute.state = res_state;
                                                    $scope.data.product_price = res_data_price.product_price;
                                                    $scope.data.product_compare_price = res_data_price.product_compare_price;
                                                    $scope.data.sum_product_price = res_data_price.sum_product_price;
                                                    $scope.data.sum_product_compare_price = res_data_price.sum_product_compare_price;
                                                    $scope.data.sum_product_compare_minus_sum_product_price = res_data_price.sum_product_compare_minus_sum_product_price;
                                                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                                                        $scope.data.reward.point_reward = res_point_reward;
                                                    });
                                                    /* ----- stock ----- */
                                                    $scope.data.quantity.quantity_max = res_data_price.product_price.total_stock;
                                                    $scope.data.quantity.quantity_select = [];
                                                    for (var i = 0; i < res_data_price.product_price.total_stock; i++) {
                                                        $scope.data.quantity.quantity_select.push(i + 1);
                                                    }
                                                    /* ----- stock ----- */
                                                });
                                            });
                                            /* ---- get attribute ---- */
                                            /* ---- get attribute custom ---- */
                                            $scope.getAttributeCustom().createArray(get_res_api_product.data.product_custom_templates, function(res_custom_attribute, res_state) {
                                                $scope.data.attribute_custom.state = res_state;
                                                $scope.data.attribute_custom.dataArray = res_custom_attribute;
                                            });
                                            /* ---- get attribute custom ---- */
                                            /* ---- get detail ---- */
                                            $scope.getDetail().getDetail(get_res_api_product.data, function(res_description, res_info, res_state_info, res_specificatio, res_state_specificatio) {
                                                $scope.data.detail.dataArray[0].data = res_description;
                                                $scope.data.detail.dataArray[1].data = res_info;
                                                $scope.data.detail.dataArray[1].state = res_state_info;
                                                $scope.data.detail.dataArray[2].data = res_specificatio;
                                                $scope.data.detail.dataArray[2].state = res_state_specificatio;
                                            });
                                            /* ---- get detail ---- */
                                            /* ---- update state ---- */
                                            $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                                            /* ---- update state ---- */
                                            /* --- Wait product/id ,shop/current --- */
                                        });
                                    });
                                });
                            });
                            /* -- get api shop/current to reward -- */
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.relation.dataArrayState = res_state;
                                $scope.getData().getReferralId(get_res_api_product.data.product_referral_display, function(res_referral_id) {
                                    $scope.dataApi.relation.dataSend.txt_referral_id = res_referral_id;
                                    $scope.getData().dataSend($scope.dataApi.relation.api, $scope.dataApi.relation.dataSend, function(res_api, res_dataSend) {
                                        $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_referral, res_state) {
                                            $scope.dataApi.relation.ok = res_ok;
                                            $scope.dataApi.relation.dataArray = (res_referral_id != 0) ? get_res_api_referral.data : [];
                                            $scope.dataApi.relation.dataArrayState = res_state;
                                        });
                                    });
                                });
                            });
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.getData().getStaffId(get_res_api_product.data.product_staff_id, function(res_staff) {
                                    if (res_staff.status) {
                                        $scope.dataApi.staff.dataArrayState = res_state;
                                        $scope.dataApi.staff.dataSend.txt_staff_id = res_staff.staff_id;
                                        $scope.getData().dataSend($scope.dataApi.staff.api, $scope.dataApi.staff.dataSend, function(res_api, res_dataSend) {
                                            $scope.getData().getApi(res_api, res_dataSend, function(res_ok, res, res_state) {
                                                $scope.dataApi.staff.ok = res_ok;
                                                $scope.dataApi.staff.dataArray = res.data;
                                                $scope.getData().getNameUrl(res.data.staff_first_name, function(res_staff_first_name_url) {
                                                    $scope.dataApi.staff.dataArray.staff_first_name_url = res_staff_first_name_url;
                                                    $scope.dataApi.staff.dataArrayState = res_state;
                                                });
                                            });
                                        });
                                    }
                                });
                            });
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                        } else {
                            /* ok = false */
                            if ($scope.dataApi.product.dataArray.length != 0) {
                                /* product deal to product original */
                                if ($scope.dataApi.product.dataArray.product_set_array.length != 0) {
                                    $scope.countDown().getNameUrl($scope.dataApi.product.dataArray.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", $scope.dataApi.product.dataArray.product_set_array[0].product_id, res_name);
                                    });
                                } else {
                                    $scope.pages().pageName("home");
                                }
                            } else {
                                /* product null */
                                $scope.pages().pageName("home");
                            }
                        }
                    });
                });
            });
        });
        /* - get api product/id end - */
        /* get product api */
    };
    return promise;
});
var $xZoomTimer = null;
var $xZoomInstance = false;
_ui_share_app.directive('productDetailPageL', function ($rootScope, $routeParams, sliderProvider, $http) {
    var templateName = 'productDetailPageL';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
        background:'@background',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.data = false;
        $scope.dataPreserve = false;
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        if(CUR_THEME.data.shop_id == "395"){
            var req = {
                url:"https://gaedemo101.getappeasy.com/store/api/v1/product/id?txt_product_id="+$scope._getPostIdFromURL(),
                method: "GET",
            };
            $http(req).then(function(res){
                if(res.data.ok == 1){
                    var e = res.data;
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.buildDataProductRelate($scope.id);
                }
            });
        } else {
            GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
                if(e.ok == 1){
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.buildDataProductRelate($scope._getPostIdFromURL());
                }
            });
        }
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 6,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            /*$scope.makeVariantsClick();*/
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            if($index == 0 && option_id == ''){
                return GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
                    if(e.ok == 1){
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                    $scope.findVariantsData($scope.dataVariantsPick);                
                }
            }            
        };
        $scope.findVariantsData = function(variantsPick){
            function compareArray(array_a, array) {
                if (!array)
                    return false;
                if (array_a.length != array.length)
                    return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i]))
                            return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for(var i = 0; i < dataVariants.length; i++){
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);                
                if(compareArray(variantsPick,optionJson)){ 
                    console.log("findVariantsData", dataVariants[i]);
                    $scope.data.product_id = dataVariants[i].product_id; /* Warning */
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;                
                } 
            }
            console.log("onSelectVariantItems: Yes", $scope.dataPreserve);
        };
        $rootScope.$on('repeatend',function(){
            /* Slider Send */
            /*var optionsParmas = {
                autoplay:true,
                slidesToShow:1,
                slidesToScroll:1,
                dots:false,
                arrows:false,
                infinite:true
            };
            var extraOptions = {
                animate: false
            };
            $timeout(function(){
                sliderProvider("#gallery_slider", optionsParmas, "", "", extraOptions);
            },500);
            $timeout(function(){
                $('.gallery_show_single img').xzoom({
                    Xoffset: 30,
                    tint: '#b9b5b3',
                });
            },500);*/
        });
        /* Slick Events */
        $scope._slickGoLeft = function () {
            setTimeout(function () {
                $('#gallery_slider').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            setTimeout(function () {
                $('#gallery_slider').slick('slickNext');
            }, 100);
        };
        /* Click SLick Item */
        $scope.slickGoto = function (idx) {
            setTimeout(function () {
                $('#gallery_slider').slick('slickGoTo', idx);
            }, 100);
        };
        /* Calcu Nav Arrows */
        $scope.navArrowsCalculate=function(){
            var size = (500 / 2);
            var n = (size + 18) + 20;
            return '-' + n + 'px';
        };
        $scope.navArrowWidth = function(){
            return $('#gallery_slider').width() + 'px';
        };
        /* Optimize image size by device pixel 
        * @params {size} (integer) prefer size
        * @params {image_url} (string) original image source link
        * @params {image_width} (string) original image width
        * @return string
        */
        $scope.viewOptimizeImage = function(size, image_url, image_width){
            if(window.devicePixelRatio >= 2 || parseInt(image_width) <= size){
                return image_url;
            }
            var a = image_url.split("/"), b = a[a.length - 1];
            a[a.length - 1] = 't'+size+'_' + b;
            return a.join("/");
        };
        $scope.gallerySingleViewIndex = 0;
        $scope.switchSingleView = function(idx){           
            console.log("$xZoomInstance",$xZoomInstance);
            $('.gallery_show_single').css({'transition':'all 0.3s','opacity':'0'});  
            $timeout(function(){
                $scope.gallerySingleViewIndex = idx;
                $('.gallery_show_single').css({'opacity':'1'});
            },300);
            setTimeout(function(){
                if($(window).width() >= 992){
                    
                    if($("img.zoom").attr('data-api-width') > 400 && $("img.zoom").attr('data-api-height') > 400){
                        /*$("img.zoom").ezPlus({
                            'scrollZoom':true,
                            'responsive':true,
                            'zoomWindowWidth':400,
                            'zoomWindowHeight':400,
                            'zoomWindowOffetx':30,
                        });*/
                        $xZoomInstance = $('.zoom').xzoom({
                            Xoffset: 30,
                            tint: '#b9b5b3',
                        });
                    }
                }
            },300);
        };
        $scope.viewImg = function(i){
            window.location.href=i;
        };
    };  
    return promise;
});
_ui_share_app.directive('productDetailPageM', function ($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageM';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.qtyProduct = 1;
        $scope.data = false;        
        $scope.dataPreserve = false;
        $scope.data_min = []; 
        $scope.tags_product = [];
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;             
            }
            if(typeof test === 'number' && test > 0){ 
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
            var dataSend = {
                'txt_product_id': $scope._getPostIdFromURL(),
            };
         $scope.data_video_id = false;
         if(CUR_THEME.shop_id()=="541"){
                $http.get("https://zoomcamera.getappeasy.com/store/api/v1/product/id", { params: dataSend }).then(function(res){
                    var e = res.data;
                    if(e.ok == 1){
                            console.log("product_set_array : data",e.data);
                            $scope.data = e.data;
                            $scope.dataPreserve = e.data;
                            $scope._getSupportDataCategory('category', e.data);
                            $scope.buildDataProductRelate($scope._getPostIdFromURL());
                            console.log("product_set_array : data",e.data);
                            $scope.data_video_id = $scope.data.product_id;
                            if(e.data.product_tags.length > 0){
                                $scope.tags_product = e.data.product_tags.split(",");
                                $scope.buildDataProductRelate(e.data.product_tags);
                            }
                            if(e.data.product_attribute.option_data != 0 && e.data.product_total_variant > 0){
                                if (e.data.product_attribute.option_data.variant_array.length != 0 && e.data.product_total_variant > 0) {
                                    
                                    var set_varia0 = e.data.product_attribute.option_data.variant_array[0].price;
                                    for (var i = 0; i < e.data.product_attribute.option_data.variant_array.length; i++) {
                                        if(parseInt(set_varia0) >= parseInt(e.data.product_attribute.option_data.variant_array[i].price)){
                                            set_varia0 = e.data.product_attribute.option_data.variant_array[i].price;
                                            $scope.data_min = e.data.product_attribute.option_data.variant_array[i];
                                        }
                                    }
                                    if($scope.data_min.length == 0){
                                        $scope.data_min = e.data.product_attribute.option_data.variant_array[0];
                                    }
                                   
                                    console.log("iujdishjdskd : ",$scope.data_min);
                                     $scope.buildVariantOption(e.data);
                                    $scope.buildMultipleQuantity(e.data);
                                }
                            }
                            if(e.data.product_total_variant == 0 && e.data.product_total_stock > 0){
                                $scope.names = [];
                                for (var i = 0; i < parseInt(e.data.product_total_stock); i++) {
                                    $scope.names.push(i+1);
                                }
                                console.log("nnames stock :",$scope.names);
                            }
                            if(e.data.product_total_variant == 0 && e.data.product_total_stock < 0){
                                $scope.names = [];
                                for (var i = 0; i < 20; i++) {
                                    $scope.names.push(i+1);
                                }
                                console.log("nnames stock :",$scope.names);
                            }
                            if(e.data.product_total_variant > 0){
                                $scope.names = [];
                                 for (var i = 0; i < 20; i++) {
                                    $scope.names.push(i+1);
                                }
                            }
                            if (typeof $scope.data.product_attribute.option_data !== 'undefined' && $scope.data.product_total_variant > 0) {
                                if (typeof $scope.data.product_attribute.option_data.pclass_array !== 'undefined' && $scope.data.product_attribute.option_data.pclass_array.length) {
                                   
                                    // $scope.buildMultipleQuantity(e.data);
                                }
                            }
                    }
                });
         }else{
        $componentProductDetail.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}, function(e){
            if(e.ok == 1){
                $scope.data = e.data;
                $scope.dataPreserve = e.data;
                $scope.data_video_id = $scope.data.product_id;
                $scope._getSupportDataCategory('category', e.data);
                // $scope.buildDataProductRelate($scope._getPostIdFromURL());
                if(e.data.product_tags.length > 0){
                    $scope.buildDataProductRelate(e.data.product_tags);
                }
                if (typeof $scope.data.product_attribute.option_data !== 'undefined' && $scope.data.product_total_variant > 0) {
                            if (typeof $scope.data.product_attribute.option_data.pclass_array !== 'undefined' && $scope.data.product_attribute.option_data.pclass_array.length) {
                                $scope.buildVariantOption(e.data);
                            }
                        }
                }
            });
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.ifOptionUnSelect = function() {
            return ($('.d_qty_price.active.inin').length > 0) ? true : false;
        };
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            
            var j = {"tags":product_id,'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 8,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    /*$scope.dataRelate = e.data.dataList;*/
                    var d = [];
                    angular.forEach(e.data.dataList, function(item){
                        if(item.product_id !== $scope.data.product_id){
                            d.push(item);
                        }
                    });
                    $scope.dataRelate = d;
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.onSelectVariantItems(0, '');
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.testyuyu = 0;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.dsetting').addClass("active");
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._idUrl($routeParams.product_id)
                }).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {                       
                        $scope.testyuyu++;
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    $scope.testyuyu = 0;
                    $('.d_qty_not_result').removeClass("active");
                    $('.dsetting').removeClass("active");
                    $scope.findVariantsData($scope.dataVariantsPick);
                } else {
                    $scope.testyuyu = 0;
                    $('.d_qty').removeClass('active').removeClass('inin');
                    $('.d_qty_price').removeClass("active");
                    $('.d_qty_price').removeClass("inin");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            $scope._data_qty_model = 1;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var _self = dataVariants[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope.name_qty = [];
                    $scope.data.product_id = dataVariants[i].product_id;
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    $scope.data.product_total_stock = dataVariants[i].total_stock;
                    console.log("selectedOptionTextJson: option",$scope.data.product_price);
                    for (var i = 0; i < parseInt($scope.data.product_total_stock); i++) {
                                $scope.name_qty.push(i+1);
                    }
                   console.log("auysuwgdhsdgsh :",$scope.name_qty , $scope._data_qty_model);
                    $scope.switchQuantityByKey('-' + variantsPick.join('-') + '-');
                        // name_qty
                    console.log("selectedOptionTextJson: option", _self);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope.data.product_image.length; im++) {
                            if ($scope.data.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope._slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.gallery-thumbnail .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                }
                if(!compareArray(variantsPick, optionJson)){
                    count++;
                }
                if(count >= dataVariants.length){
                    // alert(count);
                    
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = 0;
                    $scope.data.product_compare_price = 0;
                   
                }
            }
            // alert(count);
        };
        $rootScope.$on('repeatend',function(){
            /* Slider Send */
            var optionsParmas = {
                autoplay:true,
                slidesToShow:1,
                slidesToScroll:1,
                dots:false,
                arrows:false,
                infinite:true
            };
            var extraOptions = {
                animate: false
            };
            $timeout(function(){
               sliderProvider("#gallery_slider", optionsParmas, "", "", extraOptions);
           },500);
        });
        /* Slick Events */
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('#gallery_slider').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('#gallery_slider').slick('slickNext');
            }, 100);
        };
        /* Click SLick Item */
        $scope.slickGoto = function (idx) {
            $timeout(function () {
                $('#gallery_slider').slick('slickGoTo', idx);
            }, 100);
        };
        /* Calcu Nav Arrows */
        $scope.navArrowsCalculate=function(){
            var size = (500 / 2);
            var n = (size + 18) + 20;
            return '-' + n + 'px';
        };
        $scope.navArrowWidth = function(){
            return $('#gallery_slider').width() + 'px';
        };
        /* Build title for Address link*/
        $scope.buildTitleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
        /* Calculate discount (simple mode)
        * @params {expensivePrice}
        * @params {salePrice}
        * @return int
        */
        $scope.calculateDiscount = function(expensivePrice, salePrice){
            var dif = expensivePrice - salePrice;
            return parseInt(dif * 100 / expensivePrice);
        };
         $scope.support_data = {
                    category: [],
                };
        $scope._getSupportDataCategory = function(type,data){
           
            var dataSend = {
                'txt_referral_id': data.product_referral_display.category[0].referral_id
            };
            GAEAPI.get('referral/relation',dataSend).then(function(e){
                if(e.ok == 1){
                    $scope.support_data.category = e.data;
                }
            });
            
        };
        /* Optimize image size by device pixel 
        * @params {size} (integer) prefer size
        * @params {image_url} (string) original image source link
        * @params {image_width} (string) original image width
        * @return string
        */
        $scope.viewOptimizeImage = function(size, image_url, image_width){
            if(window.devicePixelRatio >= 2 || parseInt(image_width) <= size){
                return image_url;
            }
            var a = image_url.split("/"), b = a[a.length - 1];
            a[a.length - 1] = 't'+size+'_' + b;
            return a.join("/");
        };
        /* Hide when visible badge */
        $scope.exceptVisibleBadge = function(objectItem){          
            var r = parseInt(objectItem.badge_id);
            var s = false;
            switch (r) {
                case 16:
                case 72:
                case 74:
                case 75:
                    s = true;
                break;
                default: 
                    s = false; 
                break;
            }
            return s;
        };
        $scope.newLoginregister = function(name){
            window.location.href=GURL.base_url()+name;       
        };
        $scope.invited = [];
        $scope.insertinvited = function(user) {
        if(user) {
            if(user.product_attribute.length != 0){
               
                if($scope.invited[0] == user.product_id){
                    return;
                }
           
                 $scope.invited.push(user.product_id);
            }else{
                alert("item can't compare");                
            }
        } else {            
             console.log("test_array :",$scope.invited);
        }
    };
        /* Display Badge Name */
        $scope.renderBadgeType = function(objectItem){
            var r = parseInt(objectItem.badge_id);
            var str = 'No Badge';
            switch(r){
                case 16: str = "FEATURED"; break;
                case 72: str = "NEW"; break;
                case 74: str = "RECOMMEND"; break;
                case 75: str = "BEST SELLER"; break;
                case 82: str = "NEW (App)"; break;
                case 83: str = "RECOMMEND (App)"; break;
                case 84: str = "BEST SELLER (App)"; break;
            }
            return str;
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index){
            $scope.data_viewTab = index;
        };
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope.currentOptionQtyPick = function(variant_key) {
           var e=1;
            // var e = angular.element('input[name="detail_qty"]');
            // if (typeof variant_key !== 'undefined') {
            //     e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            // }
            if ($('#detail_qty[variant-key="' + variant_key + '"]').val() != undefined && $('#detail_qty[variant-key="' + variant_key + '"]').val() != '' && isNaN($('#detail_qty[variant-key="' + variant_key + '"]').val())) {
                e = parseInt($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
                console.log("sudyusdysudysyususu :",e);
            }
            // if(isNaN(e)){
            //     e = 1;
            // }
            // alert(e);
            return e;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('select[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('select[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
            console.log("data_set array test : ",i);
            $scope._data_qty_selected = i;
            // parseInt(e.val());
            // alert(i);
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [],
                p = productObj.product_attribute.option_data.variant_array;
            for (var i = 0; i < p.length; i++) {
                if (p[i].status == 1 && p[i].status == 1) {
                    $scope.productQuantityMultiArray.push({
                        v_key: p[i].variant_key,
                        v_name: p[i].option_name_array[0],
                        v_qty: 1,
                        v_active: 0
                    });
                }
            }
            console.log("iufthsgsdkhfgsdkfjhd :", $scope.productQuantityMultiArray);
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');            
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                // $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $scope.viewQuantity = function() {
            var check_num = 1;
            if($(".d_qty.inin").find('select').val() != undefined && $(".d_qty.inin").find('select').val() != ''){
                 check_num = $(".d_qty.inin").find('select').val().substr(7);
            }else{
                $(".d_qty.inin").find('select').val("number:1");
                $(".d_qty.inin").find('select').selectedIndex = "2";
            }
            console.log("shdgshdgsh :",check_num);
            return parseInt(check_num);
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.outofstock = 0;
        $scope.getOutofstock = function() {
            $scope.outofstock = 1;
        };
    };  
    return promise;
});
_ui_share_app.directive('productDetailPageMa', function($rootScope, $routeParams, sliderProvider ) {
    var templateName = 'productDetailPageMa';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        fontcolor: '@fontcolor',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window , $location) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        // $scope.product_sku = "";
        // $scope.product_code = "";
        // $scope.product_price = 0;
        // $scope.product_compare_price = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.dataPreserve = res.data;
                    // $scope.product_sku = res.data.product_sku;
                    // $scope.product_code = res.data.product_code;
                    $scope.product_price = $scope.calculate(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    if(res.data.product_tags != "" && res.data.product_tags != undefined){
                        $scope.dataTag = res.data.product_tags.split(",");
                    }
                    
                    if (res.data.product_attribute.length != 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            // alert("x๊อบไข่สด");
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                        
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                    $scope.qtyCurrentSize(res.data.product_total_variant, res.data.product_total_stock);
                    // $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.redirectCheckout = function(p,q){
            window.location.href = GURL.base_url() + "checkout?pdata="+p+'-'+q;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < parseInt(product_total_stock); i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.onClickVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                var count = 0;
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope._getDataArray($scope._getIdUrl());
    };
    return promise;
});_ui_share_app.directive('productDetailPageMaeju', function($rootScope, $routeParams, $location, sliderProvider) {
    var templateName = 'productDetailPageMaeju';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon: '@icon',
        stylebutton: '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log("productDetailPageMaeju : ", name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                checkAttributeOption: function(attributeOption, attributeOptionLength, callback) {
                    var _self = this;
                    var attribute = (attributeOption.length == attributeOptionLength) ? true : false;
                    for (var i = 0; i < attributeOption.length; i++) {
                        _self.consoleLog("checkAttributeOption : attributeOption[i] : ", attributeOption[i]);
                        if (attributeOption[i] == undefined) {
                            attribute = false;
                        }
                    }
                    callback(attribute);
                },
                findVariantsData: function(attributeOption, dataVariants, attributeOptionLength, callback) {
                    var _self = this;
                    _self.consoleLog("findVariantsData : attributeOption : ", attributeOption);
                    _self.consoleLog("findVariantsData : dataVariants : ", dataVariants);
                    _self.consoleLog("findVariantsData : attributeOptionLength : ", attributeOptionLength);
                    _self.checkAttributeOption(attributeOption, attributeOptionLength, function(res_attribute_option) {
                        _self.consoleLog("checkAttributeOption : callback : res_attribute_option ", res_attribute_option);
                        var variantsOut = [];
                        for (var i = 0; i < dataVariants.length; i++) {
                            var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                            if (_self.compareArray(attributeOption, optionJson)) {
                                _self.consoleLog("findVariantsData : dataVariants[i] : ", dataVariants[i]);
                                variantsOut = dataVariants[i];
                                break;
                            }
                        }
                        callback(variantsOut, res_attribute_option);
                    });
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var _self = this;
                    var state = true;
                    _self.consoleLog("checkTotalStock : index : ", stateIn);
                    _self.consoleLog("checkTotalStock : quantity_max : ", quantity_max);
                    if (stateIn == false && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, $scope.attribute.attributeOption.length, function(variantsOut, res_attribute_option) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                _self.consoleLog("onClickOption : if : findVariantsData : res_attribute_option : ", res_attribute_option);
                                if (variantsOut.length != 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = variantsOut.product_id;
                                    $scope.dataArray.product_sku = variantsOut.sku;
                                    $scope.dataProductBuy.price = variantsOut.price;
                                    $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                    $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                    if (variantsOut.variant_image != 0) {
                                        if ($scope.dataArray.product_image.length != 0) {
                                            for (var i = 0; i < $scope.dataArray.product_image.length; i++) {
                                                $scope.dataArray.product_image[i].image_id
                                                if ($scope.dataArray.product_image[i].image_id == variantsOut.variant_image[0].image_id) {
                                                    $scope.slickImageGoto(i);
                                                }
                                            }
                                        }
                                    }
                                    _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                        _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                            $scope.buy.state = state;
                                            if ($scope.attribute.variantsTotal != 0) {
                                                $scope.buy.attribute = true;
                                            }
                                        });
                                    });
                                } else if (variantsOut.length == 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = 0;
                                    $scope.dataArray.product_sku = '';
                                    $scope.dataProductBuy.price = 0;
                                    $scope.dataArray.product_compare_price = 0;
                                    $scope.dataProductBuy.quantity_max = 1;
                                    $scope.buy.state = true;
                                    $scope.buy.attribute = true;
                                }
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 100);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log('productDetailPageMaeju : ', name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    product_referral_display.category = (product_referral_display.category != '' && product_referral_display.category != undefined) ? product_referral_display.category : [];
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = true;
                    if (stateIn == true && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                checkPriceMin: function(variant, callback) {
                    var _self = this;
                    var priceMin = parseFloat(variant[0].price);
                    var comparePriceMin = parseFloat(variant[0].compare_price);
                    for (var i = 0; i < variant.length; i++) {
                        _self.consoleLog('checkPriceMin : priceMin : ', priceMin);
                        _self.consoleLog('checkPriceMin : variant[i].price : ', variant[i].price);
                        if (priceMin >= parseFloat(variant[i].price)) {
                            priceMin = parseFloat(variant[i].price);
                            comparePriceMin = parseFloat(variant[i].compare_price);
                        }
                    }
                    callback(priceMin, comparePriceMin);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.referralMapState = _self.stateData(true, false);
                    var dataSend = {
                        'txt_referral_type_id': 11,
                        'txt_sortby': 'referral_sort_index_asc_name_asc'
                    };
                    _self.dataSend('referral/map', dataSend, function(api, dataSend) {
                        _self.getApi(api, dataSend, function(output) {
                            $scope.referralMap = output.data;
                            $scope.referralMapState = _self.stateData(false, true);
                        });
                    });
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        if (output.data.length != 0) {
                            _self.consoleLog("   : output : ", output.data);
                            _self.quantity(output.data.product_total_stock, function(total_stock) {
                                _self.consoleLog("quantity : total_stock : ", total_stock);
                                $scope.dataProductBuy.quantity_max = total_stock;
                                $scope.dataArray = output.data;
                                _self.productTab(output.data.product_tags, function(productTab) {
                                    $scope.dataArrayTags = productTab;
                                    _self.showTab(output.data, function(description, info) {
                                        $scope.showTab.dataTab[0].data = description;
                                        $scope.showTab.dataTab[1].data = info;
                                    });
                                    _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                        _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                        _self.consoleLog("getAttribute : attribute : ", attribute);
                                        _self.consoleLog("getAttribute : variants : ", variants);
                                        _self.checkOption(variants_total, function(state) {
                                            _self.checkTotalStock(state, total_stock, function(state) {
                                                $scope.buy.state = state;
                                                $scope.attribute.attributeOption = attribute;
                                                $scope.attribute.dataVariants = variants;
                                                $scope.attribute.variantsTotal = variants_total;
                                                if (variants_total > 0) {
                                                    _self.checkPriceMin(variants, function(res_price, res_compare_price) {
                                                        $scope.dataProductBuy.price = res_price;
                                                        $scope.dataProductBuy.sumprice = res_price;
                                                        $scope.dataArray.product_compare_price = res_compare_price;
                                                    });
                                                } else {
                                                    $scope.dataProductBuy.price = output.data.product_price;
                                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                                }
                                            });
                                        });
                                    });
                                    _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                        _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                        $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                        if (quantity_break.length) {
                                            $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                        }
                                    });
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                        $scope.dataArrayState = _self.stateData(false, true);
                                    });
                                });
                            });
                        } else {
                            window.history.back();
                        }
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
        $scope.tab_id = 0;
        $scope.tabId = function(id) {
            $scope.tab_id = id;
        };
        $scope.routeParams = function() {
            return $routeParams || false;
        };
        $scope.categoriesData = $scope.routeParams().referral_id || '';
        $scope.setDataCategories = function(input) {
            $scope.categoriesData = input;
            var page = "category-lists";
            if (typeof $scope.categoriesData != 'undefined' && $scope.categoriesData !== "") {
                page += '?root_id=' + '0';
                page += '&referral_id=' + $scope.categoriesData;
            } else {
                delete $scope.categoriesDat;
            }
            $location.url(page).replace();
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageMb', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageMb';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        datafont: '@datafont',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $location) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.data_min = "";
        $scope.data_video_id = false;
        // $scope.product_sku = "";
        // $scope.product_code = "";
        // $scope.product_price = 0;
        // $scope.product_compare_price = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/id', dataSend, $scope).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.dataPreserve = res.data;
                    $scope.data_video_id = res.data.product_id;
                    // $scope.product_sku = res.data.product_sku;
                    // $scope.product_code = res.data.product_code;
                    $scope.product_price = $scope.calculate(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.dataTag = res.data.product_tags.split(",");
                    if (res.data.product_attribute.length != 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            // alert("x๊อบไข่สด");
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                    /*$scope.sale($scope._dataArray.product_price,
                                $scope._dataArray.product_compare_price,
                                $scope._dataArray.product_discount.discount_id,
                                $scope._dataArray.product_discount.discount_price,
                                $scope._dataArray.product_discount.discount_percent);
                    */
                    $scope.qtyCurrentSize(res.data.product_total_variant, res.data.product_total_stock);
                    // $scope.buildVariantOption(res.data);
                }
                var t = $interval(function() {
                    if ($scope._uniqueKey !== "") {
                        $interval.cancel(t);
                        var tt = $timeout(function() {
                            $timeout.cancel(tt);
                            $scope.mkCarousel();
                        }, 300);
                    }
                }, 500);
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $rootScope.$on('repeatend', function() {
            /* Check Lightbox Enable/Disable */
            $('a[data-photo-index]').each(function(idx, obj) {
                $(this).attr('data-lightbox', 'view-gallery');
            });
        });
        $scope.mkCarousel = function() {
            var elementName = '.component_carousel_map[data-id="' + $scope._key() + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                centerMode: true,
                centerPadding: '0px',
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: true,
                infinite: true,
                /*prevArrow: '
',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselBar: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: false,
                            infinite: false,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 6,
                            slidesToScroll: 6,
                            speed: 600,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: 5,
                                    slidesToScroll: 5,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: 4,
                                    slidesToScroll: 4,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: 3,
                                    slidesToScroll: 3,
                                }
                            }]
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                slickCarousel: function(carousel, index) {
                    var _self = this;
                    $scope.setCarousel.index = index;
                    setTimeout(function() {
                        $('[data-key="' + carousel + '"]').slick('slickGoTo', index);
                    }, 100);
                },
                prevIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != 0) ? image_index - 1 : image - 1;
                    _self.consoleLog("prevIndex index", $scope.setCarousel.index);
                },
                nextIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != (image - 1)) ? image_index + 1 : 0;
                    _self.consoleLog("nextIndex index", $scope.setCarousel.index);
                }
            }
            return getFunction;
        };
        $scope.getAttribute = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                productAttribute: function(productAttribute, callback) {
                    var _self = this;
                    var attribute = {
                        option_name: "",
                        option_attribute: []
                    };
                    if (productAttribute.option_data != undefined) {
                        if (productAttribute.option_data.variant_array != undefined && productAttribute.option_data.variant_array.length != 0) {
                            for (var a = 0; a < productAttribute.option_data.pclass_array.length; a++) {
                                attribute.option_name = attribute.option_name.concat(productAttribute.option_data.pclass_array[a].pclass_name, " ");
                            }
                            for (var b = 0; b < productAttribute.option_data.variant_array.length; b++) {
                                var product_attribute = {
                                    product_id: productAttribute.option_data.variant_array[b].product_id,
                                    product_sku: productAttribute.option_data.variant_array[b].sku,
                                    product_title: "",
                                    product_price: parseFloat(productAttribute.option_data.variant_array[b].price),
                                    product_compare_price: parseFloat(productAttribute.option_data.variant_array[b].compare_price),
                                    product_total_stock: parseFloat(productAttribute.option_data.variant_array[b].total_stock),
                                    product_image: productAttribute.option_data.variant_array[b].variant_image
                                }
                                for (var c = 0; c < productAttribute.option_data.variant_array[b].option_name_array.length; c++) {
                                    product_attribute.product_title = product_attribute.product_title.concat(productAttribute.option_data.variant_array[b].option_name_array[c], " ");
                                }
                                attribute.option_attribute.push(product_attribute);
                            }
                        }
                    }
                    _self.consoleLog("productAttribute attribute ", attribute);
                    callback(attribute);
                },
                checkDiscountPrice: function(productDiscount, resPrice, resComparePrice, callback) {
                    var _self = this;
                    var price = 0;
                    var compare_price = 0;
                    if (productDiscount.length == 0) {
                        price = parseFloat(resPrice);
                        compare_price = parseFloat(resComparePrice);
                    } else {
                        if (productDiscount.discount_type_id == '101') {
                            price = parseFloat(resPrice) - parseFloat(productDiscount.discount_price);
                            compare_price = parseFloat(resPrice);
                        } else if (productDiscount.discount_type_id == '102') {
                            price = (parseFloat(resPrice) * ((100 - parseFloat(productDiscount.discount_percent)) / 100));
                            compare_price = parseFloat(resPrice);
                        }
                    }
                    callback(price, compare_price);
                },
                checkMinPrice: function(option, callback) {
                    var _self = this;
                    var price_min = parseFloat(option.option_attribute[0].product_price);
                    var compare_price_min = parseFloat(option.option_attribute[0].product_compare_price);
                    var total_stock = parseFloat(option.option_attribute[0].product_total_stock);
                    for (var a = 0; a < option.option_attribute.length; a++) {
                        if (price_min >= parseFloat(option.option_attribute[a].product_price)) {
                            price_min = parseFloat(option.option_attribute[a].product_price);
                            compare_price_min = parseFloat(option.option_attribute[a].product_compare_price);
                            total_stock = parseFloat(option.option_attribute[a].product_total_stock);
                        }
                    }
                    _self.consoleLog("checkPriceMin price_min ", price_min);
                    _self.consoleLog("checkPriceMin compare_price_min ", compare_price_min);
                    _self.consoleLog("checkPriceMin total_stock ", total_stock);
                    callback(price_min, compare_price_min, total_stock);
                },
                getTotalStock: function(totalStock, mixStock, callback) {
                    var _self = this;
                    var total_stock = (totalStock > 0) ? ((totalStock <= mixStock) ? totalStock : mixStock) : ((totalStock == -1) ? mixStock : totalStock);
                    callback(total_stock);
                },
                checkMinPrices: function(api, attribute, callback) {
                    var _self = this;
                    var dataPrice = {
                        product_price: {
                            price_name: 'product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        product_compare_price: {
                            price_name: 'product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_price: {
                            price_name: 'sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_price: {
                            price_name: 'sum_product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_minus_sum_product_price: {
                            price_name: 'sum_product_compare_minus_sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        }
                    }
                    if (attribute.option_attribute.length == 0) {
                        _self.checkDiscountPrice(api.data.product_discount, api.data.product_price, api.data.product_compare_price, function(res_price, res_compare_price) {
                            _self.checkPrice(res_price, function(res_price_ecimals) {
                                dataPrice.product_price.price = res_price;
                                dataPrice.product_price.price_ecimals = res_price_ecimals;
                                dataPrice.sum_product_price.price = res_price;
                                dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                    dataPrice.product_compare_price.price = res_compare_price;
                                    dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    dataPrice.sum_product_compare_price.price = res_compare_price;
                                    dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                    _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                        dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                        dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                        _self.getTotalStock(api.data.product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                            dataPrice.product_price.total_stock = res_total_stock_s;
                                            dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                            callback(dataPrice, false);
                                        });
                                    });
                                });
                            });
                        });
                    } else {
                        _self.checkMinPrice(attribute, function(res_price_min, res_compare_price_min, res_total_stock) {
                            _self.checkDiscountPrice(api.data.product_discount, res_price_min, res_compare_price_min, function(res_price, res_compare_price) {
                                _self.checkPrice(res_price, function(res_price_ecimals) {
                                    dataPrice.product_price.price = res_price;
                                    dataPrice.product_price.price_ecimals = res_price_ecimals;
                                    dataPrice.sum_product_price.price = res_price;
                                    dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                    _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                        dataPrice.product_compare_price.price = res_compare_price;
                                        dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        dataPrice.sum_product_compare_price.price = res_compare_price;
                                        dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                        _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                            dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                            dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                            _self.getTotalStock(res_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                dataPrice.product_price.total_stock = res_total_stock_s;
                                                dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                callback(dataPrice, true);
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    }
                },
                priceIncludes: function(price, includes, callback) {
                    var _self = this;
                    var priceToString = (price == null) ? 0 : price;
                    _self.consoleLog('priceIncludes priceToString : ', priceToString);
                    callback(priceToString.toString().includes(includes));
                },
                checkPrice: function(price, callback) {
                    var _self = this;
                    _self.priceIncludes(price, '.', function(res) {
                        _self.consoleLog("checkPrice res ", res);
                        callback((!res) ? 0 : 2);
                    });
                },
                onSelectOption: function(productId) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = productId;
                    _self.consoleLog("onSelectOption productId ", productId);
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    for (var a = 0; a < $scope.data.attribute.dataArray.option_attribute.length; a++) {
                        _self.consoleLog("onSelectOption option_attribute ", $scope.data.attribute.dataArray.option_attribute[a]);
                        if ($scope.data.attribute.dataArray.option_attribute[a].product_id == productId) {
                            if ($scope.data.attribute.dataArray.option_attribute[a].product_image.length != 0) {
                                if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                                    for (var b = 0; b < $scope.dataApi.product.dataArray.product_image.length; b++) {
                                        if ($scope.dataApi.product.dataArray.product_image[b].image_id == $scope.data.attribute.dataArray.option_attribute[a].product_image[0].image_id) {
                                            $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, b);
                                        }
                                    }
                                }
                            }
                            _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[a].product_price, $scope.data.attribute.dataArray.option_attribute[a].product_compare_price, function(res_price_p, res_compare_price_p) {
                                _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                                    $scope.data.product_price.price = res_price_p;
                                    $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                                    $scope.data.sum_product_price.price = res_price_p;
                                    $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                                    _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                        $scope.data.product_compare_price.price = res_compare_price_p;
                                        $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                        $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                        _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                            $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                            $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                            _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[a].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                $scope.data.product_price.total_stock = res_total_stock_s;
                                                $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                /* stock */
                                                $scope.data.quantity.quantity_max = res_total_stock_s;
                                                $scope.data.quantity.quantity_select = [];
                                                for (var i = 0; i < res_total_stock_s; i++) {
                                                    $scope.data.quantity.quantity_select.push(i + 1);
                                                }
                                                /* stock */
                                            })
                                        });
                                    });
                                });
                            });
                            break;
                        }
                    }
                },
                onClickOption: function(index) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.data.attribute.productId = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    if ($scope.data.attribute.dataArray.option_attribute[index].product_image.length != 0) {
                        if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                            for (var i = 0; i < $scope.dataApi.product.dataArray.product_image.length; i++) {
                                if ($scope.dataApi.product.dataArray.product_image[i].image_id == $scope.data.attribute.dataArray.option_attribute[index].product_image[0].image_id) {
                                    $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, i);
                                }
                            }
                        }
                    }
                    _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[index].product_price, $scope.data.attribute.dataArray.option_attribute[index].product_compare_price, function(res_price_p, res_compare_price_p) {
                        _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                            $scope.data.product_price.price = res_price_p;
                            $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                            $scope.data.sum_product_price.price = res_price_p;
                            $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                            _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                $scope.data.product_compare_price.price = res_compare_price_p;
                                $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                    $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                    $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                    _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[index].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                        $scope.data.product_price.total_stock = res_total_stock_s;
                                        $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                        /* stock */
                                        $scope.data.quantity.quantity_max = res_total_stock_s;
                                        $scope.data.quantity.quantity_select = [];
                                        for (var i = 0; i < res_total_stock_s; i++) {
                                            $scope.data.quantity.quantity_select.push(i + 1);
                                        }
                                        /* stock */
                                    })
                                });
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.getAttributeCustom = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                createArray: function(productCustomTemplates, callback) {
                    var _self = this;
                    var custom_attributes = [];
                    if (productCustomTemplates.templates.length != 0) {
                        angular.forEach(productCustomTemplates.templates, function(item, index) {
                            if (item.option_sets.length != 0) {
                                _self.getAttributes(item.option_sets, function(res_attributes) {
                                    custom_attributes = custom_attributes.concat(res_attributes);
                                });
                            }
                        });
                        /* if (productCustomTemplates.templates[0].option_sets.length != 0) {
                            _self.getAttributes(productCustomTemplates.templates[0].option_sets, function(res_attributes) {
                                custom_attributes = res_attributes;
                            });
                        } */
                    }
                    _self.consoleLog("createArray : productCustomTemplates", productCustomTemplates);
                    _self.consoleLog("createArray : custom_attributes", custom_attributes);
                    callback(custom_attributes, true);
                },
                formatAttribute: function(index, optionSubsetIndex, setType, optionSetArray, callback) {
                    var _self = this;
                    var set_id = (setType == 'attribute') ? optionSetArray.set_id : optionSetArray.subset_id;
                    var attribute = {
                        attribute_index: index,
                        attribute_option_subset_index: optionSubsetIndex,
                        active_option_id: (optionSetArray.option_data.select_id != 0) ? optionSetArray.option_data.select_id : "-1",
                        active_option_index: -1,
                        active_option_index_str: "-1",
                        active_textarea: "",
                        active_array: [],
                        set_id: set_id,
                        name: optionSetArray.name,
                        set_type: optionSetArray.ss_type,
                        option: []
                    }
                    callback(attribute);
                },
                getOption: function(index, optionDataArray, callback) {
                    var _self = this;
                    var options = {
                        index: index,
                        ss_data_id: optionDataArray.ss_data_id,
                        name: optionDataArray.name,
                        image: optionDataArray.image,
                        price: optionDataArray.price,
                        compare_price: 0,
                        total_stock: 0
                    }
                    callback(options);
                },
                getActive: function(index, activeOptionId, activeOptionIdIn, optionDataArray, callback) {
                    var _self = this;
                    var actives_index = (optionDataArray.ss_data_id == activeOptionId) ? index : activeOptionIdIn;
                    var actives = (optionDataArray.ss_data_id != activeOptionId) ? "0" : "1";
                    callback(actives_index, actives);
                },
                getAttributes: function(optionSetArray, callback) {
                    var _self = this;
                    var attributes = [];
                    for (var index = 0; index < optionSetArray.length; index++) {
                        _self.formatAttribute(index, 0, 'attribute', optionSetArray[index], function(res_attribute) {
                            if (optionSetArray[index].option_subsets.length != 0) {
                                for (var option_subset_index = 0; option_subset_index < optionSetArray[index].option_subsets.length; option_subset_index++) {
                                    _self.formatAttribute(index, option_subset_index, res_attribute.set_type, optionSetArray[index].option_subsets[option_subset_index], function(res_attribute_sub) {
                                        var options = [];
                                        var active_option_id = -1;
                                        var active_option_array = [];
                                        for (var option = 0; option < optionSetArray[index].option_subsets[option_subset_index].option_data.options.length; option++) {
                                            _self.getOption(option, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_option) {
                                                options.push(res_option);
                                            });
                                            _self.getActive(option, res_attribute_sub.active_option_id, active_option_id, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_actives_index, res_actives) {
                                                active_option_id = res_actives_index;
                                                active_option_array.push(res_actives);
                                            });
                                        }
                                        res_attribute_sub.option = options;
                                        res_attribute_sub.active_option_index = active_option_id;
                                        res_attribute_sub.active_option_index_str = String(active_option_id);
                                        res_attribute_sub.active_array = active_option_array;
                                        attributes.push(res_attribute_sub);
                                    });
                                }
                            } else {
                                var options = [];
                                var active_option_id = -1;
                                var active_option_array = [];
                                for (var option = 0; option < optionSetArray[index].option_data.options.length; option++) {
                                    _self.getOption(option, optionSetArray[index].option_data.options[option], function(res_option) {
                                        options.push(res_option);
                                    });
                                    _self.getActive(option, res_attribute.active_option_id, active_option_id, optionSetArray[index].option_data.options[option], function(res_actives_index, res_actives) {
                                        active_option_id = res_actives_index;
                                        active_option_array.push(res_actives);
                                    });
                                }
                                res_attribute.option = options;
                                res_attribute.active_option_index = active_option_id;
                                res_attribute.active_option_index_str = String(active_option_id);
                                res_attribute.active_array = active_option_array;
                                attributes.push(res_attribute);
                            }
                        });
                    }
                    callback(attributes)
                },
                getformatQuantity: function(index, attributeCustom, callback) {
                    var _self = this;
                    var quantity = {
                        name: String(index + 1),
                        dataArray: attributeCustom
                    }
                    callback(quantity);
                },
                onClickRadio: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickRadio : index", index);
                    _self.consoleLog("onClickRadio : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickRadio : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickDropdown: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickDropdown : index", index);
                    _self.consoleLog("onClickDropdown : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickDropdown : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickCheckbox: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickCheckbox : index", index);
                    _self.consoleLog("onClickCheckbox : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i == parseInt(index_option)) ? (($scope.data.attribute_custom.dataArray[index].active_array[i] != "0") ? "0" : "1") : $scope.data.attribute_custom.dataArray[index].active_array[i];
                    }
                    _self.consoleLog("onClickCheckbox : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                }
            }
            return getFunction;
        };
        $scope.getReward = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                momentUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    callback(now);
                },
                getCalculator: function(sumProductPrice, reward, callback) {
                    var _self = this;
                    _self.consoleLog("getCalculator : sumProductPrice", sumProductPrice);
                    _self.consoleLog("getCalculator : reward", reward);
                    var point_reward = 0;
                    if (reward.type_id == "100") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    } else if (reward.type_id == "101") {
                        point_reward = reward.reward_amount;
                    } else if (reward.type_id == "102") {
                        point_reward = (reward.reward_percent * sumProductPrice.price) / 100;
                    } else if (reward.type_id == "103") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    }
                    _self.consoleLog("getCalculator : point_reward", point_reward);
                    callback(point_reward);
                },
                getProductReward: function(now, productReward, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (productReward.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(productReward.reward_lifetime.lifetime_start_time);
                        reward.lifetime_end_time = parseInt(productReward.reward_lifetime.lifetime_end_time);
                        reward.type_id = productReward.reward_type_id;
                        reward.amount = parseInt(productReward.reward_amount);
                        reward.percent = parseInt(productReward.reward_percent);
                        reward.every_price = parseInt(productReward.reward_every_price);
                    }
                    _self.consoleLog("getProductReward : reward", reward);
                    callback(reward);
                },
                getPointConfig: function(now, shopPointConfig, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (shopPointConfig.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(shopPointConfig.er_from);
                        reward.lifetime_end_time = parseInt(shopPointConfig.er_to);
                        reward.type_id = "100";
                        reward.amount = parseInt(shopPointConfig.er_earn);
                        reward.every_price = parseInt(shopPointConfig.er_rate);
                    }
                    _self.consoleLog("getPointConfig : reward", reward);
                    callback(reward);
                },
                checkPointReward: function(reward, callback) {
                    var _self = this;
                    var state = false;
                    if (reward.reward_length) {
                        var start = reward.lifetime_start_time < reward.lifetime_time && reward.lifetime_start_time != 0;
                        var end = (reward.lifetime_end_time != -1) ? reward.lifetime_time <= reward.lifetime_end_time && reward.lifetime_end_time != 0 : true;
                        if (start && end) {
                            if (reward.type_id == "100") {
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            } else if (reward.type_id == "101") {
                                var amount = reward.amount != 0;
                                if (amount) {
                                    state = true;
                                }
                            } else if (reward.type_id == "102") {
                                var percent = reward.percent != 0;
                                if (percent) {
                                    state = true;
                                }
                            } else if (reward.type_id == "103") {
                                var percent = reward.percent != 0;
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            }
                        }
                    }
                    callback(state);
                },
                checkReward: function(rewardProduct, rewardPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("checkReward : rewardProduct", rewardProduct);
                    _self.consoleLog("checkReward : rewardPointConfig", rewardPointConfig);
                    var reward = {
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    _self.checkPointReward(rewardProduct, function(res_state_product) {
                        _self.checkPointReward(rewardPointConfig, function(res_state_point_config) {
                            if (res_state_point_config) {
                                reward.type_id = rewardPointConfig.type_id;
                                reward.type_id = rewardPointConfig.type_id;
                                reward.amount = rewardPointConfig.amount;
                                reward.percent = rewardPointConfig.percent;
                                reward.every_price = rewardPointConfig.every_price;
                            } else if (res_state_product) {
                                reward.type_id = rewardProduct.type_id;
                                reward.amount = rewardProduct.amount;
                                reward.percent = rewardProduct.percent;
                                reward.every_price = rewardProduct.every_price;
                            }
                            _self.consoleLog("checkReward : reward", reward);
                            callback(reward);
                        });
                    });
                },
                checkRewardType: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.momentUnix(function(now) {
                        _self.getProductReward(now, productReward, function(res_reward_product) {
                            _self.getPointConfig(now, shopPointConfig, function(res_reward_point_config) {
                                _self.checkReward(res_reward_product, res_reward_point_config, function(res_reward) {
                                    callback(res_reward);
                                });
                            });
                        });
                    });
                },
                createReward: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("createReward : productReward", productReward);
                    _self.consoleLog("createReward : shopPointConfig", shopPointConfig);
                    _self.checkRewardType(productReward, shopPointConfig, function(res_reward) {
                        _self.consoleLog("createReward : res_reward", res_reward);
                        callback(res_reward);
                    });
                }
            }
            return getFunction;
        };
        $scope.getQuantity = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                upDateReward: function() {
                    var _self = this;
                },
                upDateReward: function() {
                    var _self = this;
                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                        $scope.data.reward.point_reward = res_point_reward;
                    });
                },
                upDatePrice: function() {
                    var _self = this;
                    var product_price = $scope.data.product_price.price * $scope.data.quantity.quantity_input;
                    var product_compare_price = $scope.data.product_compare_price.price * $scope.data.quantity.quantity_input;
                    $scope.getAttribute().checkPrice(product_price, function(res_price_ecimals) {
                        $scope.data.sum_product_price.price = product_price;
                        $scope.data.sum_product_price.price_ecimals = res_price_ecimals;
                        $scope.getAttribute().checkPrice(product_compare_price, function(res_compare_price_ecimals) {
                            $scope.data.sum_product_compare_price.price = product_compare_price;
                            $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                            var compare_price_minus_price = ((product_compare_price - product_price) > 0) ? product_compare_price - product_price : 0;
                            $scope.getAttribute().checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                _self.upDateReward();
                            });
                        });
                    });
                },
                input: function(quantityInput) {
                    var _self = this;
                    quantityInput = (quantityInput == null) ? 1 : parseInt(quantityInput);
                    _self.consoleLog("input : quantityInput", quantityInput);
                    if (quantityInput != null) {
                        if (quantityInput >= $scope.data.quantity.quantity_max) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_max;
                        }
                        if (quantityInput <= $scope.data.quantity.quantity_min) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                        }
                    } else {
                        $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                    }
                    _self.upDatePrice();
                },
                minus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input - 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_min", $scope.data.quantity.quantity_min);
                    if (quantity >= $scope.data.quantity.quantity_min) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                },
                plus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input + 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_max", $scope.data.quantity.quantity_max);
                    if (quantity <= $scope.data.quantity.quantity_max) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                }
            }
            return getFunction;
        };
        $scope.getBuy = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = params.product_id.split("-", 1).join("");
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                postApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.post(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                UiCartProductAdd: function(productId, quantityInput, promotionId, customOptions, callback) {
                    quantityInput = (quantityInput > $scope.data.quantity.quantity_max) ? $scope.data.quantity.quantity_max : quantityInput;
                    UiCart.delegate.product.add(productId, quantityInput, promotionId, function(res_data) {
                        callback(res_data);
                    });
                },
                isLogin: function(callback) {
                    var buy_login = $scope._buylogin;
                    var is_login = UiCustomerBox.delegate.get.isLogin();
                    var is_state = (buy_login) ? (!is_login) ? true : false : false;
                    callback(is_state);
                },
                formLogin: function(is_state, callback) {
                    if (is_state) {
                        $inloginPopup.open();
                    }
                    callback(is_state);
                },
                getProductStaffId(staff_id_check, callback) {
                    var res_staff_id_check = staff_id_check;
                    var res_staff_id = $scope.dataApi.product.dataArray.product_staff_id;
                    var res_is_state = (res_staff_id != 0 && res_staff_id != '0' && res_staff_id != undefined) ? true : false;
                    callback(res_staff_id_check, res_staff_id, res_is_state);
                },
                isStaffId: function(staff_id_check, callback) { /* todo */
                    var _self = this;
                    _self.getProductStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        callback(res_staff_id_check, res_staff_id, res_is_state);
                    });
                },
                checkCartDuplicateStaff: function(res_staff_id_check, txt_staff_id, res_is_state, callback) {
                    var _self = this
                    var res_is_state = true;
                    if (res_staff_id_check) {
                        var dataSend = {
                            'txt_staff_id': txt_staff_id,
                        };
                        _self.dataSend("cart/duplicate_staff", dataSend, function(res_api, res_dataSend) {
                            _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                                res_is_state = res_api.data.duplicate;
                                callback(res_is_state);
                            });
                        });
                    } else {
                        callback(res_is_state);
                    }
                },
                showAlert: function(res_staff_id_check, res_staff_id, res_is_state, res_api, callback) {
                    var res_state = (res_staff_id_check) ? ((res_api) ? ((res_is_state) ? false : true) : true) : false;
                    if (res_state) {
                        if (!res_api) {
                            if (res_staff_id != '0' && res_staff_id != 0) {
                                $scope.controlAlert().alert('002');
                            } else {
                                $scope.controlAlert().alert('003');
                            }
                        } else {
                            if (!res_is_state) {
                                $scope.controlAlert().alert('003');
                            }
                        }
                    }
                    callback(res_state);
                },
                checkStaff: function(callback) {
                    var _self = this
                    var staff_id_check = $scope._checkstaff;
                    var res_check = false;
                    _self.isStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        _self.checkCartDuplicateStaff(res_staff_id_check, res_staff_id, res_is_state, function(res_api) {
                            _self.showAlert(res_staff_id_check, res_staff_id, res_is_state, res_api, function(res_state) {
                                res_check = res_state;
                                callback(res_check);
                            });
                        });
                    });
                },
                isProgress: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isProgress(productId)) ? true : false;
                    _self.consoleLog("isProgress : productId", productId);
                    _self.consoleLog("isProgress : state", state);
                    callback(state);
                },
                isSelected: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    _self.consoleLog("isSelected : productId", productId);
                    _self.consoleLog("isSelected : state", state);
                    callback(state);
                },
                isSelectedReturn: function(productId) {
                    var _self = this;
                    var ui_cart_state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    if (!$scope.setBuy.state_active) {
                        $scope.setBuy.state_active = true;
                        var state_process = $scope.setBuy.state_process;
                        var state_step = $scope.setBuy.state_step;
                        if (ui_cart_state && !state_process && state_step != 4) /* cart */ {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_active = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else if (!ui_cart_state && !state_process && state_step != 0) /* unset */ {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_active = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        } else {
                            $scope.setBuy.state_active = false;
                        }
                    }
                    return ui_cart_state;
                },
                updateState: function(productId) {
                    _self = this;
                    _self.isSelected(productId, function(res_state) {
                        if (res_state) {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_process = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        }
                        return res_state;
                    });
                },
                uiCart: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    _self.UiCartProductAdd(productId, quantityInput, promotionId, customOptions, function(res_data) {
                        if (res_data) {
                            _self.onTimeout(500, function() {
                                _self.onPass(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            }
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onError(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onUnset(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                        });
                                    });
                                });
                            });
                        }
                    });
                },
                postApiA: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    var custom_options = {};
                    var dataSend = {
                        'txt_product_id': productId,
                        'txt_amount': quantityInput,
                        'txt_is_clear_cart_before': "0",
                        'txt_custom_options_json': JSON.stringify(custom_options)
                    };
                    _self.dataSend("cart/product_add", dataSend, function(res_api, res_dataSend) {
                        _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                            if (res_ok) {
                                _self.onTimeout(500, function() {
                                    _self.onPass(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onCart(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            });
                                        });
                                    });
                                });
                            } else {
                                _self.onTimeout(500, function() {
                                    _self.onError(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onUnset(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                            });
                                        });
                                    });
                                });
                            }
                        });
                    });
                },
                onProcess: function(data, productId, quantityInput, promotionId, customOptions) {
                    var _self = this;
                    _self.isLogin(function(res_is_login) {
                        _self.formLogin(res_is_login, function(res_form) {
                            _self.checkStaff(function(res_is_state) {
                                if (!$scope.setBuy.state_process && !res_form && !res_is_state) {
                                    $scope.setBuy.state_process = true;
                                    _self.isSelected(productId, function(res_state) {
                                        if (!res_state) {
                                            _self.onLoad($scope.setBuy.state_step, function(res_step) {
                                                if (data.sum_product_price.price != 0 && data.quantity.quantity_max != 0 && (data.attribute.state == (data.attribute.productId != ''))) {
                                                    /* UiCart */
                                                    _self.uiCart(productId, quantityInput, promotionId, customOptions, res_step);
                                                    /* api post offline */
                                                    /*_self.postApiA(productId, quantityInput, promotionId, customOptions, res_step); */
                                                } else {
                                                    _self.onTimeout(500, function() {
                                                        _self.onError(res_step, function(res_step) {
                                                            _self.onTimeout(1000, function() {
                                                                _self.onUnset(res_step, function(res_step) {
                                                                    $scope.setBuy.state_process = false;
                                                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                                                });
                                                            });
                                                        });
                                                    });
                                                }
                                            });
                                        } else {
                                            $scope.setBuy.state_process = false;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            } else if ($scope._cart == "viewcart") {
                                                _self.viewCart($scope._cart);
                                            }
                                        }
                                    });
                                }
                            });
                        });
                    });
                },
                onTimeout: function(time, callback) {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        callback(true)
                    }, time);
                },
                onUnset: function(step, callback) {
                    var _self = this;
                    step = (step == 0) ? 0 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onLoad: function(step, callback) {
                    var _self = this;
                    step = (step == 0 || step == 1) ? 1 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onPass: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 2) ? 2 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onError: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 3) ? 3 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onCart: function(step, callback) {
                    var _self = this;
                    step = (step == 2 || step == 4) ? 4 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                trumpComponentCarts: function() {
                    var controlCart = share.getTrumpComponentCarts();
                    var component_carts = $('.cover-cards').hasClass('active');
                    if (!component_carts) {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.cart();
                        }
                    } else {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.load();
                        }
                    }
                },
                viewCart: function(viewcart) {
                    var _self = this;
                    _self.pageUrl(viewcart);
                },
                locationUrlReplace: function(page) {
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                main: function(callback) {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getDetail = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getDetail: function(api, callback) {
                    var _self = this;
                    var description = api.product_description;
                    var info = api.product_more_info;
                    var specificatio = api.product_custom_title;/* [] */
                    /* if (api.product_attribute.specification_data != undefined) {
                        specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? api.product_attribute.specification_data.pclass_array : [];
                    } */
                    var state_specificatio = true;/* false */
                    /* if (api.product_attribute.specification_data != undefined) {
                        state_specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? true : false;
                    }*/
                    var state_info = true;/* (api.product_is_more_info == 1) ? true : false; */
                    _self.consoleLog("getDetail : api", api);
                    _self.consoleLog("getDetail : description", description);
                    _self.consoleLog("getDetail : info", info);
                    _self.consoleLog("getDetail : state_info", state_info);
                    _self.consoleLog("getDetail : specificatio", specificatio);
                    _self.consoleLog("getDetail : state_specificatio", state_specificatio);
                    callback(description, info, state_info, specificatio, state_specificatio);
                },
                onClickDetail: function(index) {
                    var _self = this;
                    $scope.data.detail.active = index;
                    _self.consoleLog("onClickDetail : data.detail.active", $scope.data.detail.active);
                }
            }
            return getFunction;
        };
        $scope.pages = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageName: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page_name);
                },
                pageUrl: function(page_name, id, name_url) {
                    var _self = this;
                    var page = page_name + "/" + id + "-" + name_url;
                    _self.locationUrlReplace(page);
                }
            }
            return getFunction;
        };
        $scope.countDown = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getLocation: function(callback) {
                    var _self = this;
                    var res_location = $location;
                    _self.consoleLog("getLocation", "res_location", res_location);
                    callback(res_location);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(params);
                },
                getLocationUrlNameProductDetail: function(callback) {
                    var _self = this;
                    _self.getRouteParams(function(res_params) {
                        _self.getLocation(function(res_location) {
                            var url_page_name = "/product-detail/" + res_params.product_id;
                            var res_url_name_product_detail = (res_location.url() == url_page_name) ? true : false;
                            _self.consoleLog("getLocationUrlNameProductDeal", "res_url_name_product_detail", res_url_name_product_detail);
                            callback(res_url_name_product_detail);
                        });
                    });
                },
                getUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    _self.consoleLog("getUnix", "now", now);
                    callback(now);
                },
                getCountDown: function(now, product_lifetime, callback) {
                    var _self = this;
                    var countdown_unix = parseInt(product_lifetime.lifetime_end_time) - now;
                    var milliseconds = moment.duration(countdown_unix * 1000, "milliseconds");
                    var res_countdown = ((milliseconds.days() <= 9) ? '0' + milliseconds.days() : milliseconds.days());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.hours() <= 9) ? '0' + milliseconds.hours() : milliseconds.hours());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.minutes() <= 9) ? '0' + milliseconds.minutes() : milliseconds.minutes());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.seconds() <= 9) ? '0' + milliseconds.seconds() : milliseconds.seconds());
                    _self.consoleLog("getCountDown", "res_countdown", res_countdown);
                    callback(res_countdown, countdown_unix);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                countDownByProduct: function(now, data_array, callback) {
                    var _self = this;
                    if (data_array.length != 0) {
                        if (data_array.product_lifetime.length != 0) {
                            _self.getCountDown(now, data_array.product_lifetime, function(res_count_down, res_countdown_unix) {
                                data_array.product_lifetime.lifetime_countdown = (res_countdown_unix > 0) ? res_count_down : "";
                                if (data_array.product_lifetime.lifetime_countdown == "") {
                                    _self.getNameUrl(data_array.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", data_array.product_set_array[0].product_id, res_name);
                                    });
                                }
                            });
                        }
                    }
                    _self.consoleLog("countDownByProduct", "data_array", data_array);
                    callback(data_array);
                },
                loop: function() {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        _self.getUnix(function(res_now) {
                            _self.countDownByProduct(res_now, $scope.dataApi.product.dataArray, function(data_array) {
                                $scope.dataApi.product.dataArray = data_array;
                                _self.getLocationUrlNameProductDetail(function(res_url_name_product_detail) {
                                    if (res_url_name_product_detail) {
                                        _self.loop();
                                    }
                                });
                            });
                        });
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.getPromotion = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                setPromotionId: function(promotion_id) {
                    var _self = this;
                    _self.consoleLog("setPromotionId", "promotion_id", promotion_id);
                    $scope.data.promotion.promotion_id = promotion_id;
                    _self.consoleLog("setPromotionId", "data.promotion.promotion_id", $scope.data.promotion.promotion_id);
                },
            }
            return getFunction;
        };
        $scope.control = function() {
            var getFunction = {
                popupVideo: function(state, video_link, video_embed_code) {
                    var _self = this;
                    if (video_embed_code != '') {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    } else if (video_link != '') {
                        window.open(video_link, '_blank');
                    } else {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.data_control = {
            page_video: {
                popup: false,
                shop_video_embed_code: ""
            }
        }
        $scope.control_alert = {
            alert: {
                error_id: '',
                index: null,
                state: true,
                error: [{
                    id: '001',
                    title: 'การสั่งซื้อ',
                    messages: 'สามารถสั่งซื้อได้เพียงทีละออเดอร์เท่านั้น'
                }, {
                    id: '002',
                    title: 'การเพิ่มสินค้า',
                    messages: 'ไม่สามารถเพิ่มสินค้าของร้านมากกว่า 1 ร้านค้าได้'
                }, {
                    id: '003',
                    title: 'การสั่งซื้อ',
                    messages: 'ไม่สามารถเพิ่มสินค้า(ไม่มีร้านค้า)'
                }]
            }
        };
        $scope.controlAlert = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getErrorMessages: function(error_id, callback) {
                    var _self = this;
                    var messages = {
                        res_error_id: '',
                        res_index: null
                    }
                    angular.forEach($scope.control_alert.alert.error, function(item, index) {
                        if (item.id == error_id) {
                            messages.res_error_id = item.id;
                            messages.res_index = index;
                        }
                    });
                    callback(messages.res_error_id, messages.res_index);
                },
                alert: function(error_id) {
                    var _self = this;
                    _self.getErrorMessages(error_id, function(res_error_id, res_index) {
                        $scope.control_alert.alert.error_id = res_error_id;
                        $scope.control_alert.alert.index = res_index;
                        $scope.control_alert.alert.state = (!$scope.control.alert && res_error_id != '') ? true : false;
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.countDown().loop();
        /* set carousel  */
        $scope.setCarousel = {
            carousel: 0,
            index: 0
        };
        $scope.getCarousel().getCarousel($scope.setCarousel.carousel, function(res_carousel_id) {
            $scope.setCarousel.carousel = res_carousel_id;
        });
        /* set carousel  */
        /* get product api */
        $scope.dataApi = {
            reward: {
                dataSend: {},
                api: "shop/current",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            staff: {
                dataSend: {
                    txt_staff_id: 0
                },
                api: "staff/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            product: {
                dataSend: {
                    txt_product_id: 0
                },
                api: "product/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            relation: {
                dataSend: {
                    txt_referral_id: 0
                },
                api: "referral/relation",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.data = {
            attribute: {
                state: false,
                productId: "",
                dataArray: []
            },
            attribute_custom: {
                state: false,
                dataArray: []
            },
            reward: {
                quantity_name: 'reward',
                type_id: "0",
                reward_amount: 0,
                reward_percent: 0,
                reward_every_price: 0,
                point_reward: 0
            },
            quantity: {
                quantity_name: 'quantity',
                quantity_min: 1,
                quantity_max: 1,
                quantity_input: 1,
                quantity_select: []
            },
            product_price: {
                price_name: 'product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            product_compare_price: {
                price_name: 'product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_price: {
                price_name: 'sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_price: {
                price_name: 'sum_product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_minus_sum_product_price: {
                price_name: 'sum_product_compare_minus_sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            detail: {
                active: '0',
                dataArray: [{
                    index: '0',
                    state: true,
                    en: ($scope.description != undefined && $scope.description != "") ? $scope.description : 'Description',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '1',
                    state: true,
                    en: ($scope.info != undefined && $scope.info != "") ? $scope.info : 'Info',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '2',
                    state: true,
                    en: ($scope.specification != undefined && $scope.specification != "") ? $scope.specification : 'Specification',
                    th: '',
                    data: '',
                    dataArray: []
                }]
            },
            promotion : {
                promotion_id : '0'
            }
        };
        $scope.setBuy = {
            state_active: false,
            state_process: false,
            state_step: 0,
            state_data_font_color: "",
            state_data_background_color: "",
            stepArray: [{
                step: 0,
                name: "unset",
                icon: $scope._icebuyicon,
                state: $scope._buytext,
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 1,
                name: "load",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 2,
                name: "pass",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 3,
                name: "error",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 4,
                name: "cart",
                icon: "",
                state: $scope._viewcarttext,
                data_font_color: "",
                data_background_color: "primary_darkest"
            }]
        };
        /* - get api product/id start - */
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.product.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                $scope.dataApi.product.dataSend.txt_product_id = (res_product_id != false) ? res_product_id : 0;
                $scope.getData().dataSend($scope.dataApi.product.api, $scope.dataApi.product.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_product, res_state) {
                        $scope.dataApi.product.ok = res_ok;
                        if ($scope._imageappcoverchecked) {
                            var images = [];
                            angular.forEach(get_res_api_product.data.product_image,function(image,index_image){
                                if (!image.image_app_cover_checked) {
                                    images.push(image)
                                }
                            });
                            get_res_api_product.data.product_image = images;
                        }
                        angular.element('.load-effect').removeClass('is-active');
                        $scope.dataApi.product.dataArray = get_res_api_product.data;
                        $scope.getData().consoleLog("get_res_api_product", get_res_api_product);
                        $scope.dataApi.product.dataArrayState = res_state;
                        /* -- get api shop/current to reward -- */
                        if (res_ok) {
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.reward.dataArrayState = res_state;
                                $scope.getData().dataSend($scope.dataApi.reward.api, $scope.dataApi.reward.dataSend, function(res_api, res_dataSend) {
                                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                                        $scope.dataApi.reward.ok = res_ok;
                                        $scope.dataApi.reward.dataArray = get_res_api_shop.data;
                                        $scope.dataApi.reward.dataArrayState = res_state;
                                        $scope.getReward().createReward($scope.dataApi.product.dataArray.product_reward, get_res_api_shop.data.shop_point_config, function(res_reward) {
                                            $scope.data.reward.type_id = res_reward.type_id;
                                            $scope.data.reward.reward_amount = res_reward.amount;
                                            $scope.data.reward.reward_percent = res_reward.percent;
                                            $scope.data.reward.reward_every_price = res_reward.every_price;
                                            /* --- Wait product/id ,shop/current --- */
                                            /* ---- get attribute ---- */
                                            $scope.getAttribute().productAttribute(get_res_api_product.data.product_attribute, function(res_attribute) {
                                                $scope.data.attribute.dataArray = res_attribute;
                                                $scope.getAttribute().checkMinPrices(get_res_api_product, res_attribute, function(res_data_price, res_state) {
                                                    $scope.data.attribute.state = res_state;
                                                    $scope.data.product_price = res_data_price.product_price;
                                                    $scope.data.product_compare_price = res_data_price.product_compare_price;
                                                    $scope.data.sum_product_price = res_data_price.sum_product_price;
                                                    $scope.data.sum_product_compare_price = res_data_price.sum_product_compare_price;
                                                    $scope.data.sum_product_compare_minus_sum_product_price = res_data_price.sum_product_compare_minus_sum_product_price;
                                                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                                                        $scope.data.reward.point_reward = res_point_reward;
                                                    });
                                                    /* ----- stock ----- */
                                                    $scope.data.quantity.quantity_max = res_data_price.product_price.total_stock;
                                                    $scope.data.quantity.quantity_select = [];
                                                    for (var i = 0; i < res_data_price.product_price.total_stock; i++) {
                                                        $scope.data.quantity.quantity_select.push(i + 1);
                                                    }
                                                    /* ----- stock ----- */
                                                });
                                            });
                                            /* ---- get attribute ---- */
                                            /* ---- get attribute custom ---- */
                                            $scope.getAttributeCustom().createArray(get_res_api_product.data.product_custom_templates, function(res_custom_attribute, res_state) {
                                                $scope.data.attribute_custom.state = res_state;
                                                $scope.data.attribute_custom.dataArray = res_custom_attribute;
                                            });
                                            /* ---- get attribute custom ---- */
                                            /* ---- get detail ---- */
                                            $scope.getDetail().getDetail(get_res_api_product.data, function(res_description, res_info, res_state_info, res_specificatio, res_state_specificatio) {
                                                $scope.data.detail.dataArray[0].data = res_description;
                                                $scope.data.detail.dataArray[1].data = res_info;
                                                $scope.data.detail.dataArray[1].state = res_state_info;
                                                $scope.data.detail.dataArray[2].data = res_specificatio;
                                                $scope.data.detail.dataArray[2].state = res_state_specificatio;
                                            });
                                            /* ---- get detail ---- */
                                            /* ---- update state ---- */
                                            $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                                            /* ---- update state ---- */
                                            /* --- Wait product/id ,shop/current --- */
                                        });
                                    });
                                });
                            });
                            /* -- get api shop/current to reward -- */
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.relation.dataArrayState = res_state;
                                $scope.getData().getReferralId(get_res_api_product.data.product_referral_display, function(res_referral_id) {
                                    $scope.dataApi.relation.dataSend.txt_referral_id = res_referral_id;
                                    $scope.getData().dataSend($scope.dataApi.relation.api, $scope.dataApi.relation.dataSend, function(res_api, res_dataSend) {
                                        $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_referral, res_state) {
                                            $scope.dataApi.relation.ok = res_ok;
                                            $scope.dataApi.relation.dataArray = (res_referral_id != 0) ? get_res_api_referral.data : [];
                                            $scope.dataApi.relation.dataArrayState = res_state;
                                        });
                                    });
                                });
                            });
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.getData().getStaffId(get_res_api_product.data.product_staff_id, function(res_staff) {
                                    if (res_staff.status) {
                                        $scope.dataApi.staff.dataArrayState = res_state;
                                        $scope.dataApi.staff.dataSend.txt_staff_id = res_staff.staff_id;
                                        $scope.getData().dataSend($scope.dataApi.staff.api, $scope.dataApi.staff.dataSend, function(res_api, res_dataSend) {
                                            $scope.getData().getApi(res_api, res_dataSend, function(res_ok, res, res_state) {
                                                $scope.dataApi.staff.ok = res_ok;
                                                $scope.dataApi.staff.dataArray = res.data;
                                                $scope.getData().getNameUrl(res.data.staff_first_name, function(res_staff_first_name_url) {
                                                    $scope.dataApi.staff.dataArray.staff_first_name_url = res_staff_first_name_url;
                                                    $scope.dataApi.staff.dataArrayState = res_state;
                                                });
                                            });
                                        });
                                    }
                                });
                            });
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                        } else {
                            /* ok = false */
                            if ($scope.dataApi.product.dataArray.length != 0) {
                                /* product deal to product original */
                                if ($scope.dataApi.product.dataArray.product_set_array.length != 0) {
                                    $scope.countDown().getNameUrl($scope.dataApi.product.dataArray.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", $scope.dataApi.product.dataArray.product_set_array[0].product_id, res_name);
                                    });
                                } else {
                                    $scope.pages().pageName("home");
                                }
                            } else {
                                /* product null */
                                $scope.pages().pageName("home");
                            }
                        }
                    });
                });
            });
        });
        /* - get api product/id end - */
        /* get product api */
    };
    return promise;
});
var $xZoomTimer = null;
var $xZoomInstance = false;
_ui_share_app.directive('productDetailPageL', function ($rootScope, $routeParams, sliderProvider, $http) {
    var templateName = 'productDetailPageL';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
        background:'@background',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.data = false;
        $scope.dataPreserve = false;
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        if(CUR_THEME.data.shop_id == "395"){
            var req = {
                url:"https://gaedemo101.getappeasy.com/store/api/v1/product/id?txt_product_id="+$scope._getPostIdFromURL(),
                method: "GET",
            };
            $http(req).then(function(res){
                if(res.data.ok == 1){
                    var e = res.data;
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.buildDataProductRelate($scope.id);
                }
            });
        } else {
            GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
                if(e.ok == 1){
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.buildDataProductRelate($scope._getPostIdFromURL());
                }
            });
        }
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 6,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            /*$scope.makeVariantsClick();*/
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            if($index == 0 && option_id == ''){
                return GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}).then(function(e){
                    if(e.ok == 1){
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                    $scope.findVariantsData($scope.dataVariantsPick);                
                }
            }            
        };
        $scope.findVariantsData = function(variantsPick){
            function compareArray(array_a, array) {
                if (!array)
                    return false;
                if (array_a.length != array.length)
                    return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i]))
                            return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for(var i = 0; i < dataVariants.length; i++){
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);                
                if(compareArray(variantsPick,optionJson)){ 
                    console.log("findVariantsData", dataVariants[i]);
                    $scope.data.product_id = dataVariants[i].product_id; /* Warning */
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;                
                } 
            }
            console.log("onSelectVariantItems: Yes", $scope.dataPreserve);
        };
        $rootScope.$on('repeatend',function(){
            /* Slider Send */
            /*var optionsParmas = {
                autoplay:true,
                slidesToShow:1,
                slidesToScroll:1,
                dots:false,
                arrows:false,
                infinite:true
            };
            var extraOptions = {
                animate: false
            };
            $timeout(function(){
                sliderProvider("#gallery_slider", optionsParmas, "", "", extraOptions);
            },500);
            $timeout(function(){
                $('.gallery_show_single img').xzoom({
                    Xoffset: 30,
                    tint: '#b9b5b3',
                });
            },500);*/
        });
        /* Slick Events */
        $scope._slickGoLeft = function () {
            setTimeout(function () {
                $('#gallery_slider').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            setTimeout(function () {
                $('#gallery_slider').slick('slickNext');
            }, 100);
        };
        /* Click SLick Item */
        $scope.slickGoto = function (idx) {
            setTimeout(function () {
                $('#gallery_slider').slick('slickGoTo', idx);
            }, 100);
        };
        /* Calcu Nav Arrows */
        $scope.navArrowsCalculate=function(){
            var size = (500 / 2);
            var n = (size + 18) + 20;
            return '-' + n + 'px';
        };
        $scope.navArrowWidth = function(){
            return $('#gallery_slider').width() + 'px';
        };
        /* Optimize image size by device pixel 
        * @params {size} (integer) prefer size
        * @params {image_url} (string) original image source link
        * @params {image_width} (string) original image width
        * @return string
        */
        $scope.viewOptimizeImage = function(size, image_url, image_width){
            if(window.devicePixelRatio >= 2 || parseInt(image_width) <= size){
                return image_url;
            }
            var a = image_url.split("/"), b = a[a.length - 1];
            a[a.length - 1] = 't'+size+'_' + b;
            return a.join("/");
        };
        $scope.gallerySingleViewIndex = 0;
        $scope.switchSingleView = function(idx){           
            console.log("$xZoomInstance",$xZoomInstance);
            $('.gallery_show_single').css({'transition':'all 0.3s','opacity':'0'});  
            $timeout(function(){
                $scope.gallerySingleViewIndex = idx;
                $('.gallery_show_single').css({'opacity':'1'});
            },300);
            setTimeout(function(){
                if($(window).width() >= 992){
                    
                    if($("img.zoom").attr('data-api-width') > 400 && $("img.zoom").attr('data-api-height') > 400){
                        /*$("img.zoom").ezPlus({
                            'scrollZoom':true,
                            'responsive':true,
                            'zoomWindowWidth':400,
                            'zoomWindowHeight':400,
                            'zoomWindowOffetx':30,
                        });*/
                        $xZoomInstance = $('.zoom').xzoom({
                            Xoffset: 30,
                            tint: '#b9b5b3',
                        });
                    }
                }
            },300);
        };
        $scope.viewImg = function(i){
            window.location.href=i;
        };
    };  
    return promise;
});
_ui_share_app.directive('productDetailPageM', function ($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageM';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.qtyProduct = 1;
        $scope.data = false;        
        $scope.dataPreserve = false;
        $scope.data_min = []; 
        $scope.tags_product = [];
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;             
            }
            if(typeof test === 'number' && test > 0){ 
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
            var dataSend = {
                'txt_product_id': $scope._getPostIdFromURL(),
            };
         $scope.data_video_id = false;
         if(CUR_THEME.shop_id()=="541"){
                $http.get("https://zoomcamera.getappeasy.com/store/api/v1/product/id", { params: dataSend }).then(function(res){
                    var e = res.data;
                    if(e.ok == 1){
                            console.log("product_set_array : data",e.data);
                            $scope.data = e.data;
                            $scope.dataPreserve = e.data;
                            $scope._getSupportDataCategory('category', e.data);
                            $scope.buildDataProductRelate($scope._getPostIdFromURL());
                            console.log("product_set_array : data",e.data);
                            $scope.data_video_id = $scope.data.product_id;
                            if(e.data.product_tags.length > 0){
                                $scope.tags_product = e.data.product_tags.split(",");
                                $scope.buildDataProductRelate(e.data.product_tags);
                            }
                            if(e.data.product_attribute.option_data != 0 && e.data.product_total_variant > 0){
                                if (e.data.product_attribute.option_data.variant_array.length != 0 && e.data.product_total_variant > 0) {
                                    
                                    var set_varia0 = e.data.product_attribute.option_data.variant_array[0].price;
                                    for (var i = 0; i < e.data.product_attribute.option_data.variant_array.length; i++) {
                                        if(parseInt(set_varia0) >= parseInt(e.data.product_attribute.option_data.variant_array[i].price)){
                                            set_varia0 = e.data.product_attribute.option_data.variant_array[i].price;
                                            $scope.data_min = e.data.product_attribute.option_data.variant_array[i];
                                        }
                                    }
                                    if($scope.data_min.length == 0){
                                        $scope.data_min = e.data.product_attribute.option_data.variant_array[0];
                                    }
                                   
                                    console.log("iujdishjdskd : ",$scope.data_min);
                                     $scope.buildVariantOption(e.data);
                                    $scope.buildMultipleQuantity(e.data);
                                }
                            }
                            if(e.data.product_total_variant == 0 && e.data.product_total_stock > 0){
                                $scope.names = [];
                                for (var i = 0; i < parseInt(e.data.product_total_stock); i++) {
                                    $scope.names.push(i+1);
                                }
                                console.log("nnames stock :",$scope.names);
                            }
                            if(e.data.product_total_variant == 0 && e.data.product_total_stock < 0){
                                $scope.names = [];
                                for (var i = 0; i < 20; i++) {
                                    $scope.names.push(i+1);
                                }
                                console.log("nnames stock :",$scope.names);
                            }
                            if(e.data.product_total_variant > 0){
                                $scope.names = [];
                                 for (var i = 0; i < 20; i++) {
                                    $scope.names.push(i+1);
                                }
                            }
                            if (typeof $scope.data.product_attribute.option_data !== 'undefined' && $scope.data.product_total_variant > 0) {
                                if (typeof $scope.data.product_attribute.option_data.pclass_array !== 'undefined' && $scope.data.product_attribute.option_data.pclass_array.length) {
                                   
                                    // $scope.buildMultipleQuantity(e.data);
                                }
                            }
                    }
                });
         }else{
        $componentProductDetail.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()}, function(e){
            if(e.ok == 1){
                $scope.data = e.data;
                $scope.dataPreserve = e.data;
                $scope.data_video_id = $scope.data.product_id;
                $scope._getSupportDataCategory('category', e.data);
                // $scope.buildDataProductRelate($scope._getPostIdFromURL());
                if(e.data.product_tags.length > 0){
                    $scope.buildDataProductRelate(e.data.product_tags);
                }
                if (typeof $scope.data.product_attribute.option_data !== 'undefined' && $scope.data.product_total_variant > 0) {
                            if (typeof $scope.data.product_attribute.option_data.pclass_array !== 'undefined' && $scope.data.product_attribute.option_data.pclass_array.length) {
                                $scope.buildVariantOption(e.data);
                            }
                        }
                }
            });
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.ifOptionUnSelect = function() {
            return ($('.d_qty_price.active.inin').length > 0) ? true : false;
        };
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            
            var j = {"tags":product_id,'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 8,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d).then(function(e){
                if(e.ok == 1){
                    /*$scope.dataRelate = e.data.dataList;*/
                    var d = [];
                    angular.forEach(e.data.dataList, function(item){
                        if(item.product_id !== $scope.data.product_id){
                            d.push(item);
                        }
                    });
                    $scope.dataRelate = d;
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.onSelectVariantItems(0, '');
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.testyuyu = 0;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.dsetting').addClass("active");
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._idUrl($routeParams.product_id)
                }).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {                       
                        $scope.testyuyu++;
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    $scope.testyuyu = 0;
                    $('.d_qty_not_result').removeClass("active");
                    $('.dsetting').removeClass("active");
                    $scope.findVariantsData($scope.dataVariantsPick);
                } else {
                    $scope.testyuyu = 0;
                    $('.d_qty').removeClass('active').removeClass('inin');
                    $('.d_qty_price').removeClass("active");
                    $('.d_qty_price').removeClass("inin");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            $scope._data_qty_model = 1;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var _self = dataVariants[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope.name_qty = [];
                    $scope.data.product_id = dataVariants[i].product_id;
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    $scope.data.product_total_stock = dataVariants[i].total_stock;
                    console.log("selectedOptionTextJson: option",$scope.data.product_price);
                    for (var i = 0; i < parseInt($scope.data.product_total_stock); i++) {
                                $scope.name_qty.push(i+1);
                    }
                   console.log("auysuwgdhsdgsh :",$scope.name_qty , $scope._data_qty_model);
                    $scope.switchQuantityByKey('-' + variantsPick.join('-') + '-');
                        // name_qty
                    console.log("selectedOptionTextJson: option", _self);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope.data.product_image.length; im++) {
                            if ($scope.data.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope._slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.gallery-thumbnail .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                }
                if(!compareArray(variantsPick, optionJson)){
                    count++;
                }
                if(count >= dataVariants.length){
                    // alert(count);
                    
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = 0;
                    $scope.data.product_compare_price = 0;
                   
                }
            }
            // alert(count);
        };
        $rootScope.$on('repeatend',function(){
            /* Slider Send */
            var optionsParmas = {
                autoplay:true,
                slidesToShow:1,
                slidesToScroll:1,
                dots:false,
                arrows:false,
                infinite:true
            };
            var extraOptions = {
                animate: false
            };
            $timeout(function(){
               sliderProvider("#gallery_slider", optionsParmas, "", "", extraOptions);
           },500);
        });
        /* Slick Events */
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('#gallery_slider').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('#gallery_slider').slick('slickNext');
            }, 100);
        };
        /* Click SLick Item */
        $scope.slickGoto = function (idx) {
            $timeout(function () {
                $('#gallery_slider').slick('slickGoTo', idx);
            }, 100);
        };
        /* Calcu Nav Arrows */
        $scope.navArrowsCalculate=function(){
            var size = (500 / 2);
            var n = (size + 18) + 20;
            return '-' + n + 'px';
        };
        $scope.navArrowWidth = function(){
            return $('#gallery_slider').width() + 'px';
        };
        /* Build title for Address link*/
        $scope.buildTitleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
        /* Calculate discount (simple mode)
        * @params {expensivePrice}
        * @params {salePrice}
        * @return int
        */
        $scope.calculateDiscount = function(expensivePrice, salePrice){
            var dif = expensivePrice - salePrice;
            return parseInt(dif * 100 / expensivePrice);
        };
         $scope.support_data = {
                    category: [],
                };
        $scope._getSupportDataCategory = function(type,data){
           
            var dataSend = {
                'txt_referral_id': data.product_referral_display.category[0].referral_id
            };
            GAEAPI.get('referral/relation',dataSend).then(function(e){
                if(e.ok == 1){
                    $scope.support_data.category = e.data;
                }
            });
            
        };
        /* Optimize image size by device pixel 
        * @params {size} (integer) prefer size
        * @params {image_url} (string) original image source link
        * @params {image_width} (string) original image width
        * @return string
        */
        $scope.viewOptimizeImage = function(size, image_url, image_width){
            if(window.devicePixelRatio >= 2 || parseInt(image_width) <= size){
                return image_url;
            }
            var a = image_url.split("/"), b = a[a.length - 1];
            a[a.length - 1] = 't'+size+'_' + b;
            return a.join("/");
        };
        /* Hide when visible badge */
        $scope.exceptVisibleBadge = function(objectItem){          
            var r = parseInt(objectItem.badge_id);
            var s = false;
            switch (r) {
                case 16:
                case 72:
                case 74:
                case 75:
                    s = true;
                break;
                default: 
                    s = false; 
                break;
            }
            return s;
        };
        $scope.newLoginregister = function(name){
            window.location.href=GURL.base_url()+name;       
        };
        $scope.invited = [];
        $scope.insertinvited = function(user) {
        if(user) {
            if(user.product_attribute.length != 0){
               
                if($scope.invited[0] == user.product_id){
                    return;
                }
           
                 $scope.invited.push(user.product_id);
            }else{
                alert("item can't compare");                
            }
        } else {            
             console.log("test_array :",$scope.invited);
        }
    };
        /* Display Badge Name */
        $scope.renderBadgeType = function(objectItem){
            var r = parseInt(objectItem.badge_id);
            var str = 'No Badge';
            switch(r){
                case 16: str = "FEATURED"; break;
                case 72: str = "NEW"; break;
                case 74: str = "RECOMMEND"; break;
                case 75: str = "BEST SELLER"; break;
                case 82: str = "NEW (App)"; break;
                case 83: str = "RECOMMEND (App)"; break;
                case 84: str = "BEST SELLER (App)"; break;
            }
            return str;
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index){
            $scope.data_viewTab = index;
        };
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope.currentOptionQtyPick = function(variant_key) {
           var e=1;
            // var e = angular.element('input[name="detail_qty"]');
            // if (typeof variant_key !== 'undefined') {
            //     e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            // }
            if ($('#detail_qty[variant-key="' + variant_key + '"]').val() != undefined && $('#detail_qty[variant-key="' + variant_key + '"]').val() != '' && isNaN($('#detail_qty[variant-key="' + variant_key + '"]').val())) {
                e = parseInt($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
                console.log("sudyusdysudysyususu :",e);
            }
            // if(isNaN(e)){
            //     e = 1;
            // }
            // alert(e);
            return e;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('select[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('select[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
            console.log("data_set array test : ",i);
            $scope._data_qty_selected = i;
            // parseInt(e.val());
            // alert(i);
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [],
                p = productObj.product_attribute.option_data.variant_array;
            for (var i = 0; i < p.length; i++) {
                if (p[i].status == 1 && p[i].status == 1) {
                    $scope.productQuantityMultiArray.push({
                        v_key: p[i].variant_key,
                        v_name: p[i].option_name_array[0],
                        v_qty: 1,
                        v_active: 0
                    });
                }
            }
            console.log("iufthsgsdkhfgsdkfjhd :", $scope.productQuantityMultiArray);
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');            
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                // $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $scope.viewQuantity = function() {
            var check_num = 1;
            if($(".d_qty.inin").find('select').val() != undefined && $(".d_qty.inin").find('select').val() != ''){
                 check_num = $(".d_qty.inin").find('select').val().substr(7);
            }else{
                $(".d_qty.inin").find('select').val("number:1");
                $(".d_qty.inin").find('select').selectedIndex = "2";
            }
            console.log("shdgshdgsh :",check_num);
            return parseInt(check_num);
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.outofstock = 0;
        $scope.getOutofstock = function() {
            $scope.outofstock = 1;
        };
    };  
    return promise;
});
_ui_share_app.directive('productDetailPageMa', function($rootScope, $routeParams, sliderProvider ) {
    var templateName = 'productDetailPageMa';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        fontcolor: '@fontcolor',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window , $location) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        // $scope.product_sku = "";
        // $scope.product_code = "";
        // $scope.product_price = 0;
        // $scope.product_compare_price = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.dataPreserve = res.data;
                    // $scope.product_sku = res.data.product_sku;
                    // $scope.product_code = res.data.product_code;
                    $scope.product_price = $scope.calculate(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    if(res.data.product_tags != "" && res.data.product_tags != undefined){
                        $scope.dataTag = res.data.product_tags.split(",");
                    }
                    
                    if (res.data.product_attribute.length != 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            // alert("x๊อบไข่สด");
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                        
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                    $scope.qtyCurrentSize(res.data.product_total_variant, res.data.product_total_stock);
                    // $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.redirectCheckout = function(p,q){
            window.location.href = GURL.base_url() + "checkout?pdata="+p+'-'+q;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < parseInt(product_total_stock); i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.onClickVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                var count = 0;
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope._getDataArray($scope._getIdUrl());
    };
    return promise;
});_ui_share_app.directive('productDetailPageMaeju', function($rootScope, $routeParams, $location, sliderProvider) {
    var templateName = 'productDetailPageMaeju';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon: '@icon',
        stylebutton: '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log("productDetailPageMaeju : ", name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                checkAttributeOption: function(attributeOption, attributeOptionLength, callback) {
                    var _self = this;
                    var attribute = (attributeOption.length == attributeOptionLength) ? true : false;
                    for (var i = 0; i < attributeOption.length; i++) {
                        _self.consoleLog("checkAttributeOption : attributeOption[i] : ", attributeOption[i]);
                        if (attributeOption[i] == undefined) {
                            attribute = false;
                        }
                    }
                    callback(attribute);
                },
                findVariantsData: function(attributeOption, dataVariants, attributeOptionLength, callback) {
                    var _self = this;
                    _self.consoleLog("findVariantsData : attributeOption : ", attributeOption);
                    _self.consoleLog("findVariantsData : dataVariants : ", dataVariants);
                    _self.consoleLog("findVariantsData : attributeOptionLength : ", attributeOptionLength);
                    _self.checkAttributeOption(attributeOption, attributeOptionLength, function(res_attribute_option) {
                        _self.consoleLog("checkAttributeOption : callback : res_attribute_option ", res_attribute_option);
                        var variantsOut = [];
                        for (var i = 0; i < dataVariants.length; i++) {
                            var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                            if (_self.compareArray(attributeOption, optionJson)) {
                                _self.consoleLog("findVariantsData : dataVariants[i] : ", dataVariants[i]);
                                variantsOut = dataVariants[i];
                                break;
                            }
                        }
                        callback(variantsOut, res_attribute_option);
                    });
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var _self = this;
                    var state = true;
                    _self.consoleLog("checkTotalStock : index : ", stateIn);
                    _self.consoleLog("checkTotalStock : quantity_max : ", quantity_max);
                    if (stateIn == false && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, $scope.attribute.attributeOption.length, function(variantsOut, res_attribute_option) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                _self.consoleLog("onClickOption : if : findVariantsData : res_attribute_option : ", res_attribute_option);
                                if (variantsOut.length != 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = variantsOut.product_id;
                                    $scope.dataArray.product_sku = variantsOut.sku;
                                    $scope.dataProductBuy.price = variantsOut.price;
                                    $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                    $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                    if (variantsOut.variant_image != 0) {
                                        if ($scope.dataArray.product_image.length != 0) {
                                            for (var i = 0; i < $scope.dataArray.product_image.length; i++) {
                                                $scope.dataArray.product_image[i].image_id
                                                if ($scope.dataArray.product_image[i].image_id == variantsOut.variant_image[0].image_id) {
                                                    $scope.slickImageGoto(i);
                                                }
                                            }
                                        }
                                    }
                                    _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                        _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                            $scope.buy.state = state;
                                            if ($scope.attribute.variantsTotal != 0) {
                                                $scope.buy.attribute = true;
                                            }
                                        });
                                    });
                                } else if (variantsOut.length == 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = 0;
                                    $scope.dataArray.product_sku = '';
                                    $scope.dataProductBuy.price = 0;
                                    $scope.dataArray.product_compare_price = 0;
                                    $scope.dataProductBuy.quantity_max = 1;
                                    $scope.buy.state = true;
                                    $scope.buy.attribute = true;
                                }
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 100);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log('productDetailPageMaeju : ', name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    product_referral_display.category = (product_referral_display.category != '' && product_referral_display.category != undefined) ? product_referral_display.category : [];
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = true;
                    if (stateIn == true && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                checkPriceMin: function(variant, callback) {
                    var _self = this;
                    var priceMin = parseFloat(variant[0].price);
                    var comparePriceMin = parseFloat(variant[0].compare_price);
                    for (var i = 0; i < variant.length; i++) {
                        _self.consoleLog('checkPriceMin : priceMin : ', priceMin);
                        _self.consoleLog('checkPriceMin : variant[i].price : ', variant[i].price);
                        if (priceMin >= parseFloat(variant[i].price)) {
                            priceMin = parseFloat(variant[i].price);
                            comparePriceMin = parseFloat(variant[i].compare_price);
                        }
                    }
                    callback(priceMin, comparePriceMin);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.referralMapState = _self.stateData(true, false);
                    var dataSend = {
                        'txt_referral_type_id': 11,
                        'txt_sortby': 'referral_sort_index_asc_name_asc'
                    };
                    _self.dataSend('referral/map', dataSend, function(api, dataSend) {
                        _self.getApi(api, dataSend, function(output) {
                            $scope.referralMap = output.data;
                            $scope.referralMapState = _self.stateData(false, true);
                        });
                    });
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        if (output.data.length != 0) {
                            _self.consoleLog("   : output : ", output.data);
                            _self.quantity(output.data.product_total_stock, function(total_stock) {
                                _self.consoleLog("quantity : total_stock : ", total_stock);
                                $scope.dataProductBuy.quantity_max = total_stock;
                                $scope.dataArray = output.data;
                                _self.productTab(output.data.product_tags, function(productTab) {
                                    $scope.dataArrayTags = productTab;
                                    _self.showTab(output.data, function(description, info) {
                                        $scope.showTab.dataTab[0].data = description;
                                        $scope.showTab.dataTab[1].data = info;
                                    });
                                    _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                        _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                        _self.consoleLog("getAttribute : attribute : ", attribute);
                                        _self.consoleLog("getAttribute : variants : ", variants);
                                        _self.checkOption(variants_total, function(state) {
                                            _self.checkTotalStock(state, total_stock, function(state) {
                                                $scope.buy.state = state;
                                                $scope.attribute.attributeOption = attribute;
                                                $scope.attribute.dataVariants = variants;
                                                $scope.attribute.variantsTotal = variants_total;
                                                if (variants_total > 0) {
                                                    _self.checkPriceMin(variants, function(res_price, res_compare_price) {
                                                        $scope.dataProductBuy.price = res_price;
                                                        $scope.dataProductBuy.sumprice = res_price;
                                                        $scope.dataArray.product_compare_price = res_compare_price;
                                                    });
                                                } else {
                                                    $scope.dataProductBuy.price = output.data.product_price;
                                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                                }
                                            });
                                        });
                                    });
                                    _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                        _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                        $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                        if (quantity_break.length) {
                                            $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                        }
                                    });
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                        $scope.dataArrayState = _self.stateData(false, true);
                                    });
                                });
                            });
                        } else {
                            window.history.back();
                        }
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
        $scope.tab_id = 0;
        $scope.tabId = function(id) {
            $scope.tab_id = id;
        };
        $scope.routeParams = function() {
            return $routeParams || false;
        };
        $scope.categoriesData = $scope.routeParams().referral_id || '';
        $scope.setDataCategories = function(input) {
            $scope.categoriesData = input;
            var page = "category-lists";
            if (typeof $scope.categoriesData != 'undefined' && $scope.categoriesData !== "") {
                page += '?root_id=' + '0';
                page += '&referral_id=' + $scope.categoriesData;
            } else {
                delete $scope.categoriesDat;
            }
            $location.url(page).replace();
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageMb', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageMb';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        datafont: '@datafont',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $location) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.data_min = "";
        $scope.data_video_id = false;
        // $scope.product_sku = "";
        // $scope.product_code = "";
        // $scope.product_price = 0;
        // $scope.product_compare_price = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/id', dataSend, $scope).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.dataPreserve = res.data;
                    $scope.data_video_id = res.data.product_id;
                    // $scope.product_sku = res.data.product_sku;
                    // $scope.product_code = res.data.product_code;
                    $scope.product_price = $scope.calculate(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.dataTag = res.data.product_tags.split(",");
                    if (res.data.product_attribute.length != 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            // alert("x๊อบไข่สด");
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                    /*$scope.sale($scope._dataArray.product_price,
                                $scope._dataArray.product_compare_price,
                                $scope._dataArray.product_discount.discount_id,
                                $scope._dataArray.product_discount.discount_price,
                                $scope._dataArray.product_discount.discount_percent);
                    */
                    $scope.qtyCurrentSize(res.data.product_total_variant, res.data.product_total_stock);
                    // $scope.buildVariantOption(res.data);
                }
                var t = $interval(function() {
                    if ($scope._uniqueKey !== "") {
                        $interval.cancel(t);
                        var tt = $timeout(function() {
                            $timeout.cancel(tt);
                            $scope.mkCarousel();
                        }, 300);
                    }
                }, 500);
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $rootScope.$on('repeatend', function() {
            /* Check Lightbox Enable/Disable */
            $('a[data-photo-index]').each(function(idx, obj) {
                $(this).attr('data-lightbox', 'view-gallery');
            });
        });
        $scope.mkCarousel = function() {
            var elementName = '.component_carousel_map[data-id="' + $scope._key() + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                centerMode: true,
                centerPadding: '0px',
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: true,
                infinite: true,
                /*prevArrow: ' ',
                nextArrow: '
',
                nextArrow: ' ',*/
                responsive: [{
                    breakpoint: 768,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 1
                    }
                }, {
                    breakpoint: 480,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 1
                    }
                }]
            };
            var extraOptions = {
                animate: false
            };
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.redirectCheckout = function(p, q) {
            window.location.href = GURL.base_url() + "checkout?pdata=" + p + '-' + q;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            /* alert(price); */
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < parseInt(product_total_stock); i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            console.log("buildVariantOption objectData : ", objectData);
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            if ($scope.dataOption.length == 1) {
                console.log("buildVariantOption objectData.length : ", $scope.dataOption.length);
                setTimeout(function() {
                    $scope.totalStock($scope.dataOption.length, $scope.dataVariants, 0, 0);
                }, 1000);
            }
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.displayView = function(id, statusClass, status) {
            var option;
            if (id != "0") {
                option = $('.text_4.variantSelector .t_2 .items' + '[data-option=' + id + ']');
            } else {
                option = $('.text_4.variantSelector .t_2 .items');
            }
            if (statusClass == 'add') {
                if (!option.hasClass(status)) {
                    option.addClass(status);
                }
            } else if (statusClass == 'remove') {
                if (option.hasClass(status)) {
                    option.removeClass(status);
                }
            } else if (statusClass == 'reset') {
                if (option.hasClass(status)) {
                    option.removeClass(status);
                }
            }
        };
        $scope.totalStock = function(dataVariantsPickLength, dataVariants, $index, option_id) {
            console.log("totalStock : dataVariantsPickLength : ", dataVariantsPickLength);
            console.log("totalStock : dataVariants : ", dataVariants);
            console.log("totalStock : $index : ", $index, " option_id : ", option_id);
            var dataVariants = $scope.dataVariants;
            $scope.displayView('0', 'reset', 'zero');
            for (var i = 0; i < dataVariants.length; i++) {
                var array_option_id = angular.fromJson(dataVariants[i].option_id_json);
                console.log("totalStock : for : array_option_id : ", array_option_id);
                console.log("totalStock : for : dataVariantsPickLength : ", dataVariantsPickLength);
                if (dataVariantsPickLength > 1) {
                    if (array_option_id[$index] == option_id) {
                        /* console.log("totalStock : for : if : array_option_id[", $index, "]", array_option_id[$index]); */
                        console.log("totalStock : for : if : if : array_option_id : ", array_option_id);
                        console.log("totalStock : for : if : if : dataVariants : [", i, "] :", dataVariants[i]);
                        for (var j = 0; j < array_option_id.length; j++) {
                            if (j != $index && dataVariants[i].total_stock == 0) {
                                $scope.displayView(array_option_id[j], 'add', 'zero');
                            } else {
                                $scope.displayView(array_option_id[j], 'remove', 'zero');
                            }
                        }
                    }
                } else {
                    /* console.log("totalStock : for : if : array_option_id[", $index, "]", array_option_id[$index]); */
                    console.log("totalStock : for : else : if : array_option_id : ", array_option_id);
                    console.log("totalStock : for : else : if : dataVariants : [", i, "] :", dataVariants[i]);
                    for (var j = 0; j < array_option_id.length; j++) {
                        console.log("totalStock : for : else : if : dataVariants : [", i, "] :", dataVariants[i].total_stock);
                        if (dataVariants[i].total_stock == 0) {
                            $scope.displayView(array_option_id[j], 'add', 'zero');
                        } else {
                            $scope.displayView(array_option_id[j], 'remove', 'zero');
                        }
                    }
                }
            }
        };
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems : ", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems : dataVariantsPick.length : ", $scope.dataVariantsPick.length);
            console.log("onSelectVariantItems : dataOption.length : ", $scope.dataOption.length);
            console.log("onSelectVariantItems : dataVariantsPick : ", $scope.dataVariantsPick);
            console.log("onSelectVariantItems : dataOption : ", $scope.dataOption);
            $scope.totalStock($scope.dataVariantsPick.length, $scope.dataVariants, $index, option_id);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            console.log("findVariantsData : variantsPick : ", variantsPick);
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            console.log("findVariantsData : dataVariants : ", dataVariants);
            for (var i = 0; i < dataVariants.length; i++) {
                console.log("findVariantsData : for : dataVariants[", i, "] :", dataVariants[i]);
                var _self = dataVariants[i];
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("findVariantsData : for : optionJson[", i, "].option_id_json :", angular.fromJson(dataVariants[i].option_id_json));
                var count = 0;
                if (compareArray(variantsPick, optionJson)) {
                    console.log("findVariantsData : compareArray : ", compareArray(variantsPick, optionJson));
                    console.log("findVariantsData : for : if : dataVariants[", i, "] :", dataVariants[i]);
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope._dataArray.product_image.length; im++) {
                            if ($scope._dataArray.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                // $scope._slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.block-gallery .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope.switchSingleView = function(idx) {
            console.log("$xZoomInstance", $xZoomInstance);
            $('.gallery_show_single').css({
                'transition': 'all 0.3s',
                'opacity': '0'
            });
            $timeout(function() {
                $scope.gallerySingleViewIndex = idx;
                $('.gallery_show_single').css({
                    'opacity': '1'
                });
            }, 300);
            setTimeout(function() {
                if ($(window).width() >= 992) {
                    if ($("img.zoom").attr('data-api-width') > 400 && $("img.zoom").attr('data-api-height') > 400) {
                        /*$("img.zoom").ezPlus({
                            'scrollZoom':true,
                            'responsive':true,
                            'zoomWindowWidth':400,
                            'zoomWindowHeight':400,
                            'zoomWindowOffetx':30,
                        });*/
                        $xZoomInstance = $('.zoom').xzoom({
                            Xoffset: 30,
                            tint: '#b9b5b3',
                        });
                    }
                }
            }, 300);
        };
        $scope.gallerySingleViewIndex = 0;
        $scope.switchSingleView = function(idx) {
            console.log("$xZoomInstance", $xZoomInstance);
            $('.gallery_show_single').css({
                'transition': 'all 0.3s',
                'opacity': '0'
            });
            $timeout(function() {
                $scope.gallerySingleViewIndex = idx;
                $('.gallery_show_single').css({
                    'opacity': '1'
                });
            }, 300);
            setTimeout(function() {
                if ($(window).width() >= 992) {
                    if ($("img.zoom").attr('data-api-width') > 400 && $("img.zoom").attr('data-api-height') > 400) {
                        /*$("img.zoom").ezPlus({
                            'scrollZoom':true,
                            'responsive':true,
                            'zoomWindowWidth':400,
                            'zoomWindowHeight':400,
                            'zoomWindowOffetx':30,
                        });*/
                        $xZoomInstance = $('.zoom').xzoom({
                            Xoffset: 30,
                            tint: '#b9b5b3',
                        });
                    }
                }
            }, 300);
        };
        $scope.viewOptimizeImage = function(size, image_url, image_width) {
            if (window.devicePixelRatio >= 2 || parseInt(image_width) <= size) {
                return image_url;
            }
            var a = image_url.split("/"),
                b = a[a.length - 1];
            a[a.length - 1] = 't' + size + '_' + b;
            return a.join("/");
        };
        $scope._getDataArray($scope._getIdUrl());
    };
    return promise;
});_ui_share_app.directive('productDetailPageMc', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageMc';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon: '@icon',
        stylebutton: '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log("productDetailPageMaeju : ", name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                checkAttributeOption: function(attributeOption, attributeOptionLength, callback) {
                    var _self = this;
                    var attribute = (attributeOption.length == attributeOptionLength) ? true : false;
                    for (var i = 0; i < attributeOption.length; i++) {
                        _self.consoleLog("checkAttributeOption : attributeOption[i] : ", attributeOption[i]);
                        if (attributeOption[i] == undefined) {
                            attribute = false;
                        }
                    }
                    callback(attribute);
                },
                findVariantsData: function(attributeOption, dataVariants, attributeOptionLength, callback) {
                    var _self = this;
                    _self.consoleLog("findVariantsData : attributeOption : ", attributeOption);
                    _self.consoleLog("findVariantsData : dataVariants : ", dataVariants);
                    _self.consoleLog("findVariantsData : attributeOptionLength : ", attributeOptionLength);
                    _self.checkAttributeOption(attributeOption, attributeOptionLength, function(res_attribute_option) {
                        _self.consoleLog("checkAttributeOption : callback : res_attribute_option ", res_attribute_option);
                        var variantsOut = [];
                        for (var i = 0; i < dataVariants.length; i++) {
                            var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                            if (_self.compareArray(attributeOption, optionJson)) {
                                _self.consoleLog("findVariantsData : dataVariants[i] : ", dataVariants[i]);
                                variantsOut = dataVariants[i];
                                break;
                            }
                        }
                        callback(variantsOut, res_attribute_option);
                    });
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var _self = this;
                    var state = true;
                    _self.consoleLog("checkTotalStock : index : ", stateIn);
                    _self.consoleLog("checkTotalStock : quantity_max : ", quantity_max);
                    if (stateIn == false && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, $scope.attribute.attributeOption.length, function(variantsOut, res_attribute_option) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                _self.consoleLog("onClickOption : if : findVariantsData : res_attribute_option : ", res_attribute_option);
                                if (variantsOut.length != 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = variantsOut.product_id;
                                    $scope.dataArray.product_sku = variantsOut.sku;
                                    $scope.dataProductBuy.price = variantsOut.price;
                                    $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                    $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                    if (variantsOut.variant_image != 0) {
                                        if ($scope.dataArray.product_image.length != 0) {
                                            for (var i = 0; i < $scope.dataArray.product_image.length; i++) {
                                                $scope.dataArray.product_image[i].image_id
                                                if ($scope.dataArray.product_image[i].image_id == variantsOut.variant_image[0].image_id) {
                                                    $scope.slickImageGoto(i);
                                                }
                                            }
                                        }
                                    }
                                    _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                        _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                            $scope.buy.state = state;
                                            if ($scope.attribute.variantsTotal != 0) {
                                                $scope.buy.attribute = true;
                                            }
                                        });
                                    });
                                } else if (variantsOut.length == 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = 0;
                                    $scope.dataArray.product_sku = '';
                                    $scope.dataProductBuy.price = 0;
                                    $scope.dataArray.product_compare_price = 0;
                                    $scope.dataProductBuy.quantity_max = 1;
                                    $scope.buy.state = true;
                                    $scope.buy.attribute = true;
                                }
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 100);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log('productDetailPageMaeju : ', name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = true;
                    if (stateIn == true && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                checkPriceMin: function(variant, callback) {
                    var _self = this;
                    var priceMin = parseFloat(variant[0].price);
                    var comparePriceMin = parseFloat(variant[0].compare_price);
                    for (var i = 0; i < variant.length; i++) {
                        _self.consoleLog('checkPriceMin : priceMin : ', priceMin);
                        _self.consoleLog('checkPriceMin : variant[i].price : ', variant[i].price);
                        if (priceMin >= parseFloat(variant[i].price)) {
                            priceMin = parseFloat(variant[i].price);
                            comparePriceMin = parseFloat(variant[i].compare_price);
                        }
                    }
                    callback(priceMin, comparePriceMin);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        if (output.data.length != 0) {
                            _self.consoleLog("   : output : ", output.data);
                            _self.quantity(output.data.product_total_stock, function(total_stock) {
                                _self.consoleLog("quantity : total_stock : ", total_stock);
                                $scope.dataProductBuy.quantity_max = total_stock;
                                $scope.dataArray = output.data;
                                _self.productTab(output.data.product_tags, function(productTab) {
                                    $scope.dataArrayTags = productTab;
                                    _self.showTab(output.data, function(description, info) {
                                        $scope.showTab.dataTab[0].data = description;
                                        $scope.showTab.dataTab[1].data = info;
                                    });
                                    _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                        _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                        _self.consoleLog("getAttribute : attribute : ", attribute);
                                        _self.consoleLog("getAttribute : variants : ", variants);
                                        _self.checkOption(variants_total, function(state) {
                                            _self.checkTotalStock(state, total_stock, function(state) {
                                                $scope.buy.state = state;
                                                $scope.attribute.attributeOption = attribute;
                                                $scope.attribute.dataVariants = variants;
                                                $scope.attribute.variantsTotal = variants_total;
                                                if (variants_total > 0) {
                                                    _self.checkPriceMin(variants, function(res_price, res_compare_price) {
                                                        $scope.dataProductBuy.price = res_price;
                                                        $scope.dataProductBuy.sumprice = res_price;
                                                        $scope.dataArray.product_compare_price = res_compare_price;
                                                    });
                                                } else {
                                                    $scope.dataProductBuy.price = output.data.product_price;
                                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                                }
                                            });
                                        });
                                    });
                                    _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                        _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                        $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                        if (quantity_break.length) {
                                            $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                        }
                                    });
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                        $scope.dataArrayState = _self.stateData(false, true);
                                    });
                                });
                            });
                        } else {
                            window.history.back();
                        }
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
        $scope.tab_id = 0;
        $scope.tabId = function(id) {
            $scope.tab_id = id;
        };
        $scope.routeParams = function() {
            return $routeParams || false;
        };
        $scope.categoriesData = $scope.routeParams().referral_id || '';
        $scope.setDataCategories = function(input) {
            $scope.categoriesData = input;
            var page = "category-lists";
            if (typeof $scope.categoriesData != 'undefined' && $scope.categoriesData !== "") {
                page += '?root_id=' + '0';
                page += '&referral_id=' + $scope.categoriesData;
            } else {
                delete $scope.categoriesDat;
            }
            $location.url(page).replace();
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageMhp', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageMhp';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                findVariantsData: function(attributeOption, dataVariants, callback) {
                    var _self = this;
                    var variants = dataVariants;
                    _self.consoleLog("findVariantsData : variants : ", variants);
                    var variantsOut = [];
                    for (var i = 0; i < variants.length; i++) {
                        var optionJson = angular.fromJson(variants[i].option_id_json);
                        if (_self.compareArray(attributeOption, optionJson)) {
                            _self.consoleLog("findVariantsData : variants[i] : ", variants[i]);
                            variantsOut = variants[i];
                            break;
                        }
                    }
                    callback(variantsOut);
                },
                checkOption: function(variants_total, callback) {
                    var state = false;
                    if (variants_total == 0) {
                        state = true;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = false;
                    if (stateIn == false && quantity_max > 0) {
                        state = true;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, function(variantsOut) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                $scope.dataArray.product_id = variantsOut.product_id;
                                $scope.dataArray.product_sku = variantsOut.sku;
                                $scope.dataArray.product_price = variantsOut.price;
                                $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                    _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                        $scope.buy.state = state;
                                        if ($scope.attribute.variantsTotal != 0) {
                                            $scope.buy.attribute = true;
                                        }
                                    });
                                });
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 999;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = false;
                    if (variants_total == 0) {
                        state = true;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = false;
                    if (stateIn == true && quantity_max > 0) {
                        state = true;
                    }
                    callback(state);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        _self.consoleLog("getDataProductArray : output : ", output.data);
                        _self.quantity(output.data.product_total_stock, function(total_stock) {
                            _self.consoleLog("quantity : total_stock : ", total_stock);
                            $scope.dataProductBuy.quantity_max = total_stock;
                            $scope.dataArray = output.data;
                            _self.productTab(output.data.product_tags, function(productTab) {
                                $scope.dataArrayTags = productTab;
                                _self.showTab(output.data, function(description, info) {
                                    $scope.showTab.dataTab[0].data = description;
                                    $scope.showTab.dataTab[1].data = info;
                                });
                                _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                    _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                    _self.consoleLog("getAttribute : attribute : ", attribute);
                                    _self.consoleLog("getAttribute : variants : ", variants);
                                    _self.checkOption(variants_total, function(state) {
                                        _self.checkTotalStock(state, total_stock, function(state) {
                                            $scope.buy.state = state;
                                            $scope.attribute.attributeOption = attribute;
                                            $scope.attribute.dataVariants = variants;
                                            $scope.attribute.variantsTotal = variants_total;
                                        });
                                    });
                                });
                                $scope.dataProductBuy.price = output.data.product_price;
                                $scope.dataProductBuy.sumprice = output.data.product_price;
                                _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                    _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                    $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                    if (quantity_break.length) {
                                        $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                    }
                                });
                                _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                    _self.consoleLog("getNavigationBar : output : ", output.data);
                                    $scope.navigationBar = output.data;
                                    $scope.dataArrayState = _self.stateData(false, true);
                                });
                            });
                        });
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
    };
    return promise;
});_ui_share_app.directive('productDetailPageN', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageN';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        id: '@id',
        imgcart: '@imgcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.qtyProduct = 1;
        $scope.result_price = 0;
        $scope.checkQty = function() {
            var productQuantityBreak = GAEAPI.getValueForKey($scope.data, "product_quantity_break", []);
            var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
            var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
            console.log("quantityBreak : ", $scope.data);
            for (var index in quantityBreak) {
                var rowData = quantityBreak[index];
                var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                if ($scope.qtyProduct >= amount_end) {
                    $scope.result_price = unit_price;
                }
            }
        };
        $scope.checkSeo = function() {
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* JQ: Scroll event */
        angular.element($window).bind('scroll', function() {
            if (!$scope.data) {
                return;
            }
            var curPos = ($(document).scrollTop());
            var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));
            console.debug("Cur pos", curPos, properHeight);
            if (curPos > properHeight) {
                angular.element('.block-background .bottom-info').addClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */
        $scope.data_tag = [];
        $scope.data = false;
        $scope.dataPreserve = false;
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope._dataArrayTags = [];
        /* getProductId */
        $scope.getQuantityBreak = function(dataSend, api, callback) {
            console.log("getQuantityBreak : dataSend : ", dataSend, " api : ", api);
            var quantity_break = [];
            GAEAPI.get(api, dataSend).then(function(output) {
                console.log("getQuantityBreak : output : ", output);
                if (output.ok == 1) {
                    quantity_break = output.data.quantity_break;
                    callback(quantity_break);
                }
                callback(quantity_break);
            });
            callback(quantity_break);
        };
        $scope.getProductId = function(statusLogin, customerId, dataSend, api) {
            console.log("getProductId : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
            GAEAPI.get(api, dataSend).then(function(output) {
                console.log("getProductId : output : ", output);
                if (output.ok == 1) {
                    if (output.data != undefined) {
                        console.log("getProductId : output.data : ", output.data);
                        $scope.data = output.data;
                        $scope.dataPreserve = output.data;
                        /* product_tags */
                        if (output.data.product_tags != undefined) {
                            if (output.data.product_tags != "") {
                                $scope._dataArrayTags = output.data.product_tags.split(",");
                                /* split(","); */
                                if ($scope._dataArrayTags == 1 && $scope._dataArrayTags[0] != "") {
                                    $scope.data_tag = (output.data.product_tags).split(",");
                                }
                            }
                        }
                        /* product_referral_display */
                        if (output.data.product_referral_display != undefined) {
                            if (output.data.product_referral_display.length) {
                                $scope._getSupportDataCategory(output.data);
                            }
                        }
                        /* Option */
                        $scope.buildVariantOption(output.data);
                        /* ProductRelate */
                        $scope.buildDataProductRelate(dataSend.txt_product_id);
                        /* product_quantity_break */
                        $scope.checkLogin('product/quantity_break', dataSend.txt_product_id, statusLogin, function(statusLogin, customerId, dataSend, api) {
                            console.log("getProductId checkLogin callback : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                            if (statusLogin) {
                                console.log("getProductId checkLogin : IF");
                                $scope.getQuantityBreak(dataSend, api, function(quantity_break) {
                                    console.log("getProductId checkLogin callback getQuantityBreak : quantity_break : ", quantity_break);
                                    $scope.data.product_quantity_break.quantity_break = quantity_break;
                                    if (quantity_break.length) {
                                        $scope.result_price = quantity_break[0].unit_price;
                                    }
                                });
                            } else {
                                console.log("getProductId checkLogin : ELSE")
                            }
                        });
                    }
                }
            });
        };
        $scope.checkLogin = function(urlApi, product_id, status_login, callback) {
            var dataSend = {};
            var productId = parseInt(product_id);
            var statusLogin = status_login;
            var api = urlApi;
            var customerId = 0;
            if (api == 'product/id') {
                dataSend = {
                    'txt_product_id': productId,
                }
                console.log("checkLogin : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                callback(statusLogin, customerId, dataSend, api);
            } else if (api == 'product/quantity_break') {
                if (statusLogin) {
                    customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                    dataSend = {
                        'txt_product_id': productId,
                        'txt_customer_id': customerId,
                    }
                    console.log("checkLogin : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                    callback(statusLogin, customerId, dataSend, api);
                } else {
                    console.log("checkLogin : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                    callback(statusLogin, customerId, dataSend, api);
                }
            }
        };
        $scope.checkLogin('product/id', $scope._getPostIdFromURL(), UiCustomerBox.delegate.get.isLogin(), function(statusLogin, customerId, dataSend, api) {
            console.log("checkLogin callback : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
            $scope.getProductId(statusLogin, customerId, dataSend, api);
        });
        /* getProductId */
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id) {
            var j = {
                'relate_product_id_array': [product_id],
                'badge_id_array': [18]
            };
            var d = {
                'cur_page': 1,
                'per_page': 6,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate", $scope.dataRelate);
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope.checkColorConfig = function() {
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._makeProductToCarousel();
                }, 500);
            }
        });
        $scope.qty_original = 1;
        $scope.qty_current = 1;
        /* Click SLick Item */
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        /* Calcu Nav Arrows */
        $scope.maxHeight = 0;
        $scope.navArrowsCalculate = function() {
            var size = ($('img.img_gallery').eq(0).height() / 2);
            $scope.maxHeight = (size + 18);
            $('img.img_gallery').each(function() {
                if ($(this).height() > $scope.maxHeight) {
                    $scope.maxHeight = $(this).height();
                }
            });
            return '-' + $scope.maxHeight + 'px';
        };
        $scope.navArrowWidth = function() {
            return $('#gallery_display').width() + 'px';
        };
        $scope.viewType = 'description';
        var selector = '.nav li';
        $(selector).on('click', function() {
            $(selector).removeClass('active');
            $(this).addClass('active');
        });
        $scope.toTop = function() {
            return window.scrollTo(0, 0);
        };
        $scope._page_lists = false;
        $scope._page_lists_load = false;
        $scope._get_page_lists = function() {
            $scope._clear_page_lists();
            var dataSend = {
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'page_lastest_create'
            };
            GAEAPI.get('page/lists', dataSend).then(function(res) {
                $scope._page_lists_load = true;
                if (res.ok === 1) {
                    $scope._page_lists = res.data.dataList;
                    angular.forEach($scope._page_lists, function(item, key) {
                        if (item.page_search_url == "") {
                            item.page_search_url = item.page_id;
                        }
                    });
                }
            });
        };
        $scope.support_data = {
            category: [],
        };
        $scope._getSupportDataCategory = function(data) {
            console.log("_getSupportDataCategory : data : ", data);
            console.log("_getSupportDataCategory : data : ", data.product_referral_display);
            var dataSend = {
                'txt_referral_id': data.product_referral_display.category[0].referral_id
            };
            console.log("_getSupportDataCategory : dataSend : ", dataSend);
            GAEAPI.get('referral/relation', dataSend).then(function(e) {
                if (e.ok == 1) {
                    $scope.support_data.category = e.data;
                    console.log("dyfsyhfgdhfd :", $scope.support_data.category);
                }
            });
        };
        $scope._clear_page_lists = function() {
            $scope._page_lists = false;
            $scope._page_lists_load = false;
        };
        $scope._get_page_lists();
        $scope._page_category = false;
        $scope._page_category_load = false;
        $scope._get_page_category = function() {
            $scope._clear_page_lists();
            var dataSend = {
                'txt_referral_type_id': 11,
                'txt_sortby': 'referral_name_a-z'
            };
            GAEAPI.get('referral/map', dataSend).then(function(res) {
                $scope._page_category_load = true;
                if (res.ok === 1) {
                    $scope._page_category = res.data;
                }
            });
        };
        $scope._clear_page_category = function() {
            $scope._page_category = false;
            $scope._page_category_load = false;
        };
        $scope._get_page_category();
        $scope._testdata = [{
            id: '1',
            Buy: '1',
            Price: '699',
            Discount: '0%'
        }, {
            id: '2',
            Buy: '3',
            Price: '550',
            Discount: '10%'
        }, {
            id: '3',
            Buy: '6',
            Price: '530',
            Discount: '15%'
        }, {
            id: '4',
            Buy: '12',
            Price: '520',
            Discount: '16%'
        }, {
            id: '5',
            Buy: '50',
            Price: '510',
            Discount: '17%'
        }];
        $scope._get_page_category();
        $scope.mkCarouselData = function(elem) {
            console.debug('mkCarouselData: trigger');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    slidesToShow: 5,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    prevArrow: '',
                    nextArrow: '',
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 5,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 5,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: 5,
                        }
                    }, {
                        breakpoint: 692,
                        settings: {
                            slidesToShow: 6,
                        }
                    }, {
                        breakpoint: 540,
                        settings: {
                            slidesToShow: 3,
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope._indata = $scope._testdata[0].id;
        $scope._indataPrice = $scope._testdata[0].Price;
        $scope._inputdata = function(data, Price) {
            $scope._indata = data;
            $scope._indataPrice = Price;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.invited = [];
        $scope.insertinvited = function(user) {
            if (user.isChecked[user.product_id]) {
                if (user.product_attribute.length != 0) {
                    $scope.invited.push(user.product_id);
                    if ($scope.invited.length > 4) {
                        alert("no more 4 compare");
                        user.isChecked[user.product_id] = false;
                        var toDel = $scope.invited.indexOf(user);
                        $scope.invited.splice(toDel);
                        console.log("test_array :", $scope.invited);
                    } else {
                        console.log("test_array :", $scope.invited);
                    }
                } else {
                    alert("item can't compare");
                    user.isChecked[user.product_id] = false;
                }
            } else {
                var toDel = $scope.invited.indexOf(user);
                $scope.invited.splice(toDel);
                console.log("test_array :", $scope.invited);
            }
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageP', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageP';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
        promotelink: '@promotelink',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope.checkSeo = function() {
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* JQ: Scroll event */
        angular.element($window).bind('scroll', function() {
            if (!$scope.data) {
                return;
            }
            var curPos = ($(document).scrollTop());
            var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));
            console.debug("Cur pos", curPos, properHeight);
            if (curPos > properHeight) {
                angular.element('.block-background .bottom-info').addClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */
        $scope.data = false;
        $scope.dataPreserve = false;
        $scope._getDataArray = function(id) {
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope.data = res.data;
                    $scope.dataPreserve = res.data;
                    $scope.buildVariantOption(res.data);
                    $scope._getSupportDataCategory('category', res.data);
                }
            });
        };
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id) {
            var j = {
                'relate_product_id_array': [product_id],
                'badge_id_array': [18]
            };
            var d = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate", $scope.dataRelate);
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope.checkColorConfig = function() {
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._makeProductToCarousel();
                }, 500);
            }
        });
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.qty_original = 1;
        $scope.qty_current = 1;
        $scope.viewImg = 0;
        $scope.values = [1, 2, 3, 4, 5];
        $scope.myOptions = {
            1: "1", 
            2: "2",
            3: "3",
            4: "4",
            5: "5",
            6: "6",
            7: "7",
            8: "8",
            9: "9",
            10: "10",
        };
        $scope.$watchCollection('myOptions', function() {
            $scope.myFixedOptions = [];
            angular.forEach($scope.myOptions, function(value, key) {
                $scope.myFixedOptions.push({
                    key: parseInt(key, 10),
                    value: value
                });
            });
        });
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope.support_data = {
            category: [],
        };
        $scope._getSupportDataCategory = function(type, data) {
            var dataSend = {
                'txt_referral_id': data.product_referral_display.category[0].referral_id
            };
            GAEAPI.get('referral/relation', dataSend).then(function(e) {
                if (e.ok == 1) {
                    $scope.support_data.category = e.data;
                }
            });
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [],
                p = productObj.product_attribute.option_data.variant_array;
            for (var i = 0; i < p.length; i++) {
                if (p[i].status == 1 && p[i].status == 1) {
                    $scope.productQuantityMultiArray.push({
                        v_key: p[i].variant_key,
                        v_name: p[i].option_name_array[0],
                        v_qty: 1,
                        v_active: 0
                    });
                }
            }
        };
        $scope.invited = [];
        $scope.insertinvited = function(user) {
            if (user.isChecked[user.product_id]) {
                if (user.product_attribute.length != 0) {
                    $scope.invited.push(user.product_id);
                } else {
                    alert("item can't compare");                    
                }
            } else {                
                var toDel = $scope.invited.indexOf(user.product_id);
                $scope.invited.splice(toDel, '1');
            }
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;            
        };
        $scope._data_qty_selected = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.currentOptionQtyPick = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            return e.val();
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPagePi', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPagePi';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataSet = [{
            api: "product/id",
            dataSend: {},
            dataArray: [],
            dataSendState: {
                load: false,
                done: false
            }
        }, {
            api: "referral/relation",
            dataSend: {},
            dataArray: [],
            dataSendState: {
                load: false,
                done: false
            }
        }];
        $scope.dataTab = {
            active: 0,
            tabArray: [{
                type: 1,
                name: 'ภาพรวม',
                state: true,
                compileDetail: '',
                compileArray: []
            }, {
                type: 2,
                name: 'คุณสมบัติเฉพาะทางเทคนิค',
                state: true,
                compileDetail: '',
                compileArray: []
            }, {
                type: 1,
                name: 'ข้อมูลเพิ่มเติม',
                state: true,
                compileDetail: '',
                compileArray: []
            }]
        };
        $scope.getTab = function() {
            var getFunction = {
                active: function(active, callback) {
                    callback(active);
                },
                setTab: function(active) {
                    var _self = this;
                    _self.active(parseInt(active), function(active) {
                        $scope.dataTab.active = active;
                    });
                },
                pullData: function(index, data, callback) {
                    var res_data = (data != '' && data != undefined) ? data : '';
                    var res_state = (index == 0) ? true : (data != '' && data != undefined) ? true : false;
                    $scope.getFunction().consoleLog("   : ", res_state);
                    callback(index, res_data, res_state);
                },
                pullDataArray: function(index, dataArray, callback) {
                    var res_data_array = [];
                    if (dataArray.length != 0 && dataArray.length != undefined) {
                        if (dataArray.specification_data.length != 0 && dataArray.specification_data.length != undefined) {
                            if (dataArray.specification_data.pclass_array.length != 0 && dataArray.specification_data.pclass_array.length != undefined) {
                                res_data_array = dataArray.specification_data.pclass_array;
                            }
                        }
                    }
                    var res_state = (index == 0) ? true : (dataArray.length != 0 && dataArray != undefined) ? true : false;
                    callback(index, res_data_array, res_state);
                }
            }
            return getFunction;
        };
        $scope.getFunction = function() {
            var getFunction = {
                component: function(callback) {
                    var component = "productDetailPagePi : ";
                    callback(component);
                },
                consoleLog: function(name, data) {
                    var _self = this;
                    _self.component(function(component) {
                        console.log(component, name, data);
                    });
                },
                titleUrl: function(str) {
                    var url = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    return url;
                },
                locationUrl: function(template, data) {
                    $location.url(template + data).replace();
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                getRouteParamsProductId: function(callback) {
                    var _self = this;
                    _self.getRouteParams(function(params) {
                        var product_id = params.product_id.split("-", 1).join("");
                        callback(product_id);
                    });
                },
                stateData: function(load, done) {
                    var _self = this;
                    _self.consoleLog("stateData : load : ", load);
                    _self.consoleLog("stateData : done : ", done);
                    var state = {
                        load: load,
                        done: done
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend : api      : ", api);
                    _self.consoleLog("dataSend : dataSend : ", dataSend);
                    callback(api, dataSend);
                },
                getApiOk: function(res_api, callback) {
                    var _self = this;
                    var res_ok = [];
                    if (res_api.ok == 1) {
                        res_ok = res_api;
                    }
                    _self.consoleLog("getApiOk : res_ok   : ", res_ok);
                    callback(res_ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.consoleLog("getApi : api : ", api);
                        _self.consoleLog("getApi : dataSend : ", dataSend);
                        _self.consoleLog("getApi : res_api : ", res_api);
                        _self.getApiOk(res_api, function(res_api_ok) {
                            callback(res_api_ok);
                        });
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getNavigationBar = function() {
            var getFunction = {
                chackCategory: function(categoryArray, callback) {
                    var res_chack_category = (categoryArray != 0 && categoryArray != undefined) ? true : false;
                    callback(res_chack_category);
                },
                getReferralId: function(chackCategory, categoryArray, index, callback) {
                    var res_referral_id = (chackCategory == true) ? categoryArray[index].referral_id : false;
                    callback(res_referral_id);
                },
                getData: function(api, referralId, callback) {
                    if (referralId != false) {
                        $scope.dataSet[1].dataSend = {
                            'txt_referral_id': referralId
                        }
                        $scope.getFunction().dataSend(api, $scope.dataSet[1].dataSend, function(api, dataSend) {
                            $scope.getFunction().getApi(api, dataSend, function(res_api) {
                                callback(res_api);
                            });
                        });
                    } else {
                        callback([]);
                    }
                },
                main: function(api, productReferralDisplay, callback) {
                    var _self = this;
                    _self.chackCategory(productReferralDisplay.category, function(res_chack_category) {
                        _self.getReferralId(res_chack_category, productReferralDisplay.category, 0, function(res_referral_id) {
                            _self.getData(api, res_referral_id, function(res_api) {
                                callback(res_api);
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.getFunction().getRouteParamsProductId(function(res_product_id) {
            $scope.dataSet[0].dataSendState = $scope.getFunction().stateData(true, false);
            $scope.dataSet[0].dataSend = {
                'txt_product_id': res_product_id
            }
            $scope.getFunction().dataSend($scope.dataSet[0].api, $scope.dataSet[0].dataSend, function(api, dataSend) {
                $scope.getFunction().getApi(api, dataSend, function(res_api) {
                    $scope.getFunction().consoleLog("getRouteParamsProductId : dataSend : getApi : ", res_api);
                    $scope.dataSet[0].dataArray = res_api.data;
                    $scope.dataSet[0].dataSendState = $scope.getFunction().stateData(false, true);
                    $scope.getTab().pullData(0, res_api.data.product_description, function(index, res_data, res_state) {
                        $scope.dataTab.tabArray[index].compileDetail = res_data;
                        $scope.dataTab.tabArray[index].state = res_state;
                    });
                    $scope.getTab().pullDataArray(1, res_api.data.product_attribute, function(index, res_data_array, res_state) {
                        $scope.dataTab.tabArray[index].compileArray = res_data_array;
                        $scope.dataTab.tabArray[index].state = res_state;
                    });
                    $scope.getTab().pullData(2, res_api.data.product_more_info, function(index, res_data, res_state) {
                        $scope.dataTab.tabArray[index].compileDetail = res_data;
                        $scope.dataTab.tabArray[index].state = res_state;
                    });
                    $scope.dataSet[1].dataSendState = $scope.getFunction().stateData(true, false);
                    $scope.getNavigationBar().main($scope.dataSet[1].api, res_api.data.product_referral_display, function(red_navigation_bar) {
                        $scope.getFunction().consoleLog("getNavigationBar : red_navigation_bar : ", red_navigation_bar);
                        $scope.dataSet[1].dataArray = red_navigation_bar.data;
                        $scope.dataSet[1].dataSendState = $scope.getFunction().stateData(false, true);
                    });
                });
            });
        });
    };
    return promise;
});
_ui_share_app.directive('productDetailPageQ', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageQ';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id:'@id',
        headerheight:'@headerheight',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        angular.element($window).bind('scroll',function(){
            var curPos = ($(document).scrollTop());
            var rightPos = $('product-detail-page-q .block-background .block-left .bottom-info').height();
            var properHeight = ($('.img_cover').height());
            console.debug("Cur pos",curPos, properHeight);
            if(curPos+rightPos-50 > properHeight){
                angular.element('.block-background .bottom-info').addClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        }; 
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        }; 
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope.data = false;
        $scope.dataPreserve = false;
        /* Get data by product id */        
        GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()} , $scope).then(function(e){
            if(e.ok == 1){
                $scope.data = e.data;
                $scope.dataPreserve = e.data;
                $scope.buildVariantOption(e.data);
                /*$scope.buildDataProductRelate($scope._getPostIdFromURL());*/
            }
        });          
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d , $scope).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        }; 
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            /*$scope.makeVariantsClick();*/
            $scope.makeVaraintsClick_Normal();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };        
        $scope.onClickVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };
        $scope.findVariantsData = function(variantsPick){
            function compareArray(array_a, array) {
                if (!array)
                    return false;
                if (array_a.length != array.length)
                    return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i]))
                            return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for(var i = 0; i < dataVariants.length; i++){
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if(compareArray(variantsPick,optionJson)){                    
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;
                } 
            }
        };
        /* Select FIrst Varaint (SELECT) */
        $scope.makeVariantsClick = function(){            
            var s = $timeout(function(){
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx,obj){
                    var optionElementFirst = $(this).find('option[data-index="'+idx+'"]').eq(0);
                    optionElementFirst.prop("selected",true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        }; 
        /* Select FIrst Varaint (Normal click) */
        $scope.makeVaraintsClick_Normal = function(){
            $timeout(function(){
                $('div.variantSelector').each(function(idx,obj){
                    $(this).find('span[data-index="'+idx+'"]').eq(0).click();
                });
            },2000);
        };
        $scope.checkColorConfig = function(){
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function () {
            var elementName = '.img_mobile[data-key="' + $scope._key() + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };     
              var extraOptions = {
                animate: false
            };       
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
        };
        $scope._makeProductToCarouseltwo = function () {
            var elementName = '.img_desktop[data-id="' + $scope._key() + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };     
              var extraOptions = {
                animate: false
            };       
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-key="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-key="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if($('.img_mobile[data-key="'+$scope._key()+'"]').not('.slick-initialized')){
                $timeout(function(){
                    $scope._makeProductToCarousel();
                }, 500);                
            }      
            if($('.img_desktop[data-id="'+$scope._key()+'"]').not('.slick-initialized')){
                $timeout(function(){
                    $scope._makeProductToCarouseltwo();
                }, 500);                
            }          
        });
        $scope.buildIframeMapByLoc = function(name, lat, lng) {
            var newName = name;
            var YOUR_API_KEY = 'AIzaSyDU_QXXovpoO2nlyXBWbrCZdFeaApx-luU';
            if (/\s/.test(name)) {
                var newNameOld = name.split(" ");
                var DataName = newNameOld.join("+");
            }
            if (name != '') {
                var srcByName = 'https://www.google.co.th/maps?q=' + DataName + '&output=embed&hl=th-TH';
                return srcByName;
            } else {
                var srcByLoc = 'https://www.google.co.th/maps?q=' + lat + ',' + lng + '&output=embed&hl=th-TH';
                return srcByLoc;
            }
            /*return (parseInt(lat) != 0 && parseInt(lng) != 0) ? srcByLoc : srcByName;*/
        };
        $scope.qty_original=1;
        $scope.qty_current=1;
        $scope.getShopName = function(){
            return (typeof tttt !== 'undefined') ? tttt.shop_name : '';
        };
    };
    return promise;
});
_ui_share_app.directive('productDetailPageSk', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageSk';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon: '@icon',
        stylebutton: '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log("productDetailPageSk : ", name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                checkAttributeOption: function(attributeOption, attributeOptionLength, callback) {
                    var _self = this;
                    var attribute = (attributeOption.length == attributeOptionLength) ? true : false;
                    for (var i = 0; i < attributeOption.length; i++) {
                        _self.consoleLog("checkAttributeOption : attributeOption[i] : ", attributeOption[i]);
                        if (attributeOption[i] == undefined) {
                            attribute = false;
                        }
                    }
                    callback(attribute);
                },
                findVariantsData: function(attributeOption, dataVariants, attributeOptionLength, callback) {
                    var _self = this;
                    _self.consoleLog("findVariantsData : attributeOption : ", attributeOption);
                    _self.consoleLog("findVariantsData : dataVariants : ", dataVariants);
                    _self.consoleLog("findVariantsData : attributeOptionLength : ", attributeOptionLength);
                    _self.checkAttributeOption(attributeOption, attributeOptionLength, function(res_attribute_option) {
                        _self.consoleLog("checkAttributeOption : callback : res_attribute_option ", res_attribute_option);
                        var variantsOut = [];
                        for (var i = 0; i < dataVariants.length; i++) {
                            var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                            if (_self.compareArray(attributeOption, optionJson)) {
                                _self.consoleLog("findVariantsData : dataVariants[i] : ", dataVariants[i]);
                                variantsOut = dataVariants[i];
                                break;
                            }
                        }
                        callback(variantsOut, res_attribute_option);
                    });
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var _self = this;
                    var state = true;
                    _self.consoleLog("checkTotalStock : index : ", stateIn);
                    _self.consoleLog("checkTotalStock : quantity_max : ", quantity_max);
                    if (stateIn == false && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, $scope.attribute.attributeOption.length, function(variantsOut, res_attribute_option) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                _self.consoleLog("onClickOption : if : findVariantsData : res_attribute_option : ", res_attribute_option);
                                if (variantsOut.length != 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = variantsOut.product_id;
                                    $scope.dataArray.product_sku = variantsOut.sku;
                                    $scope.dataProductBuy.price = variantsOut.price;
                                    $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                    $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                    if (variantsOut.variant_image != 0) {
                                        if ($scope.dataArray.product_image.length != 0) {
                                            for (var i = 0; i < $scope.dataArray.product_image.length; i++) {
                                                $scope.dataArray.product_image[i].image_id
                                                if ($scope.dataArray.product_image[i].image_id == variantsOut.variant_image[0].image_id) {
                                                    $scope.slickImageGoto(i);
                                                }
                                            }
                                        }
                                    }
                                    _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                        _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                            $scope.buy.state = state;
                                            if ($scope.attribute.variantsTotal != 0) {
                                                $scope.buy.attribute = true;
                                            }
                                        });
                                    });
                                } else if (variantsOut.length == 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = 0;
                                    $scope.dataArray.product_sku = '';
                                    $scope.dataProductBuy.price = 0;
                                    $scope.dataArray.product_compare_price = 0;
                                    $scope.dataProductBuy.quantity_max = 1;
                                    $scope.buy.state = true;
                                    $scope.buy.attribute = true;
                                }
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 100);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log('productDetailPageMaeju : ', name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = true;
                    if (stateIn == true && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                checkPriceMin: function(variant, callback) {
                    var _self = this;
                    var priceMin = parseFloat(variant[0].price);
                    var comparePriceMin = parseFloat(variant[0].compare_price);
                    for (var i = 0; i < variant.length; i++) {
                        _self.consoleLog('checkPriceMin : priceMin : ', priceMin);
                        _self.consoleLog('checkPriceMin : variant[i].price : ', variant[i].price);
                        if (priceMin >= parseFloat(variant[i].price)) {
                            priceMin = parseFloat(variant[i].price);
                            comparePriceMin = parseFloat(variant[i].compare_price);
                        }
                    }
                    callback(priceMin, comparePriceMin);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        if (output.data.length != 0) {
                            _self.consoleLog("   : output : ", output.data);
                            _self.quantity(output.data.product_total_stock, function(total_stock) {
                                _self.consoleLog("quantity : total_stock : ", total_stock);
                                $scope.dataProductBuy.quantity_max = total_stock;
                                $scope.dataArray = output.data;
                                _self.productTab(output.data.product_tags, function(productTab) {
                                    $scope.dataArrayTags = productTab;
                                    _self.showTab(output.data, function(description, info) {
                                        $scope.showTab.dataTab[0].data = description;
                                        $scope.showTab.dataTab[1].data = info;
                                    });
                                    _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                        _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                        _self.consoleLog("getAttribute : attribute : ", attribute);
                                        _self.consoleLog("getAttribute : variants : ", variants);
                                        _self.checkOption(variants_total, function(state) {
                                            _self.checkTotalStock(state, total_stock, function(state) {
                                                $scope.buy.state = state;
                                                $scope.attribute.attributeOption = attribute;
                                                $scope.attribute.dataVariants = variants;
                                                $scope.attribute.variantsTotal = variants_total;
                                                if (variants_total > 0) {
                                                    _self.checkPriceMin(variants, function(res_price, res_compare_price) {
                                                        $scope.dataProductBuy.price = res_price;
                                                        $scope.dataProductBuy.sumprice = res_price;
                                                        $scope.dataArray.product_compare_price = res_compare_price;
                                                    });
                                                } else {
                                                    $scope.dataProductBuy.price = output.data.product_price;
                                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                                }
                                            });
                                        });
                                    });
                                    _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                        _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                        $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                        if (quantity_break.length) {
                                            $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                        }
                                    });
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                        $scope.dataArrayState = _self.stateData(false, true);
                                    });
                                });
                            });
                        } else {
                            window.history.back();
                        }
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
        $scope.tab_id = 0;
        $scope.tabId = function(id) {
            $scope.tab_id = id;
        };
        $scope.routeParams = function() {
            return $routeParams || false;
        };
        $scope.categoriesData = $scope.routeParams().referral_id || '';
        $scope.setDataCategories = function(input) {
            $scope.categoriesData = input;
            var page = "category-lists";
            if (typeof $scope.categoriesData != 'undefined' && $scope.categoriesData !== "") {
                page += '?root_id=' + '0';
                page += '&referral_id=' + $scope.categoriesData;
            } else {
                delete $scope.categoriesDat;
            }
            $location.url(page).replace();
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
        $scope.dataShopCurrent = [];
        $scope.dataShopPointConfig = [];
        $scope.getShopCurrent = function() {
            var dataSend = {};
            GAEAPI.get('shop/current', dataSend).then(function(output) {
                console.log("getShopCurrent : output : ", output);
                if (output.ok == 1) {
                    $scope.dataShopCurrent = output.data;
                    console.log("getShopCurrent : dataShopCurrent : ", $scope.dataShopCurrent);
                    $scope.dataShopPointConfig = output.data.shop_point_config;
                    console.log("getShopCurrent : dataShopPointConfig : ", $scope.dataShopPointConfig);
                }
            });
        };
        $scope.getShopCurrent();
        $scope.getShopPointConfigReward = function(product_price, quantity) {
            var sup_price = 0;
            var er_rate = 0;
            var er_earn = 0;
            var mathFloor = 0;
            var point = 0;
            // console.log("getShopPointConfigReward : shop_point_config.er_rate : ",$scope.dataShopPointConfig.er_rate);
            if ($scope.dataShopPointConfig.length != 0) {
                sup_price = product_price * quantity;
                er_rate = parseInt($scope.dataShopPointConfig.er_rate);
                er_earn = parseInt($scope.dataShopPointConfig.er_earn);
                mathFloor = Math.floor(sup_price / er_rate);
                point = mathFloor * er_earn;
                return point;
            } else {
                return point;
            }
        }
        $scope.getShopPointConfigRewardState = function(product_price, quantity) {
            var state = 'RewardShop';
            var sup_price = product_price * quantity;
            if ($scope.dataShopPointConfig.length != 0) {
                if (parseInt($scope.dataShopPointConfig.er_rate) != 0 && parseInt($scope.dataShopPointConfig.er_earn) != 0) {
                    if (parseInt($scope.dataShopPointConfig.er_rate) <= sup_price) {
                        state = 'RewardShop';
                        return state;
                    } else {
                        state = 'High';
                        return state;
                    }
                } else {
                    return 'RewardProduct';
                    return state;
                }
            } else {
                return 'RewardProduct';
            }
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageSupercheap', function($rootScope, $routeParams, sliderProvider, $location) {
    var templateName = 'productDetailPageSupercheap';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        navigationhover: '@navigationhover',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "productDetailPageSupercheap";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        /* scope */
        $scope._name = ($scope.name != undefined && $scope.name != "") ? $scope.name : "default";
        $scope._cart = ($scope.cart != undefined && $scope.cart != "") ? $scope.cart : "trumpComponentCarts";
        $scope._buycol = ($scope.buycol != undefined && $scope.buycol != "") ? parseInt($scope.buycol) : 15;
        $scope._maxstock = ($scope.maxstock != undefined && $scope.maxstock != "") ? parseInt($scope.maxstock) : 20;
        $scope._btnstyle = ($scope.btnstyle != undefined && $scope.btnstyle != "") ? $scope.btnstyle : "filled_button_large";
        $scope._buylogin = ($scope.buylogin == "true" || $scope.buylogin == "t") ? true : false;
        $scope._checkstaff = ($scope.checkstaff == "true" || $scope.checkstaff == "t") ? true : false;
        $scope._buyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope.buyicon : "icnt_outline_cart01_dark.png";
        $scope._buytext = ($scope.buytext != undefined && $scope.buytext != "") ? $scope.buytext : "เพิ่มในรถเข็น";
        $scope._videotext = ($scope.videotext != undefined && $scope.videotext != "") ? $scope.videotext : "Video";
        $scope._icebuyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope._icnPath + $scope.buyicon : $scope._icnPath + "icnt_outline_cart01_dark.png";
        $scope._language = ($scope.language != undefined && $scope.language != "") ? (($scope.language == "en") ? "en" : "th") : "th";
        $scope._navigationhover = ($scope.navigationhover != undefined && $scope.navigationhover != "") ? $scope.navigationhover : "primary";
        /* scope */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getNamePage: function(arr) {
                    var str = [];
                    for (var i = 0; i < arr.length; i++) {
                        if (i != 0) {
                            str.push(arr[i]);
                        }
                    }
                    return str.join(" ");
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = (params.product_id != undefined) ? params.product_id.split("-", 1).join("") : false;
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getReferralId: function(productReferralDisplay, callback) {
                    var _self = this;
                    var referral_id = 0;
                    if (productReferralDisplay.length != 0) {
                        if (productReferralDisplay.category != undefined) {
                            if (productReferralDisplay.category.length != 0) {
                                referral_id = productReferralDisplay.category[0].referral_id
                            }
                        }
                    }
                    callback(referral_id);
                },
                getFreeGiftPromotionId: function(product_promotion, callback) {
                    var _self = this;
                    var promotion_id = '0';
                    _self.consoleLog("product_promotion", product_promotion);
                    angular.forEach(product_promotion, function(item, index) {
                        _self.consoleLog("product_promotion : item", item.promotion_type_id);
                        if (promotion_id == '0' && (item.promotion_type_number == '1' || item.promotion_type_number == '2' || item.promotion_type_number == '3')) {
                            promotion_id = item.promotion_id;
                        }
                    });
                    callback(promotion_id);
                },
                getStaffId: function(staffId, callback) {
                    var _self = this;
                    var res_staff = {
                        staff_id: (staffId != 0 && staffId != '' && staffId != undefined) ? staffId : '0',
                        status: (staffId != 0 && staffId != '' && staffId != undefined) ? true : false
                    }
                    callback(res_staff);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getCarousel = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carouselA: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            fade: true,
                            dots: false,
                            arrows: false,
                            infinite: true,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '',
                            nextArrow: '',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselB: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: true,
                            arrows: true,
                            infinite: true,
                            autoplay: false,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '
',*/
                responsive: [{
                    breakpoint: 768,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 1
                    }
                }, {
                    breakpoint: 480,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 1
                    }
                }]
            };
            var extraOptions = {
                animate: false
            };
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.redirectCheckout = function(p, q) {
            window.location.href = GURL.base_url() + "checkout?pdata=" + p + '-' + q;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            /* alert(price); */
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < parseInt(product_total_stock); i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            console.log("buildVariantOption objectData : ", objectData);
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            if ($scope.dataOption.length == 1) {
                console.log("buildVariantOption objectData.length : ", $scope.dataOption.length);
                setTimeout(function() {
                    $scope.totalStock($scope.dataOption.length, $scope.dataVariants, 0, 0);
                }, 1000);
            }
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.displayView = function(id, statusClass, status) {
            var option;
            if (id != "0") {
                option = $('.text_4.variantSelector .t_2 .items' + '[data-option=' + id + ']');
            } else {
                option = $('.text_4.variantSelector .t_2 .items');
            }
            if (statusClass == 'add') {
                if (!option.hasClass(status)) {
                    option.addClass(status);
                }
            } else if (statusClass == 'remove') {
                if (option.hasClass(status)) {
                    option.removeClass(status);
                }
            } else if (statusClass == 'reset') {
                if (option.hasClass(status)) {
                    option.removeClass(status);
                }
            }
        };
        $scope.totalStock = function(dataVariantsPickLength, dataVariants, $index, option_id) {
            console.log("totalStock : dataVariantsPickLength : ", dataVariantsPickLength);
            console.log("totalStock : dataVariants : ", dataVariants);
            console.log("totalStock : $index : ", $index, " option_id : ", option_id);
            var dataVariants = $scope.dataVariants;
            $scope.displayView('0', 'reset', 'zero');
            for (var i = 0; i < dataVariants.length; i++) {
                var array_option_id = angular.fromJson(dataVariants[i].option_id_json);
                console.log("totalStock : for : array_option_id : ", array_option_id);
                console.log("totalStock : for : dataVariantsPickLength : ", dataVariantsPickLength);
                if (dataVariantsPickLength > 1) {
                    if (array_option_id[$index] == option_id) {
                        /* console.log("totalStock : for : if : array_option_id[", $index, "]", array_option_id[$index]); */
                        console.log("totalStock : for : if : if : array_option_id : ", array_option_id);
                        console.log("totalStock : for : if : if : dataVariants : [", i, "] :", dataVariants[i]);
                        for (var j = 0; j < array_option_id.length; j++) {
                            if (j != $index && dataVariants[i].total_stock == 0) {
                                $scope.displayView(array_option_id[j], 'add', 'zero');
                            } else {
                                $scope.displayView(array_option_id[j], 'remove', 'zero');
                            }
                        }
                    }
                } else {
                    /* console.log("totalStock : for : if : array_option_id[", $index, "]", array_option_id[$index]); */
                    console.log("totalStock : for : else : if : array_option_id : ", array_option_id);
                    console.log("totalStock : for : else : if : dataVariants : [", i, "] :", dataVariants[i]);
                    for (var j = 0; j < array_option_id.length; j++) {
                        console.log("totalStock : for : else : if : dataVariants : [", i, "] :", dataVariants[i].total_stock);
                        if (dataVariants[i].total_stock == 0) {
                            $scope.displayView(array_option_id[j], 'add', 'zero');
                        } else {
                            $scope.displayView(array_option_id[j], 'remove', 'zero');
                        }
                    }
                }
            }
        };
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems : ", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems : dataVariantsPick.length : ", $scope.dataVariantsPick.length);
            console.log("onSelectVariantItems : dataOption.length : ", $scope.dataOption.length);
            console.log("onSelectVariantItems : dataVariantsPick : ", $scope.dataVariantsPick);
            console.log("onSelectVariantItems : dataOption : ", $scope.dataOption);
            $scope.totalStock($scope.dataVariantsPick.length, $scope.dataVariants, $index, option_id);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            console.log("findVariantsData : variantsPick : ", variantsPick);
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            console.log("findVariantsData : dataVariants : ", dataVariants);
            for (var i = 0; i < dataVariants.length; i++) {
                console.log("findVariantsData : for : dataVariants[", i, "] :", dataVariants[i]);
                var _self = dataVariants[i];
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("findVariantsData : for : optionJson[", i, "].option_id_json :", angular.fromJson(dataVariants[i].option_id_json));
                var count = 0;
                if (compareArray(variantsPick, optionJson)) {
                    console.log("findVariantsData : compareArray : ", compareArray(variantsPick, optionJson));
                    console.log("findVariantsData : for : if : dataVariants[", i, "] :", dataVariants[i]);
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope._dataArray.product_image.length; im++) {
                            if ($scope._dataArray.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                // $scope._slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.block-gallery .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope.switchSingleView = function(idx) {
            console.log("$xZoomInstance", $xZoomInstance);
            $('.gallery_show_single').css({
                'transition': 'all 0.3s',
                'opacity': '0'
            });
            $timeout(function() {
                $scope.gallerySingleViewIndex = idx;
                $('.gallery_show_single').css({
                    'opacity': '1'
                });
            }, 300);
            setTimeout(function() {
                if ($(window).width() >= 992) {
                    if ($("img.zoom").attr('data-api-width') > 400 && $("img.zoom").attr('data-api-height') > 400) {
                        /*$("img.zoom").ezPlus({
                            'scrollZoom':true,
                            'responsive':true,
                            'zoomWindowWidth':400,
                            'zoomWindowHeight':400,
                            'zoomWindowOffetx':30,
                        });*/
                        $xZoomInstance = $('.zoom').xzoom({
                            Xoffset: 30,
                            tint: '#b9b5b3',
                        });
                    }
                }
            }, 300);
        };
        $scope.gallerySingleViewIndex = 0;
        $scope.switchSingleView = function(idx) {
            console.log("$xZoomInstance", $xZoomInstance);
            $('.gallery_show_single').css({
                'transition': 'all 0.3s',
                'opacity': '0'
            });
            $timeout(function() {
                $scope.gallerySingleViewIndex = idx;
                $('.gallery_show_single').css({
                    'opacity': '1'
                });
            }, 300);
            setTimeout(function() {
                if ($(window).width() >= 992) {
                    if ($("img.zoom").attr('data-api-width') > 400 && $("img.zoom").attr('data-api-height') > 400) {
                        /*$("img.zoom").ezPlus({
                            'scrollZoom':true,
                            'responsive':true,
                            'zoomWindowWidth':400,
                            'zoomWindowHeight':400,
                            'zoomWindowOffetx':30,
                        });*/
                        $xZoomInstance = $('.zoom').xzoom({
                            Xoffset: 30,
                            tint: '#b9b5b3',
                        });
                    }
                }
            }, 300);
        };
        $scope.viewOptimizeImage = function(size, image_url, image_width) {
            if (window.devicePixelRatio >= 2 || parseInt(image_width) <= size) {
                return image_url;
            }
            var a = image_url.split("/"),
                b = a[a.length - 1];
            a[a.length - 1] = 't' + size + '_' + b;
            return a.join("/");
        };
        $scope._getDataArray($scope._getIdUrl());
    };
    return promise;
});_ui_share_app.directive('productDetailPageMc', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageMc';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon: '@icon',
        stylebutton: '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log("productDetailPageMaeju : ", name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                checkAttributeOption: function(attributeOption, attributeOptionLength, callback) {
                    var _self = this;
                    var attribute = (attributeOption.length == attributeOptionLength) ? true : false;
                    for (var i = 0; i < attributeOption.length; i++) {
                        _self.consoleLog("checkAttributeOption : attributeOption[i] : ", attributeOption[i]);
                        if (attributeOption[i] == undefined) {
                            attribute = false;
                        }
                    }
                    callback(attribute);
                },
                findVariantsData: function(attributeOption, dataVariants, attributeOptionLength, callback) {
                    var _self = this;
                    _self.consoleLog("findVariantsData : attributeOption : ", attributeOption);
                    _self.consoleLog("findVariantsData : dataVariants : ", dataVariants);
                    _self.consoleLog("findVariantsData : attributeOptionLength : ", attributeOptionLength);
                    _self.checkAttributeOption(attributeOption, attributeOptionLength, function(res_attribute_option) {
                        _self.consoleLog("checkAttributeOption : callback : res_attribute_option ", res_attribute_option);
                        var variantsOut = [];
                        for (var i = 0; i < dataVariants.length; i++) {
                            var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                            if (_self.compareArray(attributeOption, optionJson)) {
                                _self.consoleLog("findVariantsData : dataVariants[i] : ", dataVariants[i]);
                                variantsOut = dataVariants[i];
                                break;
                            }
                        }
                        callback(variantsOut, res_attribute_option);
                    });
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var _self = this;
                    var state = true;
                    _self.consoleLog("checkTotalStock : index : ", stateIn);
                    _self.consoleLog("checkTotalStock : quantity_max : ", quantity_max);
                    if (stateIn == false && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, $scope.attribute.attributeOption.length, function(variantsOut, res_attribute_option) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                _self.consoleLog("onClickOption : if : findVariantsData : res_attribute_option : ", res_attribute_option);
                                if (variantsOut.length != 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = variantsOut.product_id;
                                    $scope.dataArray.product_sku = variantsOut.sku;
                                    $scope.dataProductBuy.price = variantsOut.price;
                                    $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                    $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                    if (variantsOut.variant_image != 0) {
                                        if ($scope.dataArray.product_image.length != 0) {
                                            for (var i = 0; i < $scope.dataArray.product_image.length; i++) {
                                                $scope.dataArray.product_image[i].image_id
                                                if ($scope.dataArray.product_image[i].image_id == variantsOut.variant_image[0].image_id) {
                                                    $scope.slickImageGoto(i);
                                                }
                                            }
                                        }
                                    }
                                    _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                        _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                            $scope.buy.state = state;
                                            if ($scope.attribute.variantsTotal != 0) {
                                                $scope.buy.attribute = true;
                                            }
                                        });
                                    });
                                } else if (variantsOut.length == 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = 0;
                                    $scope.dataArray.product_sku = '';
                                    $scope.dataProductBuy.price = 0;
                                    $scope.dataArray.product_compare_price = 0;
                                    $scope.dataProductBuy.quantity_max = 1;
                                    $scope.buy.state = true;
                                    $scope.buy.attribute = true;
                                }
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 100);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log('productDetailPageMaeju : ', name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = true;
                    if (stateIn == true && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                checkPriceMin: function(variant, callback) {
                    var _self = this;
                    var priceMin = parseFloat(variant[0].price);
                    var comparePriceMin = parseFloat(variant[0].compare_price);
                    for (var i = 0; i < variant.length; i++) {
                        _self.consoleLog('checkPriceMin : priceMin : ', priceMin);
                        _self.consoleLog('checkPriceMin : variant[i].price : ', variant[i].price);
                        if (priceMin >= parseFloat(variant[i].price)) {
                            priceMin = parseFloat(variant[i].price);
                            comparePriceMin = parseFloat(variant[i].compare_price);
                        }
                    }
                    callback(priceMin, comparePriceMin);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        if (output.data.length != 0) {
                            _self.consoleLog("   : output : ", output.data);
                            _self.quantity(output.data.product_total_stock, function(total_stock) {
                                _self.consoleLog("quantity : total_stock : ", total_stock);
                                $scope.dataProductBuy.quantity_max = total_stock;
                                $scope.dataArray = output.data;
                                _self.productTab(output.data.product_tags, function(productTab) {
                                    $scope.dataArrayTags = productTab;
                                    _self.showTab(output.data, function(description, info) {
                                        $scope.showTab.dataTab[0].data = description;
                                        $scope.showTab.dataTab[1].data = info;
                                    });
                                    _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                        _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                        _self.consoleLog("getAttribute : attribute : ", attribute);
                                        _self.consoleLog("getAttribute : variants : ", variants);
                                        _self.checkOption(variants_total, function(state) {
                                            _self.checkTotalStock(state, total_stock, function(state) {
                                                $scope.buy.state = state;
                                                $scope.attribute.attributeOption = attribute;
                                                $scope.attribute.dataVariants = variants;
                                                $scope.attribute.variantsTotal = variants_total;
                                                if (variants_total > 0) {
                                                    _self.checkPriceMin(variants, function(res_price, res_compare_price) {
                                                        $scope.dataProductBuy.price = res_price;
                                                        $scope.dataProductBuy.sumprice = res_price;
                                                        $scope.dataArray.product_compare_price = res_compare_price;
                                                    });
                                                } else {
                                                    $scope.dataProductBuy.price = output.data.product_price;
                                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                                }
                                            });
                                        });
                                    });
                                    _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                        _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                        $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                        if (quantity_break.length) {
                                            $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                        }
                                    });
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                        $scope.dataArrayState = _self.stateData(false, true);
                                    });
                                });
                            });
                        } else {
                            window.history.back();
                        }
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
        $scope.tab_id = 0;
        $scope.tabId = function(id) {
            $scope.tab_id = id;
        };
        $scope.routeParams = function() {
            return $routeParams || false;
        };
        $scope.categoriesData = $scope.routeParams().referral_id || '';
        $scope.setDataCategories = function(input) {
            $scope.categoriesData = input;
            var page = "category-lists";
            if (typeof $scope.categoriesData != 'undefined' && $scope.categoriesData !== "") {
                page += '?root_id=' + '0';
                page += '&referral_id=' + $scope.categoriesData;
            } else {
                delete $scope.categoriesDat;
            }
            $location.url(page).replace();
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageMhp', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageMhp';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                findVariantsData: function(attributeOption, dataVariants, callback) {
                    var _self = this;
                    var variants = dataVariants;
                    _self.consoleLog("findVariantsData : variants : ", variants);
                    var variantsOut = [];
                    for (var i = 0; i < variants.length; i++) {
                        var optionJson = angular.fromJson(variants[i].option_id_json);
                        if (_self.compareArray(attributeOption, optionJson)) {
                            _self.consoleLog("findVariantsData : variants[i] : ", variants[i]);
                            variantsOut = variants[i];
                            break;
                        }
                    }
                    callback(variantsOut);
                },
                checkOption: function(variants_total, callback) {
                    var state = false;
                    if (variants_total == 0) {
                        state = true;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = false;
                    if (stateIn == false && quantity_max > 0) {
                        state = true;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, function(variantsOut) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                $scope.dataArray.product_id = variantsOut.product_id;
                                $scope.dataArray.product_sku = variantsOut.sku;
                                $scope.dataArray.product_price = variantsOut.price;
                                $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                    _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                        $scope.buy.state = state;
                                        if ($scope.attribute.variantsTotal != 0) {
                                            $scope.buy.attribute = true;
                                        }
                                    });
                                });
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 999;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = false;
                    if (variants_total == 0) {
                        state = true;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = false;
                    if (stateIn == true && quantity_max > 0) {
                        state = true;
                    }
                    callback(state);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        _self.consoleLog("getDataProductArray : output : ", output.data);
                        _self.quantity(output.data.product_total_stock, function(total_stock) {
                            _self.consoleLog("quantity : total_stock : ", total_stock);
                            $scope.dataProductBuy.quantity_max = total_stock;
                            $scope.dataArray = output.data;
                            _self.productTab(output.data.product_tags, function(productTab) {
                                $scope.dataArrayTags = productTab;
                                _self.showTab(output.data, function(description, info) {
                                    $scope.showTab.dataTab[0].data = description;
                                    $scope.showTab.dataTab[1].data = info;
                                });
                                _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                    _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                    _self.consoleLog("getAttribute : attribute : ", attribute);
                                    _self.consoleLog("getAttribute : variants : ", variants);
                                    _self.checkOption(variants_total, function(state) {
                                        _self.checkTotalStock(state, total_stock, function(state) {
                                            $scope.buy.state = state;
                                            $scope.attribute.attributeOption = attribute;
                                            $scope.attribute.dataVariants = variants;
                                            $scope.attribute.variantsTotal = variants_total;
                                        });
                                    });
                                });
                                $scope.dataProductBuy.price = output.data.product_price;
                                $scope.dataProductBuy.sumprice = output.data.product_price;
                                _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                    _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                    $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                    if (quantity_break.length) {
                                        $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                    }
                                });
                                _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                    _self.consoleLog("getNavigationBar : output : ", output.data);
                                    $scope.navigationBar = output.data;
                                    $scope.dataArrayState = _self.stateData(false, true);
                                });
                            });
                        });
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
    };
    return promise;
});_ui_share_app.directive('productDetailPageN', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageN';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        id: '@id',
        imgcart: '@imgcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.qtyProduct = 1;
        $scope.result_price = 0;
        $scope.checkQty = function() {
            var productQuantityBreak = GAEAPI.getValueForKey($scope.data, "product_quantity_break", []);
            var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
            var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
            console.log("quantityBreak : ", $scope.data);
            for (var index in quantityBreak) {
                var rowData = quantityBreak[index];
                var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                if ($scope.qtyProduct >= amount_end) {
                    $scope.result_price = unit_price;
                }
            }
        };
        $scope.checkSeo = function() {
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* JQ: Scroll event */
        angular.element($window).bind('scroll', function() {
            if (!$scope.data) {
                return;
            }
            var curPos = ($(document).scrollTop());
            var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));
            console.debug("Cur pos", curPos, properHeight);
            if (curPos > properHeight) {
                angular.element('.block-background .bottom-info').addClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */
        $scope.data_tag = [];
        $scope.data = false;
        $scope.dataPreserve = false;
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope._dataArrayTags = [];
        /* getProductId */
        $scope.getQuantityBreak = function(dataSend, api, callback) {
            console.log("getQuantityBreak : dataSend : ", dataSend, " api : ", api);
            var quantity_break = [];
            GAEAPI.get(api, dataSend).then(function(output) {
                console.log("getQuantityBreak : output : ", output);
                if (output.ok == 1) {
                    quantity_break = output.data.quantity_break;
                    callback(quantity_break);
                }
                callback(quantity_break);
            });
            callback(quantity_break);
        };
        $scope.getProductId = function(statusLogin, customerId, dataSend, api) {
            console.log("getProductId : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
            GAEAPI.get(api, dataSend).then(function(output) {
                console.log("getProductId : output : ", output);
                if (output.ok == 1) {
                    if (output.data != undefined) {
                        console.log("getProductId : output.data : ", output.data);
                        $scope.data = output.data;
                        $scope.dataPreserve = output.data;
                        /* product_tags */
                        if (output.data.product_tags != undefined) {
                            if (output.data.product_tags != "") {
                                $scope._dataArrayTags = output.data.product_tags.split(",");
                                /* split(","); */
                                if ($scope._dataArrayTags == 1 && $scope._dataArrayTags[0] != "") {
                                    $scope.data_tag = (output.data.product_tags).split(",");
                                }
                            }
                        }
                        /* product_referral_display */
                        if (output.data.product_referral_display != undefined) {
                            if (output.data.product_referral_display.length) {
                                $scope._getSupportDataCategory(output.data);
                            }
                        }
                        /* Option */
                        $scope.buildVariantOption(output.data);
                        /* ProductRelate */
                        $scope.buildDataProductRelate(dataSend.txt_product_id);
                        /* product_quantity_break */
                        $scope.checkLogin('product/quantity_break', dataSend.txt_product_id, statusLogin, function(statusLogin, customerId, dataSend, api) {
                            console.log("getProductId checkLogin callback : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                            if (statusLogin) {
                                console.log("getProductId checkLogin : IF");
                                $scope.getQuantityBreak(dataSend, api, function(quantity_break) {
                                    console.log("getProductId checkLogin callback getQuantityBreak : quantity_break : ", quantity_break);
                                    $scope.data.product_quantity_break.quantity_break = quantity_break;
                                    if (quantity_break.length) {
                                        $scope.result_price = quantity_break[0].unit_price;
                                    }
                                });
                            } else {
                                console.log("getProductId checkLogin : ELSE")
                            }
                        });
                    }
                }
            });
        };
        $scope.checkLogin = function(urlApi, product_id, status_login, callback) {
            var dataSend = {};
            var productId = parseInt(product_id);
            var statusLogin = status_login;
            var api = urlApi;
            var customerId = 0;
            if (api == 'product/id') {
                dataSend = {
                    'txt_product_id': productId,
                }
                console.log("checkLogin : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                callback(statusLogin, customerId, dataSend, api);
            } else if (api == 'product/quantity_break') {
                if (statusLogin) {
                    customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                    dataSend = {
                        'txt_product_id': productId,
                        'txt_customer_id': customerId,
                    }
                    console.log("checkLogin : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                    callback(statusLogin, customerId, dataSend, api);
                } else {
                    console.log("checkLogin : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                    callback(statusLogin, customerId, dataSend, api);
                }
            }
        };
        $scope.checkLogin('product/id', $scope._getPostIdFromURL(), UiCustomerBox.delegate.get.isLogin(), function(statusLogin, customerId, dataSend, api) {
            console.log("checkLogin callback : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
            $scope.getProductId(statusLogin, customerId, dataSend, api);
        });
        /* getProductId */
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id) {
            var j = {
                'relate_product_id_array': [product_id],
                'badge_id_array': [18]
            };
            var d = {
                'cur_page': 1,
                'per_page': 6,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate", $scope.dataRelate);
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope.checkColorConfig = function() {
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._makeProductToCarousel();
                }, 500);
            }
        });
        $scope.qty_original = 1;
        $scope.qty_current = 1;
        /* Click SLick Item */
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        /* Calcu Nav Arrows */
        $scope.maxHeight = 0;
        $scope.navArrowsCalculate = function() {
            var size = ($('img.img_gallery').eq(0).height() / 2);
            $scope.maxHeight = (size + 18);
            $('img.img_gallery').each(function() {
                if ($(this).height() > $scope.maxHeight) {
                    $scope.maxHeight = $(this).height();
                }
            });
            return '-' + $scope.maxHeight + 'px';
        };
        $scope.navArrowWidth = function() {
            return $('#gallery_display').width() + 'px';
        };
        $scope.viewType = 'description';
        var selector = '.nav li';
        $(selector).on('click', function() {
            $(selector).removeClass('active');
            $(this).addClass('active');
        });
        $scope.toTop = function() {
            return window.scrollTo(0, 0);
        };
        $scope._page_lists = false;
        $scope._page_lists_load = false;
        $scope._get_page_lists = function() {
            $scope._clear_page_lists();
            var dataSend = {
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'page_lastest_create'
            };
            GAEAPI.get('page/lists', dataSend).then(function(res) {
                $scope._page_lists_load = true;
                if (res.ok === 1) {
                    $scope._page_lists = res.data.dataList;
                    angular.forEach($scope._page_lists, function(item, key) {
                        if (item.page_search_url == "") {
                            item.page_search_url = item.page_id;
                        }
                    });
                }
            });
        };
        $scope.support_data = {
            category: [],
        };
        $scope._getSupportDataCategory = function(data) {
            console.log("_getSupportDataCategory : data : ", data);
            console.log("_getSupportDataCategory : data : ", data.product_referral_display);
            var dataSend = {
                'txt_referral_id': data.product_referral_display.category[0].referral_id
            };
            console.log("_getSupportDataCategory : dataSend : ", dataSend);
            GAEAPI.get('referral/relation', dataSend).then(function(e) {
                if (e.ok == 1) {
                    $scope.support_data.category = e.data;
                    console.log("dyfsyhfgdhfd :", $scope.support_data.category);
                }
            });
        };
        $scope._clear_page_lists = function() {
            $scope._page_lists = false;
            $scope._page_lists_load = false;
        };
        $scope._get_page_lists();
        $scope._page_category = false;
        $scope._page_category_load = false;
        $scope._get_page_category = function() {
            $scope._clear_page_lists();
            var dataSend = {
                'txt_referral_type_id': 11,
                'txt_sortby': 'referral_name_a-z'
            };
            GAEAPI.get('referral/map', dataSend).then(function(res) {
                $scope._page_category_load = true;
                if (res.ok === 1) {
                    $scope._page_category = res.data;
                }
            });
        };
        $scope._clear_page_category = function() {
            $scope._page_category = false;
            $scope._page_category_load = false;
        };
        $scope._get_page_category();
        $scope._testdata = [{
            id: '1',
            Buy: '1',
            Price: '699',
            Discount: '0%'
        }, {
            id: '2',
            Buy: '3',
            Price: '550',
            Discount: '10%'
        }, {
            id: '3',
            Buy: '6',
            Price: '530',
            Discount: '15%'
        }, {
            id: '4',
            Buy: '12',
            Price: '520',
            Discount: '16%'
        }, {
            id: '5',
            Buy: '50',
            Price: '510',
            Discount: '17%'
        }];
        $scope._get_page_category();
        $scope.mkCarouselData = function(elem) {
            console.debug('mkCarouselData: trigger');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    slidesToShow: 5,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    prevArrow: '',
                    nextArrow: '',
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 5,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 5,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: 5,
                        }
                    }, {
                        breakpoint: 692,
                        settings: {
                            slidesToShow: 6,
                        }
                    }, {
                        breakpoint: 540,
                        settings: {
                            slidesToShow: 3,
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope._indata = $scope._testdata[0].id;
        $scope._indataPrice = $scope._testdata[0].Price;
        $scope._inputdata = function(data, Price) {
            $scope._indata = data;
            $scope._indataPrice = Price;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.invited = [];
        $scope.insertinvited = function(user) {
            if (user.isChecked[user.product_id]) {
                if (user.product_attribute.length != 0) {
                    $scope.invited.push(user.product_id);
                    if ($scope.invited.length > 4) {
                        alert("no more 4 compare");
                        user.isChecked[user.product_id] = false;
                        var toDel = $scope.invited.indexOf(user);
                        $scope.invited.splice(toDel);
                        console.log("test_array :", $scope.invited);
                    } else {
                        console.log("test_array :", $scope.invited);
                    }
                } else {
                    alert("item can't compare");
                    user.isChecked[user.product_id] = false;
                }
            } else {
                var toDel = $scope.invited.indexOf(user);
                $scope.invited.splice(toDel);
                console.log("test_array :", $scope.invited);
            }
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageP', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageP';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
        promotelink: '@promotelink',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope.checkSeo = function() {
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* JQ: Scroll event */
        angular.element($window).bind('scroll', function() {
            if (!$scope.data) {
                return;
            }
            var curPos = ($(document).scrollTop());
            var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));
            console.debug("Cur pos", curPos, properHeight);
            if (curPos > properHeight) {
                angular.element('.block-background .bottom-info').addClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */
        $scope.data = false;
        $scope.dataPreserve = false;
        $scope._getDataArray = function(id) {
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope.data = res.data;
                    $scope.dataPreserve = res.data;
                    $scope.buildVariantOption(res.data);
                    $scope._getSupportDataCategory('category', res.data);
                }
            });
        };
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id) {
            var j = {
                'relate_product_id_array': [product_id],
                'badge_id_array': [18]
            };
            var d = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate", $scope.dataRelate);
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope.checkColorConfig = function() {
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._makeProductToCarousel();
                }, 500);
            }
        });
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.qty_original = 1;
        $scope.qty_current = 1;
        $scope.viewImg = 0;
        $scope.values = [1, 2, 3, 4, 5];
        $scope.myOptions = {
            1: "1", 
            2: "2",
            3: "3",
            4: "4",
            5: "5",
            6: "6",
            7: "7",
            8: "8",
            9: "9",
            10: "10",
        };
        $scope.$watchCollection('myOptions', function() {
            $scope.myFixedOptions = [];
            angular.forEach($scope.myOptions, function(value, key) {
                $scope.myFixedOptions.push({
                    key: parseInt(key, 10),
                    value: value
                });
            });
        });
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope.support_data = {
            category: [],
        };
        $scope._getSupportDataCategory = function(type, data) {
            var dataSend = {
                'txt_referral_id': data.product_referral_display.category[0].referral_id
            };
            GAEAPI.get('referral/relation', dataSend).then(function(e) {
                if (e.ok == 1) {
                    $scope.support_data.category = e.data;
                }
            });
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [],
                p = productObj.product_attribute.option_data.variant_array;
            for (var i = 0; i < p.length; i++) {
                if (p[i].status == 1 && p[i].status == 1) {
                    $scope.productQuantityMultiArray.push({
                        v_key: p[i].variant_key,
                        v_name: p[i].option_name_array[0],
                        v_qty: 1,
                        v_active: 0
                    });
                }
            }
        };
        $scope.invited = [];
        $scope.insertinvited = function(user) {
            if (user.isChecked[user.product_id]) {
                if (user.product_attribute.length != 0) {
                    $scope.invited.push(user.product_id);
                } else {
                    alert("item can't compare");                    
                }
            } else {                
                var toDel = $scope.invited.indexOf(user.product_id);
                $scope.invited.splice(toDel, '1');
            }
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;            
        };
        $scope._data_qty_selected = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.currentOptionQtyPick = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            return e.val();
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPagePi', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPagePi';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataSet = [{
            api: "product/id",
            dataSend: {},
            dataArray: [],
            dataSendState: {
                load: false,
                done: false
            }
        }, {
            api: "referral/relation",
            dataSend: {},
            dataArray: [],
            dataSendState: {
                load: false,
                done: false
            }
        }];
        $scope.dataTab = {
            active: 0,
            tabArray: [{
                type: 1,
                name: 'ภาพรวม',
                state: true,
                compileDetail: '',
                compileArray: []
            }, {
                type: 2,
                name: 'คุณสมบัติเฉพาะทางเทคนิค',
                state: true,
                compileDetail: '',
                compileArray: []
            }, {
                type: 1,
                name: 'ข้อมูลเพิ่มเติม',
                state: true,
                compileDetail: '',
                compileArray: []
            }]
        };
        $scope.getTab = function() {
            var getFunction = {
                active: function(active, callback) {
                    callback(active);
                },
                setTab: function(active) {
                    var _self = this;
                    _self.active(parseInt(active), function(active) {
                        $scope.dataTab.active = active;
                    });
                },
                pullData: function(index, data, callback) {
                    var res_data = (data != '' && data != undefined) ? data : '';
                    var res_state = (index == 0) ? true : (data != '' && data != undefined) ? true : false;
                    $scope.getFunction().consoleLog("   : ", res_state);
                    callback(index, res_data, res_state);
                },
                pullDataArray: function(index, dataArray, callback) {
                    var res_data_array = [];
                    if (dataArray.length != 0 && dataArray.length != undefined) {
                        if (dataArray.specification_data.length != 0 && dataArray.specification_data.length != undefined) {
                            if (dataArray.specification_data.pclass_array.length != 0 && dataArray.specification_data.pclass_array.length != undefined) {
                                res_data_array = dataArray.specification_data.pclass_array;
                            }
                        }
                    }
                    var res_state = (index == 0) ? true : (dataArray.length != 0 && dataArray != undefined) ? true : false;
                    callback(index, res_data_array, res_state);
                }
            }
            return getFunction;
        };
        $scope.getFunction = function() {
            var getFunction = {
                component: function(callback) {
                    var component = "productDetailPagePi : ";
                    callback(component);
                },
                consoleLog: function(name, data) {
                    var _self = this;
                    _self.component(function(component) {
                        console.log(component, name, data);
                    });
                },
                titleUrl: function(str) {
                    var url = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    return url;
                },
                locationUrl: function(template, data) {
                    $location.url(template + data).replace();
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                getRouteParamsProductId: function(callback) {
                    var _self = this;
                    _self.getRouteParams(function(params) {
                        var product_id = params.product_id.split("-", 1).join("");
                        callback(product_id);
                    });
                },
                stateData: function(load, done) {
                    var _self = this;
                    _self.consoleLog("stateData : load : ", load);
                    _self.consoleLog("stateData : done : ", done);
                    var state = {
                        load: load,
                        done: done
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend : api      : ", api);
                    _self.consoleLog("dataSend : dataSend : ", dataSend);
                    callback(api, dataSend);
                },
                getApiOk: function(res_api, callback) {
                    var _self = this;
                    var res_ok = [];
                    if (res_api.ok == 1) {
                        res_ok = res_api;
                    }
                    _self.consoleLog("getApiOk : res_ok   : ", res_ok);
                    callback(res_ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.consoleLog("getApi : api : ", api);
                        _self.consoleLog("getApi : dataSend : ", dataSend);
                        _self.consoleLog("getApi : res_api : ", res_api);
                        _self.getApiOk(res_api, function(res_api_ok) {
                            callback(res_api_ok);
                        });
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getNavigationBar = function() {
            var getFunction = {
                chackCategory: function(categoryArray, callback) {
                    var res_chack_category = (categoryArray != 0 && categoryArray != undefined) ? true : false;
                    callback(res_chack_category);
                },
                getReferralId: function(chackCategory, categoryArray, index, callback) {
                    var res_referral_id = (chackCategory == true) ? categoryArray[index].referral_id : false;
                    callback(res_referral_id);
                },
                getData: function(api, referralId, callback) {
                    if (referralId != false) {
                        $scope.dataSet[1].dataSend = {
                            'txt_referral_id': referralId
                        }
                        $scope.getFunction().dataSend(api, $scope.dataSet[1].dataSend, function(api, dataSend) {
                            $scope.getFunction().getApi(api, dataSend, function(res_api) {
                                callback(res_api);
                            });
                        });
                    } else {
                        callback([]);
                    }
                },
                main: function(api, productReferralDisplay, callback) {
                    var _self = this;
                    _self.chackCategory(productReferralDisplay.category, function(res_chack_category) {
                        _self.getReferralId(res_chack_category, productReferralDisplay.category, 0, function(res_referral_id) {
                            _self.getData(api, res_referral_id, function(res_api) {
                                callback(res_api);
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.getFunction().getRouteParamsProductId(function(res_product_id) {
            $scope.dataSet[0].dataSendState = $scope.getFunction().stateData(true, false);
            $scope.dataSet[0].dataSend = {
                'txt_product_id': res_product_id
            }
            $scope.getFunction().dataSend($scope.dataSet[0].api, $scope.dataSet[0].dataSend, function(api, dataSend) {
                $scope.getFunction().getApi(api, dataSend, function(res_api) {
                    $scope.getFunction().consoleLog("getRouteParamsProductId : dataSend : getApi : ", res_api);
                    $scope.dataSet[0].dataArray = res_api.data;
                    $scope.dataSet[0].dataSendState = $scope.getFunction().stateData(false, true);
                    $scope.getTab().pullData(0, res_api.data.product_description, function(index, res_data, res_state) {
                        $scope.dataTab.tabArray[index].compileDetail = res_data;
                        $scope.dataTab.tabArray[index].state = res_state;
                    });
                    $scope.getTab().pullDataArray(1, res_api.data.product_attribute, function(index, res_data_array, res_state) {
                        $scope.dataTab.tabArray[index].compileArray = res_data_array;
                        $scope.dataTab.tabArray[index].state = res_state;
                    });
                    $scope.getTab().pullData(2, res_api.data.product_more_info, function(index, res_data, res_state) {
                        $scope.dataTab.tabArray[index].compileDetail = res_data;
                        $scope.dataTab.tabArray[index].state = res_state;
                    });
                    $scope.dataSet[1].dataSendState = $scope.getFunction().stateData(true, false);
                    $scope.getNavigationBar().main($scope.dataSet[1].api, res_api.data.product_referral_display, function(red_navigation_bar) {
                        $scope.getFunction().consoleLog("getNavigationBar : red_navigation_bar : ", red_navigation_bar);
                        $scope.dataSet[1].dataArray = red_navigation_bar.data;
                        $scope.dataSet[1].dataSendState = $scope.getFunction().stateData(false, true);
                    });
                });
            });
        });
    };
    return promise;
});
_ui_share_app.directive('productDetailPageQ', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageQ';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id:'@id',
        headerheight:'@headerheight',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function (scope, element, attr) {
    };
    promise.controller = function ($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        angular.element($window).bind('scroll',function(){
            var curPos = ($(document).scrollTop());
            var rightPos = $('product-detail-page-q .block-background .block-left .bottom-info').height();
            var properHeight = ($('.img_cover').height());
            console.debug("Cur pos",curPos, properHeight);
            if(curPos+rightPos-50 > properHeight){
                angular.element('.block-background .bottom-info').addClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if($(window).width() > 991){
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        }; 
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        }; 
        $scope.titleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function(){
            var test = $scope.id;
            var a = $scope.id;
            if(typeof $routeParams.product_id !== 'undefined'){
                test = parseInt($routeParams.product_id);                
                a = $routeParams.product_id;                
            }
            if(typeof test === 'number' && test > 0){
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope.data = false;
        $scope.dataPreserve = false;
        /* Get data by product id */        
        GAEAPI.get('product/id',{'txt_product_id':$scope._getPostIdFromURL()} , $scope).then(function(e){
            if(e.ok == 1){
                $scope.data = e.data;
                $scope.dataPreserve = e.data;
                $scope.buildVariantOption(e.data);
                /*$scope.buildDataProductRelate($scope._getPostIdFromURL());*/
            }
        });          
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id){
            var j = {'relate_product_id_array':[product_id],'badge_id_array':[18]};
            var d = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists',d , $scope).then(function(e){
                if(e.ok == 1){
                    $scope.dataRelate = e.data.dataList;
                    console.log("dataRelate",$scope.dataRelate);
                }
            });
        }; 
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData){
            if(objectData.product_total_variant <= 0){
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            /*$scope.makeVariantsClick();*/
            $scope.makeVaraintsClick_Normal();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };        
        $scope.onClickVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };
        $scope.findVariantsData = function(variantsPick){
            function compareArray(array_a, array) {
                if (!array)
                    return false;
                if (array_a.length != array.length)
                    return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i]))
                            return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for(var i = 0; i < dataVariants.length; i++){
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if(compareArray(variantsPick,optionJson)){                    
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    break;
                } 
            }
        };
        /* Select FIrst Varaint (SELECT) */
        $scope.makeVariantsClick = function(){            
            var s = $timeout(function(){
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx,obj){
                    var optionElementFirst = $(this).find('option[data-index="'+idx+'"]').eq(0);
                    optionElementFirst.prop("selected",true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        }; 
        /* Select FIrst Varaint (Normal click) */
        $scope.makeVaraintsClick_Normal = function(){
            $timeout(function(){
                $('div.variantSelector').each(function(idx,obj){
                    $(this).find('span[data-index="'+idx+'"]').eq(0).click();
                });
            },2000);
        };
        $scope.checkColorConfig = function(){
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function () {
            var elementName = '.img_mobile[data-key="' + $scope._key() + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };     
              var extraOptions = {
                animate: false
            };       
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
        };
        $scope._makeProductToCarouseltwo = function () {
            var elementName = '.img_desktop[data-id="' + $scope._key() + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };     
              var extraOptions = {
                animate: false
            };       
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-key="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-key="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if($('.img_mobile[data-key="'+$scope._key()+'"]').not('.slick-initialized')){
                $timeout(function(){
                    $scope._makeProductToCarousel();
                }, 500);                
            }      
            if($('.img_desktop[data-id="'+$scope._key()+'"]').not('.slick-initialized')){
                $timeout(function(){
                    $scope._makeProductToCarouseltwo();
                }, 500);                
            }          
        });
        $scope.buildIframeMapByLoc = function(name, lat, lng) {
            var newName = name;
            var YOUR_API_KEY = 'AIzaSyDU_QXXovpoO2nlyXBWbrCZdFeaApx-luU';
            if (/\s/.test(name)) {
                var newNameOld = name.split(" ");
                var DataName = newNameOld.join("+");
            }
            if (name != '') {
                var srcByName = 'https://www.google.co.th/maps?q=' + DataName + '&output=embed&hl=th-TH';
                return srcByName;
            } else {
                var srcByLoc = 'https://www.google.co.th/maps?q=' + lat + ',' + lng + '&output=embed&hl=th-TH';
                return srcByLoc;
            }
            /*return (parseInt(lat) != 0 && parseInt(lng) != 0) ? srcByLoc : srcByName;*/
        };
        $scope.qty_original=1;
        $scope.qty_current=1;
        $scope.getShopName = function(){
            return (typeof tttt !== 'undefined') ? tttt.shop_name : '';
        };
    };
    return promise;
});
_ui_share_app.directive('productDetailPageSk', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageSk';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon: '@icon',
        stylebutton: '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log("productDetailPageSk : ", name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                checkAttributeOption: function(attributeOption, attributeOptionLength, callback) {
                    var _self = this;
                    var attribute = (attributeOption.length == attributeOptionLength) ? true : false;
                    for (var i = 0; i < attributeOption.length; i++) {
                        _self.consoleLog("checkAttributeOption : attributeOption[i] : ", attributeOption[i]);
                        if (attributeOption[i] == undefined) {
                            attribute = false;
                        }
                    }
                    callback(attribute);
                },
                findVariantsData: function(attributeOption, dataVariants, attributeOptionLength, callback) {
                    var _self = this;
                    _self.consoleLog("findVariantsData : attributeOption : ", attributeOption);
                    _self.consoleLog("findVariantsData : dataVariants : ", dataVariants);
                    _self.consoleLog("findVariantsData : attributeOptionLength : ", attributeOptionLength);
                    _self.checkAttributeOption(attributeOption, attributeOptionLength, function(res_attribute_option) {
                        _self.consoleLog("checkAttributeOption : callback : res_attribute_option ", res_attribute_option);
                        var variantsOut = [];
                        for (var i = 0; i < dataVariants.length; i++) {
                            var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                            if (_self.compareArray(attributeOption, optionJson)) {
                                _self.consoleLog("findVariantsData : dataVariants[i] : ", dataVariants[i]);
                                variantsOut = dataVariants[i];
                                break;
                            }
                        }
                        callback(variantsOut, res_attribute_option);
                    });
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var _self = this;
                    var state = true;
                    _self.consoleLog("checkTotalStock : index : ", stateIn);
                    _self.consoleLog("checkTotalStock : quantity_max : ", quantity_max);
                    if (stateIn == false && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, $scope.attribute.attributeOption.length, function(variantsOut, res_attribute_option) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                _self.consoleLog("onClickOption : if : findVariantsData : res_attribute_option : ", res_attribute_option);
                                if (variantsOut.length != 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = variantsOut.product_id;
                                    $scope.dataArray.product_sku = variantsOut.sku;
                                    $scope.dataProductBuy.price = variantsOut.price;
                                    $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                    $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                    if (variantsOut.variant_image != 0) {
                                        if ($scope.dataArray.product_image.length != 0) {
                                            for (var i = 0; i < $scope.dataArray.product_image.length; i++) {
                                                $scope.dataArray.product_image[i].image_id
                                                if ($scope.dataArray.product_image[i].image_id == variantsOut.variant_image[0].image_id) {
                                                    $scope.slickImageGoto(i);
                                                }
                                            }
                                        }
                                    }
                                    _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                        _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                            $scope.buy.state = state;
                                            if ($scope.attribute.variantsTotal != 0) {
                                                $scope.buy.attribute = true;
                                            }
                                        });
                                    });
                                } else if (variantsOut.length == 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = 0;
                                    $scope.dataArray.product_sku = '';
                                    $scope.dataProductBuy.price = 0;
                                    $scope.dataArray.product_compare_price = 0;
                                    $scope.dataProductBuy.quantity_max = 1;
                                    $scope.buy.state = true;
                                    $scope.buy.attribute = true;
                                }
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 100);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log('productDetailPageMaeju : ', name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = true;
                    if (stateIn == true && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                getRouteParams: function(callback) {
                    var params = $routeParams;
                    callback(params);
                },
                stateData: function(loadIn, doneIn) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- stateData -------");
                    _self.consoleLog("getData : loadIn : ", loadIn);
                    _self.consoleLog("getData : doneIn : ", doneIn);
                    _self.consoleLog("getData : ", "------- stateData -------");
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    _self.consoleLog("getData : api      : ", api);
                    _self.consoleLog("getData : dataSend : ", dataSend);
                    _self.consoleLog("getData : ", "------- dataSend -------");
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        _self.consoleLog("getData : ", "------- getApi -------");
                        _self.consoleLog("getData : api      : ", api);
                        _self.consoleLog("getData : dataSend : ", dataSend);
                        _self.consoleLog("getData : output   : ", output);
                        _self.consoleLog("getData : ", "------- getApi -------");
                        callback(output);
                    });
                },
                checkPriceMin: function(variant, callback) {
                    var _self = this;
                    var priceMin = parseFloat(variant[0].price);
                    var comparePriceMin = parseFloat(variant[0].compare_price);
                    for (var i = 0; i < variant.length; i++) {
                        _self.consoleLog('checkPriceMin : priceMin : ', priceMin);
                        _self.consoleLog('checkPriceMin : variant[i].price : ', variant[i].price);
                        if (priceMin >= parseFloat(variant[i].price)) {
                            priceMin = parseFloat(variant[i].price);
                            comparePriceMin = parseFloat(variant[i].compare_price);
                        }
                    }
                    callback(priceMin, comparePriceMin);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        if (output.data.length != 0) {
                            _self.consoleLog("   : output : ", output.data);
                            _self.quantity(output.data.product_total_stock, function(total_stock) {
                                _self.consoleLog("quantity : total_stock : ", total_stock);
                                $scope.dataProductBuy.quantity_max = total_stock;
                                $scope.dataArray = output.data;
                                _self.productTab(output.data.product_tags, function(productTab) {
                                    $scope.dataArrayTags = productTab;
                                    _self.showTab(output.data, function(description, info) {
                                        $scope.showTab.dataTab[0].data = description;
                                        $scope.showTab.dataTab[1].data = info;
                                    });
                                    _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                        _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                        _self.consoleLog("getAttribute : attribute : ", attribute);
                                        _self.consoleLog("getAttribute : variants : ", variants);
                                        _self.checkOption(variants_total, function(state) {
                                            _self.checkTotalStock(state, total_stock, function(state) {
                                                $scope.buy.state = state;
                                                $scope.attribute.attributeOption = attribute;
                                                $scope.attribute.dataVariants = variants;
                                                $scope.attribute.variantsTotal = variants_total;
                                                if (variants_total > 0) {
                                                    _self.checkPriceMin(variants, function(res_price, res_compare_price) {
                                                        $scope.dataProductBuy.price = res_price;
                                                        $scope.dataProductBuy.sumprice = res_price;
                                                        $scope.dataArray.product_compare_price = res_compare_price;
                                                    });
                                                } else {
                                                    $scope.dataProductBuy.price = output.data.product_price;
                                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                                }
                                            });
                                        });
                                    });
                                    _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                        _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                        $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                        if (quantity_break.length) {
                                            $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                        }
                                    });
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                        $scope.dataArrayState = _self.stateData(false, true);
                                    });
                                });
                            });
                        } else {
                            window.history.back();
                        }
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
        $scope.tab_id = 0;
        $scope.tabId = function(id) {
            $scope.tab_id = id;
        };
        $scope.routeParams = function() {
            return $routeParams || false;
        };
        $scope.categoriesData = $scope.routeParams().referral_id || '';
        $scope.setDataCategories = function(input) {
            $scope.categoriesData = input;
            var page = "category-lists";
            if (typeof $scope.categoriesData != 'undefined' && $scope.categoriesData !== "") {
                page += '?root_id=' + '0';
                page += '&referral_id=' + $scope.categoriesData;
            } else {
                delete $scope.categoriesDat;
            }
            $location.url(page).replace();
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
        $scope.dataShopCurrent = [];
        $scope.dataShopPointConfig = [];
        $scope.getShopCurrent = function() {
            var dataSend = {};
            GAEAPI.get('shop/current', dataSend).then(function(output) {
                console.log("getShopCurrent : output : ", output);
                if (output.ok == 1) {
                    $scope.dataShopCurrent = output.data;
                    console.log("getShopCurrent : dataShopCurrent : ", $scope.dataShopCurrent);
                    $scope.dataShopPointConfig = output.data.shop_point_config;
                    console.log("getShopCurrent : dataShopPointConfig : ", $scope.dataShopPointConfig);
                }
            });
        };
        $scope.getShopCurrent();
        $scope.getShopPointConfigReward = function(product_price, quantity) {
            var sup_price = 0;
            var er_rate = 0;
            var er_earn = 0;
            var mathFloor = 0;
            var point = 0;
            // console.log("getShopPointConfigReward : shop_point_config.er_rate : ",$scope.dataShopPointConfig.er_rate);
            if ($scope.dataShopPointConfig.length != 0) {
                sup_price = product_price * quantity;
                er_rate = parseInt($scope.dataShopPointConfig.er_rate);
                er_earn = parseInt($scope.dataShopPointConfig.er_earn);
                mathFloor = Math.floor(sup_price / er_rate);
                point = mathFloor * er_earn;
                return point;
            } else {
                return point;
            }
        }
        $scope.getShopPointConfigRewardState = function(product_price, quantity) {
            var state = 'RewardShop';
            var sup_price = product_price * quantity;
            if ($scope.dataShopPointConfig.length != 0) {
                if (parseInt($scope.dataShopPointConfig.er_rate) != 0 && parseInt($scope.dataShopPointConfig.er_earn) != 0) {
                    if (parseInt($scope.dataShopPointConfig.er_rate) <= sup_price) {
                        state = 'RewardShop';
                        return state;
                    } else {
                        state = 'High';
                        return state;
                    }
                } else {
                    return 'RewardProduct';
                    return state;
                }
            } else {
                return 'RewardProduct';
            }
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageSupercheap', function($rootScope, $routeParams, sliderProvider, $location) {
    var templateName = 'productDetailPageSupercheap';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        navigationhover: '@navigationhover',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "productDetailPageSupercheap";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        /* scope */
        $scope._name = ($scope.name != undefined && $scope.name != "") ? $scope.name : "default";
        $scope._cart = ($scope.cart != undefined && $scope.cart != "") ? $scope.cart : "trumpComponentCarts";
        $scope._buycol = ($scope.buycol != undefined && $scope.buycol != "") ? parseInt($scope.buycol) : 15;
        $scope._maxstock = ($scope.maxstock != undefined && $scope.maxstock != "") ? parseInt($scope.maxstock) : 20;
        $scope._btnstyle = ($scope.btnstyle != undefined && $scope.btnstyle != "") ? $scope.btnstyle : "filled_button_large";
        $scope._buylogin = ($scope.buylogin == "true" || $scope.buylogin == "t") ? true : false;
        $scope._checkstaff = ($scope.checkstaff == "true" || $scope.checkstaff == "t") ? true : false;
        $scope._buyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope.buyicon : "icnt_outline_cart01_dark.png";
        $scope._buytext = ($scope.buytext != undefined && $scope.buytext != "") ? $scope.buytext : "เพิ่มในรถเข็น";
        $scope._videotext = ($scope.videotext != undefined && $scope.videotext != "") ? $scope.videotext : "Video";
        $scope._icebuyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope._icnPath + $scope.buyicon : $scope._icnPath + "icnt_outline_cart01_dark.png";
        $scope._language = ($scope.language != undefined && $scope.language != "") ? (($scope.language == "en") ? "en" : "th") : "th";
        $scope._navigationhover = ($scope.navigationhover != undefined && $scope.navigationhover != "") ? $scope.navigationhover : "primary";
        /* scope */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getNamePage: function(arr) {
                    var str = [];
                    for (var i = 0; i < arr.length; i++) {
                        if (i != 0) {
                            str.push(arr[i]);
                        }
                    }
                    return str.join(" ");
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = (params.product_id != undefined) ? params.product_id.split("-", 1).join("") : false;
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getReferralId: function(productReferralDisplay, callback) {
                    var _self = this;
                    var referral_id = 0;
                    if (productReferralDisplay.length != 0) {
                        if (productReferralDisplay.category != undefined) {
                            if (productReferralDisplay.category.length != 0) {
                                referral_id = productReferralDisplay.category[0].referral_id
                            }
                        }
                    }
                    callback(referral_id);
                },
                getFreeGiftPromotionId: function(product_promotion, callback) {
                    var _self = this;
                    var promotion_id = '0';
                    _self.consoleLog("product_promotion", product_promotion);
                    angular.forEach(product_promotion, function(item, index) {
                        _self.consoleLog("product_promotion : item", item.promotion_type_id);
                        if (promotion_id == '0' && (item.promotion_type_number == '1' || item.promotion_type_number == '2' || item.promotion_type_number == '3')) {
                            promotion_id = item.promotion_id;
                        }
                    });
                    callback(promotion_id);
                },
                getStaffId: function(staffId, callback) {
                    var _self = this;
                    var res_staff = {
                        staff_id: (staffId != 0 && staffId != '' && staffId != undefined) ? staffId : '0',
                        status: (staffId != 0 && staffId != '' && staffId != undefined) ? true : false
                    }
                    callback(res_staff);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getCarousel = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carouselA: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            fade: true,
                            dots: false,
                            arrows: false,
                            infinite: true,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '',
                            nextArrow: '',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselB: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: true,
                            arrows: true,
                            infinite: true,
                            autoplay: false,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: ' ',
                            nextArrow: '
',
                            nextArrow: ' ',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselD: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: true,
                            infinite: true,
                            autoplay: true,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '
',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselD: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: true,
                            infinite: true,
                            autoplay: true,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: ' ',
                            nextArrow: '
',
                            nextArrow: ' ',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselBar: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: false,
                            infinite: false,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 6,
                            slidesToScroll: 6,
                            speed: 600,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: 5,
                                    slidesToScroll: 5,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: 4,
                                    slidesToScroll: 4,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: 3,
                                    slidesToScroll: 3,
                                }
                            }]
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                slickCarousel: function(carousel, index) {
                    var _self = this;
                    $scope.setCarousel.index = index;
                    setTimeout(function() {
                        $('[data-key="' + carousel + '"]').slick('slickGoTo', index);
                    }, 100);
                },
                prevIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != 0) ? image_index - 1 : image - 1;
                    _self.consoleLog("prevIndex index", $scope.setCarousel.index);
                },
                nextIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != (image - 1)) ? image_index + 1 : 0;
                    _self.consoleLog("nextIndex index", $scope.setCarousel.index);
                }
            }
            return getFunction;
        };
        $scope.getAttribute = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                productAttribute: function(productAttribute, callback) {
                    var _self = this;
                    var attribute = {
                        option_name: "",
                        option_attribute: []
                    };
                    if (productAttribute.option_data != undefined) {
                        if (productAttribute.option_data.variant_array != undefined && productAttribute.option_data.variant_array.length != 0) {
                            for (var a = 0; a < productAttribute.option_data.pclass_array.length; a++) {
                                attribute.option_name = attribute.option_name.concat(productAttribute.option_data.pclass_array[a].pclass_name, " ");
                            }
                            for (var b = 0; b < productAttribute.option_data.variant_array.length; b++) {
                                var product_attribute = {
                                    product_id: productAttribute.option_data.variant_array[b].product_id,
                                    product_sku: productAttribute.option_data.variant_array[b].sku,
                                    product_title: "",
                                    product_price: parseFloat(productAttribute.option_data.variant_array[b].price),
                                    product_compare_price: parseFloat(productAttribute.option_data.variant_array[b].compare_price),
                                    product_total_stock: parseFloat(productAttribute.option_data.variant_array[b].total_stock),
                                    product_image: productAttribute.option_data.variant_array[b].variant_image
                                }
                                for (var c = 0; c < productAttribute.option_data.variant_array[b].option_name_array.length; c++) {
                                    product_attribute.product_title = product_attribute.product_title.concat(productAttribute.option_data.variant_array[b].option_name_array[c], " ");
                                }
                                attribute.option_attribute.push(product_attribute);
                            }
                        }
                    }
                    _self.consoleLog("productAttribute attribute ", attribute);
                    callback(attribute);
                },
                checkDiscountPrice: function(productDiscount, resPrice, resComparePrice, callback) {
                    var _self = this;
                    var price = 0;
                    var compare_price = 0;
                    if (productDiscount.length == 0) {
                        price = parseFloat(resPrice);
                        compare_price = parseFloat(resComparePrice);
                    } else {
                        if (productDiscount.discount_type_id == '101') {
                            price = parseFloat(resPrice) - parseFloat(productDiscount.discount_price);
                            compare_price = parseFloat(resPrice);
                        } else if (productDiscount.discount_type_id == '102') {
                            price = (parseFloat(resPrice) * ((100 - parseFloat(productDiscount.discount_percent)) / 100));
                            compare_price = parseFloat(resPrice);
                        }
                    }
                    callback(price, compare_price);
                },
                checkMinPrice: function(option, callback) {
                    var _self = this;
                    var price_min = parseFloat(option.option_attribute[0].product_price);
                    var compare_price_min = parseFloat(option.option_attribute[0].product_compare_price);
                    var total_stock = parseFloat(option.option_attribute[0].product_total_stock);
                    for (var a = 0; a < option.option_attribute.length; a++) {
                        if (price_min >= parseFloat(option.option_attribute[a].product_price)) {
                            price_min = parseFloat(option.option_attribute[a].product_price);
                            compare_price_min = parseFloat(option.option_attribute[a].product_compare_price);
                            total_stock = parseFloat(option.option_attribute[a].product_total_stock);
                        }
                    }
                    _self.consoleLog("checkPriceMin price_min ", price_min);
                    _self.consoleLog("checkPriceMin compare_price_min ", compare_price_min);
                    _self.consoleLog("checkPriceMin total_stock ", total_stock);
                    callback(price_min, compare_price_min, total_stock);
                },
                getTotalStock: function(totalStock, mixStock, callback) {
                    var _self = this;
                    var total_stock = (totalStock > 0) ? ((totalStock <= mixStock) ? totalStock : mixStock) : ((totalStock == -1) ? mixStock : totalStock);
                    callback(total_stock);
                },
                checkMinPrices: function(api, attribute, callback) {
                    var _self = this;
                    var dataPrice = {
                        product_price: {
                            price_name: 'product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        product_compare_price: {
                            price_name: 'product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_price: {
                            price_name: 'sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_price: {
                            price_name: 'sum_product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_minus_sum_product_price: {
                            price_name: 'sum_product_compare_minus_sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        }
                    }
                    if (attribute.option_attribute.length == 0) {
                        _self.checkDiscountPrice(api.data.product_discount, api.data.product_price, api.data.product_compare_price, function(res_price, res_compare_price) {
                            _self.checkPrice(res_price, function(res_price_ecimals) {
                                dataPrice.product_price.price = res_price;
                                dataPrice.product_price.price_ecimals = res_price_ecimals;
                                dataPrice.sum_product_price.price = res_price;
                                dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                    dataPrice.product_compare_price.price = res_compare_price;
                                    dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    dataPrice.sum_product_compare_price.price = res_compare_price;
                                    dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                    _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                        dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                        dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                        _self.getTotalStock(api.data.product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                            dataPrice.product_price.total_stock = res_total_stock_s;
                                            dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                            callback(dataPrice, false);
                                        });
                                    });
                                });
                            });
                        });
                    } else {
                        _self.checkMinPrice(attribute, function(res_price_min, res_compare_price_min, res_total_stock) {
                            _self.checkDiscountPrice(api.data.product_discount, res_price_min, res_compare_price_min, function(res_price, res_compare_price) {
                                _self.checkPrice(res_price, function(res_price_ecimals) {
                                    dataPrice.product_price.price = res_price;
                                    dataPrice.product_price.price_ecimals = res_price_ecimals;
                                    dataPrice.sum_product_price.price = res_price;
                                    dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                    _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                        dataPrice.product_compare_price.price = res_compare_price;
                                        dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        dataPrice.sum_product_compare_price.price = res_compare_price;
                                        dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                        _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                            dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                            dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                            _self.getTotalStock(res_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                dataPrice.product_price.total_stock = res_total_stock_s;
                                                dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                callback(dataPrice, true);
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    }
                },
                priceIncludes: function(price, includes, callback) {
                    var _self = this;
                    var priceToString = (price == null) ? 0 : price;
                    _self.consoleLog('priceIncludes priceToString : ', priceToString);
                    callback(priceToString.toString().includes(includes));
                },
                checkPrice: function(price, callback) {
                    var _self = this;
                    _self.priceIncludes(price, '.', function(res) {
                        _self.consoleLog("checkPrice res ", res);
                        callback((!res) ? 0 : 2);
                    });
                },
                onSelectOption: function(productId) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = productId;
                    _self.consoleLog("onSelectOption productId ", productId);
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    for (var a = 0; a < $scope.data.attribute.dataArray.option_attribute.length; a++) {
                        _self.consoleLog("onSelectOption option_attribute ", $scope.data.attribute.dataArray.option_attribute[a]);
                        if ($scope.data.attribute.dataArray.option_attribute[a].product_id == productId) {
                            if ($scope.data.attribute.dataArray.option_attribute[a].product_image.length != 0) {
                                if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                                    for (var b = 0; b < $scope.dataApi.product.dataArray.product_image.length; b++) {
                                        if ($scope.dataApi.product.dataArray.product_image[b].image_id == $scope.data.attribute.dataArray.option_attribute[a].product_image[0].image_id) {
                                            $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, b);
                                        }
                                    }
                                }
                            }
                            _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[a].product_price, $scope.data.attribute.dataArray.option_attribute[a].product_compare_price, function(res_price_p, res_compare_price_p) {
                                _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                                    $scope.data.product_price.price = res_price_p;
                                    $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                                    $scope.data.sum_product_price.price = res_price_p;
                                    $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                                    _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                        $scope.data.product_compare_price.price = res_compare_price_p;
                                        $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                        $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                        _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                            $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                            $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                            _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[a].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                $scope.data.product_price.total_stock = res_total_stock_s;
                                                $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                /* stock */
                                                $scope.data.quantity.quantity_max = res_total_stock_s;
                                                $scope.data.quantity.quantity_select = [];
                                                for (var i = 0; i < res_total_stock_s; i++) {
                                                    $scope.data.quantity.quantity_select.push(i + 1);
                                                }
                                                /* stock */
                                            })
                                        });
                                    });
                                });
                            });
                            break;
                        }
                    }
                },
                onClickOption: function(index) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.data.attribute.productId = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    if ($scope.data.attribute.dataArray.option_attribute[index].product_image.length != 0) {
                        if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                            for (var i = 0; i < $scope.dataApi.product.dataArray.product_image.length; i++) {
                                if ($scope.dataApi.product.dataArray.product_image[i].image_id == $scope.data.attribute.dataArray.option_attribute[index].product_image[0].image_id) {
                                    $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, i);
                                }
                            }
                        }
                    }
                    _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[index].product_price, $scope.data.attribute.dataArray.option_attribute[index].product_compare_price, function(res_price_p, res_compare_price_p) {
                        _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                            $scope.data.product_price.price = res_price_p;
                            $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                            $scope.data.sum_product_price.price = res_price_p;
                            $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                            _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                $scope.data.product_compare_price.price = res_compare_price_p;
                                $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                    $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                    $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                    _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[index].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                        $scope.data.product_price.total_stock = res_total_stock_s;
                                        $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                        /* stock */
                                        $scope.data.quantity.quantity_max = res_total_stock_s;
                                        $scope.data.quantity.quantity_select = [];
                                        for (var i = 0; i < res_total_stock_s; i++) {
                                            $scope.data.quantity.quantity_select.push(i + 1);
                                        }
                                        /* stock */
                                    })
                                });
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.getAttributeCustom = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                createArray: function(productCustomTemplates, callback) {
                    var _self = this;
                    var custom_attributes = [];
                    if (productCustomTemplates.templates.length != 0) {
                        angular.forEach(productCustomTemplates.templates, function(item, index) {
                            if (item.option_sets.length != 0) {
                                _self.getAttributes(item.option_sets, function(res_attributes) {
                                    custom_attributes = custom_attributes.concat(res_attributes);
                                });
                            }
                        });
                        /* if (productCustomTemplates.templates[0].option_sets.length != 0) {
                            _self.getAttributes(productCustomTemplates.templates[0].option_sets, function(res_attributes) {
                                custom_attributes = res_attributes;
                            });
                        } */
                    }
                    _self.consoleLog("createArray : productCustomTemplates", productCustomTemplates);
                    _self.consoleLog("createArray : custom_attributes", custom_attributes);
                    callback(custom_attributes, true);
                },
                formatAttribute: function(index, optionSubsetIndex, setType, optionSetArray, callback) {
                    var _self = this;
                    var set_id = (setType == 'attribute') ? optionSetArray.set_id : optionSetArray.subset_id;
                    var attribute = {
                        attribute_index: index,
                        attribute_option_subset_index: optionSubsetIndex,
                        active_option_id: (optionSetArray.option_data.select_id != 0) ? optionSetArray.option_data.select_id : "-1",
                        active_option_index: -1,
                        active_option_index_str: "-1",
                        active_textarea: "",
                        active_array: [],
                        set_id: set_id,
                        name: optionSetArray.name,
                        set_type: optionSetArray.ss_type,
                        option: []
                    }
                    callback(attribute);
                },
                getOption: function(index, optionDataArray, callback) {
                    var _self = this;
                    var options = {
                        index: index,
                        ss_data_id: optionDataArray.ss_data_id,
                        name: optionDataArray.name,
                        image: optionDataArray.image,
                        price: optionDataArray.price,
                        compare_price: 0,
                        total_stock: 0
                    }
                    callback(options);
                },
                getActive: function(index, activeOptionId, activeOptionIdIn, optionDataArray, callback) {
                    var _self = this;
                    var actives_index = (optionDataArray.ss_data_id == activeOptionId) ? index : activeOptionIdIn;
                    var actives = (optionDataArray.ss_data_id != activeOptionId) ? "0" : "1";
                    callback(actives_index, actives);
                },
                getAttributes: function(optionSetArray, callback) {
                    var _self = this;
                    var attributes = [];
                    for (var index = 0; index < optionSetArray.length; index++) {
                        _self.formatAttribute(index, 0, 'attribute', optionSetArray[index], function(res_attribute) {
                            if (optionSetArray[index].option_subsets.length != 0) {
                                for (var option_subset_index = 0; option_subset_index < optionSetArray[index].option_subsets.length; option_subset_index++) {
                                    _self.formatAttribute(index, option_subset_index, res_attribute.set_type, optionSetArray[index].option_subsets[option_subset_index], function(res_attribute_sub) {
                                        var options = [];
                                        var active_option_id = -1;
                                        var active_option_array = [];
                                        for (var option = 0; option < optionSetArray[index].option_subsets[option_subset_index].option_data.options.length; option++) {
                                            _self.getOption(option, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_option) {
                                                options.push(res_option);
                                            });
                                            _self.getActive(option, res_attribute_sub.active_option_id, active_option_id, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_actives_index, res_actives) {
                                                active_option_id = res_actives_index;
                                                active_option_array.push(res_actives);
                                            });
                                        }
                                        res_attribute_sub.option = options;
                                        res_attribute_sub.active_option_index = active_option_id;
                                        res_attribute_sub.active_option_index_str = String(active_option_id);
                                        res_attribute_sub.active_array = active_option_array;
                                        attributes.push(res_attribute_sub);
                                    });
                                }
                            } else {
                                var options = [];
                                var active_option_id = -1;
                                var active_option_array = [];
                                for (var option = 0; option < optionSetArray[index].option_data.options.length; option++) {
                                    _self.getOption(option, optionSetArray[index].option_data.options[option], function(res_option) {
                                        options.push(res_option);
                                    });
                                    _self.getActive(option, res_attribute.active_option_id, active_option_id, optionSetArray[index].option_data.options[option], function(res_actives_index, res_actives) {
                                        active_option_id = res_actives_index;
                                        active_option_array.push(res_actives);
                                    });
                                }
                                res_attribute.option = options;
                                res_attribute.active_option_index = active_option_id;
                                res_attribute.active_option_index_str = String(active_option_id);
                                res_attribute.active_array = active_option_array;
                                attributes.push(res_attribute);
                            }
                        });
                    }
                    callback(attributes)
                },
                getformatQuantity: function(index, attributeCustom, callback) {
                    var _self = this;
                    var quantity = {
                        name: String(index + 1),
                        dataArray: attributeCustom
                    }
                    callback(quantity);
                },
                onClickRadio: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickRadio : index", index);
                    _self.consoleLog("onClickRadio : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickRadio : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickDropdown: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickDropdown : index", index);
                    _self.consoleLog("onClickDropdown : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickDropdown : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickCheckbox: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickCheckbox : index", index);
                    _self.consoleLog("onClickCheckbox : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i == parseInt(index_option)) ? (($scope.data.attribute_custom.dataArray[index].active_array[i] != "0") ? "0" : "1") : $scope.data.attribute_custom.dataArray[index].active_array[i];
                    }
                    _self.consoleLog("onClickCheckbox : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                }
            }
            return getFunction;
        };
        $scope.getReward = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                momentUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    callback(now);
                },
                getCalculator: function(sumProductPrice, reward, callback) {
                    var _self = this;
                    _self.consoleLog("getCalculator : sumProductPrice", sumProductPrice);
                    _self.consoleLog("getCalculator : reward", reward);
                    var point_reward = 0;
                    if (reward.type_id == "100") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    } else if (reward.type_id == "101") {
                        point_reward = reward.reward_amount;
                    } else if (reward.type_id == "102") {
                        point_reward = (reward.reward_percent * sumProductPrice.price) / 100;
                    } else if (reward.type_id == "103") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    }
                    _self.consoleLog("getCalculator : point_reward", point_reward);
                    callback(point_reward);
                },
                getProductReward: function(now, productReward, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (productReward.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(productReward.reward_lifetime.lifetime_start_time);
                        reward.lifetime_end_time = parseInt(productReward.reward_lifetime.lifetime_end_time);
                        reward.type_id = productReward.reward_type_id;
                        reward.amount = parseInt(productReward.reward_amount);
                        reward.percent = parseInt(productReward.reward_percent);
                        reward.every_price = parseInt(productReward.reward_every_price);
                    }
                    _self.consoleLog("getProductReward : reward", reward);
                    callback(reward);
                },
                getPointConfig: function(now, shopPointConfig, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (shopPointConfig.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(shopPointConfig.er_from);
                        reward.lifetime_end_time = parseInt(shopPointConfig.er_to);
                        reward.type_id = "100";
                        reward.amount = parseInt(shopPointConfig.er_earn);
                        reward.every_price = parseInt(shopPointConfig.er_rate);
                    }
                    _self.consoleLog("getPointConfig : reward", reward);
                    callback(reward);
                },
                checkPointReward: function(reward, callback) {
                    var _self = this;
                    var state = false;
                    if (reward.reward_length) {
                        var start = reward.lifetime_start_time < reward.lifetime_time && reward.lifetime_start_time != 0;
                        var end = (reward.lifetime_end_time != -1) ? reward.lifetime_time <= reward.lifetime_end_time && reward.lifetime_end_time != 0 : true;
                        if (start && end) {
                            if (reward.type_id == "100") {
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            } else if (reward.type_id == "101") {
                                var amount = reward.amount != 0;
                                if (amount) {
                                    state = true;
                                }
                            } else if (reward.type_id == "102") {
                                var percent = reward.percent != 0;
                                if (percent) {
                                    state = true;
                                }
                            } else if (reward.type_id == "103") {
                                var percent = reward.percent != 0;
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            }
                        }
                    }
                    callback(state);
                },
                checkReward: function(rewardProduct, rewardPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("checkReward : rewardProduct", rewardProduct);
                    _self.consoleLog("checkReward : rewardPointConfig", rewardPointConfig);
                    var reward = {
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    _self.checkPointReward(rewardProduct, function(res_state_product) {
                        _self.checkPointReward(rewardPointConfig, function(res_state_point_config) {
                            if (res_state_point_config) {
                                reward.type_id = rewardPointConfig.type_id;
                                reward.type_id = rewardPointConfig.type_id;
                                reward.amount = rewardPointConfig.amount;
                                reward.percent = rewardPointConfig.percent;
                                reward.every_price = rewardPointConfig.every_price;
                            } else if (res_state_product) {
                                reward.type_id = rewardProduct.type_id;
                                reward.amount = rewardProduct.amount;
                                reward.percent = rewardProduct.percent;
                                reward.every_price = rewardProduct.every_price;
                            }
                            _self.consoleLog("checkReward : reward", reward);
                            callback(reward);
                        });
                    });
                },
                checkRewardType: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.momentUnix(function(now) {
                        _self.getProductReward(now, productReward, function(res_reward_product) {
                            _self.getPointConfig(now, shopPointConfig, function(res_reward_point_config) {
                                _self.checkReward(res_reward_product, res_reward_point_config, function(res_reward) {
                                    callback(res_reward);
                                });
                            });
                        });
                    });
                },
                createReward: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("createReward : productReward", productReward);
                    _self.consoleLog("createReward : shopPointConfig", shopPointConfig);
                    _self.checkRewardType(productReward, shopPointConfig, function(res_reward) {
                        _self.consoleLog("createReward : res_reward", res_reward);
                        callback(res_reward);
                    });
                }
            }
            return getFunction;
        };
        $scope.getQuantity = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                upDateReward: function() {
                    var _self = this;
                },
                upDateReward: function() {
                    var _self = this;
                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                        $scope.data.reward.point_reward = res_point_reward;
                    });
                },
                upDatePrice: function() {
                    var _self = this;
                    var product_price = $scope.data.product_price.price * $scope.data.quantity.quantity_input;
                    var product_compare_price = $scope.data.product_compare_price.price * $scope.data.quantity.quantity_input;
                    $scope.getAttribute().checkPrice(product_price, function(res_price_ecimals) {
                        $scope.data.sum_product_price.price = product_price;
                        $scope.data.sum_product_price.price_ecimals = res_price_ecimals;
                        $scope.getAttribute().checkPrice(product_compare_price, function(res_compare_price_ecimals) {
                            $scope.data.sum_product_compare_price.price = product_compare_price;
                            $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                            var compare_price_minus_price = ((product_compare_price - product_price) > 0) ? product_compare_price - product_price : 0;
                            $scope.getAttribute().checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                _self.upDateReward();
                            });
                        });
                    });
                },
                input: function(quantityInput) {
                    var _self = this;
                    quantityInput = (quantityInput == null) ? 1 : parseInt(quantityInput);
                    _self.consoleLog("input : quantityInput", quantityInput);
                    if (quantityInput != null) {
                        if (quantityInput >= $scope.data.quantity.quantity_max) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_max;
                        }
                        if (quantityInput <= $scope.data.quantity.quantity_min) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                        }
                    } else {
                        $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                    }
                    _self.upDatePrice();
                },
                minus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input - 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_min", $scope.data.quantity.quantity_min);
                    if (quantity >= $scope.data.quantity.quantity_min) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                },
                plus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input + 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_max", $scope.data.quantity.quantity_max);
                    if (quantity <= $scope.data.quantity.quantity_max) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                }
            }
            return getFunction;
        };
        $scope.getBuy = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = params.product_id.split("-", 1).join("");
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                postApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.post(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                UiCartProductAdd: function(productId, quantityInput, promotionId, customOptions, callback) {
                    UiCart.delegate.product.add(productId, quantityInput, promotionId, function(res_data) {
                        callback(res_data);
                    });
                },
                isLogin: function(callback) {
                    var buy_login = $scope._buylogin;
                    var is_login = UiCustomerBox.delegate.get.isLogin();
                    var is_state = (buy_login) ? (!is_login) ? true : false : false;
                    callback(is_state);
                },
                formLogin: function(is_state, callback) {
                    if (is_state) {
                        $inloginPopup.open();
                    }
                    callback(is_state);
                },
                getProductStaffId(staff_id_check, callback) {
                    var res_staff_id_check = staff_id_check;
                    var res_staff_id = $scope.dataApi.product.dataArray.product_staff_id;
                    var res_is_state = (res_staff_id != 0 && res_staff_id != '0' && res_staff_id != undefined) ? true : false;
                    callback(res_staff_id_check, res_staff_id, res_is_state);
                },
                isStaffId: function(staff_id_check, callback) { /* todo */
                    var _self = this;
                    _self.getProductStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        callback(res_staff_id_check, res_staff_id, res_is_state);
                    });
                },
                checkCartDuplicateStaff: function(res_staff_id_check, txt_staff_id, res_is_state, callback) {
                    var _self = this
                    var res_is_state = true;
                    if (res_staff_id_check) {
                        var dataSend = {
                            'txt_staff_id': txt_staff_id,
                        };
                        _self.dataSend("cart/duplicate_staff", dataSend, function(res_api, res_dataSend) {
                            _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                                res_is_state = res_api.data.duplicate;
                                callback(res_is_state);
                            });
                        });
                    } else {
                        callback(res_is_state);
                    }
                },
                showAlert: function(res_staff_id_check, res_staff_id, res_is_state, res_api, callback) {
                    var res_state = (res_staff_id_check) ? ((res_api) ? ((res_is_state) ? false : true) : true) : false;
                    if (res_state) {
                        if (!res_api) {
                            if (res_staff_id != '0' && res_staff_id != 0) {
                                $scope.controlAlert().alert('002');
                            } else {
                                $scope.controlAlert().alert('003');
                            }
                        } else {
                            if (!res_is_state) {
                                $scope.controlAlert().alert('003');
                            }
                        }
                    }
                    callback(res_state);
                },
                checkStaff: function(callback) {
                    var _self = this
                    var staff_id_check = $scope._checkstaff;
                    var res_check = false;
                    _self.isStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        _self.checkCartDuplicateStaff(res_staff_id_check, res_staff_id, res_is_state, function(res_api) {
                            _self.showAlert(res_staff_id_check, res_staff_id, res_is_state, res_api, function(res_state) {
                                res_check = res_state;
                                callback(res_check);
                            });
                        });
                    });
                },
                isProgress: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isProgress(productId)) ? true : false;
                    _self.consoleLog("isProgress : productId", productId);
                    _self.consoleLog("isProgress : state", state);
                    callback(state);
                },
                isSelected: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    _self.consoleLog("isSelected : productId", productId);
                    _self.consoleLog("isSelected : state", state);
                    callback(state);
                },
                isSelectedReturn: function(productId) {
                    var _self = this;
                    var ui_cart_state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    if (!$scope.setBuy.state_active) {
                        $scope.setBuy.state_active = true;
                        var state_process = $scope.setBuy.state_process;
                        var state_step = $scope.setBuy.state_step;
                        if (ui_cart_state && !state_process && state_step != 4) /* cart */ {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_active = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else if (!ui_cart_state && !state_process && state_step != 0) /* unset */ {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_active = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        } else {
                            $scope.setBuy.state_active = false;
                        }
                    }
                    return ui_cart_state;
                },
                updateState: function(productId) {
                    _self = this;
                    _self.isSelected(productId, function(res_state) {
                        if (res_state) {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_process = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        }
                        return res_state;
                    });
                },
                uiCart: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    _self.UiCartProductAdd(productId, quantityInput, promotionId, customOptions, function(res_data) {
                        if (res_data) {
                            _self.onTimeout(500, function() {
                                _self.onPass(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            }
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onError(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onUnset(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                        });
                                    });
                                });
                            });
                        }
                    });
                },
                postApiA: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    var custom_options = {};
                    var dataSend = {
                        'txt_product_id': productId,
                        'txt_amount': quantityInput,
                        'txt_is_clear_cart_before': "0",
                        'txt_custom_options_json': JSON.stringify(custom_options)
                    };
                    _self.dataSend("cart/product_add", dataSend, function(res_api, res_dataSend) {
                        _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                            if (res_ok) {
                                _self.onTimeout(500, function() {
                                    _self.onPass(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onCart(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            });
                                        });
                                    });
                                });
                            } else {
                                _self.onTimeout(500, function() {
                                    _self.onError(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onUnset(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                            });
                                        });
                                    });
                                });
                            }
                        });
                    });
                },
                onProcess: function(data, productId, quantityInput, promotionId, customOptions) {
                    var _self = this;
                    _self.isLogin(function(res_is_login) {
                        _self.formLogin(res_is_login, function(res_form) {
                            _self.checkStaff(function(res_is_state) {
                                if (!$scope.setBuy.state_process && !res_form && !res_is_state) {
                                    $scope.setBuy.state_process = true;
                                    _self.isSelected(productId, function(res_state) {
                                        if (!res_state) {
                                            _self.onLoad($scope.setBuy.state_step, function(res_step) {
                                                if (data.sum_product_price.price != 0 && data.quantity.quantity_max != 0 && (data.attribute.state == (data.attribute.productId != ''))) {
                                                    /* UiCart */
                                                    _self.uiCart(productId, quantityInput, promotionId, customOptions, res_step);
                                                    /* api post offline */
                                                    /*_self.postApiA(productId, quantityInput, promotionId, customOptions, res_step); */
                                                } else {
                                                    _self.onTimeout(500, function() {
                                                        _self.onError(res_step, function(res_step) {
                                                            _self.onTimeout(1000, function() {
                                                                _self.onUnset(res_step, function(res_step) {
                                                                    $scope.setBuy.state_process = false;
                                                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                                                });
                                                            });
                                                        });
                                                    });
                                                }
                                            });
                                        } else {
                                            $scope.setBuy.state_process = false;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            } else if ($scope._cart == "viewcart") {
                                                _self.viewCart($scope._cart);
                                            }
                                        }
                                    });
                                }
                            });
                        });
                    });
                },
                onTimeout: function(time, callback) {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        callback(true)
                    }, time);
                },
                onUnset: function(step, callback) {
                    var _self = this;
                    step = (step == 0) ? 0 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onLoad: function(step, callback) {
                    var _self = this;
                    step = (step == 0 || step == 1) ? 1 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onPass: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 2) ? 2 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onError: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 3) ? 3 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onCart: function(step, callback) {
                    var _self = this;
                    step = (step == 2 || step == 4) ? 4 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                trumpComponentCarts: function() {
                    var controlCart = share.getTrumpComponentCarts();
                    var component_carts = $('.cover-cards').hasClass('active');
                    if (!component_carts) {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.cart();
                        }
                    } else {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.load();
                        }
                    }
                },
                viewCart: function(viewcart) {
                    var _self = this;
                    _self.pageUrl(viewcart);
                },
                locationUrlReplace: function(page) {
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                main: function(callback) {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getDetail = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getDetail: function(api, callback) {
                    var _self = this;
                    var description = api.product_description;
                    var info = api.product_more_info;
                    var specificatio = [];
                    if (api.product_attribute.specification_data != undefined) {
                        specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? api.product_attribute.specification_data.pclass_array : [];
                    }
                    var state_specificatio = false;
                    if (api.product_attribute.specification_data != undefined) {
                        state_specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? true : false;
                    }
                    var state_info = (api.product_is_more_info == 1) ? true : false;
                    _self.consoleLog("getDetail : description", description);
                    _self.consoleLog("getDetail : info", info);
                    _self.consoleLog("getDetail : state_info", state_info);
                    _self.consoleLog("getDetail : specificatio", specificatio);
                    _self.consoleLog("getDetail : state_specificatio", state_specificatio);
                    callback(description, info, state_info, specificatio, state_specificatio);
                },
                onClickDetail: function(index) {
                    var _self = this;
                    $scope.data.detail.active = index;
                    _self.consoleLog("onClickDetail : data.detail.active", $scope.data.detail.active);
                }
            }
            return getFunction;
        };
        $scope.pages = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageName: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page_name);
                },
                pageUrl: function(page_name, id, name_url) {
                    var _self = this;
                    var page = page_name + "/" + id + "-" + name_url;
                    _self.locationUrlReplace(page);
                }
            }
            return getFunction;
        };
        $scope.countDown = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getLocation: function(callback) {
                    var _self = this;
                    var res_location = $location;
                    _self.consoleLog("getLocation", "res_location", res_location);
                    callback(res_location);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(params);
                },
                getLocationUrlNameProductDetail: function(callback) {
                    var _self = this;
                    _self.getRouteParams(function(res_params) {
                        _self.getLocation(function(res_location) {
                            var url_page_name = "/product-detail/" + res_params.product_id;
                            var res_url_name_product_detail = (res_location.url() == url_page_name) ? true : false;
                            _self.consoleLog("getLocationUrlNameProductDeal", "res_url_name_product_detail", res_url_name_product_detail);
                            callback(res_url_name_product_detail);
                        });
                    });
                },
                getUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    _self.consoleLog("getUnix", "now", now);
                    callback(now);
                },
                getCountDown: function(now, product_lifetime, callback) {
                    var _self = this;
                    var countdown_unix = parseInt(product_lifetime.lifetime_end_time) - now;
                    var milliseconds = moment.duration(countdown_unix * 1000, "milliseconds");
                    var res_countdown = ((milliseconds.days() <= 9) ? '0' + milliseconds.days() : milliseconds.days());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.hours() <= 9) ? '0' + milliseconds.hours() : milliseconds.hours());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.minutes() <= 9) ? '0' + milliseconds.minutes() : milliseconds.minutes());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.seconds() <= 9) ? '0' + milliseconds.seconds() : milliseconds.seconds());
                    _self.consoleLog("getCountDown", "res_countdown", res_countdown);
                    callback(res_countdown, countdown_unix);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                countDownByProduct: function(now, data_array, callback) {
                    var _self = this;
                    if (data_array.length != 0) {
                        if (data_array.product_lifetime.length != 0) {
                            _self.getCountDown(now, data_array.product_lifetime, function(res_count_down, res_countdown_unix) {
                                data_array.product_lifetime.lifetime_countdown = (res_countdown_unix > 0) ? res_count_down : "";
                                if (data_array.product_lifetime.lifetime_countdown == "") {
                                    _self.getNameUrl(data_array.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", data_array.product_set_array[0].product_id, res_name);
                                    });
                                }
                            });
                        }
                    }
                    _self.consoleLog("countDownByProduct", "data_array", data_array);
                    callback(data_array);
                },
                loop: function() {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        _self.getUnix(function(res_now) {
                            _self.countDownByProduct(res_now, $scope.dataApi.product.dataArray, function(data_array) {
                                $scope.dataApi.product.dataArray = data_array;
                                _self.getLocationUrlNameProductDetail(function(res_url_name_product_detail) {
                                    if (res_url_name_product_detail) {
                                        _self.loop();
                                    }
                                });
                            });
                        });
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.control = function() {
            var getFunction = {
                popupVideo: function(state, video_link, video_embed_code) {
                    var _self = this;
                    if (video_embed_code != '') {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    } else if (video_link != '') {
                        window.open(video_link, '_blank');
                    } else {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.data_control = {
            page_video: {
                popup: false,
                shop_video_embed_code: ""
            }
        }
        $scope.control_alert = {
            alert: {
                error_id: '',
                index: null,
                state: true,
                error: [{
                    id: '001',
                    title: 'การสั่งซื้อ',
                    messages: 'สามารถสั่งซื้อได้เพียงทีละออเดอร์เท่านั้น'
                }, {
                    id: '002',
                    title: 'การเพิ่มสินค้า',
                    messages: 'ไม่สามารถเพิ่มสินค้าของร้านมากกว่า 1 ร้านค้าได้'
                }, {
                    id: '003',
                    title: 'การสั่งซื้อ',
                    messages: 'ไม่สามารถเพิ่มสินค้า(ไม่มีร้านค้า)'
                }]
            }
        };
        $scope.controlAlert = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getErrorMessages: function(error_id, callback) {
                    var _self = this;
                    var messages = {
                        res_error_id: '',
                        res_index: null
                    }
                    angular.forEach($scope.control_alert.alert.error, function(item, index) {
                        if (item.id == error_id) {
                            messages.res_error_id = item.id;
                            messages.res_index = index;
                        }
                    });
                    callback(messages.res_error_id, messages.res_index);
                },
                alert: function(error_id) {
                    var _self = this;
                    _self.getErrorMessages(error_id, function(res_error_id, res_index) {
                        $scope.control_alert.alert.error_id = res_error_id;
                        $scope.control_alert.alert.index = res_index;
                        $scope.control_alert.alert.state = (!$scope.control.alert && res_error_id != '') ? true : false;
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.countDown().loop();
        /* set carousel  */
        $scope.setCarousel = {
            carousel: 0,
            index: 0
        };
        $scope.getCarousel().getCarousel($scope.setCarousel.carousel, function(res_carousel_id) {
            $scope.setCarousel.carousel = res_carousel_id;
        });
        /* set carousel  */
        /* get product api */
        $scope.dataApi = {
            reward: {
                dataSend: {},
                api: "shop/current",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            staff: {
                dataSend: {
                    txt_staff_id: 0
                },
                api: "staff/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            product: {
                dataSend: {
                    txt_product_id: 0
                },
                api: "product/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            relation: {
                dataSend: {
                    txt_referral_id: 0
                },
                api: "referral/relation",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.data = {
            attribute: {
                state: false,
                productId: "",
                dataArray: []
            },
            attribute_custom: {
                state: false,
                dataArray: []
            },
            reward: {
                quantity_name: 'reward',
                type_id: "0",
                reward_amount: 0,
                reward_percent: 0,
                reward_every_price: 0,
                point_reward: 0
            },
            quantity: {
                quantity_name: 'quantity',
                quantity_min: 1,
                quantity_max: 1,
                quantity_input: 1,
                quantity_select: []
            },
            product_price: {
                price_name: 'product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            product_compare_price: {
                price_name: 'product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_price: {
                price_name: 'sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_price: {
                price_name: 'sum_product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_minus_sum_product_price: {
                price_name: 'sum_product_compare_minus_sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            detail: {
                active: '0',
                dataArray: [{
                    index: '0',
                    state: true,
                    en: ($scope.description != undefined && $scope.description != "") ? $scope.description : 'Description',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '1',
                    state: true,
                    en: ($scope.info != undefined && $scope.info != "") ? $scope.info : 'Info',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '2',
                    state: true,
                    en: ($scope.specification != undefined && $scope.specification != "") ? $scope.specification : 'Specification',
                    th: '',
                    data: '',
                    dataArray: []
                }]
            }
        };
        $scope.setBuy = {
            promotion_id: '0',
            state_active: false,
            state_process: false,
            state_step: 0,
            state_data_font_color: "",
            state_data_background_color: "",
            stepArray: [{
                step: 0,
                name: "unset",
                icon: $scope._icebuyicon,
                state: "เพิ่มในรถเข็น",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 1,
                name: "load",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 2,
                name: "pass",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 3,
                name: "error",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 4,
                name: "cart",
                icon: "",
                state: "ดูรถเข็น",
                data_font_color: "",
                data_background_color: "primary_darkest"
            }]
        };
        /* - get api product/id start - */
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.product.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                $scope.dataApi.product.dataSend.txt_product_id = (res_product_id != false) ? res_product_id : 0;
                $scope.getData().dataSend($scope.dataApi.product.api, $scope.dataApi.product.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_product, res_state) {
                        $scope.dataApi.product.ok = res_ok;
                        $scope.dataApi.product.dataArray = get_res_api_product.data;
                        $scope.getData().consoleLog("get_res_api_product", get_res_api_product);
                        $scope.dataApi.product.dataArrayState = res_state;
                        /* -- get api shop/current to reward -- */
                        if (res_ok) {
                            /* -- get free gift promotion id -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.getData().getFreeGiftPromotionId(get_res_api_product.data.product_promotion, function(res_promotion_id) {
                                    $scope.setBuy.promotion_id = res_promotion_id;
                                });
                            });
                            /* -- get free gift promotion id -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.reward.dataArrayState = res_state;
                                $scope.getData().dataSend($scope.dataApi.reward.api, $scope.dataApi.reward.dataSend, function(res_api, res_dataSend) {
                                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                                        $scope.dataApi.reward.ok = res_ok;
                                        $scope.dataApi.reward.dataArray = get_res_api_shop.data;
                                        $scope.dataApi.reward.dataArrayState = res_state;
                                        $scope.getReward().createReward($scope.dataApi.product.dataArray.product_reward, get_res_api_shop.data.shop_point_config, function(res_reward) {
                                            $scope.data.reward.type_id = res_reward.type_id;
                                            $scope.data.reward.reward_amount = res_reward.amount;
                                            $scope.data.reward.reward_percent = res_reward.percent;
                                            $scope.data.reward.reward_every_price = res_reward.every_price;
                                            /* --- Wait product/id ,shop/current --- 
                                            /* ---- get attribute ---- */
                                            $scope.getAttribute().productAttribute(get_res_api_product.data.product_attribute, function(res_attribute) {
                                                $scope.data.attribute.dataArray = res_attribute;
                                                $scope.getAttribute().checkMinPrices(get_res_api_product, res_attribute, function(res_data_price, res_state) {
                                                    $scope.data.attribute.state = res_state;
                                                    $scope.data.product_price = res_data_price.product_price;
                                                    $scope.data.product_compare_price = res_data_price.product_compare_price;
                                                    $scope.data.sum_product_price = res_data_price.sum_product_price;
                                                    $scope.data.sum_product_compare_price = res_data_price.sum_product_compare_price;
                                                    $scope.data.sum_product_compare_minus_sum_product_price = res_data_price.sum_product_compare_minus_sum_product_price;
                                                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                                                        $scope.data.reward.point_reward = res_point_reward;
                                                    });
                                                    /* ----- stock ----- */
                                                    $scope.data.quantity.quantity_max = res_data_price.product_price.total_stock;
                                                    $scope.data.quantity.quantity_select = [];
                                                    for (var i = 0; i < res_data_price.product_price.total_stock; i++) {
                                                        $scope.data.quantity.quantity_select.push(i + 1);
                                                    }
                                                    /* ----- stock ----- */
                                                });
                                            });
                                            /* ---- get attribute ---- */
                                            /* ---- get attribute custom ---- */
                                            $scope.getAttributeCustom().createArray(get_res_api_product.data.product_custom_templates, function(res_custom_attribute, res_state) {
                                                $scope.data.attribute_custom.state = res_state;
                                                $scope.data.attribute_custom.dataArray = res_custom_attribute;
                                            });
                                            /* ---- get attribute custom ---- */
                                            /* ---- get detail ---- */
                                            $scope.getDetail().getDetail(get_res_api_product.data, function(res_description, res_info, res_state_info, res_specificatio, res_state_specificatio) {
                                                $scope.data.detail.dataArray[0].data = res_description;
                                                $scope.data.detail.dataArray[1].data = res_info;
                                                $scope.data.detail.dataArray[1].state = res_state_info;
                                                $scope.data.detail.dataArray[2].dataArray = res_specificatio;
                                                $scope.data.detail.dataArray[2].state = res_state_specificatio;
                                            });
                                            /* ---- get detail ---- */
                                            /* ---- update state ---- */
                                            $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                                            /* ---- update state ---- */
                                            /* --- Wait product/id ,shop/current --- */
                                        });
                                    });
                                });
                            });
                            /* -- get api shop/current to reward -- */
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.relation.dataArrayState = res_state;
                                $scope.getData().getReferralId(get_res_api_product.data.product_referral_display, function(res_referral_id) {
                                    $scope.dataApi.relation.dataSend.txt_referral_id = res_referral_id;
                                    $scope.getData().dataSend($scope.dataApi.relation.api, $scope.dataApi.relation.dataSend, function(res_api, res_dataSend) {
                                        $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_referral, res_state) {
                                            $scope.dataApi.relation.ok = res_ok;
                                            $scope.dataApi.relation.dataArray = (res_referral_id != 0) ? get_res_api_referral.data : [];
                                            $scope.dataApi.relation.dataArrayState = res_state;
                                        });
                                    });
                                });
                            });
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.getData().getStaffId(get_res_api_product.data.product_staff_id, function(res_staff) {
                                    if (res_staff.status) {
                                        $scope.dataApi.staff.dataArrayState = res_state;
                                        $scope.dataApi.staff.dataSend.txt_staff_id = res_staff.staff_id;
                                        $scope.getData().dataSend($scope.dataApi.staff.api, $scope.dataApi.staff.dataSend, function(res_api, res_dataSend) {
                                            $scope.getData().getApi(res_api, res_dataSend, function(res_ok, res, res_state) {
                                                $scope.dataApi.staff.ok = res_ok;
                                                $scope.dataApi.staff.dataArray = res.data;
                                                $scope.getData().getNameUrl(res.data.staff_first_name, function(res_staff_first_name_url) {
                                                    $scope.dataApi.staff.dataArray.staff_first_name_url = res_staff_first_name_url;
                                                    $scope.dataApi.staff.dataArrayState = res_state;
                                                });
                                            });
                                        });
                                    }
                                });
                            });
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                        } else {
                            /* ok = false */
                            if ($scope.dataApi.product.dataArray.length != 0) {
                                /* product deal to product original */
                                if ($scope.dataApi.product.dataArray.product_set_array.length != 0) {
                                    $scope.countDown().getNameUrl($scope.dataApi.product.dataArray.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", $scope.dataApi.product.dataArray.product_set_array[0].product_id, res_name);
                                    });
                                } else {
                                    $scope.pages().pageName("home");
                                }
                            } else {
                                /* product null */
                                $scope.pages().pageName("home");
                            }
                        }
                    });
                });
            });
        });
        /* - get api product/id end - */
        /* get product api */
    };
    return promise;
});_ui_share_app.directive('productDetailPageT', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageT';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        id: '@id',
        stilebutton: '@stilebutton',
        textbutton: '@textbutton',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope._getPostIdFromURL = function() {
            var dataget = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                dataget = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof dataget === 'number' && dataget > 0) {
                return dataget;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id) {
            var d = {
                'txt_product_id': product_id
            };
            GAEAPI.get('product/id', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelate = e.data;
                    console.log("dataRelate", $scope.dataRelate);
                }
            });
        };
        $scope.buildDataProductRelate($scope._getPostIdFromURL());
        
    };
    return promise;
});_ui_share_app.directive('productDetailPageTsr', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageTsr';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0
        };
        $scope.login = function() {
            var login = {
                showLogin: function() {
                    return UiCustomerBox.delegate.get.isLogin();
                },
                isLogin: function(callback) {
                    callback(UiCustomerBox.delegate.get.isLogin());
                },
                pageLogin: function() {
                    var _self = this;
                    _self.isLogin(function(isLogin) {
                        if (!isLogin) {
                            $inloginPopupTypeGrip.open();
                        }
                    });
                }
            }
            return login;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                    }
                }
            }
            return quantity;
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getDataArrayOk: function(output, callback) {
                    var state = false;
                    if (output.ok == 1) {
                        state = true;
                        callback(output, state);
                    }
                    callback(output, state);
                },
                quantity: function(product_stock_track_type_id, product_total_stock, callback) {
                    var total_stock = 0;
                    /* if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    } */
                    if (product_stock_track_type_id == "0") {
                        total_stock = 20;
                    } else if (product_stock_track_type_id == "1") {
                        if (product_total_stock > 0) {
                            total_stock = product_total_stock;
                        } else {
                            total_stock = 0;
                        }
                    }
                    callback(total_stock);
                },
                main: function() {
                    var _self = this;
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        _self.consoleLog("getDataProductArray : output : ", output.data);
                        _self.getDataArrayOk(output, function(output, state) {
                            if (state) {
                                _self.quantity(output.data.product_stock_track_type_id, output.data.product_total_stock, function(total_stock) {
                                    $scope.dataProductBuy.quantity_max = total_stock;
                                    _self.consoleLog("getDataProductArray : output : ", output.data);
                                    $scope.dataArray = output.data;
                                    $scope.dataProductBuy.price = output.data.product_price;
                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                    $scope.dataArrayState = _self.stateData(false, true);
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                    });
                                });
                            } else {
                                $scope.dataArrayState = _self.stateData(false, true);
                            }
                        });
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
    };
    return promise;
});_ui_share_app.directive('productDetailPageTypeA', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageTypeA';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        /* getUrlProductId */
        $scope.getUrlProductId = function() {
            $scope.consoleLog("getUrlProductId : $routeParams.product_id : ", $routeParams.product_id);
            if (typeof $routeParams.product_id !== 'undefined') {
                var url_product_id = $routeParams.product_id.split("-");
                var product_id = url_product_id[0];
                return product_id;
            }
        };
        /* getUrlProductId */
        /* consoleLog */
        $scope.consoleLog = function(showlog, data) {
            console.log(showlog, data);
        };
        /* consoleLog */
        /* getProductId */
        $scope.checkProduct = function() {
            var cart = {
                checkOutputOk: function(output, callback) {
                    $scope.consoleLog("cartProduct : cartcCtegory : output : ", output);
                    var output_ok_status = false;
                    if (output.ok == 1) {
                        output_ok_status = true;
                    }
                    callback(output_ok_status);
                },
                saveProduct: function(product, callback) {
                    $scope.consoleLog("cartProduct : cartcCtegory : product : ", product);
                    var save_product = product;
                    callback(save_product);
                },
                checkCtegory: function(category, callback) {
                    $scope.consoleLog("cartProduct : checkCtegory : category : ", category);
                    var ctegory_status = false;
                    if (category.length) {
                        ctegory_status = true;
                    }
                    callback(ctegory_status);
                },
                getCtegoryId: function(category, callback) {
                    $scope.consoleLog("cartProduct : checkCtegory : category : ", category);
                    var referral_id = category[0].referral_id;
                    callback(referral_id);
                },
                getReferralRelationId: function(referral_id, callback) {
                    $scope.consoleLog("cartProduct : getReferralRelationId : referral_id : ", referral_id);
                    var dataSend = {
                        'txt_referral_id': referral_id
                    };
                    $scope.consoleLog("cartProduct : getReferralRelationId : dataSend : ", dataSend);
                    GAEAPI.get('referral/relation', dataSend, $scope).then(function(output) {
                        $scope.consoleLog("cartProduct : getReferralRelationId : output : ", output);
                        $scope.checkProduct().checkOutputOk(output, function(output_ok_status) {
                            $scope.consoleLog("cartProduct : getReferralRelationId : checkOutputOk : output_ok_status : ", output_ok_status);
                            var data_relation = false;
                            if (output_ok_status) {
                                $scope.consoleLog("cartProduct : getReferralRelationId : checkOutputOk : ", "PASS");
                                data_relation = output.data;
                                callback(data_relation);
                            } else {
                                $scope.consoleLog("cartProduct : getReferralRelationId : checkOutputOk : ", "ERROR");
                                callback(data_relation);
                            }
                        });
                    });
                },
                checkStock: function(stock, variant, callback) {
                    $scope.consoleLog("cartProduct : checkStock : stock : ", stock);
                    $scope.consoleLog("cartProduct : checkStock : variant : ", variant);
                    var output_stock = "ERROR";
                    if (variant == 0) {
                        if (stock == -1) {
                            output_stock = "Do Not Track Inventory";
                        } else {
                            output_stock = "Track Inventory";
                        }
                    } else {
                        output_stock = "Attribute Class";
                    }
                    callback(output_stock);
                },
                calculateStock: function(output_stock, stock, callback) {
                    $scope.consoleLog("cartProduct : calculateStock : output_stock : ", output_stock);
                    $scope.consoleLog("cartProduct : calculateStock : stock : ", stock);
                    var array_stock = [];
                    var number_stock = 0;
                    if (output_stock == "Track Inventory") {
                        if (stock > 20) {
                            stock = 20;
                        }
                        number_stock = stock;
                        for (var i = 0; i < stock; i++) {
                            array_stock.push(i + 1);
                        }
                    } else if (output_stock == "Do Not Track Inventory") {
                        number_stock = 20;
                        for (var i = 0; i < 20; i++) {
                            array_stock.push(i + 1);
                        }
                    }
                    callback(array_stock, number_stock);
                },
                checkAttribute: function(attribute, variant, callback) {
                    $scope.consoleLog("cartProduct : checkAttribute : attribute : ", attribute);
                    $scope.consoleLog("cartProduct : checkAttribute : variant : ", variant);
                    var output_attribute = false;
                    if (attribute.option_data.variant_array.length > 0 && variant > 0) {
                        output_attribute = true;
                    }
                    callback(output_attribute);
                },
                saveAttribute: function(attribute, callback) {
                    $scope.consoleLog("cartProduct : saveAttribute : attribute : ", attribute);
                    var save_attribute = attribute;
                    callback(save_attribute);
                },
                checkPrice: function(product_price, variant, callback) {
                    $scope.consoleLog("cartProduct : checkPrice : attribute : ", attribute);
                    $scope.consoleLog("cartProduct : checkPrice : variant : ", variant);
                    var output_attribute = false;
                    if (attribute.option_data.variant_array.length > 0 && variant > 0) {
                        output_attribute = true;
                    }
                    callback(output_attribute);
                },
            }
            return cart;
        };
        $scope.dataRelation = false;
        $scope.dataProduct = false;
        $scope.dataAttribute = false;
        $scope.getProductStock = {
            array: [],
            number: 0
        };
        $scope.getProductIdState = {
            load: true,
            done: false
        };
        $scope.getProductId = function(product_id) {
            $scope.consoleLog("getProductId : product_id : ", product_id);
            $scope.getProductIdState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': product_id
            };
            $scope.consoleLog("getProductId : dataSend : ", dataSend);
            GAEAPI.get('product/id', dataSend).then(function(output) {
                $scope.consoleLog("getProductId : get : output : ", output);
                /* checkOutputOk */
                $scope.checkProduct().checkOutputOk(output, function(output_ok_status) {
                    $scope.consoleLog("getProductId : checkOutputOk : output_ok_status : ", output_ok_status);
                    if (output_ok_status) {
                        $scope.consoleLog("getProductId : checkOutputOk : ", "PASS");
                        /* saveProduct */
                        $scope.checkProduct().saveProduct(output.data, function(save_product) {
                            $scope.consoleLog("getProductId : saveProduct : save_product : ", save_product);
                            $scope.dataArray = save_product;
                            /* checkCtegory */
                            $scope.checkProduct().checkCtegory(save_product.product_referral_display.category, function(ctegory_status) {
                                $scope.consoleLog("getProductId : checkCtegory : ctegory_status : ", ctegory_status);
                                if (ctegory_status) {
                                    $scope.consoleLog("getProductId : checkCtegory : status : ", "PASS");
                                    $scope.checkProduct().getCtegoryId(save_product.product_referral_display.category, function(referral_id) {
                                        $scope.consoleLog("getProductId : checkCtegory : getCtegoryId : referral_id : ", referral_id);
                                        $scope.checkProduct().getReferralRelationId(referral_id, function(data_relation) {
                                            $scope.consoleLog("getProductId : checkCtegory : getReferralRelationId : data_relation : ", data_relation);
                                            $scope.dataRelation = data_relation;
                                        });
                                    });
                                } else {
                                    $scope.consoleLog("getProductId : checkCtegory : status : ", "ERROR");
                                }
                            });
                            /* checkCtegory */
                            /* checkStock */
                            $scope.checkProduct().checkStock(save_product.product_total_stock, save_product.product_total_variant, function(output_stock) {
                                $scope.consoleLog("getProductId : checkStock : output_stock : ", output_stock);
                                $scope.checkProduct().calculateStock(output_stock, save_product.product_total_stock, function(array_stock, number_stock) {
                                    $scope.consoleLog("getProductId : calculateStock : array_stock : ", array_stock);
                                    $scope.consoleLog("getProductId : calculateStock : number_stock : ", number_stock);
                                    $scope.getProductStock.array = array_stock;
                                    $scope.getProductStock.number = number_stock;
                                    $scope.consoleLog("getProductId : calculateStock : getProductStock : ", $scope.getProductStock);
                                });
                            });
                            /* checkStock */
                            /* checkAttribute */
                            $scope.checkProduct().checkAttribute(save_product.product_attribute, save_product.product_total_variant, function(output_attribute) {
                                $scope.consoleLog("getProductId : checkAttribute : output_attribute : ", output_attribute);
                                if (output_attribute) {
                                    $scope.consoleLog("getProductId : checkAttribute : status : ", "PASS");
                                    $scope.checkProduct().saveAttribute(save_product.product_attribute.option_data.pclass_array, function(save_attribute) {
                                        $scope.consoleLog("getProductId : saveAttribute : save_attribute : ", save_attribute);
                                        $scope.dataAttribute = save_attribute;
                                        $scope.consoleLog("getProductId : saveAttribute : dataAttribute : ", $scope.dataAttribute);
                                    });
                                } else {
                                    $scope.consoleLog("getProductId : checkAttribute : status : ", "ERROR");
                                }
                            });
                            /* checkAttribute */
                        });
                        /* saveProduct */
                    } else {
                        $scope.consoleLog("getProductId : checkOutputOk : ", "ERROR");
                    }
                    $scope.getProductIdState = $scope.StateData(false, true);
                });
                /* checkOutputOk */
            });
        };
        /* getProductId */
        /* StateData */
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        /* StateData */
        $scope.getProductId($scope.getUrlProductId());
    };
    return promise;
});// _data_qty_modelvar $xZoomTimer = null;
// var $xZoomInstance = false;
_ui_share_app.directive('productDetailPageU', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageU';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        stylebutton: '@stylebutton',
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.referral_id = '0';
        $scope._shop_id = CUR_THEME.shop_id();
        $scope._currency = ($scope._shop_id == "635") ? 0 : 2;
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.checkSeo = function() {
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
        $scope.calculateDiscount = function(expensivePrice, salePrice) {
            var dif = expensivePrice - salePrice;
            return parseInt(dif * 100 / expensivePrice);
        };
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* JQ: Scroll event */
        angular.element($window).bind('scroll', function() {
            if (!$scope.data) {
                return;
            }
            var curPos = ($(document).scrollTop());
            var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));
            console.debug("Cur pos", curPos, properHeight);
            if (curPos > properHeight) {
                angular.element('.block-background .bottom-info').addClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */
        $scope.data_min = [];
        $scope.dataPreserve = false;
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* Get data by product id */
        $scope.data = false;
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.quantity_in = function(product_total_stock, callback) {
            var total_stock = 0;
            if (product_total_stock == -1) {
                total_stock = 20;
            } else if (product_total_stock != -1 && product_total_stock != 0) {
                total_stock = product_total_stock;
            }
            callback(total_stock);
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope.quantity_in(e.data.product_total_stock, function(total_stock) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                        $scope.buildVariantOption(e.data);
                        console.log("product/id : ", $scope.data.product_referral_display);
                        if ($scope.data.product_referral_display.category != undefined) {
                            if ($scope.data.product_referral_display.category.length != 0) {
                                $scope.referral_id = $scope.data.product_referral_display.category[0].referral_id;
                                $scope._getdatamap($scope.data.product_referral_display.category[0].referral_id);
                            }
                        }
                        $scope.show_badge(e.data);
                        $scope.dataProductBuy.quantity_max = total_stock;
                        $scope.dataProductBuy.price = e.data.product_price;
                        $scope.dataProductBuy.sumprice = e.data.product_price;
                    });
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.makeVariantsClick();
            $scope.onSelectVariantItems(0, '');
        };
        $scope.buy_button = false;
        $scope.dataVariantsPick = [];
        $scope.max_length = 20;
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.testyuyu = 0;
                $scope.buy_button = false;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.dsetting').addClass("active");
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._getPostIdFromURL()
                }, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                        if (e.data.product_attribute.option_data != 0 && e.data.product_total_variant > 0) {
                            if (e.data.product_attribute.option_data.variant_array.length != 0 && e.data.product_total_variant > 0) {
                                var set_varia0 = e.data.product_attribute.option_data.variant_array[0].price;
                                for (var i = 0; i < e.data.product_attribute.option_data.variant_array.length; i++) {
                                    if (parseInt(set_varia0) >= parseFloat(e.data.product_attribute.option_data.variant_array[i].price)) {
                                        set_varia0 = e.data.product_attribute.option_data.variant_array[i].price;
                                        $scope.data_min = e.data.product_attribute.option_data.variant_array[i];
                                        // $scope.data = $scope.data_min[0];
                                        $scope.data.product_price = $scope.data_min.price;
                                        $scope.data.product_compare_price = $scope.data_min.compare_price;
                                    }
                                }
                                if ($scope.data_min.length == 0) {
                                    $scope.data_min = e.data.product_attribute.option_data.variant_array[0];
                                    $scope.data.product_price = $scope.data_min.price;
                                }
                                console.log("iujdishjdskd : ", $scope.data_min.price);
                                //  $scope.buildVariantOption(e.data);
                                // $scope.buildMultipleQuantity(e.data);
                            }
                        }
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    $scope.testyuyu = 0;
                    $('.d_qty_not_result').removeClass("active");
                    $('.dsetting').removeClass("active");
                    $scope.findVariantsData($scope.dataVariantsPick);
                    $scope.buy_button = true;
                } else {
                    $scope.testyuyu = 0;
                    $('.d_qty').removeClass('active').removeClass('inin');
                    $('.d_qty_price').removeClass("active");
                    $('.d_qty_price').removeClass("inin");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    $scope.data.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = 0;
                    $scope.data.product_compare_price = 0;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope.checkColorConfig = function() {
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._makeProductToCarousel();
                }, 500);
            }
        });
        $scope.qty_original = 1;
        $scope.qty_current = 1;
        $scope.viewOptimizeImage = function(size, image_url, image_width) {
            if (window.devicePixelRatio >= 2 || parseInt(image_width) <= size) {
                return image_url;
            }
            var a = image_url.split("/"),
                b = a[a.length - 1];
            a[a.length - 1] = 't' + size + '_' + b;
            return a.join("/");
        };
        $scope.gallerySingleViewIndex = 0;
        $scope.switchSingleView = function(idx) {
            console.log("$xZoomInstance", $xZoomInstance);
            $('.gallery_show_single').css({
                'transition': 'all 0.3s',
                'opacity': '0'
            });
            $timeout(function() {
                $scope.gallerySingleViewIndex = idx;
                $('.gallery_show_single').css({
                    'opacity': '1'
                });
            }, 300);
            setTimeout(function() {
                if ($(window).width() >= 992) {
                    if ($("img.zoom").attr('data-api-width') > 400 && $("img.zoom").attr('data-api-height') > 400) {
                        /*$("img.zoom").ezPlus({
                            'scrollZoom':true,
                            'responsive':true,
                            'zoomWindowWidth':400,
                            'zoomWindowHeight':400,
                            'zoomWindowOffetx':30,
                        });*/
                        $xZoomInstance = $('.zoom').xzoom({
                            Xoffset: 30,
                            tint: '#b9b5b3',
                        });
                    }
                }
            }, 300);
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.datamap = [];
        $scope._getdatamap = function(dataIn) {
            var dataSend = {
                'txt_referral_id': dataIn
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    $scope.datamap = output.data;
                }
            });
        }
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        _self.quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        _self.quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity;
                        _self.upDatePrice();
                        _self.quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity;
                        _self.upDatePrice();
                        _self.quantityBreaks();
                    }
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.data, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                }
            }
            return quantity;
        };
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".qty_display").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.warning_qty = 0;
        $scope.getWarn_qty = function() {
            $scope.warning_qty = 1;
        };
        $scope.ShowWithBadge = false;
        $scope.show_badge = function(data) {
            if (data.product_badge.length > 0) {
                for (var i = 0; i < data.product_badge.length; i++) {
                    if (data.product_badge[i].badge_id == 18) {
                        $scope.ShowWithBadge = true;
                        break;
                    }
                }
            } else {
                $scope.ShowWithBadge = false;
            }
        }
    };
    return promise;
});var $xZoomTimer = null;
var $xZoomInstance = false;
_ui_share_app.directive('productDetailPageUa', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageUa';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        stylebutton: '@stylebutton',
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.checkSeo = function() {
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* JQ: Scroll event */
        angular.element($window).bind('scroll', function() {
            if (!$scope.data) {
                return;
            }
            var curPos = ($(document).scrollTop());
            var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));
            console.debug("Cur pos", curPos, properHeight);
            if (curPos > properHeight) {
                angular.element('.block-background .bottom-info').addClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */
        $scope.data_min = [];
        $scope.dataPreserve = false;
        $scope.names = [];
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* Get data by product id */
        $scope.data = false;
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.getRelation($scope.data.product_referral[0].referral_id);
                    $scope._getdatamap($scope.data.product_referral_display.category[0].referral_id);
                    $scope.show_badge(e.data);
                    $scope.timeCountStart2(e.data);
                    if(e.data.product_total_variant == 0 && e.data.product_total_stock > 0){
                        $scope.names = [];
                        for (var i = 0; i < parseInt(e.data.product_total_stock); i++) {
                            $scope.names.push(i+1);
                        }
                        console.log("nnames stock :",$scope.names);
                    }
                    if(e.data.product_total_variant == 0 && e.data.product_total_stock < 0){
                        $scope.names = [];
                        for (var i = 0; i < 10; i++) {
                            $scope.names.push(i+1);
                        }
                        console.log("nnames stock :",$scope.names);
                    }
                    if(e.data.product_total_variant > 0){
                        $scope.names = [];
                            for (var i = 0; i < 10; i++) {
                                $scope.names.push(i+1);
                        }
                    }
                }
                console.log("detail_id_npd : ",$scope.data);
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope.showPart = "";
        $scope.showPart_wan = "";
        $scope.showPart_h = "";
        $scope.showPart_m = "";
        $scope.showPart_s = "";
        $scope.countDown = function(settime) {
            var time_year = "";
            var time_mount = "";
            var time_date = "";
            var time_hr = "";
            var time_mi = "";
            var time_se = "";
            var timeA = "";
            var timeB = "";
            var timeC = "";
            var timeDifference = "";
            var timeDifference_temp = "";
            var wan = "";
            var l_wan = "";
            var hour = "";
            var l_hour = "";
            var minute = "";
            var second = "";
            time_year = GAEAPI.time.dateFormat("YYYY", settime.product_lifetime.lifetime_end_time);
            time_mount = GAEAPI.time.dateFormat("M", settime.product_lifetime.lifetime_end_time);
            time_date = GAEAPI.time.dateFormat("D", settime.product_lifetime.lifetime_end_time);
            time_hr = GAEAPI.time.dateFormat("H", settime.product_lifetime.lifetime_end_time);
            time_mi = GAEAPI.time.dateFormat("m", settime.product_lifetime.lifetime_end_time);
            time_se = GAEAPI.time.dateFormat("s", settime.product_lifetime.lifetime_end_time);
            timeA = new Date(); /* วันเวลาปัจจุบัน */
            timeB = new Date(time_year, (time_mount - 1), time_date, time_hr, time_mi, time_se, '0');
            
            timeDifference = timeB.getTime() - timeA.getTime();
            console.log("timeDifference", timeDifference);
            if (timeDifference >= 0) {
                timeDifference = timeDifference / 1000;
                timeDifference = Math.floor(timeDifference);
                wan = Math.floor(timeDifference / 86400);
                l_wan = timeDifference % 86400;
                hour = Math.floor(l_wan / 3600);
                l_hour = l_wan % 3600;
                minute = Math.floor(l_hour / 60);
                second = l_hour % 60;
                $scope.showPart = wan + " วัน " + pad(hour, 2) + " ชั่วโมง " + pad(minute, 2) + " นาที " + pad(second, 2) + " วินาที";
                $scope.showPart_wan = wan;
                $scope.showPart_h = pad(hour, 2);
                $scope.showPart_m = pad(minute, 2);
                $scope.showPart_s = pad(second, 2);
                if (wan == 0 && hour == 0 && minute == 0 && second == 0) {}
                console.log("check_array", $scope.showPart);
            }
        };
        function pad(str, max) {
            str = str.toString();
            return str.length < max ? pad("0" + str, max) : str;
        };
        $scope.timeout_promise2 = null;
        $scope.timeCountStart2 = function(settime) {
            $scope.timeout_promise2 = $timeout(function() {
                $scope.countDown(settime);
                $scope.timeCountStart2(settime);
            }, 1000);
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.makeVariantsClick();
            $scope.onSelectVariantItems(0, '');
        };
        $scope.buy_button = false;
        $scope.dataVariantsPick = [];
        $scope.max_length = 20;
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.testyuyu = 0;
                $scope.buy_button = false;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.dsetting').addClass("active");
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._getPostIdFromURL()
                }, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                        if (e.data.product_attribute.option_data != 0 && e.data.product_total_variant > 0) {
                            if (e.data.product_attribute.option_data.variant_array.length != 0 && e.data.product_total_variant > 0) {
                                var set_varia0 = e.data.product_attribute.option_data.variant_array[0].price;
                                for (var i = 0; i < e.data.product_attribute.option_data.variant_array.length; i++) {
                                    if (parseInt(set_varia0) >= parseInt(e.data.product_attribute.option_data.variant_array[i].price)) {
                                        set_varia0 = e.data.product_attribute.option_data.variant_array[i].price;
                                        $scope.data_min = e.data.product_attribute.option_data.variant_array[i];
                                        // $scope.data = $scope.data_min[0];
                                        $scope.data.product_price = $scope.data_min.price;
                                        $scope.data.product_compare_price = $scope.data_min.compare_price;
                                    }
                                }
                                if ($scope.data_min.length == 0) {
                                    $scope.data_min = e.data.product_attribute.option_data.variant_array[0];
                                    $scope.data.product_price = $scope.data_min.price;
                                }
                                console.log("iujdishjdskd : ", $scope.data_min.price);
                                //  $scope.buildVariantOption(e.data);
                                // $scope.buildMultipleQuantity(e.data);
                            }
                        }
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    $scope.testyuyu = 0;
                    $('.d_qty_not_result').removeClass("active");
                    $('.dsetting').removeClass("active");
                    $scope.findVariantsData($scope.dataVariantsPick);
                    $scope.buy_button = true;
                } else {
                    $scope.testyuyu = 0;
                    $('.d_qty').removeClass('active').removeClass('inin');
                    $('.d_qty_price').removeClass("active");
                    $('.d_qty_price').removeClass("inin");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    $scope.data.product_total_stock = dataVariants[i].total_stock;
                    $scope.names = [];
                    for (var j = 0; j < 10; j++) {
                        $scope.names.push(j+1);
                    }
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = 0;
                    $scope.data.product_compare_price = 0;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope.checkColorConfig = function() {
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._makeProductToCarousel();
                }, 500);
            }
        });
        $scope.qty_original = 1;
        $scope.qty_current = 1;
        $scope.viewOptimizeImage = function(size, image_url, image_width) {
            if (window.devicePixelRatio >= 2 || parseInt(image_width) <= size) {
                return image_url;
            }
            var a = image_url.split("/"),
                b = a[a.length - 1];
            a[a.length - 1] = 't' + size + '_' + b;
            return a.join("/");
        };
        $scope.gallerySingleViewIndex = 0;
        $scope.switchSingleView = function(idx) {
            console.log("$xZoomInstance", $xZoomInstance);
            $('.gallery_show_single').css({
                'transition': 'all 0.3s',
                'opacity': '0'
            });
            $timeout(function() {
                $scope.gallerySingleViewIndex = idx;
                $('.gallery_show_single').css({
                    'opacity': '1'
                });
            }, 300);
            setTimeout(function() {
                if ($(window).width() >= 992) {
                    if ($("img.zoom").attr('data-api-width') > 400 && $("img.zoom").attr('data-api-height') > 400) {
                        /*$("img.zoom").ezPlus({
                            'scrollZoom':true,
                            'responsive':true,
                            'zoomWindowWidth':400,
                            'zoomWindowHeight':400,
                            'zoomWindowOffetx':30,
                        });*/
                        $xZoomInstance = $('.zoom').xzoom({
                            Xoffset: 30,
                            tint: '#b9b5b3',
                        });
                    }
                }
            }, 300);
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.redirectCheckout = function(p,q){
            window.location.href = GURL.base_url() + "checkout?pdata="+p+'-'+q;
        };
        $scope.datamap = [];
        $scope._getdatamap = function(dataIn) {
            var dataSend = {
                'txt_referral_id': dataIn
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    $scope.datamap = output.data;
                }
            });
        }
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            var check_num = 1;
            if($(".d_qty_i").find('select').val() != undefined && $(".d_qty_i").find('select').val() != ''){
                 check_num = $(".d_qty_i").find('select').val().substr(7);
            }else{
                $(".d_qty_i").find('select').val("number:1");
                $(".d_qty_i").find('select').selectedIndex = "2";
            }
            console.log("shdgshdgsh :",check_num);
            return parseInt(check_num);
            // return $(".qty_display").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 9) {
                i = 9;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('select[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('select[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
            // alert(i);
            console.log("data_set array test : ",i);
            $scope._data_qty_selected = i;
            // parseInt(e.val());
            // alert(i);
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
            alert("กรุณาเลือกตัวเลือกให้ครบถ้วน");
        };
        $scope.warning_qty = 0;
        $scope.getWarn_qty = function() {
            $scope.warning_qty = 1;
        };
        $scope.ShowWithBadge = false;
        $scope.show_badge = function(data) {
            if (data.product_badge.length > 0) {
                for (var i = 0; i < data.product_badge.length; i++) {
                    if (data.product_badge[i].badge_id == 18) {
                        $scope.ShowWithBadge = true;
                        break;
                    }
                }
            } else {
                $scope.ShowWithBadge = false;
            }
        }
    };
    return promise;
});var $xZoomTimer = null;
var $xZoomInstance = false;
_ui_share_app.directive('productDetailPageUb', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageUb';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                findVariantsData: function(attributeOption, dataVariants, callback) {
                    var _self = this;
                    var variants = dataVariants;
                    _self.consoleLog("findVariantsData : variants : ", variants);
                    var variantsOut = [];
                    for (var i = 0; i < variants.length; i++) {
                        var optionJson = angular.fromJson(variants[i].option_id_json);
                        if (_self.compareArray(attributeOption, optionJson)) {
                            _self.consoleLog("findVariantsData : variants[i] : ", variants[i]);
                            variantsOut = variants[i];
                            break;
                        }
                    }
                    callback(variantsOut);
                },
                checkOption: function(variants_total, callback) {
                    var state = false;
                    if (variants_total == 0) {
                        state = true;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = false;
                    if (stateIn == false && quantity_max > 0) {
                        state = true;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, function(variantsOut) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                $scope.dataArray.product_id = variantsOut.product_id;
                                $scope.dataArray.product_sku = variantsOut.sku;
                                $scope.dataArray.product_price = variantsOut.price;
                                $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                    _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                        $scope.buy.state = state;
                                        if ($scope.attribute.variantsTotal != 0) {
                                            $scope.buy.attribute = true;
                                        }
                                    });
                                });
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = false;
                    if (variants_total == 0) {
                        state = true;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = false;
                    if (stateIn == true && quantity_max > 0) {
                        state = true;
                    }
                    callback(state);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        _self.consoleLog("getDataProductArray : output : ", output.data);
                        _self.quantity(output.data.product_total_stock, function(total_stock) {
                            _self.consoleLog("quantity : total_stock : ", total_stock);
                            $scope.dataProductBuy.quantity_max = total_stock;
                            $scope.dataArray = output.data;
                            _self.productTab(output.data.product_tags, function(productTab) {
                                $scope.dataArrayTags = productTab;
                                _self.showTab(output.data, function(description, info) {
                                    $scope.showTab.dataTab[0].data = description;
                                    $scope.showTab.dataTab[1].data = info;
                                });
                                _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                    _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                    _self.consoleLog("getAttribute : attribute : ", attribute);
                                    _self.consoleLog("getAttribute : variants : ", variants);
                                    _self.checkOption(variants_total, function(state) {
                                        _self.checkTotalStock(state, total_stock, function(state) {
                                            $scope.buy.state = state;
                                            $scope.attribute.attributeOption = attribute;
                                            $scope.attribute.dataVariants = variants;
                                            $scope.attribute.variantsTotal = variants_total;
                                        });
                                    });
                                });
                                $scope.dataProductBuy.price = output.data.product_price;
                                $scope.dataProductBuy.sumprice = output.data.product_price;
                                _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                    _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                    $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                    if (quantity_break.length) {
                                        $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                    }
                                });
                                _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                    _self.consoleLog("getNavigationBar : output : ", output.data);
                                    $scope.navigationBar = output.data;
                                    $scope.dataArrayState = _self.stateData(false, true);
                                });
                            });
                        });
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
    };
    return promise;
});var $xZoomTimer = null;
var $xZoomInstance = false;
_ui_share_app.directive('productDetailPageUc', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageUc';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon : '@icon',
        stylebutton : '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                findVariantsData: function(attributeOption, dataVariants, callback) {
                    var _self = this;
                    var variants = dataVariants;
                    _self.consoleLog("findVariantsData : variants : ", variants);
                    var variantsOut = [];
                    for (var i = 0; i < variants.length; i++) {
                        var optionJson = angular.fromJson(variants[i].option_id_json);
                        if (_self.compareArray(attributeOption, optionJson)) {
                            _self.consoleLog("findVariantsData : variants[i] : ", variants[i]);
                            variantsOut = variants[i];
                            break;
                        }
                    }
                    callback(variantsOut);
                },
                checkOption: function(variants_total, callback) {
                    var state = false;
                    if (variants_total == 0) {
                        state = true;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = false;
                    if (stateIn == false && quantity_max > 0) {
                        state = true;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, function(variantsOut) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                $scope.dataArray.product_id = variantsOut.product_id;
                                $scope.dataArray.product_sku = variantsOut.sku;
                                $scope.dataArray.product_price = variantsOut.price;
                                $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                    _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                        $scope.buy.state = state;
                                        if ($scope.attribute.variantsTotal != 0) {
                                            $scope.buy.attribute = true;
                                        }
                                    });
                                });
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = false;
                    if (variants_total == 0) {
                        state = true;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = false;
                    if (stateIn == true && quantity_max > 0) {
                        state = true;
                    }
                    callback(state);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        _self.consoleLog("getDataProductArray : output : ", output.data);
                        _self.quantity(output.data.product_total_stock, function(total_stock) {
                            _self.consoleLog("quantity : total_stock : ", total_stock);
                            $scope.dataProductBuy.quantity_max = total_stock;
                            $scope.dataArray = output.data;
                            _self.productTab(output.data.product_tags, function(productTab) {
                                $scope.dataArrayTags = productTab;
                                _self.showTab(output.data, function(description, info) {
                                    $scope.showTab.dataTab[0].data = description;
                                    $scope.showTab.dataTab[1].data = info;
                                });
                                _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                    _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                    _self.consoleLog("getAttribute : attribute : ", attribute);
                                    _self.consoleLog("getAttribute : variants : ", variants);
                                    _self.checkOption(variants_total, function(state) {
                                        _self.checkTotalStock(state, total_stock, function(state) {
                                            $scope.buy.state = state;
                                            $scope.attribute.attributeOption = attribute;
                                            $scope.attribute.dataVariants = variants;
                                            $scope.attribute.variantsTotal = variants_total;
                                        });
                                    });
                                });
                                $scope.dataProductBuy.price = output.data.product_price;
                                $scope.dataProductBuy.sumprice = output.data.product_price;
                                _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                    _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                    $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                    if (quantity_break.length) {
                                        $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                    }
                                });
                                _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                    _self.consoleLog("getNavigationBar : output : ", output.data);
                                    $scope.navigationBar = output.data;
                                    $scope.dataArrayState = _self.stateData(false, true);
                                });
                            });
                        });
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
    };
    return promise;
});var $xZoomTimer = null;
var $xZoomInstance = false;
_ui_share_app.directive('productDetailPageUd', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageUd';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon: '@icon',
        stylebutton: '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.shopPointConfig = [];
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                checkAttributeOption: function(attributeOption, attributeOptionLength, callback) {
                    var _self = this;
                    var attribute = (attributeOption.length == attributeOptionLength) ? true : false;
                    for (var i = 0; i < attributeOption.length; i++) {
                        _self.consoleLog("checkAttributeOption : attributeOption[i] : ", attributeOption[i]);
                        if (attributeOption[i] == undefined) {
                            attribute = false;
                        }
                    }
                    callback(attribute);
                },
                findVariantsData: function(attributeOption, dataVariants, attributeOptionLength, callback) {
                    var _self = this;
                    _self.consoleLog("findVariantsData : attributeOption : ", attributeOption);
                    _self.consoleLog("findVariantsData : dataVariants : ", dataVariants);
                    _self.consoleLog("findVariantsData : attributeOptionLength : ", attributeOptionLength);
                    _self.checkAttributeOption(attributeOption, attributeOptionLength, function(res_attribute_option) {
                        _self.consoleLog("checkAttributeOption : callback : res_attribute_option ", res_attribute_option);
                        var variantsOut = [];
                        for (var i = 0; i < dataVariants.length; i++) {
                            var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                            if (_self.compareArray(attributeOption, optionJson)) {
                                _self.consoleLog("findVariantsData : dataVariants[i] : ", dataVariants[i]);
                                variantsOut = dataVariants[i];
                                break;
                            }
                        }
                        callback(variantsOut, res_attribute_option);
                    });
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var _self = this;
                    var state = true;
                    _self.consoleLog("checkTotalStock : index : ", stateIn);
                    _self.consoleLog("checkTotalStock : quantity_max : ", quantity_max);
                    if (stateIn == false && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, $scope.attribute.attributeOption.length, function(variantsOut, res_attribute_option) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                _self.consoleLog("onClickOption : if : findVariantsData : res_attribute_option : ", res_attribute_option);
                                if (variantsOut.length != 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = variantsOut.product_id;
                                    $scope.dataArray.product_sku = variantsOut.sku;
                                    $scope.dataProductBuy.price = variantsOut.price;
                                    $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                    $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                    _self.consoleLog("zzzz onClickOption : variantsOut : ", variantsOut);
                                    _self.consoleLog("zzzz onClickOption : variantsOut : ", $scope.dataArray.product_image);
                                    if (variantsOut.variant_image != 0) {
                                        if ($scope.dataArray.product_image.length != 0) {
                                            for (var i = 0; i < $scope.dataArray.product_image.length; i++) {
                                                if ($scope.dataArray.product_image[i].image_id == variantsOut.variant_image[0].image_id) {
                                                    $scope.slickImageGoto(variantsOut.variant_image[0].image_id);
                                                }
                                            }
                                        }
                                    }
                                    _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                        _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                            $scope.buy.state = state;
                                            if ($scope.attribute.variantsTotal != 0) {
                                                $scope.buy.attribute = true;
                                            }
                                        });
                                    });
                                } else if (variantsOut.length == 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = 0;
                                    $scope.dataArray.product_sku = '';
                                    $scope.dataProductBuy.price = 0;
                                    $scope.dataArray.product_compare_price = 0;
                                    $scope.dataProductBuy.quantity_max = 1;
                                    $scope.buy.state = true;
                                    $scope.buy.attribute = true;
                                }
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        console.log("quantity : input : inputQuantity : ", $scope.dataProductBuy.inputQuantity);
                        console.log("quantity : input : quantity_max : ", $scope.dataProductBuy.quantity_max);
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = ($scope.dataProductBuy.quantity_max != 0) ? $scope.dataProductBuy.quantity_max : 1;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            $scope.cover_lists_index = idx;
            setTimeout(function() {
                $scope.cover_lists_index = idx;
                // $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.cover_lists_index = 0;
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.imageCarouselBar = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    slidesToShow: 6,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1200,
                        settings: {
                            slidesToShow: 5,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: 3,
                        }
                    }]
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(res) {
                        _self.consoleLog("getData : res : ", res);
                        callback(res);
                    });
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 9999;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = true;
                    if (stateIn == true && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkPriceMin: function(variant, callback) {
                    var _self = this;
                    var priceMin = parseFloat(variant[0].price);
                    var comparePriceMin = parseFloat(variant[0].compare_price);
                    for (var i = 0; i < variant.length; i++) {
                        _self.consoleLog('checkPriceMin : priceMin : ', priceMin);
                        _self.consoleLog('checkPriceMin : variant[i].price : ', variant[i].price);
                        if (priceMin >= parseFloat(variant[i].price)) {
                            priceMin = parseFloat(variant[i].price);
                            comparePriceMin = parseFloat(variant[i].compare_price);
                        }
                    }
                    callback(priceMin, comparePriceMin);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    var dataSend = {};
                    _self.getApi("shop/current", dataSend, function(res_api) {
                        $scope.shopPointConfig = res_api.data.shop_point_config;
                        _self.getDataProductArray('product/id', function(output) {
                            if (output.data.length != 0) {
                                _self.consoleLog("getDataProductArray : output : ", output.data);
                                _self.quantity(output.data.product_total_stock, function(total_stock) {
                                    _self.consoleLog("quantity : total_stock : ", total_stock);
                                    $scope.dataProductBuy.quantity_max = total_stock;
                                    $scope.dataArray = output.data;
                                    if (output.data.product_image.length != 0) {
                                        $scope.slickImageGoto(output.data.product_image[0].image_id);
                                    }
                                    _self.productTab(output.data.product_tags, function(productTab) {
                                        $scope.dataArrayTags = productTab;
                                        _self.showTab(output.data, function(description, info) {
                                            $scope.showTab.dataTab[0].data = description;
                                            $scope.showTab.dataTab[1].data = info;
                                        });
                                        _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                            _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                            _self.consoleLog("getAttribute : attribute : ", attribute);
                                            _self.consoleLog("getAttribute : variants : ", variants);
                                            _self.checkOption(variants_total, function(state) {
                                                _self.checkTotalStock(state, total_stock, function(state) {
                                                    $scope.buy.state = state;
                                                    $scope.attribute.attributeOption = attribute;
                                                    $scope.attribute.dataVariants = variants;
                                                    $scope.attribute.variantsTotal = variants_total;
                                                    if (variants_total > 0) {
                                                        _self.checkPriceMin(variants, function(res_price, res_compare_price) {
                                                            $scope.dataProductBuy.price = res_price;
                                                            $scope.dataProductBuy.sumprice = res_price;
                                                            $scope.dataArray.product_compare_price = res_compare_price;
                                                        });
                                                    } else {
                                                        $scope.dataProductBuy.price = output.data.product_price;
                                                        $scope.dataProductBuy.sumprice = output.data.product_price;
                                                    }
                                                });
                                            });
                                        });
                                        $scope.dataProductBuy.price = output.data.product_price;
                                        $scope.dataProductBuy.sumprice = output.data.product_price;
                                        _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                            _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                            $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                            if (quantity_break.length) {
                                                $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                            }
                                        });
                                        _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                            _self.consoleLog("getNavigationBar : output : ", output.data);
                                            $scope.navigationBar = output.data;
                                            $scope.dataArrayState = _self.stateData(false, true);
                                        });
                                    });
                                });
                            } else {
                                window.history.back();
                            }
                        });
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
        $scope.getShopPointConfigRewardState = function(productPrice) {
            var state = 'RewardShop';
            var sup_price = parseInt(productPrice);
            if ($scope.shopPointConfig.length != 0) {
                if (parseInt($scope.shopPointConfig.er_rate) != 0 && parseInt($scope.shopPointConfig.er_earn) != 0) {
                    if (sup_price > 0) {
                        if (parseInt($scope.shopPointConfig.er_rate) <= sup_price) {
                            return 'RewardShop';
                        } else {
                            return 'High';
                        }
                    } else {
                        return 'High';
                    }
                } else {
                    return 'RewardProduct';
                }
            } else {
                return 'RewardProduct';
            }
        };
        $scope.getShopPointConfigReward = function(productPrice) {
            var sup_price = 0;
            var er_rate = 0;
            var er_earn = 0;
            var mathFloor = 0;
            var point = 0;
            if ($scope.shopPointConfig.length != 0) {
                sup_price = productPrice;
                er_rate = parseInt($scope.shopPointConfig.er_rate);
                er_earn = parseInt($scope.shopPointConfig.er_earn);
                mathFloor = Math.floor(sup_price / er_rate);
                point = mathFloor * er_earn;
                return point;
            } else {
                return point;
            }
        }
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});_ui_share_app.directive('productDetailPageV', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageV';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            if (product_tag != '') {
                var tag = {
                    'tags': product_tag
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 4,
                    'txt_filter_json': JSON.stringify(tag)
                };
            } else {
                $scope.dataRelatetagState = $scope.StateData(false, true);
                $scope.dataRelatetag = [];
                return;
            }
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    // for (var i = 0; i < output.data.dataList.length; i++) {
                    //     if(output.data.dataList){
                    //         $scope.dataRelatetag = output.data.dataList;
                    //     }
                    // }
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.data_min = [];
        $scope._dataArrayTags = [];
        $scope.data_video_id = false;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    // if ($scope._dataArray.product_hightlight_video_embed != "") {
                    //     $scope._dataArray.product_image.unshift({
                    //         image_url: $scope.imgPath + 'img-play.png',
                    //         product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                    //     });
                    // }
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if (res.data.product_tags != "") {
                        $scope._dataArrayTags = res.data.product_tags.split(",");
                    }
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags, $scope._dataArray.product_referral_display.category[0].referral_id);
                    if (res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            // alert("x๊อบไข่สด");
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                            //      $scope.buildVariantOption(e.data);
                            //     $scope.buildMultipleQuantity(e.data);
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 98) {
                i = 98;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
            if (i > 98) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 99;
                    e.val(99);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.onClickVariantItems();
        };
        $scope.dataVariantsPick = [];
        $scope.buy_button = false;
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            $scope.buy_button = false;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.buy_button = true;
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
            //window.location.href='login';
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            /* $("iframe").css("height", $(".cover_image_item").css("width"));
             $("iframe").css("width", $(".cover_image_item").css("width")); */
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageVa', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageVa';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d ,$scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            if (product_tag != '') {
                var tag = {
                    'tags': product_tag
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 4,
                    'txt_filter_json': JSON.stringify(tag)
                };
            } else {
                $scope.dataRelatetagState = $scope.StateData(false, true);
                $scope.dataRelatetag = [];
                return;
            }
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend ,$scope).then(function(output) {
                if (output.ok == 1) {
                    // for (var i = 0; i < output.data.dataList.length; i++) {
                    //     if(output.data.dataList){
                    //         $scope.dataRelatetag = output.data.dataList;
                    //     }
                    // }
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope.data_relate_pro = [];
        $scope._getDataRelate = function(id, limit) {
         
        
            var dataSend = {
                'txt_product_id': id,
                'txt_limit': limit,
            };
            
            GAEAPI.get('product/related', dataSend, $scope).then(function(output) {
               
                if (output.ok == 1) {
                    // $scope.$apply(function() {
                        $scope.data_relate_pro = output.data.lists;
                        
                    // });
                }
               
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.data_min = [];
        $scope._dataArrayTags = [];
        $scope.data_video_id = false;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend ,$scope).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    // if ($scope._dataArray.product_hightlight_video_embed != "") {
                    //     $scope._dataArray.product_image.unshift({
                    //         image_url: $scope.imgPath + 'img-play.png',
                    //         product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                    //     });
                    // }
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if (res.data.product_tags != "") {
                        $scope._dataArrayTags = res.data.product_tags.split(",");
                    }
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags, $scope._dataArray.product_referral_display.category[0].referral_id);
                    $scope._getDataRelate($scope.data_video_id,8);
                    // if (res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0) {
                    //     if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                    //         // alert("x๊อบไข่สด");
                    //         var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                    //         for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                    //             if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                    //                 set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                    //                 $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                    //             }
                    //         }
                    //         if ($scope.data_min.length == 0) {
                    //             $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                    //         }
                    //         console.log("iujdishjdskd : ", $scope.data_min);
                           
                    //         $scope.buildVariantOption(res.data);
                    //     }
                    //     $scope._dataArray.product_price = $scope.data_min.price;
                    //     $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    // }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 98) {
                i = 98;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
            if (i > 98) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 99;
                    e.val(99);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.onClickVariantItems();
        };
        $scope.dataVariantsPick = [];
        $scope.buy_button = false;
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            $scope.buy_button = false;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.buy_button = true;
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
            //window.location.href='login';
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            /* $("iframe").css("height", $(".cover_image_item").css("width"));
             $("iframe").css("width", $(".cover_image_item").css("width")); */
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageVb', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageVb';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
        imgcart: '@imgcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            if (product_tag != '') {
                var tag = {
                    'tags': product_tag
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 4,
                    'txt_filter_json': JSON.stringify(tag)
                };
            } else {
                $scope.dataRelatetagState = $scope.StateData(false, true);
                $scope.dataRelatetag = [];
                return;
            }
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    // for (var i = 0; i < output.data.dataList.length; i++) {
                    //     if(output.data.dataList){
                    //         $scope.dataRelatetag = output.data.dataList;
                    //     }
                    // }
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope.qtyProduct = 1;
        $scope.result_price = 0;
        $scope.checkQty = function(qtyProduct) {
            var productQuantityBreak = GAEAPI.getValueForKey($scope._data_product_id, "product_quantity_break", []);
            var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
            var product_price = GAEAPI.getValueForKey($scope._data_product_id, "product_price", 0);
            console.log("quantityBreak : ", quantityBreak);
            console.log("quantityBreak : qtyProduct : ", qtyProduct);
            for (var index in quantityBreak) {
                var rowData = quantityBreak[index];
                var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                if (qtyProduct >= amount_end) {
                    $scope.result_price = unit_price;
                }
            }
        };
        $scope.getQuantityBreak = function(dataSend, api, callback) {
            console.log("getQuantityBreak : dataSend : ", dataSend, " api : ", api);
            var quantity_break = [];
            GAEAPI.get(api, dataSend).then(function(output) {
                console.log("getQuantityBreak : output : ", output);
                if (output.ok == 1) {
                    quantity_break = output.data.quantity_break;
                    callback(quantity_break);
                }
                callback(quantity_break);
            });
            callback(quantity_break);
        };
        $scope.checkLogin = function(urlApi, product_id, status_login, callback) {
            var dataSend = {};
            var productId = parseInt(product_id);
            var statusLogin = status_login;
            var api = urlApi;
            var customerId = 0;
            if (api == 'product/id') {
                dataSend = {
                    'txt_product_id': productId,
                }
                console.log("checkLogin : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                callback(statusLogin, customerId, dataSend, api);
            } else if (api == 'product/quantity_break') {
                if (statusLogin) {
                    customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                    dataSend = {
                        'txt_product_id': productId,
                        'txt_customer_id': customerId,
                    }
                    console.log("checkLogin : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                    callback(statusLogin, customerId, dataSend, api);
                } else {
                    console.log("checkLogin : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                    callback(statusLogin, customerId, dataSend, api);
                }
            }
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.data_min = [];
        $scope._dataArrayTags = [];
        $scope.data_video_id = false;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    // if ($scope._dataArray.product_hightlight_video_embed != "") {
                    //     $scope._dataArray.product_image.unshift({
                    //         image_url: $scope.imgPath + 'img-play.png',
                    //         product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                    //     });
                    // }
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if (res.data.product_tags != "") {
                        $scope._dataArrayTags = res.data.product_tags.split(",");
                    }
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.checkLogin('product/quantity_break', dataSend.txt_product_id, UiCustomerBox.delegate.get.isLogin() , function(statusLogin, customerId, dataSend, api) {
                            console.log("getProductId checkLogin callback : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                            if (statusLogin) {
                                console.log("getProductId checkLogin : IF");
                                $scope.getQuantityBreak(dataSend, api, function(quantity_break) {
                                    console.log("getProductId checkLogin callback getQuantityBreak : quantity_break : ", quantity_break);
                                    $scope._dataArray.product_quantity_break.quantity_break = quantity_break;
                                    if (quantity_break.length) {
                                        $scope.result_price = quantity_break[0].unit_price;
                                    }
                                });
                            } else {
                                console.log("getProductId checkLogin : ELSE")
                            }
                    });
                    $scope.productRelateTag($scope._dataArray.product_tags, $scope._dataArray.product_referral_display.category[0].referral_id);
                    if (res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            // alert("x๊อบไข่สด");
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                            //      $scope.buildVariantOption(e.data);
                            //     $scope.buildMultipleQuantity(e.data);
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 98) {
                i = 98;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
            if (i > 98) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 99;
                    e.val(99);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.onClickVariantItems();
        };
        $scope.dataVariantsPick = [];
        $scope.buy_button = false;
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            $scope.buy_button = false;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.buy_button = true;
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
            //window.location.href='login';
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            /* $("iframe").css("height", $(".cover_image_item").css("width"));
             $("iframe").css("width", $(".cover_image_item").css("width")); */
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
        $scope.Relate_dataArray = [];
        $scope._getRelateDataArray = function(id) {
        
            var dataSend = {
                'txt_product_id': id,
                'txt_limit': 10,
            };
            // $scope.consoleLog('_getDataArray dataSend', dataSend);
            GAEAPI.get('product/related', dataSend, $scope).then(function(output) {
                // $scope.consoleLog('_getDataArray output', output);
                if (output.ok == 1) {
                    // $scope.$apply(function() {
                        $scope.Relate_dataArray = output.data.lists;
                        // $scope.consoleLog('_getDataArray _dataArray', $scope._dataArray);
                        console.log("slofkdsfdfds;lfsdk;f : ", $scope.Relate_dataArray);
                    // });
                }
                // $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope._getRelateDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope.buildTitleUrl = function (str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageVc', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageVc';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            if (product_tag != '') {
                var tag = {
                    'tags': product_tag
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 4,
                    'txt_filter_json': JSON.stringify(tag)
                };
            } else {
                $scope.dataRelatetagState = $scope.StateData(false, true);
                $scope.dataRelatetag = [];
                return;
            }
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    // for (var i = 0; i < output.data.dataList.length; i++) {
                    //     if(output.data.dataList){
                    //         $scope.dataRelatetag = output.data.dataList;
                    //     }
                    // }
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.getNameBadgeId = function(id) {
            if (id == '72') {
                return 'New Arrival'
            } else if (id == '74') {
                return 'Recommend'
            } else if (id == '75') {
                return 'Best Seller'
            } else {
                return 'null';
            }
        };
        $scope.data_min = [];
        $scope._dataArrayTags = [];
        $scope.data_video_id = false;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            console.log("product/id : dataSend : ", dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                console.log("product/id : output : ", res);
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    // if ($scope._dataArray.product_hightlight_video_embed != "") {
                    //     $scope._dataArray.product_image.unshift({
                    //         image_url: $scope.imgPath + 'img-play.png',
                    //         product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                    //     });
                    // }
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if (res.data.product_tags != "") {
                        $scope._dataArrayTags = res.data.product_tags.split(",");
                    }
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags, $scope._dataArray.product_referral_display.category[0].referral_id);
                    if (res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            // alert("x๊อบไข่สด");
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                            //      $scope.buildVariantOption(e.data);
                            //     $scope.buildMultipleQuantity(e.data);
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 98) {
                i = 98;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
            if (i > 98) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 99;
                    e.val(99);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.onClickVariantItems();
        };
        $scope.dataVariantsPick = [];
        $scope.buy_button = false;
        $scope.showComment = false;
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            $scope.buy_button = false;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.buy_button = true;
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.getShowComment = function(show) {
            $scope.showComment = true;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
            //window.location.href='login';
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            /* $("iframe").css("height", $(".cover_image_item").css("width"));
             $("iframe").css("width", $(".cover_image_item").css("width")); */
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});_ui_share_app.directive('productDetailPageVca', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageVca';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        promotelink: '@promotelink',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            if (product_tag != '') {
                var tag = {
                    'tags': product_tag
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 4,
                    'txt_filter_json': JSON.stringify(tag)
                };
            } else {
                $scope.dataRelatetagState = $scope.StateData(false, true);
                $scope.dataRelatetag = [];
                return;
            }
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    // for (var i = 0; i < output.data.dataList.length; i++) {
                    //     if(output.data.dataList){
                    //         $scope.dataRelatetag = output.data.dataList;
                    //     }
                    // }
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.getNameBadgeId = function(id) {
            if (id == '72') {
                return 'New Arrival'
            } else if (id == '74') {
                return 'Recommend'
            } else if (id == '75') {
                return 'Best Seller'
            } else {
                return 'null';
            }
        };
        $scope.data_min = [];
        $scope._dataArrayTags = [];
        $scope.data_video_id = false;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            console.log("product/id : dataSend : ", dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                console.log("product/id : output : ", res);
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    // if ($scope._dataArray.product_hightlight_video_embed != "") {
                    //     $scope._dataArray.product_image.unshift({
                    //         image_url: $scope.imgPath + 'img-play.png',
                    //         product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                    //     });
                    // }
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if (res.data.product_tags != "") {
                        $scope._dataArrayTags = res.data.product_tags.split(",");
                    }
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags, $scope._dataArray.product_referral_display.category[0].referral_id);
                    if (res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            // alert("x๊อบไข่สด");
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                            //      $scope.buildVariantOption(e.data);
                            //     $scope.buildMultipleQuantity(e.data);
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 98) {
                i = 98;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
            if (i > 98) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 99;
                    e.val(99);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.onClickVariantItems();
        };
        $scope.dataVariantsPick = [];
        $scope.buy_button = false;
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            $scope.buy_button = false;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.buy_button = true;
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
            //window.location.href='login';
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            /* $("iframe").css("height", $(".cover_image_item").css("width"));
             $("iframe").css("width", $(".cover_image_item").css("width")); */
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});_ui_share_app.directive('productDetailPageVx', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageVx';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.backgroundImageId = '';
        $scope.toBackgroundImageId = function(id) {
            console.log('toBackgroundImageId : id : ', id);
            $scope.backgroundImageId = id;
        };
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            if (product_tag != '') {
                var tag = {
                    'tags': product_tag
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 4,
                    'txt_filter_json': JSON.stringify(tag)
                };
            } else {
                $scope.dataRelatetagState = $scope.StateData(false, true);
                $scope.dataRelatetag = [];
                return;
            }
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    // for (var i = 0; i < output.data.dataList.length; i++) {
                    //     if(output.data.dataList){
                    //         $scope.dataRelatetag = output.data.dataList;
                    //     }
                    // }
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.data_min = [];
        $scope._dataArrayTags = [];
        $scope.data_video_id = false;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    // if ($scope._dataArray.product_hightlight_video_embed != "") {
                    //     $scope._dataArray.product_image.unshift({
                    //         image_url: $scope.imgPath + 'img-play.png',
                    //         product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                    //     });
                    // }
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if (res.data.product_tags != "") {
                        $scope._dataArrayTags = res.data.product_tags.split(",");
                    }
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags, $scope._dataArray.product_referral_display.category[0].referral_id);
                    if (res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            console.log("res.data.product_attribute.option_data.variant_array : ", res.data.product_attribute.option_data.variant_array);
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseFloat(set_varia0) >= parseFloat(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            if ($scope.data_min.length != 0) {
                                if ($scope.data_min.variant_image.length != 0) {
                                    $scope.toBackgroundImageId($scope.data_min.variant_image[0].image_id);
                                }
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                            //      $scope.buildVariantOption(e.data);
                            //     $scope.buildMultipleQuantity(e.data);
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseFloat(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseFloat(e.val());
            if (i > 19) {
                i = 19;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseFloat(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
            if (i > 19) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 20;
                    e.val(20);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            console.log('slickGoto : idx : ', idx);
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.onClickVariantItems();
        };
        $scope.dataVariantsPick = [];
        $scope.buy_button = false;
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            $scope.buy_button = false;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.buy_button = true;
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            console.log("findVariantsData : dataVariants : ", dataVariants);
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    // if (dataVariants[i].variant_image.length != 0) {
                    //     $scope._dataArray.product_image = dataVariants[i].variant_image;
                    //     $scope.mkCarousel();
                    // }
                    if (dataVariants[i].variant_image.length != 0) {
                        $scope.toBackgroundImageId(dataVariants[i].variant_image[0].image_id);
                    }
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.mkCarousel = function() {
            var key = $('[data-key="' + $scope._key() + '"]');
            var gall = $('[data-gall="' + $scope._key() + '"]');
            key.css('height', '0');
            key.css('opacity', '0');
            gall.css('height', '0');
            gall.css('opacity', '0');
            setTimeout(function() {
                key.css('height', 'auto');
                key.css('opacity', '1');
                gall.css('height', 'auto');
                gall.css('opacity', '1');
            }, 1500);
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
            //window.location.href='login';
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            /* $("iframe").css("height", $(".cover_image_item").css("width"));
             $("iframe").css("width", $(".cover_image_item").css("width")); */
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageW', function($rootScope, $routeParams, sliderProvider, $componentProductDetail, $location) {
    var templateName = 'productDetailPageW';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
        imgcart: '@imgcart',
        view: '@viewcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        if ($scope.imgcart != undefined) {
            $scope.setimg_cart = $scope.icnPath + $scope.imgcart;
        }
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            var tag = {
                'tags': product_tag
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(tag)
            };
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope.names = 20;
        $scope._dataArray_tag = [];
        $scope._dataArray = [];
        $scope.data_video_id = false;
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    /*if ($scope._dataArray.product_hightlight_video_embed != "") {
                        $scope._dataArray.product_image.unshift({
                            image_url: $scope.imgPath + 'img-play.png',
                            product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                        });
                    }*/
                    $scope._dataArray_tag = res.data.product_tags.split(",");
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags);
                    $scope.buildVariantOption(res.data);
                    if (res.data.product_attribute.length != 0) {
                        $scope.buildMultipleQuantity(res.data);
                    }
                    if (res.data.product_total_variant == 0 && res.data.product_total_stock > 0) {
                        $scope.names = parseInt(res.data.product_total_stock);
                        console.log("nnames stock :", $scope.names);
                    }
                    if (res.data.product_total_variant == 0 && res.data.product_total_stock < 0) {
                        $scope.names = 20;
                        console.log("nnames stock :", $scope.names);
                    }
                    if (res.data.product_total_variant > 0) {
                        $scope.names = 20;
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '#gallery_slider[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (isNaN(i)) {
                i = 0;
            }
            if (i < $scope.names) {
                e.val(i + 1);
                $scope._data_qty_selected = (i + 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.onSelectVariantItems(0, '');
        };
        $scope.dataVariantsPick = [];
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var _self = dataVariants[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                console.log("selectedOptionTextJson: option", dataVariants);
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    if (dataVariants[i].total_stock != 0) {
                        $scope.names = dataVariants[i].total_stock;
                    } else {
                        $scope.names = 20;
                    }
                    $scope.switchQuantityByKey('-' + variantsPick.join('-') + '-');
                    console.log("selectedOptionTextJson: option", _self);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope._dataArray.product_image.length; im++) {
                            if ($scope._dataArray.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope._slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.gallery-thumbnail .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.currentOptionQtyPick = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            return e.val();
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [],
                p = productObj.product_attribute.option_data.variant_array;
            for (var i = 0; i < p.length; i++) {
                if (p[i].status == 1 && p[i].status == 1) {
                    $scope.productQuantityMultiArray.push({
                        v_key: p[i].variant_key,
                        v_name: p[i].option_name_array[0],
                        v_qty: 1,
                        v_active: 0
                    });
                }
            }
        };
        $scope.dataVariantsPick = [];
        $scope.electric = [];
        $scope.testyuyu = 0;
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.testyuyu = 0;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._idUrl($scope._viewRouteParams().product_id)
                }).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    $scope.testyuyu = 0;
                    $('.d_qty_not_result').removeClass("active");
                    $scope.findVariantsData($scope.dataVariantsPick);
                } else {
                    $scope.testyuyu = 0;
                    $('.d_qty').removeClass('active').removeClass('inin');
                    $('.d_qty_price').removeClass("active");
                    $('.d_qty_price').removeClass("inin");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric);
            }
        };
        $scope.ifOptionUnSelect = function() {
            return ($('.d_qty_price.active.inin').length > 0) ? true : false;
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("width", $(".cover_image_item").css("width"));
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageWa', function($rootScope, $routeParams, sliderProvider, $componentProductDetail, $location) {
    var templateName = 'productDetailPageWa';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
        imgcart: '@imgcart',
        view: '@viewcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        if ($scope.imgcart != undefined) {
            $scope.setimg_cart = $scope.icnPath + $scope.imgcart;
        }
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            var tag = {
                'tags': product_tag
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(tag)
            };
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    /*if ($scope._dataArray.product_hightlight_video_embed != "") {
                        $scope._dataArray.product_image.unshift({
                            image_url: $scope.imgPath + 'img-play.png',
                            product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                        });
                    }*/
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    if(res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0){
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            
                        }
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags);
                    $scope.buildVariantOption(res.data);
                    if (res.data.product_attribute.length != 0) {
                        $scope.buildMultipleQuantity(res.data);
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '#gallery_slider[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.onSelectVariantItems(0, '');
        };
        $scope.dataVariantsPick = [];
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var _self = dataVariants[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope.switchQuantityByKey('-' + variantsPick.join('-') + '-');
                    console.log("selectedOptionTextJson: option", _self);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope._dataArray.product_image.length; im++) {
                            if ($scope._dataArray.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope._slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.gallery-thumbnail .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.currentOptionQtyPick = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            return e.val();
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [],
                p = productObj.product_attribute.option_data.variant_array;
            for (var i = 0; i < p.length; i++) {
                if (p[i].status == 1 && p[i].status == 1) {
                    $scope.productQuantityMultiArray.push({
                        v_key: p[i].variant_key,
                        v_name: p[i].option_name_array[0],
                        v_qty: 1,
                        v_active: 0
                    });
                }
            }
        };
        $scope.dataVariantsPick = [];
        $scope.electric = [];
        $scope.testyuyu = 0;
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.testyuyu = 0;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._idUrl($scope._viewRouteParams().product_id)
                }).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    $scope.testyuyu = 0;
                    $('.d_qty_not_result').removeClass("active");
                    $scope.findVariantsData($scope.dataVariantsPick);
                } else {
                    $scope.testyuyu = 0;
                    $('.d_qty').removeClass('active').removeClass('inin');
                    $('.d_qty_price').removeClass("active");
                    $('.d_qty_price').removeClass("inin");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric);
            }
        };
        $scope.ifOptionUnSelect = function() {
            return ($('.d_qty_price.active.inin').length > 0) ? true : false;
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("width", $(".cover_image_item").css("width"));
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageWorldcamera', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageWorldcamera';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        type: '@type',
        cart: '@cart',
        buycol: '@buycol',
        buyicon: '@buyicon',
        buytext: '@buytext',
        viewcarttext: '@viewcarttext',
        buylogin: '@buylogin',
        currency: '@currency',
        checkstaff: '@checkstaff',
        language: '@language',
        btnstyle: '@btnstyle',
        maxstock: '@maxstock',
        videotext: '@videotext',
        description: '@description',
        info: '@info',
        specification: '@specification',
        textbrand:'@textbrand',
        navigationhover: '@navigationhover',
        imageappcoverchecked: '@imageappcoverchecked',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location ,share) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "productDetailPageWorldcamera";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        /* scope */
        $scope._name = ($scope.name != undefined && $scope.name != "") ? $scope.name : "default";
        $scope._type = $scope._componentType + $scope._class + ".html";
        $scope._cart = ($scope.cart != undefined && $scope.cart != "") ? $scope.cart : "trumpComponentCarts";
        $scope._buycol = ($scope.buycol != undefined && $scope.buycol != "") ? parseInt($scope.buycol) : 15;
        $scope._maxstock = ($scope.maxstock != undefined && $scope.maxstock != "") ? parseInt($scope.maxstock) : 20;
        $scope._btnstyle = ($scope.btnstyle != undefined && $scope.btnstyle != "") ? $scope.btnstyle : "filled_button_large";
        $scope._buylogin = ($scope.buylogin == "true" || $scope.buylogin == "t") ? true : false;
        $scope._checkstaff = ($scope.checkstaff == "true" || $scope.checkstaff == "t") ? true : false;
        $scope._currency = ($scope.currency != undefined && $scope.currency != "") ? $scope.currency : "THB";
        $scope._buyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope.buyicon : "icnt_outline_cart01_dark.png";
        $scope._buytext = ($scope.buytext != undefined && $scope.buytext != "") ? $scope.buytext : "เพิ่มในรถเข็น";
        $scope._viewcarttext = ($scope.viewcarttext != undefined && $scope.viewcarttext != "") ? $scope.viewcarttext : "ดูรถเข็น";
        $scope._videotext = ($scope.videotext != undefined && $scope.videotext != "") ? $scope.videotext : "Video";
        $scope._icebuyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope._icnPath + $scope.buyicon : $scope._icnPath + "icnt_outline_cart01_dark.png";
        $scope._language = ($scope.language != undefined && $scope.language != "") ? (($scope.language == "en") ? "en" : "th") : "th";
        $scope._textbrand = ($scope.textbrand != undefined && $scope.textbrand != "") ? $scope.textbrand : "Brand";
        $scope._navigationhover = ($scope.navigationhover != undefined && $scope.navigationhover != "") ? $scope.navigationhover : "primary";
        $scope._imageappcoverchecked = ($scope.imageappcoverchecked == "true" || $scope.imageappcoverchecked == "t") ? true : false;
        /* scope */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getNamePage: function(arr) {
                    var str = [];
                    for (var i = 0; i < arr.length; i++) {
                        if (i != 0) {
                            str.push(arr[i]);
                        }
                    }
                    return str.join(" ");
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = (params.product_id != undefined) ? params.product_id.split("-", 1).join("") : false;
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getReferralId: function(productReferralDisplay, callback) {
                    var _self = this;
                    var referral_id = 0;
                    if (productReferralDisplay.length != 0) {
                        if (productReferralDisplay.category != undefined) {
                            if (productReferralDisplay.category.length != 0) {
                                referral_id = productReferralDisplay.category[0].referral_id
                            }
                        }
                    }
                    callback(referral_id);
                },
                getStaffId: function(staffId, callback) {
                    var _self = this;
                    var res_staff = {
                        staff_id: (staffId != 0 && staffId != '' && staffId != undefined) ? staffId : '0',
                        status: (staffId != 0 && staffId != '' && staffId != undefined) ? true : false
                    }
                    callback(res_staff);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getCarousel = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carouselA: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            fade: true,
                            dots: false,
                            arrows: false,
                            infinite: true,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '',
                            nextArrow: '',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselB: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: true,
                            arrows: true,
                            infinite: true,
                            autoplay: false,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '
',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselBar: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: false,
                            infinite: false,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 6,
                            slidesToScroll: 6,
                            speed: 600,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: 5,
                                    slidesToScroll: 5,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: 4,
                                    slidesToScroll: 4,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: 3,
                                    slidesToScroll: 3,
                                }
                            }]
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                slickCarousel: function(carousel, index) {
                    var _self = this;
                    $scope.setCarousel.index = index;
                    setTimeout(function() {
                        $('[data-key="' + carousel + '"]').slick('slickGoTo', index);
                    }, 100);
                },
                prevIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != 0) ? image_index - 1 : image - 1;
                    _self.consoleLog("prevIndex index", $scope.setCarousel.index);
                },
                nextIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != (image - 1)) ? image_index + 1 : 0;
                    _self.consoleLog("nextIndex index", $scope.setCarousel.index);
                }
            }
            return getFunction;
        };
        $scope.getAttribute = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                productAttribute: function(productAttribute, callback) {
                    var _self = this;
                    var attribute = {
                        option_name: "",
                        option_attribute: []
                    };
                    if (productAttribute.option_data != undefined) {
                        if (productAttribute.option_data.variant_array != undefined && productAttribute.option_data.variant_array.length != 0) {
                            for (var a = 0; a < productAttribute.option_data.pclass_array.length; a++) {
                                attribute.option_name = attribute.option_name.concat(productAttribute.option_data.pclass_array[a].pclass_name, " ");
                            }
                            for (var b = 0; b < productAttribute.option_data.variant_array.length; b++) {
                                var product_attribute = {
                                    product_id: productAttribute.option_data.variant_array[b].product_id,
                                    product_sku: productAttribute.option_data.variant_array[b].sku,
                                    product_title: "",
                                    product_price: parseFloat(productAttribute.option_data.variant_array[b].price),
                                    product_compare_price: parseFloat(productAttribute.option_data.variant_array[b].compare_price),
                                    product_total_stock: parseFloat(productAttribute.option_data.variant_array[b].total_stock),
                                    product_image: productAttribute.option_data.variant_array[b].variant_image
                                }
                                for (var c = 0; c < productAttribute.option_data.variant_array[b].option_name_array.length; c++) {
                                    product_attribute.product_title = product_attribute.product_title.concat(productAttribute.option_data.variant_array[b].option_name_array[c], " ");
                                }
                                attribute.option_attribute.push(product_attribute);
                            }
                        }
                    }
                    _self.consoleLog("productAttribute attribute ", attribute);
                    callback(attribute);
                },
                checkDiscountPrice: function(productDiscount, resPrice, resComparePrice, callback) {
                    var _self = this;
                    var price = 0;
                    var compare_price = 0;
                    if (productDiscount.length == 0) {
                        price = parseFloat(resPrice);
                        compare_price = parseFloat(resComparePrice);
                    } else {
                        if (productDiscount.discount_type_id == '101') {
                            price = parseFloat(resPrice) - parseFloat(productDiscount.discount_price);
                            compare_price = parseFloat(resPrice);
                        } else if (productDiscount.discount_type_id == '102') {
                            price = (parseFloat(resPrice) * ((100 - parseFloat(productDiscount.discount_percent)) / 100));
                            compare_price = parseFloat(resPrice);
                        }
                    }
                    callback(price, compare_price);
                },
                checkMinPrice: function(option, callback) {
                    var _self = this;
                    var price_min = parseFloat(option.option_attribute[0].product_price);
                    var compare_price_min = parseFloat(option.option_attribute[0].product_compare_price);
                    var total_stock = parseFloat(option.option_attribute[0].product_total_stock);
                    for (var a = 0; a < option.option_attribute.length; a++) {
                        if (price_min >= parseFloat(option.option_attribute[a].product_price)) {
                            price_min = parseFloat(option.option_attribute[a].product_price);
                            compare_price_min = parseFloat(option.option_attribute[a].product_compare_price);
                            total_stock = parseFloat(option.option_attribute[a].product_total_stock);
                        }
                    }
                    _self.consoleLog("checkPriceMin price_min ", price_min);
                    _self.consoleLog("checkPriceMin compare_price_min ", compare_price_min);
                    _self.consoleLog("checkPriceMin total_stock ", total_stock);
                    callback(price_min, compare_price_min, total_stock);
                },
                getTotalStock: function(totalStock, mixStock, callback) {
                    var _self = this;
                    var total_stock = (totalStock > 0) ? ((totalStock <= mixStock) ? totalStock : mixStock) : ((totalStock == -1) ? mixStock : totalStock);
                    callback(total_stock);
                },
                checkMinPrices: function(api, attribute, callback) {
                    var _self = this;
                    var dataPrice = {
                        product_price: {
                            price_name: 'product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        product_compare_price: {
                            price_name: 'product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_price: {
                            price_name: 'sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_price: {
                            price_name: 'sum_product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_minus_sum_product_price: {
                            price_name: 'sum_product_compare_minus_sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        }
                    }
                    if (attribute.option_attribute.length == 0) {
                        _self.checkDiscountPrice(api.data.product_discount, api.data.product_price, api.data.product_compare_price, function(res_price, res_compare_price) {
                            _self.checkPrice(res_price, function(res_price_ecimals) {
                                dataPrice.product_price.price = res_price;
                                dataPrice.product_price.price_ecimals = res_price_ecimals;
                                dataPrice.sum_product_price.price = res_price;
                                dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                    dataPrice.product_compare_price.price = res_compare_price;
                                    dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    dataPrice.sum_product_compare_price.price = res_compare_price;
                                    dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                    _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                        dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                        dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                        _self.getTotalStock(api.data.product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                            dataPrice.product_price.total_stock = res_total_stock_s;
                                            dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                            callback(dataPrice, false);
                                        });
                                    });
                                });
                            });
                        });
                    } else {
                        _self.checkMinPrice(attribute, function(res_price_min, res_compare_price_min, res_total_stock) {
                            _self.checkDiscountPrice(api.data.product_discount, res_price_min, res_compare_price_min, function(res_price, res_compare_price) {
                                _self.checkPrice(res_price, function(res_price_ecimals) {
                                    dataPrice.product_price.price = res_price;
                                    dataPrice.product_price.price_ecimals = res_price_ecimals;
                                    dataPrice.sum_product_price.price = res_price;
                                    dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                    _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                        dataPrice.product_compare_price.price = res_compare_price;
                                        dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        dataPrice.sum_product_compare_price.price = res_compare_price;
                                        dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                        _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                            dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                            dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                            _self.getTotalStock(res_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                dataPrice.product_price.total_stock = res_total_stock_s;
                                                dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                callback(dataPrice, true);
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    }
                },
                priceIncludes: function(price, includes, callback) {
                    var _self = this;
                    var priceToString = (price == null) ? 0 : price;
                    _self.consoleLog('priceIncludes priceToString : ', priceToString);
                    callback(priceToString.toString().includes(includes));
                },
                checkPrice: function(price, callback) {
                    var _self = this;
                    _self.priceIncludes(price, '.', function(res) {
                        _self.consoleLog("checkPrice res ", res);
                        callback((!res) ? 0 : 2);
                    });
                },
                onSelectOption: function(productId) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = productId;
                    _self.consoleLog("onSelectOption productId ", productId);
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    for (var a = 0; a < $scope.data.attribute.dataArray.option_attribute.length; a++) {
                        _self.consoleLog("onSelectOption option_attribute ", $scope.data.attribute.dataArray.option_attribute[a]);
                        if ($scope.data.attribute.dataArray.option_attribute[a].product_id == productId) {
                            if ($scope.data.attribute.dataArray.option_attribute[a].product_image.length != 0) {
                                if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                                    for (var b = 0; b < $scope.dataApi.product.dataArray.product_image.length; b++) {
                                        if ($scope.dataApi.product.dataArray.product_image[b].image_id == $scope.data.attribute.dataArray.option_attribute[a].product_image[0].image_id) {
                                            $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, b);
                                        }
                                    }
                                }
                            }
                            _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[a].product_price, $scope.data.attribute.dataArray.option_attribute[a].product_compare_price, function(res_price_p, res_compare_price_p) {
                                _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                                    $scope.data.product_price.price = res_price_p;
                                    $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                                    $scope.data.sum_product_price.price = res_price_p;
                                    $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                                    _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                        $scope.data.product_compare_price.price = res_compare_price_p;
                                        $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                        $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                        _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                            $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                            $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                            _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[a].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                $scope.data.product_price.total_stock = res_total_stock_s;
                                                $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                /* stock */
                                                $scope.data.quantity.quantity_max = res_total_stock_s;
                                                $scope.data.quantity.quantity_select = [];
                                                for (var i = 0; i < res_total_stock_s; i++) {
                                                    $scope.data.quantity.quantity_select.push(i + 1);
                                                }
                                                /* stock */
                                            })
                                        });
                                    });
                                });
                            });
                            break;
                        }
                    }
                },
                onClickOption: function(index) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.data.attribute.productId = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    if ($scope.data.attribute.dataArray.option_attribute[index].product_image.length != 0) {
                        if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                            for (var i = 0; i < $scope.dataApi.product.dataArray.product_image.length; i++) {
                                if ($scope.dataApi.product.dataArray.product_image[i].image_id == $scope.data.attribute.dataArray.option_attribute[index].product_image[0].image_id) {
                                    $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, i);
                                }
                            }
                        }
                    }
                    _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[index].product_price, $scope.data.attribute.dataArray.option_attribute[index].product_compare_price, function(res_price_p, res_compare_price_p) {
                        _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                            $scope.data.product_price.price = res_price_p;
                            $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                            $scope.data.sum_product_price.price = res_price_p;
                            $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                            _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                $scope.data.product_compare_price.price = res_compare_price_p;
                                $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                    $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                    $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                    _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[index].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                        $scope.data.product_price.total_stock = res_total_stock_s;
                                        $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                        /* stock */
                                        $scope.data.quantity.quantity_max = res_total_stock_s;
                                        $scope.data.quantity.quantity_select = [];
                                        for (var i = 0; i < res_total_stock_s; i++) {
                                            $scope.data.quantity.quantity_select.push(i + 1);
                                        }
                                        /* stock */
                                    })
                                });
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.getAttributeCustom = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                createArray: function(productCustomTemplates, callback) {
                    var _self = this;
                    var custom_attributes = [];
                    if (productCustomTemplates.templates.length != 0) {
                        angular.forEach(productCustomTemplates.templates, function(item, index) {
                            if (item.option_sets.length != 0) {
                                _self.getAttributes(item.option_sets, function(res_attributes) {
                                    custom_attributes = custom_attributes.concat(res_attributes);
                                });
                            }
                        });
                        /* if (productCustomTemplates.templates[0].option_sets.length != 0) {
                            _self.getAttributes(productCustomTemplates.templates[0].option_sets, function(res_attributes) {
                                custom_attributes = res_attributes;
                            });
                        } */
                    }
                    _self.consoleLog("createArray : productCustomTemplates", productCustomTemplates);
                    _self.consoleLog("createArray : custom_attributes", custom_attributes);
                    callback(custom_attributes, true);
                },
                formatAttribute: function(index, optionSubsetIndex, setType, optionSetArray, callback) {
                    var _self = this;
                    var set_id = (setType == 'attribute') ? optionSetArray.set_id : optionSetArray.subset_id;
                    var attribute = {
                        attribute_index: index,
                        attribute_option_subset_index: optionSubsetIndex,
                        active_option_id: (optionSetArray.option_data.select_id != 0) ? optionSetArray.option_data.select_id : "-1",
                        active_option_index: -1,
                        active_option_index_str: "-1",
                        active_textarea: "",
                        active_array: [],
                        set_id: set_id,
                        name: optionSetArray.name,
                        set_type: optionSetArray.ss_type,
                        option: []
                    }
                    callback(attribute);
                },
                getOption: function(index, optionDataArray, callback) {
                    var _self = this;
                    var options = {
                        index: index,
                        ss_data_id: optionDataArray.ss_data_id,
                        name: optionDataArray.name,
                        image: optionDataArray.image,
                        price: optionDataArray.price,
                        compare_price: 0,
                        total_stock: 0
                    }
                    callback(options);
                },
                getActive: function(index, activeOptionId, activeOptionIdIn, optionDataArray, callback) {
                    var _self = this;
                    var actives_index = (optionDataArray.ss_data_id == activeOptionId) ? index : activeOptionIdIn;
                    var actives = (optionDataArray.ss_data_id != activeOptionId) ? "0" : "1";
                    callback(actives_index, actives);
                },
                getAttributes: function(optionSetArray, callback) {
                    var _self = this;
                    var attributes = [];
                    for (var index = 0; index < optionSetArray.length; index++) {
                        _self.formatAttribute(index, 0, 'attribute', optionSetArray[index], function(res_attribute) {
                            if (optionSetArray[index].option_subsets.length != 0) {
                                for (var option_subset_index = 0; option_subset_index < optionSetArray[index].option_subsets.length; option_subset_index++) {
                                    _self.formatAttribute(index, option_subset_index, res_attribute.set_type, optionSetArray[index].option_subsets[option_subset_index], function(res_attribute_sub) {
                                        var options = [];
                                        var active_option_id = -1;
                                        var active_option_array = [];
                                        for (var option = 0; option < optionSetArray[index].option_subsets[option_subset_index].option_data.options.length; option++) {
                                            _self.getOption(option, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_option) {
                                                options.push(res_option);
                                            });
                                            _self.getActive(option, res_attribute_sub.active_option_id, active_option_id, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_actives_index, res_actives) {
                                                active_option_id = res_actives_index;
                                                active_option_array.push(res_actives);
                                            });
                                        }
                                        res_attribute_sub.option = options;
                                        res_attribute_sub.active_option_index = active_option_id;
                                        res_attribute_sub.active_option_index_str = String(active_option_id);
                                        res_attribute_sub.active_array = active_option_array;
                                        attributes.push(res_attribute_sub);
                                    });
                                }
                            } else {
                                var options = [];
                                var active_option_id = -1;
                                var active_option_array = [];
                                for (var option = 0; option < optionSetArray[index].option_data.options.length; option++) {
                                    _self.getOption(option, optionSetArray[index].option_data.options[option], function(res_option) {
                                        options.push(res_option);
                                    });
                                    _self.getActive(option, res_attribute.active_option_id, active_option_id, optionSetArray[index].option_data.options[option], function(res_actives_index, res_actives) {
                                        active_option_id = res_actives_index;
                                        active_option_array.push(res_actives);
                                    });
                                }
                                res_attribute.option = options;
                                res_attribute.active_option_index = active_option_id;
                                res_attribute.active_option_index_str = String(active_option_id);
                                res_attribute.active_array = active_option_array;
                                attributes.push(res_attribute);
                            }
                        });
                    }
                    callback(attributes)
                },
                getformatQuantity: function(index, attributeCustom, callback) {
                    var _self = this;
                    var quantity = {
                        name: String(index + 1),
                        dataArray: attributeCustom
                    }
                    callback(quantity);
                },
                onClickRadio: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickRadio : index", index);
                    _self.consoleLog("onClickRadio : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickRadio : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickDropdown: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickDropdown : index", index);
                    _self.consoleLog("onClickDropdown : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickDropdown : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickCheckbox: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickCheckbox : index", index);
                    _self.consoleLog("onClickCheckbox : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i == parseInt(index_option)) ? (($scope.data.attribute_custom.dataArray[index].active_array[i] != "0") ? "0" : "1") : $scope.data.attribute_custom.dataArray[index].active_array[i];
                    }
                    _self.consoleLog("onClickCheckbox : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                }
            }
            return getFunction;
        };
        $scope.getReward = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                momentUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    callback(now);
                },
                getCalculator: function(sumProductPrice, reward, callback) {
                    var _self = this;
                    _self.consoleLog("getCalculator : sumProductPrice", sumProductPrice);
                    _self.consoleLog("getCalculator : reward", reward);
                    var point_reward = 0;
                    if (reward.type_id == "100") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    } else if (reward.type_id == "101") {
                        point_reward = reward.reward_amount;
                    } else if (reward.type_id == "102") {
                        point_reward = (reward.reward_percent * sumProductPrice.price) / 100;
                    } else if (reward.type_id == "103") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    }
                    _self.consoleLog("getCalculator : point_reward", point_reward);
                    callback(point_reward);
                },
                getProductReward: function(now, productReward, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (productReward.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(productReward.reward_lifetime.lifetime_start_time);
                        reward.lifetime_end_time = parseInt(productReward.reward_lifetime.lifetime_end_time);
                        reward.type_id = productReward.reward_type_id;
                        reward.amount = parseInt(productReward.reward_amount);
                        reward.percent = parseInt(productReward.reward_percent);
                        reward.every_price = parseInt(productReward.reward_every_price);
                    }
                    _self.consoleLog("getProductReward : reward", reward);
                    callback(reward);
                },
                getPointConfig: function(now, shopPointConfig, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (shopPointConfig.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(shopPointConfig.er_from);
                        reward.lifetime_end_time = parseInt(shopPointConfig.er_to);
                        reward.type_id = "100";
                        reward.amount = parseInt(shopPointConfig.er_earn);
                        reward.every_price = parseInt(shopPointConfig.er_rate);
                    }
                    _self.consoleLog("getPointConfig : reward", reward);
                    callback(reward);
                },
                checkPointReward: function(reward, callback) {
                    var _self = this;
                    var state = false;
                    if (reward.reward_length) {
                        var start = reward.lifetime_start_time < reward.lifetime_time && reward.lifetime_start_time != 0;
                        var end = (reward.lifetime_end_time != -1) ? reward.lifetime_time <= reward.lifetime_end_time && reward.lifetime_end_time != 0 : true;
                        if (start && end) {
                            if (reward.type_id == "100") {
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            } else if (reward.type_id == "101") {
                                var amount = reward.amount != 0;
                                if (amount) {
                                    state = true;
                                }
                            } else if (reward.type_id == "102") {
                                var percent = reward.percent != 0;
                                if (percent) {
                                    state = true;
                                }
                            } else if (reward.type_id == "103") {
                                var percent = reward.percent != 0;
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            }
                        }
                    }
                    callback(state);
                },
                checkReward: function(rewardProduct, rewardPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("checkReward : rewardProduct", rewardProduct);
                    _self.consoleLog("checkReward : rewardPointConfig", rewardPointConfig);
                    var reward = {
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    _self.checkPointReward(rewardProduct, function(res_state_product) {
                        _self.checkPointReward(rewardPointConfig, function(res_state_point_config) {
                            if (res_state_point_config) {
                                reward.type_id = rewardPointConfig.type_id;
                                reward.type_id = rewardPointConfig.type_id;
                                reward.amount = rewardPointConfig.amount;
                                reward.percent = rewardPointConfig.percent;
                                reward.every_price = rewardPointConfig.every_price;
                            } else if (res_state_product) {
                                reward.type_id = rewardProduct.type_id;
                                reward.amount = rewardProduct.amount;
                                reward.percent = rewardProduct.percent;
                                reward.every_price = rewardProduct.every_price;
                            }
                            _self.consoleLog("checkReward : reward", reward);
                            callback(reward);
                        });
                    });
                },
                checkRewardType: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.momentUnix(function(now) {
                        _self.getProductReward(now, productReward, function(res_reward_product) {
                            _self.getPointConfig(now, shopPointConfig, function(res_reward_point_config) {
                                _self.checkReward(res_reward_product, res_reward_point_config, function(res_reward) {
                                    callback(res_reward);
                                });
                            });
                        });
                    });
                },
                createReward: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("createReward : productReward", productReward);
                    _self.consoleLog("createReward : shopPointConfig", shopPointConfig);
                    _self.checkRewardType(productReward, shopPointConfig, function(res_reward) {
                        _self.consoleLog("createReward : res_reward", res_reward);
                        callback(res_reward);
                    });
                }
            }
            return getFunction;
        };
        $scope.getQuantity = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                upDateReward: function() {
                    var _self = this;
                },
                upDateReward: function() {
                    var _self = this;
                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                        $scope.data.reward.point_reward = res_point_reward;
                    });
                },
                upDatePrice: function() {
                    var _self = this;
                    var product_price = $scope.data.product_price.price * $scope.data.quantity.quantity_input;
                    var product_compare_price = $scope.data.product_compare_price.price * $scope.data.quantity.quantity_input;
                    $scope.getAttribute().checkPrice(product_price, function(res_price_ecimals) {
                        $scope.data.sum_product_price.price = product_price;
                        $scope.data.sum_product_price.price_ecimals = res_price_ecimals;
                        $scope.getAttribute().checkPrice(product_compare_price, function(res_compare_price_ecimals) {
                            $scope.data.sum_product_compare_price.price = product_compare_price;
                            $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                            var compare_price_minus_price = ((product_compare_price - product_price) > 0) ? product_compare_price - product_price : 0;
                            $scope.getAttribute().checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                _self.upDateReward();
                            });
                        });
                    });
                },
                input: function(quantityInput) {
                    var _self = this;
                    quantityInput = (quantityInput == null) ? 1 : parseInt(quantityInput);
                    _self.consoleLog("input : quantityInput", quantityInput);
                    if (quantityInput != null) {
                        if (quantityInput >= $scope.data.quantity.quantity_max) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_max;
                        }
                        if (quantityInput <= $scope.data.quantity.quantity_min) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                        }
                    } else {
                        $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                    }
                    _self.upDatePrice();
                },
                minus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input - 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_min", $scope.data.quantity.quantity_min);
                    if (quantity >= $scope.data.quantity.quantity_min) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                },
                plus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input + 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_max", $scope.data.quantity.quantity_max);
                    if (quantity <= $scope.data.quantity.quantity_max) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                }
            }
            return getFunction;
        };
        $scope.getBuy = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = params.product_id.split("-", 1).join("");
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                postApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.post(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                UiCartProductAdd: function(productId, quantityInput, promotionId, customOptions, callback) {
                    UiCart.delegate.product.add(productId, quantityInput, promotionId, function(res_data) {
                        callback(res_data);
                    });
                },
                isLogin: function(callback) {
                    var buy_login = $scope._buylogin;
                    var is_login = UiCustomerBox.delegate.get.isLogin();
                    var is_state = (buy_login) ? (!is_login) ? true : false : false;
                    callback(is_state);
                },
                formLogin: function(is_state, callback) {
                    if (is_state) {
                        $inloginPopup.open();
                    }
                    callback(is_state);
                },
                getProductStaffId(staff_id_check, callback) {
                    var res_staff_id_check = staff_id_check;
                    var res_staff_id = $scope.dataApi.product.dataArray.product_staff_id;
                    var res_is_state = (res_staff_id != 0 && res_staff_id != '0' && res_staff_id != undefined) ? true : false;
                    callback(res_staff_id_check, res_staff_id, res_is_state);
                },
                isStaffId: function(staff_id_check, callback) { /* todo */
                    var _self = this;
                    _self.getProductStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        callback(res_staff_id_check, res_staff_id, res_is_state);
                    });
                },
                checkCartDuplicateStaff: function(res_staff_id_check, txt_staff_id, res_is_state, callback) {
                    var _self = this
                    var res_is_state = true;
                    if (res_staff_id_check) {
                        var dataSend = {
                            'txt_staff_id': txt_staff_id,
                        };
                        _self.dataSend("cart/duplicate_staff", dataSend, function(res_api, res_dataSend) {
                            _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                                res_is_state = res_api.data.duplicate;
                                callback(res_is_state);
                            });
                        });
                    } else {
                        callback(res_is_state);
                    }
                },
                showAlert: function(res_staff_id_check, res_staff_id, res_is_state, res_api, callback) {
                    var res_state = (res_staff_id_check) ? ((res_api) ? ((res_is_state) ? false : true) : true) : false;
                    if (res_state) {
                        if (!res_api) {
                            if (res_staff_id != '0' && res_staff_id != 0) {
                                $scope.controlAlert().alert('002');
                            } else {
                                $scope.controlAlert().alert('003');
                            }
                        } else {
                            if (!res_is_state) {
                                $scope.controlAlert().alert('003');
                            }
                        }
                    }
                    callback(res_state);
                },
                checkStaff: function(callback) {
                    var _self = this
                    var staff_id_check = $scope._checkstaff;
                    var res_check = false;
                    _self.isStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        _self.checkCartDuplicateStaff(res_staff_id_check, res_staff_id, res_is_state, function(res_api) {
                            _self.showAlert(res_staff_id_check, res_staff_id, res_is_state, res_api, function(res_state) {
                                res_check = res_state;
                                callback(res_check);
                            });
                        });
                    });
                },
                isProgress: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isProgress(productId)) ? true : false;
                    _self.consoleLog("isProgress : productId", productId);
                    _self.consoleLog("isProgress : state", state);
                    callback(state);
                },
                isSelected: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    _self.consoleLog("isSelected : productId", productId);
                    _self.consoleLog("isSelected : state", state);
                    callback(state);
                },
                isSelectedReturn: function(productId) {
                    var _self = this;
                    var ui_cart_state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    if (!$scope.setBuy.state_active) {
                        $scope.setBuy.state_active = true;
                        var state_process = $scope.setBuy.state_process;
                        var state_step = $scope.setBuy.state_step;
                        if (ui_cart_state && !state_process && state_step != 4) /* cart */ {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_active = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else if (!ui_cart_state && !state_process && state_step != 0) /* unset */ {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_active = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        } else {
                            $scope.setBuy.state_active = false;
                        }
                    }
                    return ui_cart_state;
                },
                updateState: function(productId) {
                    _self = this;
                    _self.isSelected(productId, function(res_state) {
                        if (res_state) {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_process = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        }
                        return res_state;
                    });
                },
                uiCart: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    _self.UiCartProductAdd(productId, quantityInput, promotionId, customOptions, function(res_data) {
                        if (res_data) {
                            _self.onTimeout(500, function() {
                                _self.onPass(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            }
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onError(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onUnset(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                        });
                                    });
                                });
                            });
                        }
                    });
                },
                postApiA: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    var custom_options = {};
                    var dataSend = {
                        'txt_product_id': productId,
                        'txt_amount': quantityInput,
                        'txt_is_clear_cart_before': "0",
                        'txt_custom_options_json': JSON.stringify(custom_options)
                    };
                    _self.dataSend("cart/product_add", dataSend, function(res_api, res_dataSend) {
                        _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                            if (res_ok) {
                                _self.onTimeout(500, function() {
                                    _self.onPass(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onCart(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            });
                                        });
                                    });
                                });
                            } else {
                                _self.onTimeout(500, function() {
                                    _self.onError(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onUnset(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                            });
                                        });
                                    });
                                });
                            }
                        });
                    });
                },
                onProcess: function(data, productId, quantityInput, promotionId, customOptions) {
                    var _self = this;
                    _self.isLogin(function(res_is_login) {
                        _self.formLogin(res_is_login, function(res_form) {
                            _self.checkStaff(function(res_is_state) {
                                if (!$scope.setBuy.state_process && !res_form && !res_is_state) {
                                    $scope.setBuy.state_process = true;
                                    _self.isSelected(productId, function(res_state) {
                                        if (!res_state) {
                                            _self.onLoad($scope.setBuy.state_step, function(res_step) {
                                                if (data.sum_product_price.price != 0 && data.quantity.quantity_max != 0 && (data.attribute.state == (data.attribute.productId != ''))) {
                                                    /* UiCart */
                                                    _self.uiCart(productId, quantityInput, promotionId, customOptions, res_step);
                                                    /* api post offline */
                                                    /*_self.postApiA(productId, quantityInput, promotionId, customOptions, res_step); */
                                                } else {
                                                    _self.onTimeout(500, function() {
                                                        _self.onError(res_step, function(res_step) {
                                                            _self.onTimeout(1000, function() {
                                                                _self.onUnset(res_step, function(res_step) {
                                                                    $scope.setBuy.state_process = false;
                                                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                                                });
                                                            });
                                                        });
                                                    });
                                                }
                                            });
                                        } else {
                                            $scope.setBuy.state_process = false;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            } else if ($scope._cart == "viewcart") {
                                                _self.viewCart($scope._cart);
                                            }
                                        }
                                    });
                                }
                            });
                        });
                    });
                },
                onTimeout: function(time, callback) {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        callback(true)
                    }, time);
                },
                onUnset: function(step, callback) {
                    var _self = this;
                    step = (step == 0) ? 0 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onLoad: function(step, callback) {
                    var _self = this;
                    step = (step == 0 || step == 1) ? 1 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onPass: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 2) ? 2 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onError: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 3) ? 3 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onCart: function(step, callback) {
                    var _self = this;
                    step = (step == 2 || step == 4) ? 4 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                trumpComponentCarts: function() {
                    var controlCart = share.getTrumpComponentCarts();
                    var component_carts = $('.cover-cards').hasClass('active');
                    if (!component_carts) {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.cart();
                        }
                    } else {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.load();
                        }
                    }
                },
                viewCart: function(viewcart) {
                    var _self = this;
                    _self.pageUrl(viewcart);
                },
                locationUrlReplace: function(page) {
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                main: function(callback) {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getDetail = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getDetail: function(api, callback) {
                    var _self = this;
                    var description = api.product_description;
                    var info = api.product_more_info;
                    var specificatio = [];
                    if (api.product_attribute.specification_data != undefined) {
                        specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? api.product_attribute.specification_data.pclass_array : [];
                    }
                    var state_specificatio = false;
                    if (api.product_attribute.specification_data != undefined) {
                        state_specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? true : false;
                    }
                    var state_info = (api.product_is_more_info == 1) ? true : false;
                    _self.consoleLog("getDetail : description", description);
                    _self.consoleLog("getDetail : info", info);
                    _self.consoleLog("getDetail : state_info", state_info);
                    _self.consoleLog("getDetail : specificatio", specificatio);
                    _self.consoleLog("getDetail : state_specificatio", state_specificatio);
                    callback(description, info, state_info, specificatio, state_specificatio);
                },
                onClickDetail: function(index) {
                    var _self = this;
                    $scope.data.detail.active = index;
                    _self.consoleLog("onClickDetail : data.detail.active", $scope.data.detail.active);
                }
            }
            return getFunction;
        };
        $scope.pages = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageName: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page_name);
                },
                pageUrl: function(page_name, id, name_url) {
                    var _self = this;
                    var page = page_name + "/" + id + "-" + name_url;
                    _self.locationUrlReplace(page);
                }
            }
            return getFunction;
        };
        $scope.countDown = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getLocation: function(callback) {
                    var _self = this;
                    var res_location = $location;
                    _self.consoleLog("getLocation", "res_location", res_location);
                    callback(res_location);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(params);
                },
                getLocationUrlNameProductDetail: function(callback) {
                    var _self = this;
                    _self.getRouteParams(function(res_params) {
                        _self.getLocation(function(res_location) {
                            var url_page_name = "/product-detail/" + res_params.product_id;
                            var res_url_name_product_detail = (res_location.url() == url_page_name) ? true : false;
                            _self.consoleLog("getLocationUrlNameProductDeal", "res_url_name_product_detail", res_url_name_product_detail);
                            callback(res_url_name_product_detail);
                        });
                    });
                },
                getUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    _self.consoleLog("getUnix", "now", now);
                    callback(now);
                },
                getCountDown: function(now, product_lifetime, callback) {
                    var _self = this;
                    var countdown_unix = parseInt(product_lifetime.lifetime_end_time) - now;
                    var milliseconds = moment.duration(countdown_unix * 1000, "milliseconds");
                    var res_countdown = ((milliseconds.days() <= 9) ? '0' + milliseconds.days() : milliseconds.days());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.hours() <= 9) ? '0' + milliseconds.hours() : milliseconds.hours());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.minutes() <= 9) ? '0' + milliseconds.minutes() : milliseconds.minutes());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.seconds() <= 9) ? '0' + milliseconds.seconds() : milliseconds.seconds());
                    _self.consoleLog("getCountDown", "res_countdown", res_countdown);
                    callback(res_countdown, countdown_unix);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                countDownByProduct: function(now, data_array, callback) {
                    var _self = this;
                    if (data_array.length != 0) {
                        if (data_array.product_lifetime.length != 0) {
                            _self.getCountDown(now, data_array.product_lifetime, function(res_count_down, res_countdown_unix) {
                                data_array.product_lifetime.lifetime_countdown = (res_countdown_unix > 0) ? res_count_down : "";
                                if (data_array.product_lifetime.lifetime_countdown == "") {
                                    _self.getNameUrl(data_array.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", data_array.product_set_array[0].product_id, res_name);
                                    });
                                }
                            });
                        }
                    }
                    _self.consoleLog("countDownByProduct", "data_array", data_array);
                    callback(data_array);
                },
                loop: function() {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        _self.getUnix(function(res_now) {
                            _self.countDownByProduct(res_now, $scope.dataApi.product.dataArray, function(data_array) {
                                $scope.dataApi.product.dataArray = data_array;
                                _self.getLocationUrlNameProductDetail(function(res_url_name_product_detail) {
                                    if (res_url_name_product_detail) {
                                        _self.loop();
                                    }
                                });
                            });
                        });
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.control = function() {
            var getFunction = {
                popupVideo: function(state, video_link, video_embed_code) {
                    var _self = this;
                    if (video_embed_code != '') {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    } else if (video_link != '') {
                        window.open(video_link, '_blank');
                    } else {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.data_control = {
            page_video: {
                popup: false,
                shop_video_embed_code: ""
            }
        }
        $scope.control_alert = {
            alert: {
                error_id: '',
                index: null,
                state: true,
                error: [{
                    id: '001',
                    title: 'การสั่งซื้อ',
                    messages: 'สามารถสั่งซื้อได้เพียงทีละออเดอร์เท่านั้น'
                }, {
                    id: '002',
                    title: 'การเพิ่มสินค้า',
                    messages: 'ไม่สามารถเพิ่มสินค้าของร้านมากกว่า 1 ร้านค้าได้'
                }, {
                    id: '003',
                    title: 'การสั่งซื้อ',
                    messages: 'ไม่สามารถเพิ่มสินค้า(ไม่มีร้านค้า)'
                }]
            }
        };
        $scope.controlAlert = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getErrorMessages: function(error_id, callback) {
                    var _self = this;
                    var messages = {
                        res_error_id: '',
                        res_index: null
                    }
                    angular.forEach($scope.control_alert.alert.error, function(item, index) {
                        if (item.id == error_id) {
                            messages.res_error_id = item.id;
                            messages.res_index = index;
                        }
                    });
                    callback(messages.res_error_id, messages.res_index);
                },
                alert: function(error_id) {
                    var _self = this;
                    _self.getErrorMessages(error_id, function(res_error_id, res_index) {
                        $scope.control_alert.alert.error_id = res_error_id;
                        $scope.control_alert.alert.index = res_index;
                        $scope.control_alert.alert.state = (!$scope.control.alert && res_error_id != '') ? true : false;
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.countDown().loop();
        /* set carousel  */
        $scope.setCarousel = {
            carousel: 0,
            index: 0
        };
        $scope.getCarousel().getCarousel($scope.setCarousel.carousel, function(res_carousel_id) {
            $scope.setCarousel.carousel = res_carousel_id;
        });
        /* set carousel  */
        /* get product api */
        $scope.dataApi = {
            reward: {
                dataSend: {},
                api: "shop/current",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            staff: {
                dataSend: {
                    txt_staff_id: 0
                },
                api: "staff/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            product: {
                dataSend: {
                    txt_product_id: 0
                },
                api: "product/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            relation: {
                dataSend: {
                    txt_referral_id: 0
                },
                api: "referral/relation",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.data = {
            attribute: {
                state: false,
                productId: "",
                dataArray: []
            },
            attribute_custom: {
                state: false,
                dataArray: []
            },
            reward: {
                quantity_name: 'reward',
                type_id: "0",
                reward_amount: 0,
                reward_percent: 0,
                reward_every_price: 0,
                point_reward: 0
            },
            quantity: {
                quantity_name: 'quantity',
                quantity_min: 1,
                quantity_max: 1,
                quantity_input: 1,
                quantity_select: []
            },
            product_price: {
                price_name: 'product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            product_compare_price: {
                price_name: 'product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_price: {
                price_name: 'sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_price: {
                price_name: 'sum_product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_minus_sum_product_price: {
                price_name: 'sum_product_compare_minus_sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            detail: {
                active: '0',
                dataArray: [{
                    index: '0',
                    state: true,
                    en: ($scope.description != undefined && $scope.description != "") ? $scope.description : 'Description',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '1',
                    state: true,
                    en: ($scope.info != undefined && $scope.info != "") ? $scope.info : 'Info',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '2',
                    state: true,
                    en: ($scope.specification != undefined && $scope.specification != "") ? $scope.specification : 'Specification',
                    th: '',
                    data: '',
                    dataArray: []
                }]
            }
        };
        $scope.setBuy = {
            promotion_id: '0',
            state_active: false,
            state_process: false,
            state_step: 0,
            state_data_font_color: "",
            state_data_background_color: "",
            stepArray: [{
                step: 0,
                name: "unset",
                icon: $scope._icebuyicon,
                state: "เพิ่มในรถเข็น",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 1,
                name: "load",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 2,
                name: "pass",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 3,
                name: "error",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 4,
                name: "cart",
                icon: "",
                state: "ดูรถเข็น",
                data_font_color: "",
                data_background_color: "primary_darkest"
            }]
        };
        /* - get api product/id start - */
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.product.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                $scope.dataApi.product.dataSend.txt_product_id = (res_product_id != false) ? res_product_id : 0;
                $scope.getData().dataSend($scope.dataApi.product.api, $scope.dataApi.product.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_product, res_state) {
                        $scope.dataApi.product.ok = res_ok;
                        $scope.dataApi.product.dataArray = get_res_api_product.data;
                        $scope.getData().consoleLog("get_res_api_product", get_res_api_product);
                        $scope.dataApi.product.dataArrayState = res_state;
                        /* -- get api shop/current to reward -- */
                        if (res_ok) {
                            /* -- get free gift promotion id -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.getData().getFreeGiftPromotionId(get_res_api_product.data.product_promotion, function(res_promotion_id) {
                                    $scope.setBuy.promotion_id = res_promotion_id;
                                });
                            });
                            /* -- get free gift promotion id -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.reward.dataArrayState = res_state;
                                $scope.getData().dataSend($scope.dataApi.reward.api, $scope.dataApi.reward.dataSend, function(res_api, res_dataSend) {
                                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                                        $scope.dataApi.reward.ok = res_ok;
                                        $scope.dataApi.reward.dataArray = get_res_api_shop.data;
                                        $scope.dataApi.reward.dataArrayState = res_state;
                                        $scope.getReward().createReward($scope.dataApi.product.dataArray.product_reward, get_res_api_shop.data.shop_point_config, function(res_reward) {
                                            $scope.data.reward.type_id = res_reward.type_id;
                                            $scope.data.reward.reward_amount = res_reward.amount;
                                            $scope.data.reward.reward_percent = res_reward.percent;
                                            $scope.data.reward.reward_every_price = res_reward.every_price;
                                            /* --- Wait product/id ,shop/current --- 
                                            /* ---- get attribute ---- */
                                            $scope.getAttribute().productAttribute(get_res_api_product.data.product_attribute, function(res_attribute) {
                                                $scope.data.attribute.dataArray = res_attribute;
                                                $scope.getAttribute().checkMinPrices(get_res_api_product, res_attribute, function(res_data_price, res_state) {
                                                    $scope.data.attribute.state = res_state;
                                                    $scope.data.product_price = res_data_price.product_price;
                                                    $scope.data.product_compare_price = res_data_price.product_compare_price;
                                                    $scope.data.sum_product_price = res_data_price.sum_product_price;
                                                    $scope.data.sum_product_compare_price = res_data_price.sum_product_compare_price;
                                                    $scope.data.sum_product_compare_minus_sum_product_price = res_data_price.sum_product_compare_minus_sum_product_price;
                                                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                                                        $scope.data.reward.point_reward = res_point_reward;
                                                    });
                                                    /* ----- stock ----- */
                                                    $scope.data.quantity.quantity_max = res_data_price.product_price.total_stock;
                                                    $scope.data.quantity.quantity_select = [];
                                                    for (var i = 0; i < res_data_price.product_price.total_stock; i++) {
                                                        $scope.data.quantity.quantity_select.push(i + 1);
                                                    }
                                                    /* ----- stock ----- */
                                                });
                                            });
                                            /* ---- get attribute ---- */
                                            /* ---- get attribute custom ---- */
                                            $scope.getAttributeCustom().createArray(get_res_api_product.data.product_custom_templates, function(res_custom_attribute, res_state) {
                                                $scope.data.attribute_custom.state = res_state;
                                                $scope.data.attribute_custom.dataArray = res_custom_attribute;
                                            });
                                            /* ---- get attribute custom ---- */
                                            /* ---- get detail ---- */
                                            $scope.getDetail().getDetail(get_res_api_product.data, function(res_description, res_info, res_state_info, res_specificatio, res_state_specificatio) {
                                                $scope.data.detail.dataArray[0].data = res_description;
                                                $scope.data.detail.dataArray[1].data = res_info;
                                                $scope.data.detail.dataArray[1].state = res_state_info;
                                                $scope.data.detail.dataArray[2].dataArray = res_specificatio;
                                                $scope.data.detail.dataArray[2].state = res_state_specificatio;
                                            });
                                            /* ---- get detail ---- */
                                            /* ---- update state ---- */
                                            $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                                            /* ---- update state ---- */
                                            /* --- Wait product/id ,shop/current --- */
                                        });
                                    });
                                });
                            });
                            /* -- get api shop/current to reward -- */
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.relation.dataArrayState = res_state;
                                $scope.getData().getReferralId(get_res_api_product.data.product_referral_display, function(res_referral_id) {
                                    $scope.dataApi.relation.dataSend.txt_referral_id = res_referral_id;
                                    $scope.getData().dataSend($scope.dataApi.relation.api, $scope.dataApi.relation.dataSend, function(res_api, res_dataSend) {
                                        $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_referral, res_state) {
                                            $scope.dataApi.relation.ok = res_ok;
                                            $scope.dataApi.relation.dataArray = (res_referral_id != 0) ? get_res_api_referral.data : [];
                                            $scope.dataApi.relation.dataArrayState = res_state;
                                        });
                                    });
                                });
                            });
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.getData().getStaffId(get_res_api_product.data.product_staff_id, function(res_staff) {
                                    if (res_staff.status) {
                                        $scope.dataApi.staff.dataArrayState = res_state;
                                        $scope.dataApi.staff.dataSend.txt_staff_id = res_staff.staff_id;
                                        $scope.getData().dataSend($scope.dataApi.staff.api, $scope.dataApi.staff.dataSend, function(res_api, res_dataSend) {
                                            $scope.getData().getApi(res_api, res_dataSend, function(res_ok, res, res_state) {
                                                $scope.dataApi.staff.ok = res_ok;
                                                $scope.dataApi.staff.dataArray = res.data;
                                                $scope.getData().getNameUrl(res.data.staff_first_name, function(res_staff_first_name_url) {
                                                    $scope.dataApi.staff.dataArray.staff_first_name_url = res_staff_first_name_url;
                                                    $scope.dataApi.staff.dataArrayState = res_state;
                                                });
                                            });
                                        });
                                    }
                                });
                            });
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                        } else {
                            /* ok = false */
                            if ($scope.dataApi.product.dataArray.length != 0) {
                                /* product deal to product original */
                                if ($scope.dataApi.product.dataArray.product_set_array.length != 0) {
                                    $scope.countDown().getNameUrl($scope.dataApi.product.dataArray.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", $scope.dataApi.product.dataArray.product_set_array[0].product_id, res_name);
                                    });
                                } else {
                                    $scope.pages().pageName("home");
                                }
                            } else {
                                /* product null */
                                $scope.pages().pageName("home");
                            }
                        }
                    });
                });
            });
        });
        /* - get api product/id end - */
        /* get product api */
    };
    return promise;
});_ui_share_app.directive('productDetailPageT', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageT';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        id: '@id',
        stilebutton: '@stilebutton',
        textbutton: '@textbutton',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope._getPostIdFromURL = function() {
            var dataget = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                dataget = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof dataget === 'number' && dataget > 0) {
                return dataget;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id) {
            var d = {
                'txt_product_id': product_id
            };
            GAEAPI.get('product/id', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelate = e.data;
                    console.log("dataRelate", $scope.dataRelate);
                }
            });
        };
        $scope.buildDataProductRelate($scope._getPostIdFromURL());
        
    };
    return promise;
});_ui_share_app.directive('productDetailPageTsr', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageTsr';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0
        };
        $scope.login = function() {
            var login = {
                showLogin: function() {
                    return UiCustomerBox.delegate.get.isLogin();
                },
                isLogin: function(callback) {
                    callback(UiCustomerBox.delegate.get.isLogin());
                },
                pageLogin: function() {
                    var _self = this;
                    _self.isLogin(function(isLogin) {
                        if (!isLogin) {
                            $inloginPopupTypeGrip.open();
                        }
                    });
                }
            }
            return login;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                    }
                }
            }
            return quantity;
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getDataArrayOk: function(output, callback) {
                    var state = false;
                    if (output.ok == 1) {
                        state = true;
                        callback(output, state);
                    }
                    callback(output, state);
                },
                quantity: function(product_stock_track_type_id, product_total_stock, callback) {
                    var total_stock = 0;
                    /* if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    } */
                    if (product_stock_track_type_id == "0") {
                        total_stock = 20;
                    } else if (product_stock_track_type_id == "1") {
                        if (product_total_stock > 0) {
                            total_stock = product_total_stock;
                        } else {
                            total_stock = 0;
                        }
                    }
                    callback(total_stock);
                },
                main: function() {
                    var _self = this;
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        _self.consoleLog("getDataProductArray : output : ", output.data);
                        _self.getDataArrayOk(output, function(output, state) {
                            if (state) {
                                _self.quantity(output.data.product_stock_track_type_id, output.data.product_total_stock, function(total_stock) {
                                    $scope.dataProductBuy.quantity_max = total_stock;
                                    _self.consoleLog("getDataProductArray : output : ", output.data);
                                    $scope.dataArray = output.data;
                                    $scope.dataProductBuy.price = output.data.product_price;
                                    $scope.dataProductBuy.sumprice = output.data.product_price;
                                    $scope.dataArrayState = _self.stateData(false, true);
                                    _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                        _self.consoleLog("getNavigationBar : output : ", output.data);
                                        $scope.navigationBar = output.data;
                                    });
                                });
                            } else {
                                $scope.dataArrayState = _self.stateData(false, true);
                            }
                        });
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
    };
    return promise;
});_ui_share_app.directive('productDetailPageTypeA', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageTypeA';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        /* getUrlProductId */
        $scope.getUrlProductId = function() {
            $scope.consoleLog("getUrlProductId : $routeParams.product_id : ", $routeParams.product_id);
            if (typeof $routeParams.product_id !== 'undefined') {
                var url_product_id = $routeParams.product_id.split("-");
                var product_id = url_product_id[0];
                return product_id;
            }
        };
        /* getUrlProductId */
        /* consoleLog */
        $scope.consoleLog = function(showlog, data) {
            console.log(showlog, data);
        };
        /* consoleLog */
        /* getProductId */
        $scope.checkProduct = function() {
            var cart = {
                checkOutputOk: function(output, callback) {
                    $scope.consoleLog("cartProduct : cartcCtegory : output : ", output);
                    var output_ok_status = false;
                    if (output.ok == 1) {
                        output_ok_status = true;
                    }
                    callback(output_ok_status);
                },
                saveProduct: function(product, callback) {
                    $scope.consoleLog("cartProduct : cartcCtegory : product : ", product);
                    var save_product = product;
                    callback(save_product);
                },
                checkCtegory: function(category, callback) {
                    $scope.consoleLog("cartProduct : checkCtegory : category : ", category);
                    var ctegory_status = false;
                    if (category.length) {
                        ctegory_status = true;
                    }
                    callback(ctegory_status);
                },
                getCtegoryId: function(category, callback) {
                    $scope.consoleLog("cartProduct : checkCtegory : category : ", category);
                    var referral_id = category[0].referral_id;
                    callback(referral_id);
                },
                getReferralRelationId: function(referral_id, callback) {
                    $scope.consoleLog("cartProduct : getReferralRelationId : referral_id : ", referral_id);
                    var dataSend = {
                        'txt_referral_id': referral_id
                    };
                    $scope.consoleLog("cartProduct : getReferralRelationId : dataSend : ", dataSend);
                    GAEAPI.get('referral/relation', dataSend, $scope).then(function(output) {
                        $scope.consoleLog("cartProduct : getReferralRelationId : output : ", output);
                        $scope.checkProduct().checkOutputOk(output, function(output_ok_status) {
                            $scope.consoleLog("cartProduct : getReferralRelationId : checkOutputOk : output_ok_status : ", output_ok_status);
                            var data_relation = false;
                            if (output_ok_status) {
                                $scope.consoleLog("cartProduct : getReferralRelationId : checkOutputOk : ", "PASS");
                                data_relation = output.data;
                                callback(data_relation);
                            } else {
                                $scope.consoleLog("cartProduct : getReferralRelationId : checkOutputOk : ", "ERROR");
                                callback(data_relation);
                            }
                        });
                    });
                },
                checkStock: function(stock, variant, callback) {
                    $scope.consoleLog("cartProduct : checkStock : stock : ", stock);
                    $scope.consoleLog("cartProduct : checkStock : variant : ", variant);
                    var output_stock = "ERROR";
                    if (variant == 0) {
                        if (stock == -1) {
                            output_stock = "Do Not Track Inventory";
                        } else {
                            output_stock = "Track Inventory";
                        }
                    } else {
                        output_stock = "Attribute Class";
                    }
                    callback(output_stock);
                },
                calculateStock: function(output_stock, stock, callback) {
                    $scope.consoleLog("cartProduct : calculateStock : output_stock : ", output_stock);
                    $scope.consoleLog("cartProduct : calculateStock : stock : ", stock);
                    var array_stock = [];
                    var number_stock = 0;
                    if (output_stock == "Track Inventory") {
                        if (stock > 20) {
                            stock = 20;
                        }
                        number_stock = stock;
                        for (var i = 0; i < stock; i++) {
                            array_stock.push(i + 1);
                        }
                    } else if (output_stock == "Do Not Track Inventory") {
                        number_stock = 20;
                        for (var i = 0; i < 20; i++) {
                            array_stock.push(i + 1);
                        }
                    }
                    callback(array_stock, number_stock);
                },
                checkAttribute: function(attribute, variant, callback) {
                    $scope.consoleLog("cartProduct : checkAttribute : attribute : ", attribute);
                    $scope.consoleLog("cartProduct : checkAttribute : variant : ", variant);
                    var output_attribute = false;
                    if (attribute.option_data.variant_array.length > 0 && variant > 0) {
                        output_attribute = true;
                    }
                    callback(output_attribute);
                },
                saveAttribute: function(attribute, callback) {
                    $scope.consoleLog("cartProduct : saveAttribute : attribute : ", attribute);
                    var save_attribute = attribute;
                    callback(save_attribute);
                },
                checkPrice: function(product_price, variant, callback) {
                    $scope.consoleLog("cartProduct : checkPrice : attribute : ", attribute);
                    $scope.consoleLog("cartProduct : checkPrice : variant : ", variant);
                    var output_attribute = false;
                    if (attribute.option_data.variant_array.length > 0 && variant > 0) {
                        output_attribute = true;
                    }
                    callback(output_attribute);
                },
            }
            return cart;
        };
        $scope.dataRelation = false;
        $scope.dataProduct = false;
        $scope.dataAttribute = false;
        $scope.getProductStock = {
            array: [],
            number: 0
        };
        $scope.getProductIdState = {
            load: true,
            done: false
        };
        $scope.getProductId = function(product_id) {
            $scope.consoleLog("getProductId : product_id : ", product_id);
            $scope.getProductIdState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': product_id
            };
            $scope.consoleLog("getProductId : dataSend : ", dataSend);
            GAEAPI.get('product/id', dataSend).then(function(output) {
                $scope.consoleLog("getProductId : get : output : ", output);
                /* checkOutputOk */
                $scope.checkProduct().checkOutputOk(output, function(output_ok_status) {
                    $scope.consoleLog("getProductId : checkOutputOk : output_ok_status : ", output_ok_status);
                    if (output_ok_status) {
                        $scope.consoleLog("getProductId : checkOutputOk : ", "PASS");
                        /* saveProduct */
                        $scope.checkProduct().saveProduct(output.data, function(save_product) {
                            $scope.consoleLog("getProductId : saveProduct : save_product : ", save_product);
                            $scope.dataArray = save_product;
                            /* checkCtegory */
                            $scope.checkProduct().checkCtegory(save_product.product_referral_display.category, function(ctegory_status) {
                                $scope.consoleLog("getProductId : checkCtegory : ctegory_status : ", ctegory_status);
                                if (ctegory_status) {
                                    $scope.consoleLog("getProductId : checkCtegory : status : ", "PASS");
                                    $scope.checkProduct().getCtegoryId(save_product.product_referral_display.category, function(referral_id) {
                                        $scope.consoleLog("getProductId : checkCtegory : getCtegoryId : referral_id : ", referral_id);
                                        $scope.checkProduct().getReferralRelationId(referral_id, function(data_relation) {
                                            $scope.consoleLog("getProductId : checkCtegory : getReferralRelationId : data_relation : ", data_relation);
                                            $scope.dataRelation = data_relation;
                                        });
                                    });
                                } else {
                                    $scope.consoleLog("getProductId : checkCtegory : status : ", "ERROR");
                                }
                            });
                            /* checkCtegory */
                            /* checkStock */
                            $scope.checkProduct().checkStock(save_product.product_total_stock, save_product.product_total_variant, function(output_stock) {
                                $scope.consoleLog("getProductId : checkStock : output_stock : ", output_stock);
                                $scope.checkProduct().calculateStock(output_stock, save_product.product_total_stock, function(array_stock, number_stock) {
                                    $scope.consoleLog("getProductId : calculateStock : array_stock : ", array_stock);
                                    $scope.consoleLog("getProductId : calculateStock : number_stock : ", number_stock);
                                    $scope.getProductStock.array = array_stock;
                                    $scope.getProductStock.number = number_stock;
                                    $scope.consoleLog("getProductId : calculateStock : getProductStock : ", $scope.getProductStock);
                                });
                            });
                            /* checkStock */
                            /* checkAttribute */
                            $scope.checkProduct().checkAttribute(save_product.product_attribute, save_product.product_total_variant, function(output_attribute) {
                                $scope.consoleLog("getProductId : checkAttribute : output_attribute : ", output_attribute);
                                if (output_attribute) {
                                    $scope.consoleLog("getProductId : checkAttribute : status : ", "PASS");
                                    $scope.checkProduct().saveAttribute(save_product.product_attribute.option_data.pclass_array, function(save_attribute) {
                                        $scope.consoleLog("getProductId : saveAttribute : save_attribute : ", save_attribute);
                                        $scope.dataAttribute = save_attribute;
                                        $scope.consoleLog("getProductId : saveAttribute : dataAttribute : ", $scope.dataAttribute);
                                    });
                                } else {
                                    $scope.consoleLog("getProductId : checkAttribute : status : ", "ERROR");
                                }
                            });
                            /* checkAttribute */
                        });
                        /* saveProduct */
                    } else {
                        $scope.consoleLog("getProductId : checkOutputOk : ", "ERROR");
                    }
                    $scope.getProductIdState = $scope.StateData(false, true);
                });
                /* checkOutputOk */
            });
        };
        /* getProductId */
        /* StateData */
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        /* StateData */
        $scope.getProductId($scope.getUrlProductId());
    };
    return promise;
});// _data_qty_modelvar $xZoomTimer = null;
// var $xZoomInstance = false;
_ui_share_app.directive('productDetailPageU', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageU';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        stylebutton: '@stylebutton',
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.referral_id = '0';
        $scope._shop_id = CUR_THEME.shop_id();
        $scope._currency = ($scope._shop_id == "635") ? 0 : 2;
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.checkSeo = function() {
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
        $scope.calculateDiscount = function(expensivePrice, salePrice) {
            var dif = expensivePrice - salePrice;
            return parseInt(dif * 100 / expensivePrice);
        };
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* JQ: Scroll event */
        angular.element($window).bind('scroll', function() {
            if (!$scope.data) {
                return;
            }
            var curPos = ($(document).scrollTop());
            var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));
            console.debug("Cur pos", curPos, properHeight);
            if (curPos > properHeight) {
                angular.element('.block-background .bottom-info').addClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */
        $scope.data_min = [];
        $scope.dataPreserve = false;
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* Get data by product id */
        $scope.data = false;
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.quantity_in = function(product_total_stock, callback) {
            var total_stock = 0;
            if (product_total_stock == -1) {
                total_stock = 20;
            } else if (product_total_stock != -1 && product_total_stock != 0) {
                total_stock = product_total_stock;
            }
            callback(total_stock);
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope.quantity_in(e.data.product_total_stock, function(total_stock) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                        $scope.buildVariantOption(e.data);
                        console.log("product/id : ", $scope.data.product_referral_display);
                        if ($scope.data.product_referral_display.category != undefined) {
                            if ($scope.data.product_referral_display.category.length != 0) {
                                $scope.referral_id = $scope.data.product_referral_display.category[0].referral_id;
                                $scope._getdatamap($scope.data.product_referral_display.category[0].referral_id);
                            }
                        }
                        $scope.show_badge(e.data);
                        $scope.dataProductBuy.quantity_max = total_stock;
                        $scope.dataProductBuy.price = e.data.product_price;
                        $scope.dataProductBuy.sumprice = e.data.product_price;
                    });
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.makeVariantsClick();
            $scope.onSelectVariantItems(0, '');
        };
        $scope.buy_button = false;
        $scope.dataVariantsPick = [];
        $scope.max_length = 20;
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.testyuyu = 0;
                $scope.buy_button = false;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.dsetting').addClass("active");
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._getPostIdFromURL()
                }, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                        if (e.data.product_attribute.option_data != 0 && e.data.product_total_variant > 0) {
                            if (e.data.product_attribute.option_data.variant_array.length != 0 && e.data.product_total_variant > 0) {
                                var set_varia0 = e.data.product_attribute.option_data.variant_array[0].price;
                                for (var i = 0; i < e.data.product_attribute.option_data.variant_array.length; i++) {
                                    if (parseInt(set_varia0) >= parseFloat(e.data.product_attribute.option_data.variant_array[i].price)) {
                                        set_varia0 = e.data.product_attribute.option_data.variant_array[i].price;
                                        $scope.data_min = e.data.product_attribute.option_data.variant_array[i];
                                        // $scope.data = $scope.data_min[0];
                                        $scope.data.product_price = $scope.data_min.price;
                                        $scope.data.product_compare_price = $scope.data_min.compare_price;
                                    }
                                }
                                if ($scope.data_min.length == 0) {
                                    $scope.data_min = e.data.product_attribute.option_data.variant_array[0];
                                    $scope.data.product_price = $scope.data_min.price;
                                }
                                console.log("iujdishjdskd : ", $scope.data_min.price);
                                //  $scope.buildVariantOption(e.data);
                                // $scope.buildMultipleQuantity(e.data);
                            }
                        }
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    $scope.testyuyu = 0;
                    $('.d_qty_not_result').removeClass("active");
                    $('.dsetting').removeClass("active");
                    $scope.findVariantsData($scope.dataVariantsPick);
                    $scope.buy_button = true;
                } else {
                    $scope.testyuyu = 0;
                    $('.d_qty').removeClass('active').removeClass('inin');
                    $('.d_qty_price').removeClass("active");
                    $('.d_qty_price').removeClass("inin");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    $scope.data.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = 0;
                    $scope.data.product_compare_price = 0;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope.checkColorConfig = function() {
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._makeProductToCarousel();
                }, 500);
            }
        });
        $scope.qty_original = 1;
        $scope.qty_current = 1;
        $scope.viewOptimizeImage = function(size, image_url, image_width) {
            if (window.devicePixelRatio >= 2 || parseInt(image_width) <= size) {
                return image_url;
            }
            var a = image_url.split("/"),
                b = a[a.length - 1];
            a[a.length - 1] = 't' + size + '_' + b;
            return a.join("/");
        };
        $scope.gallerySingleViewIndex = 0;
        $scope.switchSingleView = function(idx) {
            console.log("$xZoomInstance", $xZoomInstance);
            $('.gallery_show_single').css({
                'transition': 'all 0.3s',
                'opacity': '0'
            });
            $timeout(function() {
                $scope.gallerySingleViewIndex = idx;
                $('.gallery_show_single').css({
                    'opacity': '1'
                });
            }, 300);
            setTimeout(function() {
                if ($(window).width() >= 992) {
                    if ($("img.zoom").attr('data-api-width') > 400 && $("img.zoom").attr('data-api-height') > 400) {
                        /*$("img.zoom").ezPlus({
                            'scrollZoom':true,
                            'responsive':true,
                            'zoomWindowWidth':400,
                            'zoomWindowHeight':400,
                            'zoomWindowOffetx':30,
                        });*/
                        $xZoomInstance = $('.zoom').xzoom({
                            Xoffset: 30,
                            tint: '#b9b5b3',
                        });
                    }
                }
            }, 300);
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.datamap = [];
        $scope._getdatamap = function(dataIn) {
            var dataSend = {
                'txt_referral_id': dataIn
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    $scope.datamap = output.data;
                }
            });
        }
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        _self.quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        _self.quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity;
                        _self.upDatePrice();
                        _self.quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity;
                        _self.upDatePrice();
                        _self.quantityBreaks();
                    }
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.data, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                }
            }
            return quantity;
        };
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".qty_display").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.warning_qty = 0;
        $scope.getWarn_qty = function() {
            $scope.warning_qty = 1;
        };
        $scope.ShowWithBadge = false;
        $scope.show_badge = function(data) {
            if (data.product_badge.length > 0) {
                for (var i = 0; i < data.product_badge.length; i++) {
                    if (data.product_badge[i].badge_id == 18) {
                        $scope.ShowWithBadge = true;
                        break;
                    }
                }
            } else {
                $scope.ShowWithBadge = false;
            }
        }
    };
    return promise;
});var $xZoomTimer = null;
var $xZoomInstance = false;
_ui_share_app.directive('productDetailPageUa', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageUa';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        stylebutton: '@stylebutton',
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.checkSeo = function() {
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.titleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* JQ: Scroll event */
        angular.element($window).bind('scroll', function() {
            if (!$scope.data) {
                return;
            }
            var curPos = ($(document).scrollTop());
            var properHeight = ($('.img_cover').height() * ($('.img_cover').length - 1));
            console.debug("Cur pos", curPos, properHeight);
            if (curPos > properHeight) {
                angular.element('.block-background .bottom-info').addClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').addClass('unactive');
                }
            } else {
                angular.element('.block-background .bottom-info').removeClass('unactive');
                if ($(window).width() > 991) {
                    angular.element('.bottom-buy-overlay').removeClass('unactive');
                }
            }
        });
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /* Slider Send */
        $scope.data_min = [];
        $scope.dataPreserve = false;
        $scope.names = [];
        /* Get product id from url or from component */
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        /* Get data by product id */
        $scope.data = false;
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope.buildVariantOption(e.data);
                    $scope.getRelation($scope.data.product_referral[0].referral_id);
                    $scope._getdatamap($scope.data.product_referral_display.category[0].referral_id);
                    $scope.show_badge(e.data);
                    $scope.timeCountStart2(e.data);
                    if(e.data.product_total_variant == 0 && e.data.product_total_stock > 0){
                        $scope.names = [];
                        for (var i = 0; i < parseInt(e.data.product_total_stock); i++) {
                            $scope.names.push(i+1);
                        }
                        console.log("nnames stock :",$scope.names);
                    }
                    if(e.data.product_total_variant == 0 && e.data.product_total_stock < 0){
                        $scope.names = [];
                        for (var i = 0; i < 10; i++) {
                            $scope.names.push(i+1);
                        }
                        console.log("nnames stock :",$scope.names);
                    }
                    if(e.data.product_total_variant > 0){
                        $scope.names = [];
                            for (var i = 0; i < 10; i++) {
                                $scope.names.push(i+1);
                        }
                    }
                }
                console.log("detail_id_npd : ",$scope.data);
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope.showPart = "";
        $scope.showPart_wan = "";
        $scope.showPart_h = "";
        $scope.showPart_m = "";
        $scope.showPart_s = "";
        $scope.countDown = function(settime) {
            var time_year = "";
            var time_mount = "";
            var time_date = "";
            var time_hr = "";
            var time_mi = "";
            var time_se = "";
            var timeA = "";
            var timeB = "";
            var timeC = "";
            var timeDifference = "";
            var timeDifference_temp = "";
            var wan = "";
            var l_wan = "";
            var hour = "";
            var l_hour = "";
            var minute = "";
            var second = "";
            time_year = GAEAPI.time.dateFormat("YYYY", settime.product_lifetime.lifetime_end_time);
            time_mount = GAEAPI.time.dateFormat("M", settime.product_lifetime.lifetime_end_time);
            time_date = GAEAPI.time.dateFormat("D", settime.product_lifetime.lifetime_end_time);
            time_hr = GAEAPI.time.dateFormat("H", settime.product_lifetime.lifetime_end_time);
            time_mi = GAEAPI.time.dateFormat("m", settime.product_lifetime.lifetime_end_time);
            time_se = GAEAPI.time.dateFormat("s", settime.product_lifetime.lifetime_end_time);
            timeA = new Date(); /* วันเวลาปัจจุบัน */
            timeB = new Date(time_year, (time_mount - 1), time_date, time_hr, time_mi, time_se, '0');
            
            timeDifference = timeB.getTime() - timeA.getTime();
            console.log("timeDifference", timeDifference);
            if (timeDifference >= 0) {
                timeDifference = timeDifference / 1000;
                timeDifference = Math.floor(timeDifference);
                wan = Math.floor(timeDifference / 86400);
                l_wan = timeDifference % 86400;
                hour = Math.floor(l_wan / 3600);
                l_hour = l_wan % 3600;
                minute = Math.floor(l_hour / 60);
                second = l_hour % 60;
                $scope.showPart = wan + " วัน " + pad(hour, 2) + " ชั่วโมง " + pad(minute, 2) + " นาที " + pad(second, 2) + " วินาที";
                $scope.showPart_wan = wan;
                $scope.showPart_h = pad(hour, 2);
                $scope.showPart_m = pad(minute, 2);
                $scope.showPart_s = pad(second, 2);
                if (wan == 0 && hour == 0 && minute == 0 && second == 0) {}
                console.log("check_array", $scope.showPart);
            }
        };
        function pad(str, max) {
            str = str.toString();
            return str.length < max ? pad("0" + str, max) : str;
        };
        $scope.timeout_promise2 = null;
        $scope.timeCountStart2 = function(settime) {
            $scope.timeout_promise2 = $timeout(function() {
                $scope.countDown(settime);
                $scope.timeCountStart2(settime);
            }, 1000);
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.makeVariantsClick();
            $scope.onSelectVariantItems(0, '');
        };
        $scope.buy_button = false;
        $scope.dataVariantsPick = [];
        $scope.max_length = 20;
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.testyuyu = 0;
                $scope.buy_button = false;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.dsetting').addClass("active");
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._getPostIdFromURL()
                }, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                        if (e.data.product_attribute.option_data != 0 && e.data.product_total_variant > 0) {
                            if (e.data.product_attribute.option_data.variant_array.length != 0 && e.data.product_total_variant > 0) {
                                var set_varia0 = e.data.product_attribute.option_data.variant_array[0].price;
                                for (var i = 0; i < e.data.product_attribute.option_data.variant_array.length; i++) {
                                    if (parseInt(set_varia0) >= parseInt(e.data.product_attribute.option_data.variant_array[i].price)) {
                                        set_varia0 = e.data.product_attribute.option_data.variant_array[i].price;
                                        $scope.data_min = e.data.product_attribute.option_data.variant_array[i];
                                        // $scope.data = $scope.data_min[0];
                                        $scope.data.product_price = $scope.data_min.price;
                                        $scope.data.product_compare_price = $scope.data_min.compare_price;
                                    }
                                }
                                if ($scope.data_min.length == 0) {
                                    $scope.data_min = e.data.product_attribute.option_data.variant_array[0];
                                    $scope.data.product_price = $scope.data_min.price;
                                }
                                console.log("iujdishjdskd : ", $scope.data_min.price);
                                //  $scope.buildVariantOption(e.data);
                                // $scope.buildMultipleQuantity(e.data);
                            }
                        }
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    $scope.testyuyu = 0;
                    $('.d_qty_not_result').removeClass("active");
                    $('.dsetting').removeClass("active");
                    $scope.findVariantsData($scope.dataVariantsPick);
                    $scope.buy_button = true;
                } else {
                    $scope.testyuyu = 0;
                    $('.d_qty').removeClass('active').removeClass('inin');
                    $('.d_qty_price').removeClass("active");
                    $('.d_qty_price').removeClass("inin");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    $scope.data.product_total_stock = dataVariants[i].total_stock;
                    $scope.names = [];
                    for (var j = 0; j < 10; j++) {
                        $scope.names.push(j+1);
                    }
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = 0;
                    $scope.data.product_compare_price = 0;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope.checkColorConfig = function() {
            return ($('config-color').length) ? true : false;
        };
        $scope._makeProductToCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._makeProductToCarousel();
                }, 500);
            }
        });
        $scope.qty_original = 1;
        $scope.qty_current = 1;
        $scope.viewOptimizeImage = function(size, image_url, image_width) {
            if (window.devicePixelRatio >= 2 || parseInt(image_width) <= size) {
                return image_url;
            }
            var a = image_url.split("/"),
                b = a[a.length - 1];
            a[a.length - 1] = 't' + size + '_' + b;
            return a.join("/");
        };
        $scope.gallerySingleViewIndex = 0;
        $scope.switchSingleView = function(idx) {
            console.log("$xZoomInstance", $xZoomInstance);
            $('.gallery_show_single').css({
                'transition': 'all 0.3s',
                'opacity': '0'
            });
            $timeout(function() {
                $scope.gallerySingleViewIndex = idx;
                $('.gallery_show_single').css({
                    'opacity': '1'
                });
            }, 300);
            setTimeout(function() {
                if ($(window).width() >= 992) {
                    if ($("img.zoom").attr('data-api-width') > 400 && $("img.zoom").attr('data-api-height') > 400) {
                        /*$("img.zoom").ezPlus({
                            'scrollZoom':true,
                            'responsive':true,
                            'zoomWindowWidth':400,
                            'zoomWindowHeight':400,
                            'zoomWindowOffetx':30,
                        });*/
                        $xZoomInstance = $('.zoom').xzoom({
                            Xoffset: 30,
                            tint: '#b9b5b3',
                        });
                    }
                }
            }, 300);
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.redirectCheckout = function(p,q){
            window.location.href = GURL.base_url() + "checkout?pdata="+p+'-'+q;
        };
        $scope.datamap = [];
        $scope._getdatamap = function(dataIn) {
            var dataSend = {
                'txt_referral_id': dataIn
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    $scope.datamap = output.data;
                }
            });
        }
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            var check_num = 1;
            if($(".d_qty_i").find('select').val() != undefined && $(".d_qty_i").find('select').val() != ''){
                 check_num = $(".d_qty_i").find('select').val().substr(7);
            }else{
                $(".d_qty_i").find('select').val("number:1");
                $(".d_qty_i").find('select').selectedIndex = "2";
            }
            console.log("shdgshdgsh :",check_num);
            return parseInt(check_num);
            // return $(".qty_display").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 9) {
                i = 9;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('select[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('select[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
            // alert(i);
            console.log("data_set array test : ",i);
            $scope._data_qty_selected = i;
            // parseInt(e.val());
            // alert(i);
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
            alert("กรุณาเลือกตัวเลือกให้ครบถ้วน");
        };
        $scope.warning_qty = 0;
        $scope.getWarn_qty = function() {
            $scope.warning_qty = 1;
        };
        $scope.ShowWithBadge = false;
        $scope.show_badge = function(data) {
            if (data.product_badge.length > 0) {
                for (var i = 0; i < data.product_badge.length; i++) {
                    if (data.product_badge[i].badge_id == 18) {
                        $scope.ShowWithBadge = true;
                        break;
                    }
                }
            } else {
                $scope.ShowWithBadge = false;
            }
        }
    };
    return promise;
});var $xZoomTimer = null;
var $xZoomInstance = false;
_ui_share_app.directive('productDetailPageUb', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageUb';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                findVariantsData: function(attributeOption, dataVariants, callback) {
                    var _self = this;
                    var variants = dataVariants;
                    _self.consoleLog("findVariantsData : variants : ", variants);
                    var variantsOut = [];
                    for (var i = 0; i < variants.length; i++) {
                        var optionJson = angular.fromJson(variants[i].option_id_json);
                        if (_self.compareArray(attributeOption, optionJson)) {
                            _self.consoleLog("findVariantsData : variants[i] : ", variants[i]);
                            variantsOut = variants[i];
                            break;
                        }
                    }
                    callback(variantsOut);
                },
                checkOption: function(variants_total, callback) {
                    var state = false;
                    if (variants_total == 0) {
                        state = true;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = false;
                    if (stateIn == false && quantity_max > 0) {
                        state = true;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, function(variantsOut) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                $scope.dataArray.product_id = variantsOut.product_id;
                                $scope.dataArray.product_sku = variantsOut.sku;
                                $scope.dataArray.product_price = variantsOut.price;
                                $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                    _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                        $scope.buy.state = state;
                                        if ($scope.attribute.variantsTotal != 0) {
                                            $scope.buy.attribute = true;
                                        }
                                    });
                                });
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = false;
                    if (variants_total == 0) {
                        state = true;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = false;
                    if (stateIn == true && quantity_max > 0) {
                        state = true;
                    }
                    callback(state);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        _self.consoleLog("getDataProductArray : output : ", output.data);
                        _self.quantity(output.data.product_total_stock, function(total_stock) {
                            _self.consoleLog("quantity : total_stock : ", total_stock);
                            $scope.dataProductBuy.quantity_max = total_stock;
                            $scope.dataArray = output.data;
                            _self.productTab(output.data.product_tags, function(productTab) {
                                $scope.dataArrayTags = productTab;
                                _self.showTab(output.data, function(description, info) {
                                    $scope.showTab.dataTab[0].data = description;
                                    $scope.showTab.dataTab[1].data = info;
                                });
                                _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                    _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                    _self.consoleLog("getAttribute : attribute : ", attribute);
                                    _self.consoleLog("getAttribute : variants : ", variants);
                                    _self.checkOption(variants_total, function(state) {
                                        _self.checkTotalStock(state, total_stock, function(state) {
                                            $scope.buy.state = state;
                                            $scope.attribute.attributeOption = attribute;
                                            $scope.attribute.dataVariants = variants;
                                            $scope.attribute.variantsTotal = variants_total;
                                        });
                                    });
                                });
                                $scope.dataProductBuy.price = output.data.product_price;
                                $scope.dataProductBuy.sumprice = output.data.product_price;
                                _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                    _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                    $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                    if (quantity_break.length) {
                                        $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                    }
                                });
                                _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                    _self.consoleLog("getNavigationBar : output : ", output.data);
                                    $scope.navigationBar = output.data;
                                    $scope.dataArrayState = _self.stateData(false, true);
                                });
                            });
                        });
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
    };
    return promise;
});var $xZoomTimer = null;
var $xZoomInstance = false;
_ui_share_app.directive('productDetailPageUc', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageUc';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon : '@icon',
        stylebutton : '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                findVariantsData: function(attributeOption, dataVariants, callback) {
                    var _self = this;
                    var variants = dataVariants;
                    _self.consoleLog("findVariantsData : variants : ", variants);
                    var variantsOut = [];
                    for (var i = 0; i < variants.length; i++) {
                        var optionJson = angular.fromJson(variants[i].option_id_json);
                        if (_self.compareArray(attributeOption, optionJson)) {
                            _self.consoleLog("findVariantsData : variants[i] : ", variants[i]);
                            variantsOut = variants[i];
                            break;
                        }
                    }
                    callback(variantsOut);
                },
                checkOption: function(variants_total, callback) {
                    var state = false;
                    if (variants_total == 0) {
                        state = true;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = false;
                    if (stateIn == false && quantity_max > 0) {
                        state = true;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, function(variantsOut) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                $scope.dataArray.product_id = variantsOut.product_id;
                                $scope.dataArray.product_sku = variantsOut.sku;
                                $scope.dataArray.product_price = variantsOut.price;
                                $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                    _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                        $scope.buy.state = state;
                                        if ($scope.attribute.variantsTotal != 0) {
                                            $scope.buy.attribute = true;
                                        }
                                    });
                                });
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = $scope.dataProductBuy.quantity_max;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 20;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = false;
                    if (variants_total == 0) {
                        state = true;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = false;
                    if (stateIn == true && quantity_max > 0) {
                        state = true;
                    }
                    callback(state);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    _self.getDataProductArray('product/id', function(output) {
                        _self.consoleLog("getDataProductArray : output : ", output.data);
                        _self.quantity(output.data.product_total_stock, function(total_stock) {
                            _self.consoleLog("quantity : total_stock : ", total_stock);
                            $scope.dataProductBuy.quantity_max = total_stock;
                            $scope.dataArray = output.data;
                            _self.productTab(output.data.product_tags, function(productTab) {
                                $scope.dataArrayTags = productTab;
                                _self.showTab(output.data, function(description, info) {
                                    $scope.showTab.dataTab[0].data = description;
                                    $scope.showTab.dataTab[1].data = info;
                                });
                                _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                    _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                    _self.consoleLog("getAttribute : attribute : ", attribute);
                                    _self.consoleLog("getAttribute : variants : ", variants);
                                    _self.checkOption(variants_total, function(state) {
                                        _self.checkTotalStock(state, total_stock, function(state) {
                                            $scope.buy.state = state;
                                            $scope.attribute.attributeOption = attribute;
                                            $scope.attribute.dataVariants = variants;
                                            $scope.attribute.variantsTotal = variants_total;
                                        });
                                    });
                                });
                                $scope.dataProductBuy.price = output.data.product_price;
                                $scope.dataProductBuy.sumprice = output.data.product_price;
                                _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                    _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                    $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                    if (quantity_break.length) {
                                        $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                    }
                                });
                                _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                    _self.consoleLog("getNavigationBar : output : ", output.data);
                                    $scope.navigationBar = output.data;
                                    $scope.dataArrayState = _self.stateData(false, true);
                                });
                            });
                        });
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
    };
    return promise;
});var $xZoomTimer = null;
var $xZoomInstance = false;
_ui_share_app.directive('productDetailPageUd', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'productDetailPageUd';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        icon: '@icon',
        stylebutton: '@stylebutton'
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.shopPointConfig = [];
        $scope.navigationBar = [];
        $scope.dataArray = [];
        $scope.dataArrayTags = [];
        $scope.dataArrayState = {
            load: false,
            done: false
        };
        $scope.dataProductBuy = {
            inputQuantity: 1,
            quantity: 1,
            price: 0,
            sumprice: 0,
            quantity_min: 0,
            quantity_max: 0,
            result_price: 0
        };
        $scope.showTab = {
            activeTab: 'description',
            dataTab: [{
                en: 'description',
                th: 'รายละเอียดสินค้า',
                data: ''
            }, {
                en: 'info',
                th: 'วิธีการชำระเงินและวิธีการจัดส่ง',
                data: ''
            }]
        };
        $scope.attribute = {
            state: false,
            attributeOption: [],
            variants: 'description',
            variantsPick: [],
            dataVariants: [],
            variantsTotal: 0
        };
        $scope.buy = {
            state: false,
            attribute: false
        };
        $scope.processBuy = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                onClickFalse: function() {
                    if ($scope.attribute.variantsTotal != 0) {
                        $scope.buy.attribute = true;
                    }
                }
            }
            return functionIn;
        };
        $scope.attributeOption = function() {
            var functionIn = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                checkVariantsPick: function(variantsPick) {
                    if (variantsPick.length != 0) {
                        var state = 0;
                        for (var i = 0; i < variantsPick.length; i++) {
                            if (variantsPick[i] == "") {
                                state = state + 1;
                            }
                        }
                        if (state == 0) {
                            return true
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                },
                compareArray: function(attributeOption, optionJson) {
                    if (!optionJson) return false;
                    if (attributeOption.length != optionJson.length) return false;
                    for (var i = 0, l = attributeOption.length; i < l; i++) {
                        if (attributeOption[i] instanceof Array && optionJson[i] instanceof Array) {
                            if (!compareArray(attributeOption[i], optionJson[i])) return false;
                        } else if (attributeOption[i] != optionJson[i]) {
                            return false;
                        }
                    }
                    return true;
                },
                checkAttributeOption: function(attributeOption, attributeOptionLength, callback) {
                    var _self = this;
                    var attribute = (attributeOption.length == attributeOptionLength) ? true : false;
                    for (var i = 0; i < attributeOption.length; i++) {
                        _self.consoleLog("checkAttributeOption : attributeOption[i] : ", attributeOption[i]);
                        if (attributeOption[i] == undefined) {
                            attribute = false;
                        }
                    }
                    callback(attribute);
                },
                findVariantsData: function(attributeOption, dataVariants, attributeOptionLength, callback) {
                    var _self = this;
                    _self.consoleLog("findVariantsData : attributeOption : ", attributeOption);
                    _self.consoleLog("findVariantsData : dataVariants : ", dataVariants);
                    _self.consoleLog("findVariantsData : attributeOptionLength : ", attributeOptionLength);
                    _self.checkAttributeOption(attributeOption, attributeOptionLength, function(res_attribute_option) {
                        _self.consoleLog("checkAttributeOption : callback : res_attribute_option ", res_attribute_option);
                        var variantsOut = [];
                        for (var i = 0; i < dataVariants.length; i++) {
                            var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                            if (_self.compareArray(attributeOption, optionJson)) {
                                _self.consoleLog("findVariantsData : dataVariants[i] : ", dataVariants[i]);
                                variantsOut = dataVariants[i];
                                break;
                            }
                        }
                        callback(variantsOut, res_attribute_option);
                    });
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var _self = this;
                    var state = true;
                    _self.consoleLog("checkTotalStock : index : ", stateIn);
                    _self.consoleLog("checkTotalStock : quantity_max : ", quantity_max);
                    if (stateIn == false && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                onClickOption: function($index, option_id) {
                    var _self = this;
                    _self.consoleLog("onClickOption : index : ", $index);
                    _self.consoleLog("onClickOption : option_id : ", option_id);
                    $scope.attribute.variantsPick[$index] = option_id;
                    _self.consoleLog("onClickOption : $scope.attribute.variantsPick[$index] : ", $scope.attribute.variantsPick[$index]);
                    if ($scope.attribute.attributeOption.length >= $scope.attribute.variantsPick.length) {
                        if (_self.checkVariantsPick($scope.attribute.variantsPick)) {
                            _self.consoleLog("onClickOption : if : $scope.attribute.attributeOption.length : ", $scope.attribute.attributeOption.length);
                            _self.consoleLog("onClickOption : if : $scope.attribute.variantsPick.length : ", $scope.attribute.variantsPick.length);
                            _self.findVariantsData($scope.attribute.variantsPick, $scope.attribute.dataVariants, $scope.attribute.attributeOption.length, function(variantsOut, res_attribute_option) {
                                _self.consoleLog("onClickOption : if : findVariantsData : variantsOut : ", variantsOut);
                                _self.consoleLog("onClickOption : if : findVariantsData : res_attribute_option : ", res_attribute_option);
                                if (variantsOut.length != 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = variantsOut.product_id;
                                    $scope.dataArray.product_sku = variantsOut.sku;
                                    $scope.dataProductBuy.price = variantsOut.price;
                                    $scope.dataArray.product_compare_price = variantsOut.compare_price;
                                    $scope.dataProductBuy.quantity_max = variantsOut.total_stock;
                                    _self.consoleLog("zzzz onClickOption : variantsOut : ", variantsOut);
                                    _self.consoleLog("zzzz onClickOption : variantsOut : ", $scope.dataArray.product_image);
                                    if (variantsOut.variant_image != 0) {
                                        if ($scope.dataArray.product_image.length != 0) {
                                            for (var i = 0; i < $scope.dataArray.product_image.length; i++) {
                                                if ($scope.dataArray.product_image[i].image_id == variantsOut.variant_image[0].image_id) {
                                                    $scope.slickImageGoto(variantsOut.variant_image[0].image_id);
                                                }
                                            }
                                        }
                                    }
                                    _self.checkOption($scope.attribute.variantsTotal, function(state) {
                                        _self.checkTotalStock(state, variantsOut.total_stock, function(state) {
                                            $scope.buy.state = state;
                                            if ($scope.attribute.variantsTotal != 0) {
                                                $scope.buy.attribute = true;
                                            }
                                        });
                                    });
                                } else if (variantsOut.length == 0 && res_attribute_option) {
                                    $scope.dataArray.product_id = 0;
                                    $scope.dataArray.product_sku = '';
                                    $scope.dataProductBuy.price = 0;
                                    $scope.dataArray.product_compare_price = 0;
                                    $scope.dataProductBuy.quantity_max = 1;
                                    $scope.buy.state = true;
                                    $scope.buy.attribute = true;
                                }
                                $scope.quantity().input();
                            });
                        }
                    }
                }
            }
            return functionIn;
        };
        $scope.quantity = function() {
            var quantity = {
                upDatePrice: function() {
                    $scope.dataProductBuy.sumprice = $scope.dataProductBuy.price * $scope.dataProductBuy.quantity;
                },
                input: function() {
                    var _self = this;
                    if ($scope.dataProductBuy.inputQuantity > 0) {
                        console.log("quantity : input : inputQuantity : ", $scope.dataProductBuy.inputQuantity);
                        console.log("quantity : input : quantity_max : ", $scope.dataProductBuy.quantity_max);
                        if ($scope.dataProductBuy.inputQuantity <= $scope.dataProductBuy.quantity_max) {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.inputQuantity;
                        } else {
                            $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity_max;
                            $scope.dataProductBuy.inputQuantity = ($scope.dataProductBuy.quantity_max != 0) ? $scope.dataProductBuy.quantity_max : 1;
                        }
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    } else {
                        console.log("quantity : input : ", $scope.dataProductBuy.inputQuantity);
                        if ($scope.dataProductBuy.inputQuantity <= 0) {
                            $scope.dataProductBuy.quantity = 1;
                        } else {
                            $scope.dataProductBuy.inputQuantity = 1;
                            $scope.dataProductBuy.quantity = 1;
                        }
                        /* $scope.dataProductBuy.quantity = 1;
                        $scope.dataProductBuy.inputQuantity = 1; */
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                minus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity - 1) != $scope.dataProductBuy.quantity_min) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity - 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                },
                plus: function() {
                    var _self = this;
                    if (($scope.dataProductBuy.quantity + 1) <= $scope.dataProductBuy.quantity_max) {
                        $scope.dataProductBuy.quantity = $scope.dataProductBuy.quantity + 1;
                        _self.upDatePrice();
                        $scope.getDataArray().quantityBreaks();
                    }
                }
            }
            return quantity;
        };
        $scope.carouselId = '';
        $scope.slickCarouselId = function() {
            if ($scope.carouselId == '') {
                $scope.carouselId = Math.floor((Math.random() * 9999) + 1000);
                return $scope.carouselId;
            } else {
                return $scope.carouselId;
            }
        };
        $scope.slickImageGoto = function(idx) {
            $scope.cover_lists_index = idx;
            setTimeout(function() {
                $scope.cover_lists_index = idx;
                // $('[data-key="' + $scope.carouselId + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope.cover_lists_index = 0;
        $scope.imageCarousel = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    prevArrow: '',
                    nextArrow: '',
                    speed: 600,
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.imageCarouselBar = function(cover_in, carousel_in) {
            $(cover_in).css('height', '0');
            $(cover_in).css('opacity', '0');
            setTimeout(function() {
                var carousel = $(carousel_in);
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    infinite: true,
                    slidesToShow: 6,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1200,
                        settings: {
                            slidesToShow: 5,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: 3,
                        }
                    }]
                }).closest('section').addClass('active');
                $(cover_in).css('height', 'auto');
                $(cover_in).css('opacity', '1');
            }, 1000);
        };
        $scope.getDataArray = function() {
            var data = {
                consoleLog: function(name, data) {
                    console.log(name, data);
                },
                stateData: function(loadIn, doneIn) {
                    var state = {
                        load: loadIn,
                        done: doneIn
                    };
                    return state;
                },
                getProductId: function(callback) {
                    var params = $routeParams;
                    var product_id = params.product_id.split("-", 1).join("");
                    callback(product_id)
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    GAEAPI.get(api, dataSend, $scope).then(function(res) {
                        _self.consoleLog("getData : res : ", res);
                        callback(res);
                    });
                },
                getDataProductArray: function(api, callback) {
                    var _self = this;
                    var output = [];
                    _self.getProductId(function(product_id) {
                        var dataSendProductId = {
                            'txt_product_id': product_id
                        };
                        _self.getDataArray(api, dataSendProductId, function(output) {
                            callback(output);
                        });
                    });
                },
                getNavigationBar: function(product_referral_display, api, callback) {
                    var _self = this;
                    var output = [];
                    _self.consoleLog("product_referral_display : ", product_referral_display);
                    if (product_referral_display.category.length != 0) {
                        var dataSendReferralId = {
                            'txt_referral_id': product_referral_display.category[0].referral_id
                        };
                        _self.getDataArray(api, dataSendReferralId, function(output) {
                            callback(output);
                        });
                    } else {
                        callback(output);
                    }
                },
                getDataArray: function(api, dataSend, callback) {
                    GAEAPI.get(api, dataSend, $scope).then(function(output) {
                        callback(output);
                    });
                },
                getQuantityBreak: function(api, callback) {
                    var _self = this;
                    _self.getProductId(function(product_id) {
                        var customerId = 0;
                        if (UiCustomerBox.delegate.get.isLogin()) {
                            customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                        }
                        var dataSendQuantityBreak = {
                            'txt_product_id': product_id,
                            'txt_customer_id': customerId
                        };
                        var quantity_break = [];
                        _self.getDataArray(api, dataSendQuantityBreak, function(output) {
                            if (output.ok == 1) {
                                quantity_break = output.data.quantity_break;
                                callback(quantity_break);
                            }
                            callback(quantity_break);
                        });
                    });
                },
                quantity: function(product_total_stock, callback) {
                    var total_stock = 0;
                    if (product_total_stock == -1) {
                        total_stock = 9999;
                    } else if (product_total_stock != -1 && product_total_stock != 0) {
                        total_stock = product_total_stock;
                    }
                    callback(total_stock);
                },
                quantityBreaks: function() {
                    var _self = this;
                    var productQuantityBreak = GAEAPI.getValueForKey($scope.dataArray, "product_quantity_break", []);
                    var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
                    var product_price = GAEAPI.getValueForKey($scope.data, "product_price", 0);
                    for (var index in quantityBreak) {
                        var rowData = quantityBreak[index];
                        var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                        var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                        if ($scope.dataProductBuy.quantity >= amount_end) {
                            $scope.dataProductBuy.result_price = unit_price;
                        }
                    }
                },
                showTab: function(input, callback) {
                    var description = input.product_description;
                    var info = input.product_more_info;
                    callback(description, info);
                },
                productTab: function(product_tags, callback) {
                    var _self = this;
                    _self.consoleLog("productTab : product_tags : ", product_tags);
                    var productTab = [];
                    if (product_tags != undefined) {
                        if (product_tags != "") {
                            productTab = product_tags.split(",");
                            callback(productTab);
                        } else {
                            callback(productTab);
                        }
                    } else {
                        callback(productTab);
                    }
                },
                getAttribute: function(input, callback) {
                    var _self = this;
                    var attribute = [];
                    var variants = [];
                    var variants_total = 0;
                    _self.consoleLog("getAttribute : input : ", input);
                    if (input.product_attribute.option_data !== 'undefined' && input.product_total_variant > 0) {
                        _self.consoleLog("getAttribute : input.product_attribute.option_data : ", input.product_attribute.option_data);
                        _self.consoleLog("getAttribute : input.product_total_variant : ", input.product_total_variant);
                        if (input.product_attribute.option_data.pclass_array !== 'undefined' && input.product_attribute.option_data.pclass_array.length) {
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array : ", input.product_attribute.option_data.pclass_array);
                            _self.consoleLog("getAttribute : input.product_attribute.option_data.pclass_array.length : ", input.product_attribute.option_data.pclass_array.length);
                            attribute = input.product_attribute.option_data.pclass_array;
                            variants = input.product_attribute.option_data.variant_array;
                            variants_total = input.product_total_variant;
                        }
                    }
                    callback(variants_total, attribute, variants);
                },
                checkOption: function(variants_total, callback) {
                    var state = true;
                    if (variants_total == 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkTotalStock: function(stateIn, quantity_max, callback) {
                    var state = true;
                    if (stateIn == true && quantity_max > 0) {
                        state = false;
                    }
                    callback(state);
                },
                checkPriceMin: function(variant, callback) {
                    var _self = this;
                    var priceMin = parseFloat(variant[0].price);
                    var comparePriceMin = parseFloat(variant[0].compare_price);
                    for (var i = 0; i < variant.length; i++) {
                        _self.consoleLog('checkPriceMin : priceMin : ', priceMin);
                        _self.consoleLog('checkPriceMin : variant[i].price : ', variant[i].price);
                        if (priceMin >= parseFloat(variant[i].price)) {
                            priceMin = parseFloat(variant[i].price);
                            comparePriceMin = parseFloat(variant[i].compare_price);
                        }
                    }
                    callback(priceMin, comparePriceMin);
                },
                main: function() {
                    var _self = this;
                    $scope.slickCarouselId();
                    $scope.dataArrayState = _self.stateData(true, false);
                    var dataSend = {};
                    _self.getApi("shop/current", dataSend, function(res_api) {
                        $scope.shopPointConfig = res_api.data.shop_point_config;
                        _self.getDataProductArray('product/id', function(output) {
                            if (output.data.length != 0) {
                                _self.consoleLog("getDataProductArray : output : ", output.data);
                                _self.quantity(output.data.product_total_stock, function(total_stock) {
                                    _self.consoleLog("quantity : total_stock : ", total_stock);
                                    $scope.dataProductBuy.quantity_max = total_stock;
                                    $scope.dataArray = output.data;
                                    if (output.data.product_image.length != 0) {
                                        $scope.slickImageGoto(output.data.product_image[0].image_id);
                                    }
                                    _self.productTab(output.data.product_tags, function(productTab) {
                                        $scope.dataArrayTags = productTab;
                                        _self.showTab(output.data, function(description, info) {
                                            $scope.showTab.dataTab[0].data = description;
                                            $scope.showTab.dataTab[1].data = info;
                                        });
                                        _self.getAttribute(output.data, function(variants_total, attribute, variants) {
                                            _self.consoleLog("getAttribute : variants_total : ", variants_total);
                                            _self.consoleLog("getAttribute : attribute : ", attribute);
                                            _self.consoleLog("getAttribute : variants : ", variants);
                                            _self.checkOption(variants_total, function(state) {
                                                _self.checkTotalStock(state, total_stock, function(state) {
                                                    $scope.buy.state = state;
                                                    $scope.attribute.attributeOption = attribute;
                                                    $scope.attribute.dataVariants = variants;
                                                    $scope.attribute.variantsTotal = variants_total;
                                                    if (variants_total > 0) {
                                                        _self.checkPriceMin(variants, function(res_price, res_compare_price) {
                                                            $scope.dataProductBuy.price = res_price;
                                                            $scope.dataProductBuy.sumprice = res_price;
                                                            $scope.dataArray.product_compare_price = res_compare_price;
                                                        });
                                                    } else {
                                                        $scope.dataProductBuy.price = output.data.product_price;
                                                        $scope.dataProductBuy.sumprice = output.data.product_price;
                                                    }
                                                });
                                            });
                                        });
                                        $scope.dataProductBuy.price = output.data.product_price;
                                        $scope.dataProductBuy.sumprice = output.data.product_price;
                                        _self.getQuantityBreak('product/quantity_break', function(quantity_break) {
                                            _self.consoleLog("getQuantityBreak : output : ", quantity_break);
                                            $scope.dataArray.product_quantity_break.quantity_break = quantity_break;
                                            if (quantity_break.length) {
                                                $scope.dataProductBuy.result_price = quantity_break[0].unit_price;
                                            }
                                        });
                                        _self.getNavigationBar(output.data.product_referral_display, 'referral/relation', function(output) {
                                            _self.consoleLog("getNavigationBar : output : ", output.data);
                                            $scope.navigationBar = output.data;
                                            $scope.dataArrayState = _self.stateData(false, true);
                                        });
                                    });
                                });
                            } else {
                                window.history.back();
                            }
                        });
                    });
                }
            }
            return data;
        };
        $scope.getDataArray().main();
        $scope.getShopPointConfigRewardState = function(productPrice) {
            var state = 'RewardShop';
            var sup_price = parseInt(productPrice);
            if ($scope.shopPointConfig.length != 0) {
                if (parseInt($scope.shopPointConfig.er_rate) != 0 && parseInt($scope.shopPointConfig.er_earn) != 0) {
                    if (sup_price > 0) {
                        if (parseInt($scope.shopPointConfig.er_rate) <= sup_price) {
                            return 'RewardShop';
                        } else {
                            return 'High';
                        }
                    } else {
                        return 'High';
                    }
                } else {
                    return 'RewardProduct';
                }
            } else {
                return 'RewardProduct';
            }
        };
        $scope.getShopPointConfigReward = function(productPrice) {
            var sup_price = 0;
            var er_rate = 0;
            var er_earn = 0;
            var mathFloor = 0;
            var point = 0;
            if ($scope.shopPointConfig.length != 0) {
                sup_price = productPrice;
                er_rate = parseInt($scope.shopPointConfig.er_rate);
                er_earn = parseInt($scope.shopPointConfig.er_earn);
                mathFloor = Math.floor(sup_price / er_rate);
                point = mathFloor * er_earn;
                return point;
            } else {
                return point;
            }
        }
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});_ui_share_app.directive('productDetailPageV', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageV';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            if (product_tag != '') {
                var tag = {
                    'tags': product_tag
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 4,
                    'txt_filter_json': JSON.stringify(tag)
                };
            } else {
                $scope.dataRelatetagState = $scope.StateData(false, true);
                $scope.dataRelatetag = [];
                return;
            }
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    // for (var i = 0; i < output.data.dataList.length; i++) {
                    //     if(output.data.dataList){
                    //         $scope.dataRelatetag = output.data.dataList;
                    //     }
                    // }
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.data_min = [];
        $scope._dataArrayTags = [];
        $scope.data_video_id = false;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    // if ($scope._dataArray.product_hightlight_video_embed != "") {
                    //     $scope._dataArray.product_image.unshift({
                    //         image_url: $scope.imgPath + 'img-play.png',
                    //         product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                    //     });
                    // }
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if (res.data.product_tags != "") {
                        $scope._dataArrayTags = res.data.product_tags.split(",");
                    }
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags, $scope._dataArray.product_referral_display.category[0].referral_id);
                    if (res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            // alert("x๊อบไข่สด");
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                            //      $scope.buildVariantOption(e.data);
                            //     $scope.buildMultipleQuantity(e.data);
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 98) {
                i = 98;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
            if (i > 98) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 99;
                    e.val(99);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.onClickVariantItems();
        };
        $scope.dataVariantsPick = [];
        $scope.buy_button = false;
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            $scope.buy_button = false;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.buy_button = true;
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
            //window.location.href='login';
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            /* $("iframe").css("height", $(".cover_image_item").css("width"));
             $("iframe").css("width", $(".cover_image_item").css("width")); */
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageVa', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageVa';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d ,$scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            if (product_tag != '') {
                var tag = {
                    'tags': product_tag
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 4,
                    'txt_filter_json': JSON.stringify(tag)
                };
            } else {
                $scope.dataRelatetagState = $scope.StateData(false, true);
                $scope.dataRelatetag = [];
                return;
            }
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend ,$scope).then(function(output) {
                if (output.ok == 1) {
                    // for (var i = 0; i < output.data.dataList.length; i++) {
                    //     if(output.data.dataList){
                    //         $scope.dataRelatetag = output.data.dataList;
                    //     }
                    // }
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope.data_relate_pro = [];
        $scope._getDataRelate = function(id, limit) {
         
        
            var dataSend = {
                'txt_product_id': id,
                'txt_limit': limit,
            };
            
            GAEAPI.get('product/related', dataSend, $scope).then(function(output) {
               
                if (output.ok == 1) {
                    // $scope.$apply(function() {
                        $scope.data_relate_pro = output.data.lists;
                        
                    // });
                }
               
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.data_min = [];
        $scope._dataArrayTags = [];
        $scope.data_video_id = false;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend ,$scope).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    // if ($scope._dataArray.product_hightlight_video_embed != "") {
                    //     $scope._dataArray.product_image.unshift({
                    //         image_url: $scope.imgPath + 'img-play.png',
                    //         product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                    //     });
                    // }
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if (res.data.product_tags != "") {
                        $scope._dataArrayTags = res.data.product_tags.split(",");
                    }
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags, $scope._dataArray.product_referral_display.category[0].referral_id);
                    $scope._getDataRelate($scope.data_video_id,8);
                    // if (res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0) {
                    //     if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                    //         // alert("x๊อบไข่สด");
                    //         var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                    //         for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                    //             if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                    //                 set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                    //                 $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                    //             }
                    //         }
                    //         if ($scope.data_min.length == 0) {
                    //             $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                    //         }
                    //         console.log("iujdishjdskd : ", $scope.data_min);
                           
                    //         $scope.buildVariantOption(res.data);
                    //     }
                    //     $scope._dataArray.product_price = $scope.data_min.price;
                    //     $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    // }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 98) {
                i = 98;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
            if (i > 98) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 99;
                    e.val(99);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.onClickVariantItems();
        };
        $scope.dataVariantsPick = [];
        $scope.buy_button = false;
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            $scope.buy_button = false;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.buy_button = true;
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
            //window.location.href='login';
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            /* $("iframe").css("height", $(".cover_image_item").css("width"));
             $("iframe").css("width", $(".cover_image_item").css("width")); */
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageVb', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageVb';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
        imgcart: '@imgcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            if (product_tag != '') {
                var tag = {
                    'tags': product_tag
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 4,
                    'txt_filter_json': JSON.stringify(tag)
                };
            } else {
                $scope.dataRelatetagState = $scope.StateData(false, true);
                $scope.dataRelatetag = [];
                return;
            }
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    // for (var i = 0; i < output.data.dataList.length; i++) {
                    //     if(output.data.dataList){
                    //         $scope.dataRelatetag = output.data.dataList;
                    //     }
                    // }
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope.qtyProduct = 1;
        $scope.result_price = 0;
        $scope.checkQty = function(qtyProduct) {
            var productQuantityBreak = GAEAPI.getValueForKey($scope._data_product_id, "product_quantity_break", []);
            var quantityBreak = GAEAPI.getValueForKey(productQuantityBreak, "quantity_break", []);
            var product_price = GAEAPI.getValueForKey($scope._data_product_id, "product_price", 0);
            console.log("quantityBreak : ", quantityBreak);
            console.log("quantityBreak : qtyProduct : ", qtyProduct);
            for (var index in quantityBreak) {
                var rowData = quantityBreak[index];
                var amount_end = parseInt(GAEAPI.getValueForKey(rowData, "amount_end", 0));
                var unit_price = parseInt(GAEAPI.getValueForKey(rowData, "unit_price", 0));
                if (qtyProduct >= amount_end) {
                    $scope.result_price = unit_price;
                }
            }
        };
        $scope.getQuantityBreak = function(dataSend, api, callback) {
            console.log("getQuantityBreak : dataSend : ", dataSend, " api : ", api);
            var quantity_break = [];
            GAEAPI.get(api, dataSend).then(function(output) {
                console.log("getQuantityBreak : output : ", output);
                if (output.ok == 1) {
                    quantity_break = output.data.quantity_break;
                    callback(quantity_break);
                }
                callback(quantity_break);
            });
            callback(quantity_break);
        };
        $scope.checkLogin = function(urlApi, product_id, status_login, callback) {
            var dataSend = {};
            var productId = parseInt(product_id);
            var statusLogin = status_login;
            var api = urlApi;
            var customerId = 0;
            if (api == 'product/id') {
                dataSend = {
                    'txt_product_id': productId,
                }
                console.log("checkLogin : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                callback(statusLogin, customerId, dataSend, api);
            } else if (api == 'product/quantity_break') {
                if (statusLogin) {
                    customerId = parseInt(UiCustomerBox.delegate.get.me().customer_id);
                    dataSend = {
                        'txt_product_id': productId,
                        'txt_customer_id': customerId,
                    }
                    console.log("checkLogin : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                    callback(statusLogin, customerId, dataSend, api);
                } else {
                    console.log("checkLogin : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                    callback(statusLogin, customerId, dataSend, api);
                }
            }
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.data_min = [];
        $scope._dataArrayTags = [];
        $scope.data_video_id = false;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    // if ($scope._dataArray.product_hightlight_video_embed != "") {
                    //     $scope._dataArray.product_image.unshift({
                    //         image_url: $scope.imgPath + 'img-play.png',
                    //         product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                    //     });
                    // }
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if (res.data.product_tags != "") {
                        $scope._dataArrayTags = res.data.product_tags.split(",");
                    }
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.checkLogin('product/quantity_break', dataSend.txt_product_id, UiCustomerBox.delegate.get.isLogin() , function(statusLogin, customerId, dataSend, api) {
                            console.log("getProductId checkLogin callback : statusLogin : ", statusLogin, " customerId : ", customerId, " dataSend : ", dataSend, " api : ", api);
                            if (statusLogin) {
                                console.log("getProductId checkLogin : IF");
                                $scope.getQuantityBreak(dataSend, api, function(quantity_break) {
                                    console.log("getProductId checkLogin callback getQuantityBreak : quantity_break : ", quantity_break);
                                    $scope._dataArray.product_quantity_break.quantity_break = quantity_break;
                                    if (quantity_break.length) {
                                        $scope.result_price = quantity_break[0].unit_price;
                                    }
                                });
                            } else {
                                console.log("getProductId checkLogin : ELSE")
                            }
                    });
                    $scope.productRelateTag($scope._dataArray.product_tags, $scope._dataArray.product_referral_display.category[0].referral_id);
                    if (res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            // alert("x๊อบไข่สด");
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                            //      $scope.buildVariantOption(e.data);
                            //     $scope.buildMultipleQuantity(e.data);
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 98) {
                i = 98;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
            if (i > 98) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 99;
                    e.val(99);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.onClickVariantItems();
        };
        $scope.dataVariantsPick = [];
        $scope.buy_button = false;
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            $scope.buy_button = false;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.buy_button = true;
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
            //window.location.href='login';
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            /* $("iframe").css("height", $(".cover_image_item").css("width"));
             $("iframe").css("width", $(".cover_image_item").css("width")); */
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
        $scope.Relate_dataArray = [];
        $scope._getRelateDataArray = function(id) {
        
            var dataSend = {
                'txt_product_id': id,
                'txt_limit': 10,
            };
            // $scope.consoleLog('_getDataArray dataSend', dataSend);
            GAEAPI.get('product/related', dataSend, $scope).then(function(output) {
                // $scope.consoleLog('_getDataArray output', output);
                if (output.ok == 1) {
                    // $scope.$apply(function() {
                        $scope.Relate_dataArray = output.data.lists;
                        // $scope.consoleLog('_getDataArray _dataArray', $scope._dataArray);
                        console.log("slofkdsfdfds;lfsdk;f : ", $scope.Relate_dataArray);
                    // });
                }
                // $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope._getRelateDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope.buildTitleUrl = function (str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageVc', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageVc';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            if (product_tag != '') {
                var tag = {
                    'tags': product_tag
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 4,
                    'txt_filter_json': JSON.stringify(tag)
                };
            } else {
                $scope.dataRelatetagState = $scope.StateData(false, true);
                $scope.dataRelatetag = [];
                return;
            }
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    // for (var i = 0; i < output.data.dataList.length; i++) {
                    //     if(output.data.dataList){
                    //         $scope.dataRelatetag = output.data.dataList;
                    //     }
                    // }
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.getNameBadgeId = function(id) {
            if (id == '72') {
                return 'New Arrival'
            } else if (id == '74') {
                return 'Recommend'
            } else if (id == '75') {
                return 'Best Seller'
            } else {
                return 'null';
            }
        };
        $scope.data_min = [];
        $scope._dataArrayTags = [];
        $scope.data_video_id = false;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            console.log("product/id : dataSend : ", dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                console.log("product/id : output : ", res);
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    // if ($scope._dataArray.product_hightlight_video_embed != "") {
                    //     $scope._dataArray.product_image.unshift({
                    //         image_url: $scope.imgPath + 'img-play.png',
                    //         product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                    //     });
                    // }
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if (res.data.product_tags != "") {
                        $scope._dataArrayTags = res.data.product_tags.split(",");
                    }
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags, $scope._dataArray.product_referral_display.category[0].referral_id);
                    if (res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            // alert("x๊อบไข่สด");
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                            //      $scope.buildVariantOption(e.data);
                            //     $scope.buildMultipleQuantity(e.data);
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 98) {
                i = 98;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
            if (i > 98) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 99;
                    e.val(99);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.onClickVariantItems();
        };
        $scope.dataVariantsPick = [];
        $scope.buy_button = false;
        $scope.showComment = false;
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            $scope.buy_button = false;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.buy_button = true;
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.getShowComment = function(show) {
            $scope.showComment = true;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
            //window.location.href='login';
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            /* $("iframe").css("height", $(".cover_image_item").css("width"));
             $("iframe").css("width", $(".cover_image_item").css("width")); */
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});_ui_share_app.directive('productDetailPageVca', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageVca';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        promotelink: '@promotelink',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            if (product_tag != '') {
                var tag = {
                    'tags': product_tag
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 4,
                    'txt_filter_json': JSON.stringify(tag)
                };
            } else {
                $scope.dataRelatetagState = $scope.StateData(false, true);
                $scope.dataRelatetag = [];
                return;
            }
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    // for (var i = 0; i < output.data.dataList.length; i++) {
                    //     if(output.data.dataList){
                    //         $scope.dataRelatetag = output.data.dataList;
                    //     }
                    // }
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.getNameBadgeId = function(id) {
            if (id == '72') {
                return 'New Arrival'
            } else if (id == '74') {
                return 'Recommend'
            } else if (id == '75') {
                return 'Best Seller'
            } else {
                return 'null';
            }
        };
        $scope.data_min = [];
        $scope._dataArrayTags = [];
        $scope.data_video_id = false;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            console.log("product/id : dataSend : ", dataSend);
            GAEAPI.get('product/id', dataSend).then(function(res) {
                console.log("product/id : output : ", res);
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    // if ($scope._dataArray.product_hightlight_video_embed != "") {
                    //     $scope._dataArray.product_image.unshift({
                    //         image_url: $scope.imgPath + 'img-play.png',
                    //         product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                    //     });
                    // }
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if (res.data.product_tags != "") {
                        $scope._dataArrayTags = res.data.product_tags.split(",");
                    }
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags, $scope._dataArray.product_referral_display.category[0].referral_id);
                    if (res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            // alert("x๊อบไข่สด");
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseInt(set_varia0) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                            //      $scope.buildVariantOption(e.data);
                            //     $scope.buildMultipleQuantity(e.data);
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 98) {
                i = 98;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
            if (i > 98) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 99;
                    e.val(99);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.onClickVariantItems();
        };
        $scope.dataVariantsPick = [];
        $scope.buy_button = false;
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            $scope.buy_button = false;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.buy_button = true;
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
            //window.location.href='login';
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            /* $("iframe").css("height", $(".cover_image_item").css("width"));
             $("iframe").css("width", $(".cover_image_item").css("width")); */
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});_ui_share_app.directive('productDetailPageVx', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageVx';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.backgroundImageId = '';
        $scope.toBackgroundImageId = function(id) {
            console.log('toBackgroundImageId : id : ', id);
            $scope.backgroundImageId = id;
        };
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            if (product_tag != '') {
                var tag = {
                    'tags': product_tag
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 4,
                    'txt_filter_json': JSON.stringify(tag)
                };
            } else {
                $scope.dataRelatetagState = $scope.StateData(false, true);
                $scope.dataRelatetag = [];
                return;
            }
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    // for (var i = 0; i < output.data.dataList.length; i++) {
                    //     if(output.data.dataList){
                    //         $scope.dataRelatetag = output.data.dataList;
                    //     }
                    // }
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.data_min = [];
        $scope._dataArrayTags = [];
        $scope.data_video_id = false;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    // if ($scope._dataArray.product_hightlight_video_embed != "") {
                    //     $scope._dataArray.product_image.unshift({
                    //         image_url: $scope.imgPath + 'img-play.png',
                    //         product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                    //     });
                    // }
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if (res.data.product_tags != "") {
                        $scope._dataArrayTags = res.data.product_tags.split(",");
                    }
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags, $scope._dataArray.product_referral_display.category[0].referral_id);
                    if (res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0) {
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            console.log("res.data.product_attribute.option_data.variant_array : ", res.data.product_attribute.option_data.variant_array);
                            var set_varia0 = res.data.product_attribute.option_data.variant_array[0].price;
                            for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                if (parseFloat(set_varia0) >= parseFloat(res.data.product_attribute.option_data.variant_array[i].price)) {
                                    set_varia0 = res.data.product_attribute.option_data.variant_array[i].price;
                                    $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                }
                            }
                            if ($scope.data_min.length == 0) {
                                $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                            }
                            if ($scope.data_min.length != 0) {
                                if ($scope.data_min.variant_image.length != 0) {
                                    $scope.toBackgroundImageId($scope.data_min.variant_image[0].image_id);
                                }
                            }
                            console.log("iujdishjdskd : ", $scope.data_min);
                            //      $scope.buildVariantOption(e.data);
                            //     $scope.buildMultipleQuantity(e.data);
                            $scope.buildVariantOption(res.data);
                        }
                        $scope._dataArray.product_price = $scope.data_min.price;
                        $scope._dataArray.product_compare_price = $scope.data_min.compare_price;
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseFloat(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseFloat(e.val());
            if (i > 19) {
                i = 19;
            }
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseFloat(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
            if (i > 19) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 20;
                    e.val(20);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            console.log('slickGoto : idx : ', idx);
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            // $scope.onClickVariantItems();
        };
        $scope.dataVariantsPick = [];
        $scope.buy_button = false;
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            $scope.buy_button = false;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.buy_button = true;
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            var count = 0;
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            console.log("findVariantsData : dataVariants : ", dataVariants);
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope._dataArray.product_total_stock = dataVariants[i].total_stock;
                    // if (dataVariants[i].variant_image.length != 0) {
                    //     $scope._dataArray.product_image = dataVariants[i].variant_image;
                    //     $scope.mkCarousel();
                    // }
                    if (dataVariants[i].variant_image.length != 0) {
                        $scope.toBackgroundImageId(dataVariants[i].variant_image[0].image_id);
                    }
                    $scope.max_length = dataVariants[i].total_stock;
                    break;
                }
                if (!compareArray(variantsPick, optionJson)) {
                    count++;
                }
                if (count >= dataVariants.length) {
                    // alert(count + " and " + dataVariants.length);
                    // $scope.data.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = 0;
                    $scope._dataArray.product_compare_price = 0;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.mkCarousel = function() {
            var key = $('[data-key="' + $scope._key() + '"]');
            var gall = $('[data-gall="' + $scope._key() + '"]');
            key.css('height', '0');
            key.css('opacity', '0');
            gall.css('height', '0');
            gall.css('opacity', '0');
            setTimeout(function() {
                key.css('height', 'auto');
                key.css('opacity', '1');
                gall.css('height', 'auto');
                gall.css('opacity', '1');
            }, 1500);
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
            //window.location.href='login';
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            /* $("iframe").css("height", $(".cover_image_item").css("width"));
             $("iframe").css("width", $(".cover_image_item").css("width")); */
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageW', function($rootScope, $routeParams, sliderProvider, $componentProductDetail, $location) {
    var templateName = 'productDetailPageW';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
        imgcart: '@imgcart',
        view: '@viewcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        if ($scope.imgcart != undefined) {
            $scope.setimg_cart = $scope.icnPath + $scope.imgcart;
        }
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            var tag = {
                'tags': product_tag
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(tag)
            };
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope.names = 20;
        $scope._dataArray_tag = [];
        $scope._dataArray = [];
        $scope.data_video_id = false;
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    $scope.data_video_id = $scope._dataArray.product_id;
                    /*if ($scope._dataArray.product_hightlight_video_embed != "") {
                        $scope._dataArray.product_image.unshift({
                            image_url: $scope.imgPath + 'img-play.png',
                            product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                        });
                    }*/
                    $scope._dataArray_tag = res.data.product_tags.split(",");
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags);
                    $scope.buildVariantOption(res.data);
                    if (res.data.product_attribute.length != 0) {
                        $scope.buildMultipleQuantity(res.data);
                    }
                    if (res.data.product_total_variant == 0 && res.data.product_total_stock > 0) {
                        $scope.names = parseInt(res.data.product_total_stock);
                        console.log("nnames stock :", $scope.names);
                    }
                    if (res.data.product_total_variant == 0 && res.data.product_total_stock < 0) {
                        $scope.names = 20;
                        console.log("nnames stock :", $scope.names);
                    }
                    if (res.data.product_total_variant > 0) {
                        $scope.names = 20;
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '#gallery_slider[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (isNaN(i)) {
                i = 0;
            }
            if (i < $scope.names) {
                e.val(i + 1);
                $scope._data_qty_selected = (i + 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.onSelectVariantItems(0, '');
        };
        $scope.dataVariantsPick = [];
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var _self = dataVariants[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                console.log("selectedOptionTextJson: option", dataVariants);
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    if (dataVariants[i].total_stock != 0) {
                        $scope.names = dataVariants[i].total_stock;
                    } else {
                        $scope.names = 20;
                    }
                    $scope.switchQuantityByKey('-' + variantsPick.join('-') + '-');
                    console.log("selectedOptionTextJson: option", _self);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope._dataArray.product_image.length; im++) {
                            if ($scope._dataArray.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope._slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.gallery-thumbnail .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.currentOptionQtyPick = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            return e.val();
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [],
                p = productObj.product_attribute.option_data.variant_array;
            for (var i = 0; i < p.length; i++) {
                if (p[i].status == 1 && p[i].status == 1) {
                    $scope.productQuantityMultiArray.push({
                        v_key: p[i].variant_key,
                        v_name: p[i].option_name_array[0],
                        v_qty: 1,
                        v_active: 0
                    });
                }
            }
        };
        $scope.dataVariantsPick = [];
        $scope.electric = [];
        $scope.testyuyu = 0;
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.testyuyu = 0;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._idUrl($scope._viewRouteParams().product_id)
                }).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    $scope.testyuyu = 0;
                    $('.d_qty_not_result').removeClass("active");
                    $scope.findVariantsData($scope.dataVariantsPick);
                } else {
                    $scope.testyuyu = 0;
                    $('.d_qty').removeClass('active').removeClass('inin');
                    $('.d_qty_price').removeClass("active");
                    $('.d_qty_price').removeClass("inin");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric);
            }
        };
        $scope.ifOptionUnSelect = function() {
            return ($('.d_qty_price.active.inin').length > 0) ? true : false;
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("width", $(".cover_image_item").css("width"));
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageWa', function($rootScope, $routeParams, sliderProvider, $componentProductDetail, $location) {
    var templateName = 'productDetailPageWa';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
        imgcart: '@imgcart',
        view: '@viewcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        if ($scope.imgcart != undefined) {
            $scope.setimg_cart = $scope.icnPath + $scope.imgcart;
        }
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            var tag = {
                'tags': product_tag
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(tag)
            };
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    /*if ($scope._dataArray.product_hightlight_video_embed != "") {
                        $scope._dataArray.product_image.unshift({
                            image_url: $scope.imgPath + 'img-play.png',
                            product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                        });
                    }*/
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    if(res.data.product_attribute.option_data != 0 && res.data.product_total_variant > 0){
                        if (res.data.product_attribute.option_data.variant_array.length != 0 && res.data.product_total_variant > 0) {
                            
                        }
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags);
                    $scope.buildVariantOption(res.data);
                    if (res.data.product_attribute.length != 0) {
                        $scope.buildMultipleQuantity(res.data);
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '#gallery_slider[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.onSelectVariantItems(0, '');
        };
        $scope.dataVariantsPick = [];
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var _self = dataVariants[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope.switchQuantityByKey('-' + variantsPick.join('-') + '-');
                    console.log("selectedOptionTextJson: option", _self);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope._dataArray.product_image.length; im++) {
                            if ($scope._dataArray.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope._slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.gallery-thumbnail .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.currentOptionQtyPick = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            return e.val();
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [],
                p = productObj.product_attribute.option_data.variant_array;
            for (var i = 0; i < p.length; i++) {
                if (p[i].status == 1 && p[i].status == 1) {
                    $scope.productQuantityMultiArray.push({
                        v_key: p[i].variant_key,
                        v_name: p[i].option_name_array[0],
                        v_qty: 1,
                        v_active: 0
                    });
                }
            }
        };
        $scope.dataVariantsPick = [];
        $scope.electric = [];
        $scope.testyuyu = 0;
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.testyuyu = 0;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._idUrl($scope._viewRouteParams().product_id)
                }).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    $scope.testyuyu = 0;
                    $('.d_qty_not_result').removeClass("active");
                    $scope.findVariantsData($scope.dataVariantsPick);
                } else {
                    $scope.testyuyu = 0;
                    $('.d_qty').removeClass('active').removeClass('inin');
                    $('.d_qty_price').removeClass("active");
                    $('.d_qty_price').removeClass("inin");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric);
            }
        };
        $scope.ifOptionUnSelect = function() {
            return ($('.d_qty_price.active.inin').length > 0) ? true : false;
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("width", $(".cover_image_item").css("width"));
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageWorldcamera', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageWorldcamera';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
        type: '@type',
        cart: '@cart',
        buycol: '@buycol',
        buyicon: '@buyicon',
        buytext: '@buytext',
        viewcarttext: '@viewcarttext',
        buylogin: '@buylogin',
        currency: '@currency',
        checkstaff: '@checkstaff',
        language: '@language',
        btnstyle: '@btnstyle',
        maxstock: '@maxstock',
        videotext: '@videotext',
        description: '@description',
        info: '@info',
        specification: '@specification',
        textbrand:'@textbrand',
        navigationhover: '@navigationhover',
        imageappcoverchecked: '@imageappcoverchecked',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http, $location ,share) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "productDetailPageWorldcamera";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        /* scope */
        $scope._name = ($scope.name != undefined && $scope.name != "") ? $scope.name : "default";
        $scope._type = $scope._componentType + $scope._class + ".html";
        $scope._cart = ($scope.cart != undefined && $scope.cart != "") ? $scope.cart : "trumpComponentCarts";
        $scope._buycol = ($scope.buycol != undefined && $scope.buycol != "") ? parseInt($scope.buycol) : 15;
        $scope._maxstock = ($scope.maxstock != undefined && $scope.maxstock != "") ? parseInt($scope.maxstock) : 20;
        $scope._btnstyle = ($scope.btnstyle != undefined && $scope.btnstyle != "") ? $scope.btnstyle : "filled_button_large";
        $scope._buylogin = ($scope.buylogin == "true" || $scope.buylogin == "t") ? true : false;
        $scope._checkstaff = ($scope.checkstaff == "true" || $scope.checkstaff == "t") ? true : false;
        $scope._currency = ($scope.currency != undefined && $scope.currency != "") ? $scope.currency : "THB";
        $scope._buyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope.buyicon : "icnt_outline_cart01_dark.png";
        $scope._buytext = ($scope.buytext != undefined && $scope.buytext != "") ? $scope.buytext : "เพิ่มในรถเข็น";
        $scope._viewcarttext = ($scope.viewcarttext != undefined && $scope.viewcarttext != "") ? $scope.viewcarttext : "ดูรถเข็น";
        $scope._videotext = ($scope.videotext != undefined && $scope.videotext != "") ? $scope.videotext : "Video";
        $scope._icebuyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope._icnPath + $scope.buyicon : $scope._icnPath + "icnt_outline_cart01_dark.png";
        $scope._language = ($scope.language != undefined && $scope.language != "") ? (($scope.language == "en") ? "en" : "th") : "th";
        $scope._textbrand = ($scope.textbrand != undefined && $scope.textbrand != "") ? $scope.textbrand : "Brand";
        $scope._navigationhover = ($scope.navigationhover != undefined && $scope.navigationhover != "") ? $scope.navigationhover : "primary";
        $scope._imageappcoverchecked = ($scope.imageappcoverchecked == "true" || $scope.imageappcoverchecked == "t") ? true : false;
        /* scope */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getNamePage: function(arr) {
                    var str = [];
                    for (var i = 0; i < arr.length; i++) {
                        if (i != 0) {
                            str.push(arr[i]);
                        }
                    }
                    return str.join(" ");
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = (params.product_id != undefined) ? params.product_id.split("-", 1).join("") : false;
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getReferralId: function(productReferralDisplay, callback) {
                    var _self = this;
                    var referral_id = 0;
                    if (productReferralDisplay.length != 0) {
                        if (productReferralDisplay.category != undefined) {
                            if (productReferralDisplay.category.length != 0) {
                                referral_id = productReferralDisplay.category[0].referral_id
                            }
                        }
                    }
                    callback(referral_id);
                },
                getStaffId: function(staffId, callback) {
                    var _self = this;
                    var res_staff = {
                        staff_id: (staffId != 0 && staffId != '' && staffId != undefined) ? staffId : '0',
                        status: (staffId != 0 && staffId != '' && staffId != undefined) ? true : false
                    }
                    callback(res_staff);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getCarousel = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carouselA: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            fade: true,
                            dots: false,
                            arrows: false,
                            infinite: true,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '',
                            nextArrow: '',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselB: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: true,
                            arrows: true,
                            infinite: true,
                            autoplay: false,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: ' ',
                            nextArrow: '
',
                            nextArrow: ' ',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselD: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: true,
                            infinite: true,
                            autoplay: true,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '
',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselD: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: true,
                            infinite: true,
                            autoplay: true,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: ' ',
                            nextArrow: '
',
                            nextArrow: ' ',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselBar: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: false,
                            infinite: false,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 6,
                            slidesToScroll: 6,
                            speed: 600,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: 5,
                                    slidesToScroll: 5,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: 4,
                                    slidesToScroll: 4,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: 3,
                                    slidesToScroll: 3,
                                }
                            }]
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                slickCarousel: function(carousel, index) {
                    var _self = this;
                    $scope.setCarousel.index = index;
                    setTimeout(function() {
                        $('[data-key="' + carousel + '"]').slick('slickGoTo', index);
                    }, 100);
                },
                prevIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != 0) ? image_index - 1 : image - 1;
                    _self.consoleLog("prevIndex index", $scope.setCarousel.index);
                },
                nextIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != (image - 1)) ? image_index + 1 : 0;
                    _self.consoleLog("nextIndex index", $scope.setCarousel.index);
                }
            }
            return getFunction;
        };
        $scope.getAttribute = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                productAttribute: function(productAttribute, callback) {
                    var _self = this;
                    var attribute = {
                        option_name: "",
                        option_attribute: []
                    };
                    if (productAttribute.option_data != undefined) {
                        if (productAttribute.option_data.variant_array != undefined && productAttribute.option_data.variant_array.length != 0) {
                            for (var a = 0; a < productAttribute.option_data.pclass_array.length; a++) {
                                attribute.option_name = attribute.option_name.concat(productAttribute.option_data.pclass_array[a].pclass_name, " ");
                            }
                            for (var b = 0; b < productAttribute.option_data.variant_array.length; b++) {
                                var product_attribute = {
                                    product_id: productAttribute.option_data.variant_array[b].product_id,
                                    product_sku: productAttribute.option_data.variant_array[b].sku,
                                    product_title: "",
                                    product_price: parseFloat(productAttribute.option_data.variant_array[b].price),
                                    product_compare_price: parseFloat(productAttribute.option_data.variant_array[b].compare_price),
                                    product_total_stock: parseFloat(productAttribute.option_data.variant_array[b].total_stock),
                                    product_image: productAttribute.option_data.variant_array[b].variant_image
                                }
                                for (var c = 0; c < productAttribute.option_data.variant_array[b].option_name_array.length; c++) {
                                    product_attribute.product_title = product_attribute.product_title.concat(productAttribute.option_data.variant_array[b].option_name_array[c], " ");
                                }
                                attribute.option_attribute.push(product_attribute);
                            }
                        }
                    }
                    _self.consoleLog("productAttribute attribute ", attribute);
                    callback(attribute);
                },
                checkDiscountPrice: function(productDiscount, resPrice, resComparePrice, callback) {
                    var _self = this;
                    var price = 0;
                    var compare_price = 0;
                    if (productDiscount.length == 0) {
                        price = parseFloat(resPrice);
                        compare_price = parseFloat(resComparePrice);
                    } else {
                        if (productDiscount.discount_type_id == '101') {
                            price = parseFloat(resPrice) - parseFloat(productDiscount.discount_price);
                            compare_price = parseFloat(resPrice);
                        } else if (productDiscount.discount_type_id == '102') {
                            price = (parseFloat(resPrice) * ((100 - parseFloat(productDiscount.discount_percent)) / 100));
                            compare_price = parseFloat(resPrice);
                        }
                    }
                    callback(price, compare_price);
                },
                checkMinPrice: function(option, callback) {
                    var _self = this;
                    var price_min = parseFloat(option.option_attribute[0].product_price);
                    var compare_price_min = parseFloat(option.option_attribute[0].product_compare_price);
                    var total_stock = parseFloat(option.option_attribute[0].product_total_stock);
                    for (var a = 0; a < option.option_attribute.length; a++) {
                        if (price_min >= parseFloat(option.option_attribute[a].product_price)) {
                            price_min = parseFloat(option.option_attribute[a].product_price);
                            compare_price_min = parseFloat(option.option_attribute[a].product_compare_price);
                            total_stock = parseFloat(option.option_attribute[a].product_total_stock);
                        }
                    }
                    _self.consoleLog("checkPriceMin price_min ", price_min);
                    _self.consoleLog("checkPriceMin compare_price_min ", compare_price_min);
                    _self.consoleLog("checkPriceMin total_stock ", total_stock);
                    callback(price_min, compare_price_min, total_stock);
                },
                getTotalStock: function(totalStock, mixStock, callback) {
                    var _self = this;
                    var total_stock = (totalStock > 0) ? ((totalStock <= mixStock) ? totalStock : mixStock) : ((totalStock == -1) ? mixStock : totalStock);
                    callback(total_stock);
                },
                checkMinPrices: function(api, attribute, callback) {
                    var _self = this;
                    var dataPrice = {
                        product_price: {
                            price_name: 'product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        product_compare_price: {
                            price_name: 'product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_price: {
                            price_name: 'sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_price: {
                            price_name: 'sum_product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_minus_sum_product_price: {
                            price_name: 'sum_product_compare_minus_sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        }
                    }
                    if (attribute.option_attribute.length == 0) {
                        _self.checkDiscountPrice(api.data.product_discount, api.data.product_price, api.data.product_compare_price, function(res_price, res_compare_price) {
                            _self.checkPrice(res_price, function(res_price_ecimals) {
                                dataPrice.product_price.price = res_price;
                                dataPrice.product_price.price_ecimals = res_price_ecimals;
                                dataPrice.sum_product_price.price = res_price;
                                dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                    dataPrice.product_compare_price.price = res_compare_price;
                                    dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    dataPrice.sum_product_compare_price.price = res_compare_price;
                                    dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                    _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                        dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                        dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                        _self.getTotalStock(api.data.product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                            dataPrice.product_price.total_stock = res_total_stock_s;
                                            dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                            callback(dataPrice, false);
                                        });
                                    });
                                });
                            });
                        });
                    } else {
                        _self.checkMinPrice(attribute, function(res_price_min, res_compare_price_min, res_total_stock) {
                            _self.checkDiscountPrice(api.data.product_discount, res_price_min, res_compare_price_min, function(res_price, res_compare_price) {
                                _self.checkPrice(res_price, function(res_price_ecimals) {
                                    dataPrice.product_price.price = res_price;
                                    dataPrice.product_price.price_ecimals = res_price_ecimals;
                                    dataPrice.sum_product_price.price = res_price;
                                    dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                    _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                        dataPrice.product_compare_price.price = res_compare_price;
                                        dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        dataPrice.sum_product_compare_price.price = res_compare_price;
                                        dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                        _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                            dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                            dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                            _self.getTotalStock(res_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                dataPrice.product_price.total_stock = res_total_stock_s;
                                                dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                callback(dataPrice, true);
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    }
                },
                priceIncludes: function(price, includes, callback) {
                    var _self = this;
                    var priceToString = (price == null) ? 0 : price;
                    _self.consoleLog('priceIncludes priceToString : ', priceToString);
                    callback(priceToString.toString().includes(includes));
                },
                checkPrice: function(price, callback) {
                    var _self = this;
                    _self.priceIncludes(price, '.', function(res) {
                        _self.consoleLog("checkPrice res ", res);
                        callback((!res) ? 0 : 2);
                    });
                },
                onSelectOption: function(productId) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = productId;
                    _self.consoleLog("onSelectOption productId ", productId);
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    for (var a = 0; a < $scope.data.attribute.dataArray.option_attribute.length; a++) {
                        _self.consoleLog("onSelectOption option_attribute ", $scope.data.attribute.dataArray.option_attribute[a]);
                        if ($scope.data.attribute.dataArray.option_attribute[a].product_id == productId) {
                            if ($scope.data.attribute.dataArray.option_attribute[a].product_image.length != 0) {
                                if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                                    for (var b = 0; b < $scope.dataApi.product.dataArray.product_image.length; b++) {
                                        if ($scope.dataApi.product.dataArray.product_image[b].image_id == $scope.data.attribute.dataArray.option_attribute[a].product_image[0].image_id) {
                                            $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, b);
                                        }
                                    }
                                }
                            }
                            _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[a].product_price, $scope.data.attribute.dataArray.option_attribute[a].product_compare_price, function(res_price_p, res_compare_price_p) {
                                _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                                    $scope.data.product_price.price = res_price_p;
                                    $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                                    $scope.data.sum_product_price.price = res_price_p;
                                    $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                                    _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                        $scope.data.product_compare_price.price = res_compare_price_p;
                                        $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                        $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                        _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                            $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                            $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                            _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[a].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                $scope.data.product_price.total_stock = res_total_stock_s;
                                                $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                /* stock */
                                                $scope.data.quantity.quantity_max = res_total_stock_s;
                                                $scope.data.quantity.quantity_select = [];
                                                for (var i = 0; i < res_total_stock_s; i++) {
                                                    $scope.data.quantity.quantity_select.push(i + 1);
                                                }
                                                /* stock */
                                            })
                                        });
                                    });
                                });
                            });
                            break;
                        }
                    }
                },
                onClickOption: function(index) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.data.attribute.productId = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    if ($scope.data.attribute.dataArray.option_attribute[index].product_image.length != 0) {
                        if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                            for (var i = 0; i < $scope.dataApi.product.dataArray.product_image.length; i++) {
                                if ($scope.dataApi.product.dataArray.product_image[i].image_id == $scope.data.attribute.dataArray.option_attribute[index].product_image[0].image_id) {
                                    $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, i);
                                }
                            }
                        }
                    }
                    _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[index].product_price, $scope.data.attribute.dataArray.option_attribute[index].product_compare_price, function(res_price_p, res_compare_price_p) {
                        _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                            $scope.data.product_price.price = res_price_p;
                            $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                            $scope.data.sum_product_price.price = res_price_p;
                            $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                            _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                $scope.data.product_compare_price.price = res_compare_price_p;
                                $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                    $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                    $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                    _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[index].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                        $scope.data.product_price.total_stock = res_total_stock_s;
                                        $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                        /* stock */
                                        $scope.data.quantity.quantity_max = res_total_stock_s;
                                        $scope.data.quantity.quantity_select = [];
                                        for (var i = 0; i < res_total_stock_s; i++) {
                                            $scope.data.quantity.quantity_select.push(i + 1);
                                        }
                                        /* stock */
                                    })
                                });
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.getAttributeCustom = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                createArray: function(productCustomTemplates, callback) {
                    var _self = this;
                    var custom_attributes = [];
                    if (productCustomTemplates.templates.length != 0) {
                        angular.forEach(productCustomTemplates.templates, function(item, index) {
                            if (item.option_sets.length != 0) {
                                _self.getAttributes(item.option_sets, function(res_attributes) {
                                    custom_attributes = custom_attributes.concat(res_attributes);
                                });
                            }
                        });
                        /* if (productCustomTemplates.templates[0].option_sets.length != 0) {
                            _self.getAttributes(productCustomTemplates.templates[0].option_sets, function(res_attributes) {
                                custom_attributes = res_attributes;
                            });
                        } */
                    }
                    _self.consoleLog("createArray : productCustomTemplates", productCustomTemplates);
                    _self.consoleLog("createArray : custom_attributes", custom_attributes);
                    callback(custom_attributes, true);
                },
                formatAttribute: function(index, optionSubsetIndex, setType, optionSetArray, callback) {
                    var _self = this;
                    var set_id = (setType == 'attribute') ? optionSetArray.set_id : optionSetArray.subset_id;
                    var attribute = {
                        attribute_index: index,
                        attribute_option_subset_index: optionSubsetIndex,
                        active_option_id: (optionSetArray.option_data.select_id != 0) ? optionSetArray.option_data.select_id : "-1",
                        active_option_index: -1,
                        active_option_index_str: "-1",
                        active_textarea: "",
                        active_array: [],
                        set_id: set_id,
                        name: optionSetArray.name,
                        set_type: optionSetArray.ss_type,
                        option: []
                    }
                    callback(attribute);
                },
                getOption: function(index, optionDataArray, callback) {
                    var _self = this;
                    var options = {
                        index: index,
                        ss_data_id: optionDataArray.ss_data_id,
                        name: optionDataArray.name,
                        image: optionDataArray.image,
                        price: optionDataArray.price,
                        compare_price: 0,
                        total_stock: 0
                    }
                    callback(options);
                },
                getActive: function(index, activeOptionId, activeOptionIdIn, optionDataArray, callback) {
                    var _self = this;
                    var actives_index = (optionDataArray.ss_data_id == activeOptionId) ? index : activeOptionIdIn;
                    var actives = (optionDataArray.ss_data_id != activeOptionId) ? "0" : "1";
                    callback(actives_index, actives);
                },
                getAttributes: function(optionSetArray, callback) {
                    var _self = this;
                    var attributes = [];
                    for (var index = 0; index < optionSetArray.length; index++) {
                        _self.formatAttribute(index, 0, 'attribute', optionSetArray[index], function(res_attribute) {
                            if (optionSetArray[index].option_subsets.length != 0) {
                                for (var option_subset_index = 0; option_subset_index < optionSetArray[index].option_subsets.length; option_subset_index++) {
                                    _self.formatAttribute(index, option_subset_index, res_attribute.set_type, optionSetArray[index].option_subsets[option_subset_index], function(res_attribute_sub) {
                                        var options = [];
                                        var active_option_id = -1;
                                        var active_option_array = [];
                                        for (var option = 0; option < optionSetArray[index].option_subsets[option_subset_index].option_data.options.length; option++) {
                                            _self.getOption(option, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_option) {
                                                options.push(res_option);
                                            });
                                            _self.getActive(option, res_attribute_sub.active_option_id, active_option_id, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_actives_index, res_actives) {
                                                active_option_id = res_actives_index;
                                                active_option_array.push(res_actives);
                                            });
                                        }
                                        res_attribute_sub.option = options;
                                        res_attribute_sub.active_option_index = active_option_id;
                                        res_attribute_sub.active_option_index_str = String(active_option_id);
                                        res_attribute_sub.active_array = active_option_array;
                                        attributes.push(res_attribute_sub);
                                    });
                                }
                            } else {
                                var options = [];
                                var active_option_id = -1;
                                var active_option_array = [];
                                for (var option = 0; option < optionSetArray[index].option_data.options.length; option++) {
                                    _self.getOption(option, optionSetArray[index].option_data.options[option], function(res_option) {
                                        options.push(res_option);
                                    });
                                    _self.getActive(option, res_attribute.active_option_id, active_option_id, optionSetArray[index].option_data.options[option], function(res_actives_index, res_actives) {
                                        active_option_id = res_actives_index;
                                        active_option_array.push(res_actives);
                                    });
                                }
                                res_attribute.option = options;
                                res_attribute.active_option_index = active_option_id;
                                res_attribute.active_option_index_str = String(active_option_id);
                                res_attribute.active_array = active_option_array;
                                attributes.push(res_attribute);
                            }
                        });
                    }
                    callback(attributes)
                },
                getformatQuantity: function(index, attributeCustom, callback) {
                    var _self = this;
                    var quantity = {
                        name: String(index + 1),
                        dataArray: attributeCustom
                    }
                    callback(quantity);
                },
                onClickRadio: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickRadio : index", index);
                    _self.consoleLog("onClickRadio : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickRadio : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickDropdown: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickDropdown : index", index);
                    _self.consoleLog("onClickDropdown : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickDropdown : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickCheckbox: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickCheckbox : index", index);
                    _self.consoleLog("onClickCheckbox : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i == parseInt(index_option)) ? (($scope.data.attribute_custom.dataArray[index].active_array[i] != "0") ? "0" : "1") : $scope.data.attribute_custom.dataArray[index].active_array[i];
                    }
                    _self.consoleLog("onClickCheckbox : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                }
            }
            return getFunction;
        };
        $scope.getReward = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                momentUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    callback(now);
                },
                getCalculator: function(sumProductPrice, reward, callback) {
                    var _self = this;
                    _self.consoleLog("getCalculator : sumProductPrice", sumProductPrice);
                    _self.consoleLog("getCalculator : reward", reward);
                    var point_reward = 0;
                    if (reward.type_id == "100") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    } else if (reward.type_id == "101") {
                        point_reward = reward.reward_amount;
                    } else if (reward.type_id == "102") {
                        point_reward = (reward.reward_percent * sumProductPrice.price) / 100;
                    } else if (reward.type_id == "103") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    }
                    _self.consoleLog("getCalculator : point_reward", point_reward);
                    callback(point_reward);
                },
                getProductReward: function(now, productReward, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (productReward.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(productReward.reward_lifetime.lifetime_start_time);
                        reward.lifetime_end_time = parseInt(productReward.reward_lifetime.lifetime_end_time);
                        reward.type_id = productReward.reward_type_id;
                        reward.amount = parseInt(productReward.reward_amount);
                        reward.percent = parseInt(productReward.reward_percent);
                        reward.every_price = parseInt(productReward.reward_every_price);
                    }
                    _self.consoleLog("getProductReward : reward", reward);
                    callback(reward);
                },
                getPointConfig: function(now, shopPointConfig, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (shopPointConfig.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(shopPointConfig.er_from);
                        reward.lifetime_end_time = parseInt(shopPointConfig.er_to);
                        reward.type_id = "100";
                        reward.amount = parseInt(shopPointConfig.er_earn);
                        reward.every_price = parseInt(shopPointConfig.er_rate);
                    }
                    _self.consoleLog("getPointConfig : reward", reward);
                    callback(reward);
                },
                checkPointReward: function(reward, callback) {
                    var _self = this;
                    var state = false;
                    if (reward.reward_length) {
                        var start = reward.lifetime_start_time < reward.lifetime_time && reward.lifetime_start_time != 0;
                        var end = (reward.lifetime_end_time != -1) ? reward.lifetime_time <= reward.lifetime_end_time && reward.lifetime_end_time != 0 : true;
                        if (start && end) {
                            if (reward.type_id == "100") {
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            } else if (reward.type_id == "101") {
                                var amount = reward.amount != 0;
                                if (amount) {
                                    state = true;
                                }
                            } else if (reward.type_id == "102") {
                                var percent = reward.percent != 0;
                                if (percent) {
                                    state = true;
                                }
                            } else if (reward.type_id == "103") {
                                var percent = reward.percent != 0;
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            }
                        }
                    }
                    callback(state);
                },
                checkReward: function(rewardProduct, rewardPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("checkReward : rewardProduct", rewardProduct);
                    _self.consoleLog("checkReward : rewardPointConfig", rewardPointConfig);
                    var reward = {
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    _self.checkPointReward(rewardProduct, function(res_state_product) {
                        _self.checkPointReward(rewardPointConfig, function(res_state_point_config) {
                            if (res_state_point_config) {
                                reward.type_id = rewardPointConfig.type_id;
                                reward.type_id = rewardPointConfig.type_id;
                                reward.amount = rewardPointConfig.amount;
                                reward.percent = rewardPointConfig.percent;
                                reward.every_price = rewardPointConfig.every_price;
                            } else if (res_state_product) {
                                reward.type_id = rewardProduct.type_id;
                                reward.amount = rewardProduct.amount;
                                reward.percent = rewardProduct.percent;
                                reward.every_price = rewardProduct.every_price;
                            }
                            _self.consoleLog("checkReward : reward", reward);
                            callback(reward);
                        });
                    });
                },
                checkRewardType: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.momentUnix(function(now) {
                        _self.getProductReward(now, productReward, function(res_reward_product) {
                            _self.getPointConfig(now, shopPointConfig, function(res_reward_point_config) {
                                _self.checkReward(res_reward_product, res_reward_point_config, function(res_reward) {
                                    callback(res_reward);
                                });
                            });
                        });
                    });
                },
                createReward: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("createReward : productReward", productReward);
                    _self.consoleLog("createReward : shopPointConfig", shopPointConfig);
                    _self.checkRewardType(productReward, shopPointConfig, function(res_reward) {
                        _self.consoleLog("createReward : res_reward", res_reward);
                        callback(res_reward);
                    });
                }
            }
            return getFunction;
        };
        $scope.getQuantity = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                upDateReward: function() {
                    var _self = this;
                },
                upDateReward: function() {
                    var _self = this;
                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                        $scope.data.reward.point_reward = res_point_reward;
                    });
                },
                upDatePrice: function() {
                    var _self = this;
                    var product_price = $scope.data.product_price.price * $scope.data.quantity.quantity_input;
                    var product_compare_price = $scope.data.product_compare_price.price * $scope.data.quantity.quantity_input;
                    $scope.getAttribute().checkPrice(product_price, function(res_price_ecimals) {
                        $scope.data.sum_product_price.price = product_price;
                        $scope.data.sum_product_price.price_ecimals = res_price_ecimals;
                        $scope.getAttribute().checkPrice(product_compare_price, function(res_compare_price_ecimals) {
                            $scope.data.sum_product_compare_price.price = product_compare_price;
                            $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                            var compare_price_minus_price = ((product_compare_price - product_price) > 0) ? product_compare_price - product_price : 0;
                            $scope.getAttribute().checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                _self.upDateReward();
                            });
                        });
                    });
                },
                input: function(quantityInput) {
                    var _self = this;
                    quantityInput = (quantityInput == null) ? 1 : parseInt(quantityInput);
                    _self.consoleLog("input : quantityInput", quantityInput);
                    if (quantityInput != null) {
                        if (quantityInput >= $scope.data.quantity.quantity_max) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_max;
                        }
                        if (quantityInput <= $scope.data.quantity.quantity_min) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                        }
                    } else {
                        $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                    }
                    _self.upDatePrice();
                },
                minus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input - 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_min", $scope.data.quantity.quantity_min);
                    if (quantity >= $scope.data.quantity.quantity_min) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                },
                plus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input + 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_max", $scope.data.quantity.quantity_max);
                    if (quantity <= $scope.data.quantity.quantity_max) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                }
            }
            return getFunction;
        };
        $scope.getBuy = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = params.product_id.split("-", 1).join("");
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                postApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.post(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                UiCartProductAdd: function(productId, quantityInput, promotionId, customOptions, callback) {
                    quantityInput = (quantityInput > $scope.data.quantity.quantity_max) ? $scope.data.quantity.quantity_max : quantityInput;
                    UiCart.delegate.product.add(productId, quantityInput, promotionId, function(res_data) {
                        callback(res_data);
                    });
                },
                isLogin: function(callback) {
                    var buy_login = $scope._buylogin;
                    var is_login = UiCustomerBox.delegate.get.isLogin();
                    var is_state = (buy_login) ? (!is_login) ? true : false : false;
                    callback(is_state);
                },
                formLogin: function(is_state, callback) {
                    if (is_state) {
                        $inloginPopup.open();
                    }
                    callback(is_state);
                },
                getProductStaffId(staff_id_check, callback) {
                    var res_staff_id_check = staff_id_check;
                    var res_staff_id = $scope.dataApi.product.dataArray.product_staff_id;
                    var res_is_state = (res_staff_id != 0 && res_staff_id != '0' && res_staff_id != undefined) ? true : false;
                    callback(res_staff_id_check, res_staff_id, res_is_state);
                },
                isStaffId: function(staff_id_check, callback) { /* todo */
                    var _self = this;
                    _self.getProductStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        callback(res_staff_id_check, res_staff_id, res_is_state);
                    });
                },
                checkCartDuplicateStaff: function(res_staff_id_check, txt_staff_id, res_is_state, callback) {
                    var _self = this
                    var res_is_state = true;
                    if (res_staff_id_check) {
                        var dataSend = {
                            'txt_staff_id': txt_staff_id,
                        };
                        _self.dataSend("cart/duplicate_staff", dataSend, function(res_api, res_dataSend) {
                            _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                                res_is_state = res_api.data.duplicate;
                                callback(res_is_state);
                            });
                        });
                    } else {
                        callback(res_is_state);
                    }
                },
                showAlert: function(res_staff_id_check, res_staff_id, res_is_state, res_api, callback) {
                    var res_state = (res_staff_id_check) ? ((res_api) ? ((res_is_state) ? false : true) : true) : false;
                    if (res_state) {
                        if (!res_api) {
                            if (res_staff_id != '0' && res_staff_id != 0) {
                                $scope.controlAlert().alert('002');
                            } else {
                                $scope.controlAlert().alert('003');
                            }
                        } else {
                            if (!res_is_state) {
                                $scope.controlAlert().alert('003');
                            }
                        }
                    }
                    callback(res_state);
                },
                checkStaff: function(callback) {
                    var _self = this
                    var staff_id_check = $scope._checkstaff;
                    var res_check = false;
                    _self.isStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        _self.checkCartDuplicateStaff(res_staff_id_check, res_staff_id, res_is_state, function(res_api) {
                            _self.showAlert(res_staff_id_check, res_staff_id, res_is_state, res_api, function(res_state) {
                                res_check = res_state;
                                callback(res_check);
                            });
                        });
                    });
                },
                isProgress: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isProgress(productId)) ? true : false;
                    _self.consoleLog("isProgress : productId", productId);
                    _self.consoleLog("isProgress : state", state);
                    callback(state);
                },
                isSelected: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    _self.consoleLog("isSelected : productId", productId);
                    _self.consoleLog("isSelected : state", state);
                    callback(state);
                },
                isSelectedReturn: function(productId) {
                    var _self = this;
                    var ui_cart_state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    if (!$scope.setBuy.state_active) {
                        $scope.setBuy.state_active = true;
                        var state_process = $scope.setBuy.state_process;
                        var state_step = $scope.setBuy.state_step;
                        if (ui_cart_state && !state_process && state_step != 4) /* cart */ {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_active = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else if (!ui_cart_state && !state_process && state_step != 0) /* unset */ {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_active = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        } else {
                            $scope.setBuy.state_active = false;
                        }
                    }
                    return ui_cart_state;
                },
                updateState: function(productId) {
                    _self = this;
                    _self.isSelected(productId, function(res_state) {
                        if (res_state) {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_process = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        }
                        return res_state;
                    });
                },
                uiCart: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    _self.UiCartProductAdd(productId, quantityInput, promotionId, customOptions, function(res_data) {
                        if (res_data) {
                            _self.onTimeout(500, function() {
                                _self.onPass(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            }
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onError(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onUnset(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                        });
                                    });
                                });
                            });
                        }
                    });
                },
                postApiA: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    var custom_options = {};
                    var dataSend = {
                        'txt_product_id': productId,
                        'txt_amount': quantityInput,
                        'txt_is_clear_cart_before': "0",
                        'txt_custom_options_json': JSON.stringify(custom_options)
                    };
                    _self.dataSend("cart/product_add", dataSend, function(res_api, res_dataSend) {
                        _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                            if (res_ok) {
                                _self.onTimeout(500, function() {
                                    _self.onPass(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onCart(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            });
                                        });
                                    });
                                });
                            } else {
                                _self.onTimeout(500, function() {
                                    _self.onError(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onUnset(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                            });
                                        });
                                    });
                                });
                            }
                        });
                    });
                },
                onProcess: function(data, productId, quantityInput, promotionId, customOptions) {
                    var _self = this;
                    _self.isLogin(function(res_is_login) {
                        _self.formLogin(res_is_login, function(res_form) {
                            _self.checkStaff(function(res_is_state) {
                                if (!$scope.setBuy.state_process && !res_form && !res_is_state) {
                                    $scope.setBuy.state_process = true;
                                    _self.isSelected(productId, function(res_state) {
                                        if (!res_state) {
                                            _self.onLoad($scope.setBuy.state_step, function(res_step) {
                                                if (data.sum_product_price.price != 0 && data.quantity.quantity_max != 0 && (data.attribute.state == (data.attribute.productId != ''))) {
                                                    /* UiCart */
                                                    _self.uiCart(productId, quantityInput, promotionId, customOptions, res_step);
                                                    /* api post offline */
                                                    /*_self.postApiA(productId, quantityInput, promotionId, customOptions, res_step); */
                                                } else {
                                                    _self.onTimeout(500, function() {
                                                        _self.onError(res_step, function(res_step) {
                                                            _self.onTimeout(1000, function() {
                                                                _self.onUnset(res_step, function(res_step) {
                                                                    $scope.setBuy.state_process = false;
                                                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                                                });
                                                            });
                                                        });
                                                    });
                                                }
                                            });
                                        } else {
                                            $scope.setBuy.state_process = false;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            } else if ($scope._cart == "viewcart") {
                                                _self.viewCart($scope._cart);
                                            }
                                        }
                                    });
                                }
                            });
                        });
                    });
                },
                onTimeout: function(time, callback) {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        callback(true)
                    }, time);
                },
                onUnset: function(step, callback) {
                    var _self = this;
                    step = (step == 0) ? 0 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onLoad: function(step, callback) {
                    var _self = this;
                    step = (step == 0 || step == 1) ? 1 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onPass: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 2) ? 2 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onError: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 3) ? 3 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onCart: function(step, callback) {
                    var _self = this;
                    step = (step == 2 || step == 4) ? 4 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                trumpComponentCarts: function() {
                    var controlCart = share.getTrumpComponentCarts();
                    var component_carts = $('.cover-cards').hasClass('active');
                    if (!component_carts) {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.cart();
                        }
                    } else {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.load();
                        }
                    }
                },
                viewCart: function(viewcart) {
                    var _self = this;
                    _self.pageUrl(viewcart);
                },
                locationUrlReplace: function(page) {
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                main: function(callback) {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getDetail = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getDetail: function(api, callback) {
                    var _self = this;
                    var description = api.product_description;
                    var info = api.product_more_info;
                    var specificatio = [];
                    if (api.product_attribute.specification_data != undefined) {
                        specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? api.product_attribute.specification_data.pclass_array : [];
                    }
                    var state_specificatio = false;
                    if (api.product_attribute.specification_data != undefined) {
                        state_specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? true : false;
                    }
                    var state_info = (api.product_is_more_info == 1) ? true : false;
                    _self.consoleLog("getDetail : description", description);
                    _self.consoleLog("getDetail : info", info);
                    _self.consoleLog("getDetail : state_info", state_info);
                    _self.consoleLog("getDetail : specificatio", specificatio);
                    _self.consoleLog("getDetail : state_specificatio", state_specificatio);
                    callback(description, info, state_info, specificatio, state_specificatio);
                },
                onClickDetail: function(index) {
                    var _self = this;
                    $scope.data.detail.active = index;
                    _self.consoleLog("onClickDetail : data.detail.active", $scope.data.detail.active);
                }
            }
            return getFunction;
        };
        $scope.pages = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageName: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page_name);
                },
                pageUrl: function(page_name, id, name_url) {
                    var _self = this;
                    var page = page_name + "/" + id + "-" + name_url;
                    _self.locationUrlReplace(page);
                }
            }
            return getFunction;
        };
        $scope.countDown = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getLocation: function(callback) {
                    var _self = this;
                    var res_location = $location;
                    _self.consoleLog("getLocation", "res_location", res_location);
                    callback(res_location);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(params);
                },
                getLocationUrlNameProductDetail: function(callback) {
                    var _self = this;
                    _self.getRouteParams(function(res_params) {
                        _self.getLocation(function(res_location) {
                            var url_page_name = "/product-detail/" + res_params.product_id;
                            var res_url_name_product_detail = (res_location.url() == url_page_name) ? true : false;
                            _self.consoleLog("getLocationUrlNameProductDeal", "res_url_name_product_detail", res_url_name_product_detail);
                            callback(res_url_name_product_detail);
                        });
                    });
                },
                getUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    _self.consoleLog("getUnix", "now", now);
                    callback(now);
                },
                getCountDown: function(now, product_lifetime, callback) {
                    var _self = this;
                    var countdown_unix = parseInt(product_lifetime.lifetime_end_time) - now;
                    var milliseconds = moment.duration(countdown_unix * 1000, "milliseconds");
                    var res_countdown = ((milliseconds.days() <= 9) ? '0' + milliseconds.days() : milliseconds.days());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.hours() <= 9) ? '0' + milliseconds.hours() : milliseconds.hours());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.minutes() <= 9) ? '0' + milliseconds.minutes() : milliseconds.minutes());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.seconds() <= 9) ? '0' + milliseconds.seconds() : milliseconds.seconds());
                    _self.consoleLog("getCountDown", "res_countdown", res_countdown);
                    callback(res_countdown, countdown_unix);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                countDownByProduct: function(now, data_array, callback) {
                    var _self = this;
                    if (data_array.length != 0) {
                        if (data_array.product_lifetime.length != 0) {
                            _self.getCountDown(now, data_array.product_lifetime, function(res_count_down, res_countdown_unix) {
                                data_array.product_lifetime.lifetime_countdown = (res_countdown_unix > 0) ? res_count_down : "";
                                if (data_array.product_lifetime.lifetime_countdown == "") {
                                    _self.getNameUrl(data_array.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", data_array.product_set_array[0].product_id, res_name);
                                    });
                                }
                            });
                        }
                    }
                    _self.consoleLog("countDownByProduct", "data_array", data_array);
                    callback(data_array);
                },
                loop: function() {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        _self.getUnix(function(res_now) {
                            _self.countDownByProduct(res_now, $scope.dataApi.product.dataArray, function(data_array) {
                                $scope.dataApi.product.dataArray = data_array;
                                _self.getLocationUrlNameProductDetail(function(res_url_name_product_detail) {
                                    if (res_url_name_product_detail) {
                                        _self.loop();
                                    }
                                });
                            });
                        });
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.getPromotion = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                setPromotionId: function(promotion_id) {
                    var _self = this;
                    _self.consoleLog("setPromotionId", "promotion_id", promotion_id);
                    $scope.data.promotion.promotion_id = promotion_id;
                    _self.consoleLog("setPromotionId", "data.promotion.promotion_id", $scope.data.promotion.promotion_id);
                },
            }
            return getFunction;
        };
        $scope.control = function() {
            var getFunction = {
                popupVideo: function(state, video_link, video_embed_code) {
                    var _self = this;
                    if (video_embed_code != '') {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    } else if (video_link != '') {
                        window.open(video_link, '_blank');
                    } else {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.data_control = {
            page_video: {
                popup: false,
                shop_video_embed_code: ""
            }
        }
        $scope.control_alert = {
            alert: {
                error_id: '',
                index: null,
                state: true,
                error: [{
                    id: '001',
                    title: 'การสั่งซื้อ',
                    messages: 'สามารถสั่งซื้อได้เพียงทีละออเดอร์เท่านั้น'
                }, {
                    id: '002',
                    title: 'การเพิ่มสินค้า',
                    messages: 'ไม่สามารถเพิ่มสินค้าของร้านมากกว่า 1 ร้านค้าได้'
                }, {
                    id: '003',
                    title: 'การสั่งซื้อ',
                    messages: 'ไม่สามารถเพิ่มสินค้า(ไม่มีร้านค้า)'
                }]
            }
        };
        $scope.controlAlert = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getErrorMessages: function(error_id, callback) {
                    var _self = this;
                    var messages = {
                        res_error_id: '',
                        res_index: null
                    }
                    angular.forEach($scope.control_alert.alert.error, function(item, index) {
                        if (item.id == error_id) {
                            messages.res_error_id = item.id;
                            messages.res_index = index;
                        }
                    });
                    callback(messages.res_error_id, messages.res_index);
                },
                alert: function(error_id) {
                    var _self = this;
                    _self.getErrorMessages(error_id, function(res_error_id, res_index) {
                        $scope.control_alert.alert.error_id = res_error_id;
                        $scope.control_alert.alert.index = res_index;
                        $scope.control_alert.alert.state = (!$scope.control.alert && res_error_id != '') ? true : false;
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.countDown().loop();
        /* set carousel  */
        $scope.setCarousel = {
            carousel: 0,
            index: 0
        };
        $scope.getCarousel().getCarousel($scope.setCarousel.carousel, function(res_carousel_id) {
            $scope.setCarousel.carousel = res_carousel_id;
        });
        /* set carousel  */
        /* get product api */
        $scope.dataApi = {
            reward: {
                dataSend: {},
                api: "shop/current",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            staff: {
                dataSend: {
                    txt_staff_id: 0
                },
                api: "staff/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            product: {
                dataSend: {
                    txt_product_id: 0
                },
                api: "product/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            relation: {
                dataSend: {
                    txt_referral_id: 0
                },
                api: "referral/relation",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.data = {
            attribute: {
                state: false,
                productId: "",
                dataArray: []
            },
            attribute_custom: {
                state: false,
                dataArray: []
            },
            reward: {
                quantity_name: 'reward',
                type_id: "0",
                reward_amount: 0,
                reward_percent: 0,
                reward_every_price: 0,
                point_reward: 0
            },
            quantity: {
                quantity_name: 'quantity',
                quantity_min: 1,
                quantity_max: 1,
                quantity_input: 1,
                quantity_select: []
            },
            product_price: {
                price_name: 'product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            product_compare_price: {
                price_name: 'product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_price: {
                price_name: 'sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_price: {
                price_name: 'sum_product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_minus_sum_product_price: {
                price_name: 'sum_product_compare_minus_sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            detail: {
                active: '0',
                dataArray: [{
                    index: '0',
                    state: true,
                    en: ($scope.description != undefined && $scope.description != "") ? $scope.description : 'Description',
                    th: 'ภาพรวม',
                    data: '',
                    dataArray: []
                }, {
                    index: '1',
                    state: true,
                    en: ($scope.info != undefined && $scope.info != "") ? $scope.info : 'Info',
                    th: 'ข้อมูล',
                    data: '',
                    dataArray: []
                }, {
                    index: '2',
                    state: true,
                    en: ($scope.specification != undefined && $scope.specification != "") ? $scope.specification : 'Specification',
                    th: 'สเปค',
                    data: '',
                    dataArray: []
                }, {
                    index: '3',
                    state: true,
                    en: '',
                    th: 'คลังรูปภาพ/วิดีโอ',
                    data: '',
                    dataArray: []
                }, {
                    index: '4',
                    state: true,
                    en: '',
                    th: 'พูดคุยผู้ใช้',
                    data: '',
                    dataArray: []
                }]
            },
            promotion : {
                promotion_id : '0'
            }
        };
        $scope.setBuy = {
            state_active: false,
            state_process: false,
            state_step: 0,
            state_data_font_color: "",
            state_data_background_color: "",
            stepArray: [{
                step: 0,
                name: "unset",
                icon: $scope._icebuyicon,
                state: $scope._buytext,
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 1,
                name: "load",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 2,
                name: "pass",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 3,
                name: "error",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 4,
                name: "cart",
                icon: "",
                state: $scope._viewcarttext,
                data_font_color: "",
                data_background_color: "primary_darkest"
            }]
        };
        /* - get api product/id start - */
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.product.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                $scope.dataApi.product.dataSend.txt_product_id = (res_product_id != false) ? res_product_id : 0;
                $scope.getData().dataSend($scope.dataApi.product.api, $scope.dataApi.product.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_product, res_state) {
                        $scope.dataApi.product.ok = res_ok;
                        if ($scope._imageappcoverchecked) {
                            var images = [];
                            angular.forEach(get_res_api_product.data.product_image,function(image,index_image){
                                if (!image.image_app_cover_checked) {
                                    images.push(image)
                                }
                            });
                            get_res_api_product.data.product_image = images;
                        }
                        $scope.dataApi.product.dataArray = get_res_api_product.data;
                        $scope.getData().consoleLog("get_res_api_product", get_res_api_product);
                        $scope.dataApi.product.dataArrayState = res_state;
                        /* -- get api shop/current to reward -- */
                        if (res_ok) {
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.reward.dataArrayState = res_state;
                                $scope.getData().dataSend($scope.dataApi.reward.api, $scope.dataApi.reward.dataSend, function(res_api, res_dataSend) {
                                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                                        $scope.dataApi.reward.ok = res_ok;
                                        $scope.dataApi.reward.dataArray = get_res_api_shop.data;
                                        $scope.dataApi.reward.dataArrayState = res_state;
                                        $scope.getReward().createReward($scope.dataApi.product.dataArray.product_reward, get_res_api_shop.data.shop_point_config, function(res_reward) {
                                            $scope.data.reward.type_id = res_reward.type_id;
                                            $scope.data.reward.reward_amount = res_reward.amount;
                                            $scope.data.reward.reward_percent = res_reward.percent;
                                            $scope.data.reward.reward_every_price = res_reward.every_price;
                                            /* --- Wait product/id ,shop/current --- */
                                            /* ---- get attribute ---- */
                                            $scope.getAttribute().productAttribute(get_res_api_product.data.product_attribute, function(res_attribute) {
                                                $scope.data.attribute.dataArray = res_attribute;
                                                $scope.getAttribute().checkMinPrices(get_res_api_product, res_attribute, function(res_data_price, res_state) {
                                                    $scope.data.attribute.state = res_state;
                                                    $scope.data.product_price = res_data_price.product_price;
                                                    $scope.data.product_compare_price = res_data_price.product_compare_price;
                                                    $scope.data.sum_product_price = res_data_price.sum_product_price;
                                                    $scope.data.sum_product_compare_price = res_data_price.sum_product_compare_price;
                                                    $scope.data.sum_product_compare_minus_sum_product_price = res_data_price.sum_product_compare_minus_sum_product_price;
                                                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                                                        $scope.data.reward.point_reward = res_point_reward;
                                                    });
                                                    /* ----- stock ----- */
                                                    $scope.data.quantity.quantity_max = res_data_price.product_price.total_stock;
                                                    $scope.data.quantity.quantity_select = [];
                                                    for (var i = 0; i < res_data_price.product_price.total_stock; i++) {
                                                        $scope.data.quantity.quantity_select.push(i + 1);
                                                    }
                                                    /* ----- stock ----- */
                                                });
                                            });
                                            /* ---- get attribute ---- */
                                            /* ---- get attribute custom ---- */
                                            $scope.getAttributeCustom().createArray(get_res_api_product.data.product_custom_templates, function(res_custom_attribute, res_state) {
                                                $scope.data.attribute_custom.state = res_state;
                                                $scope.data.attribute_custom.dataArray = res_custom_attribute;
                                            });
                                            /* ---- get attribute custom ---- */
                                            /* ---- get detail ---- */
                                            $scope.getDetail().getDetail(get_res_api_product.data, function(res_description, res_info, res_state_info, res_specificatio, res_state_specificatio) {
                                                $scope.data.detail.dataArray[0].data = res_description;
                                                $scope.data.detail.dataArray[1].data = res_info;
                                                $scope.data.detail.dataArray[1].state = res_state_info;
                                                $scope.data.detail.dataArray[2].dataArray = res_specificatio;
                                                $scope.data.detail.dataArray[2].state = res_state_specificatio;
                                            });
                                            /* ---- get detail ---- */
                                            /* ---- update state ---- */
                                            $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                                            /* ---- update state ---- */
                                            /* --- Wait product/id ,shop/current --- */
                                        });
                                    });
                                });
                            });
                            /* -- get api shop/current to reward -- */
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.relation.dataArrayState = res_state;
                                $scope.getData().getReferralId(get_res_api_product.data.product_referral_display, function(res_referral_id) {
                                    $scope.dataApi.relation.dataSend.txt_referral_id = res_referral_id;
                                    $scope.getData().dataSend($scope.dataApi.relation.api, $scope.dataApi.relation.dataSend, function(res_api, res_dataSend) {
                                        $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_referral, res_state) {
                                            $scope.dataApi.relation.ok = res_ok;
                                            $scope.dataApi.relation.dataArray = (res_referral_id != 0) ? get_res_api_referral.data : [];
                                            $scope.dataApi.relation.dataArrayState = res_state;
                                        });
                                    });
                                });
                            });
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.getData().getStaffId(get_res_api_product.data.product_staff_id, function(res_staff) {
                                    if (res_staff.status) {
                                        $scope.dataApi.staff.dataArrayState = res_state;
                                        $scope.dataApi.staff.dataSend.txt_staff_id = res_staff.staff_id;
                                        $scope.getData().dataSend($scope.dataApi.staff.api, $scope.dataApi.staff.dataSend, function(res_api, res_dataSend) {
                                            $scope.getData().getApi(res_api, res_dataSend, function(res_ok, res, res_state) {
                                                $scope.dataApi.staff.ok = res_ok;
                                                $scope.dataApi.staff.dataArray = res.data;
                                                $scope.getData().getNameUrl(res.data.staff_first_name, function(res_staff_first_name_url) {
                                                    $scope.dataApi.staff.dataArray.staff_first_name_url = res_staff_first_name_url;
                                                    $scope.dataApi.staff.dataArrayState = res_state;
                                                });
                                            });
                                        });
                                    }
                                });
                            });
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                        } else {
                            /* ok = false */
                            if ($scope.dataApi.product.dataArray.length != 0) {
                                /* product deal to product original */
                                if ($scope.dataApi.product.dataArray.product_set_array.length != 0) {
                                    $scope.countDown().getNameUrl($scope.dataApi.product.dataArray.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", $scope.dataApi.product.dataArray.product_set_array[0].product_id, res_name);
                                    });
                                } else {
                                    $scope.pages().pageName("home");
                                }
                            } else {
                                /* product null */
                                $scope.pages().pageName("home");
                            }
                        }
                    });
                });
            });
        });
        /* - get api product/id end - */
        /* get product api */
    };
    return promise;
});_ui_share_app.directive('productDetailPageX', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageX';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.qtyProduct = 1;
        $scope.data = false;
        $scope.dataPreserve = false;
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;         
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        var dataSend = {
            'txt_product_id': $scope._getPostIdFromURL(),
        };
        if (CUR_THEME.shop_id() == "541") {
            $http.get("https://zoomcamera.getappeasy.com/store/api/v1/product/id", {
                params: dataSend
            }).then(function(res) {
                var e = res.data;
                if (e.ok == 1) {
                    console.log("product_set_array : data", e.data);
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope._getSupportDataCategory('category', e.data);
                    $scope.buildDataProductRelate($scope._getPostIdFromURL());
                    console.log("product_set_array : data", e.data);
                    if (typeof $scope.data.product_attribute.option_data !== 'undefined' && $scope.data.product_total_variant > 0) {
                        if (typeof $scope.data.product_attribute.option_data.pclass_array !== 'undefined' && $scope.data.product_attribute.option_data.pclass_array.length) {
                            $scope.buildVariantOption(e.data);
                        }
                    }
                    if (res.data.product_attribute.length != 0) {
                        $scope.buildMultipleQuantity(res.data);
                    }
                }
            });
        } else {
            $componentProductDetail.get('product/id', {
                'txt_product_id': $scope._getPostIdFromURL()
            }, function(e) {
                if (e.ok == 1) {
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope._getSupportDataCategory('category', e.data);
                    $scope.buildDataProductRelate($scope._getPostIdFromURL());
                    if (typeof $scope.data.product_attribute.option_data !== 'undefined' && $scope.data.product_total_variant > 0) {
                        if (typeof $scope.data.product_attribute.option_data.pclass_array !== 'undefined' && $scope.data.product_attribute.option_data.pclass_array.length) {
                            $scope.buildVariantOption(e.data);
                        }
                    }
                    if (e.data.product_attribute.length != 0) {
                        $scope.buildMultipleQuantity(e.data);
                    }
                }
            });
        }
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [],
                p = productObj.product_attribute.option_data.variant_array;
            for (var i = 0; i < p.length; i++) {
                if (p[i].status == 1 && p[i].status == 1) {
                    $scope.productQuantityMultiArray.push({
                        v_key: p[i].variant_key,
                        v_name: p[i].option_name_array[0],
                        v_qty: 1,
                        v_active: 0
                    });
                }
            }
        };
        $scope.currentOptionQtyPick = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            return e.val();
        };
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id) {
            var j = {
                'relate_product_id_array': [product_id],
                'badge_id_array': [18]
            };
            var d = {
                'cur_page': 1,
                'per_page': 8,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists', d).then(function(e) {
                if (e.ok == 1) {
                    var d = [];
                    angular.forEach(e.data.dataList, function(item) {
                        if (item.product_id !== $scope.data.product_id) {
                            d.push(item);
                        }
                    });
                    $scope.dataRelate = d;
                }
            });
        };
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            $scope.buildDataProductRelate($scope._getPostIdFromURL());
            if (objectData.product_total_variant <= 0) {
                /*return;*/
            }
            if (typeof $scope.data.product_attribute.option_data !== 'undefined' && $scope.data.product_total_variant > 0) {
                if (typeof $scope.data.product_attribute.option_data.pclass_array !== 'undefined' && $scope.data.product_attribute.option_data.pclass_array.length) {
                    $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
                    $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
                }
            }
        };
        $scope.ifOptionUnSelect = function() {
            return ($('.d_qty_price.active.inin').length > 0) ? true : false;
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $('.d_qty_not_result').removeClass("active");
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            if ($index == 0 && option_id == '') {
                
                return $componentProductDetail.get('product/id', {
                    'txt_product_id': $scope._getPostIdFromURL()
                }, function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                    $scope.findVariantsData($scope.dataVariantsPick);
                }
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    $scope.switchQuantityByKey('-' + variantsPick.join('-') + '-');
                    break;
                }
            }
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $rootScope.$on('repeatend', function() {
            /* Slider Send */
            var optionsParmas = {
                autoplay: true,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                infinite: true
            };
            var extraOptions = {
                animate: false
            };
            $timeout(function() {
                sliderProvider("#gallery_slider", optionsParmas, "", "", extraOptions);
            }, 500);
        });
        /* Slick Events */
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('#gallery_slider').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('#gallery_slider').slick('slickNext');
            }, 100);
        };
        /* Click SLick Item */
        $scope.slickGoto = function(idx) {
            $timeout(function() {
                $('#gallery_slider').slick('slickGoTo', idx);
            }, 100);
        };
        /* Calcu Nav Arrows */
        $scope.navArrowsCalculate = function() {
            var size = (500 / 2);
            var n = (size + 18) + 20;
            return '-' + n + 'px';
        };
        $scope.navArrowWidth = function() {
            return $('#gallery_slider').width() + 'px';
        };
        /* Build title for Address link*/
        $scope.buildTitleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
        /* Calculate discount (simple mode)
         * @params {expensivePrice}
         * @params {salePrice}
         * @return int
         */
        $scope.calculateDiscount = function(expensivePrice, salePrice) {
            var dif = expensivePrice - salePrice;
            return parseInt(dif * 100 / expensivePrice);
        };
        $scope.support_data = {
            category: [],
        };
        $scope._getSupportDataCategory = function(type, data) {
            var dataSend = {
                'txt_referral_id': data.product_referral_display.category[0].referral_id
            };
            GAEAPI.get('referral/relation', dataSend).then(function(e) {
                if (e.ok == 1) {
                    $scope.support_data.category = e.data;
                }
            });
        };
        /* Optimize image size by device pixel 
         * @params {size} (integer) prefer size
         * @params {image_url} (string) original image source link
         * @params {image_width} (string) original image width
         * @return string
         */
        $scope.viewOptimizeImage = function(size, image_url, image_width) {
            if (window.devicePixelRatio >= 2 || parseInt(image_width) <= size) {
                return image_url;
            }
            var a = image_url.split("/"),
                b = a[a.length - 1];
            a[a.length - 1] = 't' + size + '_' + b;
            return a.join("/");
        };
        /* Hide when visible badge */
        $scope.exceptVisibleBadge = function(objectItem) {
            var r = parseInt(objectItem.badge_id);
            var s = false;
            switch (r) {
                case 16:
                case 72:
                case 74:
                case 75:
                    s = true;
                    break;
                default:
                    s = false;
                    break;
            }
            return s;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.invited = [];
        $scope.insertinvited = function(user) {
            if (user) {
                if (user.product_attribute.length != 0) {
                    if ($scope.invited[0] == user.product_id) {
                        return;
                    }
                    $scope.invited.push(user.product_id);
                } else {
                    alert("item can't compare");
                }
            } else {                
                console.log("test_array :", $scope.invited);
            }
        };
        /* Display Badge Name */
        $scope.renderBadgeType = function(objectItem) {
            var r = parseInt(objectItem.badge_id);
            var str = 'No Badge';
            switch (r) {
                case 16:
                    str = "FEATURED";
                    break;
                case 72:
                    str = "NEW";
                    break;
                case 74:
                    str = "RECOMMEND";
                    break;
                case 75:
                    str = "BEST SELLER";
                    break;
                case 82:
                    str = "NEW (App)";
                    break;
                case 83:
                    str = "RECOMMEND (App)";
                    break;
                case 84:
                    str = "BEST SELLER (App)";
                    break;
            }
            return str;
        };
        $scope.renderBadgeTypeImg = function() {
            var returnData = false;
            if (CUR_THEME.shop_id() == "717") {
                returnData = true;
            } else {
                returnData = false;
            }
            return returnData;
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageXa', function($rootScope, $routeParams, sliderProvider, $componentProductDetail, $location) {
    var templateName = 'productDetailPageXa';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
        imgcart: '@imgcart',
        view: '@viewcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        if ($scope.imgcart != undefined) {
            $scope.setimg_cart = $scope.icnPath + $scope.imgcart;
        }
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            var tag = {
                'tags': product_tag
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(tag)
            };
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    /*if ($scope._dataArray.product_hightlight_video_embed != "") {
                        $scope._dataArray.product_image.unshift({
                            image_url: $scope.imgPath + 'img-play.png',
                            product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                        });
                    }*/
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags);
                    $scope.buildVariantOption(res.data);
                    if (res.data.product_attribute.length != 0) {
                        $scope.buildMultipleQuantity(res.data);
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '#gallery_slider[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.onSelectVariantItems(0, '');
        };
        $scope.dataVariantsPick = [];
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var _self = dataVariants[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope.switchQuantityByKey('-' + variantsPick.join('-') + '-');
                    console.log("selectedOptionTextJson: option", _self);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope._dataArray.product_image.length; im++) {
                            if ($scope._dataArray.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope._slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.gallery-thumbnail .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.currentOptionQtyPick = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            return e.val();
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [],
                p = productObj.product_attribute.option_data.variant_array;
            for (var i = 0; i < p.length; i++) {
                if (p[i].status == 1 && p[i].status == 1) {
                    $scope.productQuantityMultiArray.push({
                        v_key: p[i].variant_key,
                        v_name: p[i].option_name_array[0],
                        v_qty: 1,
                        v_active: 0
                    });
                }
            }
        };
        $scope.dataVariantsPick = [];
        $scope.electric = [];
        $scope.testyuyu = 0;
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.testyuyu = 0;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._idUrl($scope._viewRouteParams().product_id)
                }).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    $scope.testyuyu = 0;
                    $('.d_qty_not_result').removeClass("active");
                    $scope.findVariantsData($scope.dataVariantsPick);
                } else {
                    $scope.testyuyu = 0;
                    $('.d_qty').removeClass('active').removeClass('inin');
                    $('.d_qty_price').removeClass("active");
                    $('.d_qty_price').removeClass("inin");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric);
            }
        };
        $scope.ifOptionUnSelect = function() {
            return ($('.d_qty_price.active.inin').length > 0) ? true : false;
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("width", $(".cover_image_item").css("width"));
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageZ', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageZ';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
        iconbuy: '@iconbuy',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.login = function() {
            var login = {
                showLogin: function() {
                    return UiCustomerBox.delegate.get.isLogin();
                },
                isLogin: function(callback) {
                    callback(UiCustomerBox.delegate.get.isLogin());
                },
                totalAmount: function() {
                    return UiCart.delegate.get.totalAmount() || 0;
                },
                pageLogin: function() {
                    var _self = this;
                    _self.isLogin(function(isLogin) {
                        if (!isLogin) {
                            $inloginPopupTypeGrip.open();
                        }
                    });
                }
            }
            return login;
        };
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope._dataArray_tag = [];
        $scope._dataArray = [];
        $scope.data_min = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.names = [];
        $scope.currentStock = 0;
        $scope.buildTitleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
        $scope.encodeURIComponentOut = function(str) {
            var output = encodeURIComponent(str);
            return output;
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend, $scope).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    /*if ($scope._dataArray.product_hightlight_video_embed != "") {
                        $scope._dataArray.product_image.unshift({
                            image_url: $scope.imgPath + 'img-play.png',
                            product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                        });
                    }*/
                    $('.gallery_container').css('height', '0');
                    $('.gallery_container').css('opacity', '0');
                    setTimeout(function() {
                        $('.gallery_container').css('height', 'auto');
                        $('.gallery_container').css('opacity', '1');
                    }, 2000);
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    /*if ($scope._dataArray.product_description == '') {
                        $scope._viewTab(2);
                    }*/
                    $scope.names = [];
                    if (res.data.product_total_variant == 0 && res.data.product_total_stock > 0) {
                        for (var i = 0; i < parseFloat(res.data.product_total_stock); i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    if (res.data.product_total_variant == 0 && res.data.product_total_stock < 0) {
                        for (var i = 0; i < 20; i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    if (res.data.product_total_variant > 0) {
                        for (var i = 0; i < 20; i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    if (res.data.product_attribute != undefined) {
                        if (res.data.product_attribute.option_data != undefined) {
                            if (res.data.product_attribute.option_data.variant_array != undefined) {
                                if (res.data.product_attribute.option_data.variant_array.length != 0) {
                                    var set_varia = res.data.product_attribute.option_data.variant_array[0].price;
                                    for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                        if (parseFloat(set_varia) >= parseFloat(res.data.product_attribute.option_data.variant_array[i].price)) {
                                            set_varia = res.data.product_attribute.option_data.variant_array[i].price;
                                            $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                        }
                                    }
                                    if ($scope.data_min.length == 0) {
                                        $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                                    }
                                }
                            }
                        }
                    }
                    $scope._dataArray_tag = res.data.product_tags.split(",");
                    $scope.buildMultipleQuantity(res.data);
                    $scope.buildVariantOption(res.data);
                    // $scope.builldRelateProduct(res.data);
                    $scope.currentStock = $scope._dataArray.product_total_stock;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.dataRelateProductArray = [];
        $scope.builldRelateProduct = function(dataObj) {
            console.log("_getDataArray", dataObj);
            var dataSend = {
                'cur_page': 1,
                'per_page': 5,
                'txt_filter_json': JSON.stringify({
                    "badge_id_array": [18],
                    "tags": dataObj.product_tags
                })
            };
            GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope.dataRelateProductArray = e.data.dataList;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVaraintsClick_Normal();
        };
        $scope.dataVariantsPick = [];
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onClickVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.nowMoment = moment().unix();
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope.saleprice = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.stateShow = false;
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var count = 0;
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                var _self = dataVariants[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope.data.product_total_stock = dataVariants[i].total_stock;
                    console.log("tasdasdasdasest if", $scope.data.product_total_stock);
                    $scope.names = [];
                    if (parseFloat($scope.data.product_total_stock) == 0) {
                        $scope.stateShow = false;
                        $scope.names = [1]; 
                    } else {
                        $scope.stateShow = true;
                        for (var i = 0; i < parseFloat($scope.data.product_total_stock); i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    console.log("selectedOptionTextJson: option", _self);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope.data.product_image.length; im++) {
                            if ($scope.data.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope.slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.gallery-thumbnail .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                } else {
                    console.log("tasdasdasdasest else", $scope.data.product_total_stock);
                    $scope.stateShow = false;
                }
                if (!compareArray(variantsPick, optionJson)) {                    
                    count++;              
                }                
                if (count >= dataVariants.length) { 
                    $scope._dataArray.product_id = dataVariants[i].product_id;                                       
                    console.log("optionJson : 0000 ", count, dataVariants[i].total_stock);  
                    $scope.names = [1];       
                    $scope.stateShow = false;                     
                }
            }
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("width", $(".cover_image_item").css("width"));
            /*$(".cover_image_item_md_lg").css("height", $(".cover_image_item_md_lg").css("width"));
            $(".gallery_display_md_lg").css("height", $(".cover_image_item_md_lg").css("width"));*/
            $("iframe").css("height", $(".cover_image_item_md_lg").css("width"));
            $("iframe").css("width", $(".cover_image_item_md_lg").css("width"));
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                /*$scope.returnheight();
                $scope.timeCountStart();*/
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.data_viewTab = '1';
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope.currentOptionQtyPick = function(variant_key) {
            if ($('#detail_qty[variant-key="' + variant_key + '"]').val() != undefined) {
                var e = parseFloat($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
            }
            return e;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('select[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('select[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            if ($('#detail_qty[variant-key="' + variant_key + '"]').val() != undefined) {
                $scope._data_qty_selected = parseFloat($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
            }
            console.log("_data_qty_selected", $scope._data_qty_selected);
            /* parseFloat(e.val());
            alert(i);onSelectVariantItems*/
            if ($scope._data_qty_selected <= 0 || typeof $scope._data_qty_selected == 'undefined' || isNaN($scope._data_qty_selected)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [];
            if (productObj.product_attribute.option_data != undefined && productObj.product_attribute.option_data.length > 0) {
                var p = productObj.product_attribute.option_data.variant_array;
                for (var i = 0; i < p.length; i++) {
                    if (p[i].status == 1 && p[i].status == 1) {
                        $scope.productQuantityMultiArray.push({
                            v_key: p[i].variant_key,
                            v_name: p[i].option_name_array[0],
                            v_qty: 1,
                            v_active: 0
                        });
                    }
                }
            }
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").find('select').val() != undefined) {
                check_int = parseFloat($(".d_qty").find('select').val().substr(7));
            }
            return check_int;
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.outofstock = 0;
        $scope.getOutofstock = function() {
            $scope.outofstock = 1;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.onSelectVariantItems(0, '');
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.names = [];
                for (var i = 0; i < 20; i++) {
                    $scope.names.push(i + 1);
                }
                $scope._dataArray.product_id = $scope._idUrl($scope._viewRouteParams().product_id);
                $scope._dataArray.product_price = $scope.data_min.price;
                $scope.testyuyu = 0;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.dsetting').addClass("active");
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._idUrl($routeParams.product_id)
                }, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                        console.log("check_vareian 103", $scope.testyuyu);
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    console.log("check_vareian 104", $scope.testyuyu);
                    $scope.testyuyu = 0;
                    $scope.findVariantsData($scope.dataVariantsPick);
                    $(".d_qty").find('select').val("number:1");
                } else {
                    console.log("check_vareian 105", $scope.testyuyu);
                    $scope.testyuyu = 0;
                    $(".d_qty").find('select').val("number:1");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric, $scope.testyuyu);
            }
            /*alert($scope.dataVariantsPick);*/
        };
        $scope.video_code = "";
        $scope.videoShow = function() {
            $scope.video_code = $scope._dataArray.product_hightlight_video_embed;
            $(".videoHighlightOverlay").addClass("active");
            console.log("videoShow");
        }
        $scope.videoHide = function() {
            $scope.video_code = '';
            $(".videoHighlightOverlay").removeClass("active");
            console.log("videoHide");
        }
        $scope.viewHide = function(arrayData, optionData) {
            var reTest = false;
            if (optionData == arrayData.length) {
                for (var i = 0; arrayData.length > i; i++) {
                    console.log("arrayData[i]", arrayData[i]);
                    if (!arrayData[i]) {
                        reTest = false;
                        break;
                    } else {
                        reTest = true;
                    }
                }
            }
            return reTest;
        }
        $scope.viewHideOp = function(arrayData, optionData) {
            var e = false;
            if (optionData == 0 && arrayData.length == 0) {
                e = true;
            }
            return e;
        }
        $scope.qtuC = function() {
            var e = 1;
            if ($(".d_qty").find('select').val() == "") {
                $(".d_qty").find('select').val("number:1");
                var e = 1;
            } else {
                var e = $(".d_qty").find('select').val();
            }
            return e;
        }
        $scope.buyC = function() {
            var e = false;
            if ($scope.dataOption.length == 0 && $scope.viewHide($scope.dataVariantsPick, $scope.dataOption.length) == false) {
                if ($scope.names.length == 0) {
                    e = false
                } else {
                    e = true;
                }
            } else if ($scope.dataOption.length > 0) {
                if ($scope.viewHide($scope.dataVariantsPick, $scope.dataOption.length) == true) {
                    if ($scope.stateShow == true) {
                        e = true;
                    }
                } else {
                    e = false;
                }
            }
            return e;
        }
        $scope.outOfStockShow = function() {
            var e = false;
            if ($scope.buyC() == true) {
                e = true;
            } else {
                if ($scope.names.length == 20) {
                    e = true;
                } else {
                    e = false;
                }
            }
            return e;
        }
    };
    return promise;
});_ui_share_app.directive('productDetailPageZa', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageZa';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        buttonicon: '@buttonicon',
        buttontext: '@buttontext',
        stylebutton: '@stylebutton',
        promotelink: '@promotelink',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._stylebutton = ($scope.stylebutton == undefined || $scope.stylebutton == "") ? 'filled_button_round_small' : $scope.stylebutton;
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            var tag = {
                'tags': product_tag
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(tag)
            };
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    /* add data video */
                    /*if ($scope._dataArray.product_hightlight_video_embed != "") {
                        $scope._dataArray.product_image.unshift({
                            image_url: $scope.imgPath + 'img-play.png',
                            product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                        });
                    }*/
                    /* add data video */
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags);
                    $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = '1';
        $scope.viewQuantity = function() {
            /*return $(".d_qty.active.inin").find('input').val() || 1;*/
            return $( "#d_qty option:selected" ).text();
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVaraintsClick_Normal();
        };
        $scope.dataVariantsPick = [""];
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.dataVariantsPick = [""];
        $scope.onSelectVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };
        $scope.makeVariantsClick = function(){            
            var s = $timeout(function(){
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx,obj){
                    var optionElementFirst = $(this).find('option[data-index="'+idx+'"]').eq(0);
                    optionElementFirst.prop("selected",true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    break;
                }
            }
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("width", $(".cover_image_item").css("width"));
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
        /* Change Big Image when click thumbnail */
        $scope.dataChangeBigImage = 0;
        $scope.changeBigImage = function(dataObject,index) {
            $scope.dataChangeBigImage = index;
            $timeout(function() {
                var e = $('.gallery-display');
                var el = $('.gallery-display').find('img').eq(0);
                e.css('opacity', '0');
                $timeout(function() {
                    el.attr('original-src', el.attr('src'));
                    el.attr('src', dataObject.image_url);
                    el.addClass('has-changed');
                    e.css('opacity', '1');
                }, 600);
            }, 300);
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageZb', function($rootScope, $routeParams, sliderProvider, $componentProductDetail, $location) {
    var templateName = 'productDetailPageZb';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
        iconbuy: '@iconbuy',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope.login = function() {
            var login = {
                showLogin: function() {
                    return UiCustomerBox.delegate.get.isLogin();
                },
                isLogin: function(callback) {
                    callback(UiCustomerBox.delegate.get.isLogin());
                },
                pageLogin: function() {
                    var _self = this;
                    _self.isLogin(function(isLogin) {
                        if (!isLogin) {
                            /* $location.url('member').replace(); */
                            window.location.href = "member";
                        }
                    });
                }
            }
            return login;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.titleUrl = function(str) {
            var res_str = '';
            if (str != undefined) {
                var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                res_str = s.toLowerCase();
            }
            return res_str;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope._dataArray_tag = {};
        $scope._dataArray = [];
        $scope.data_min = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.names = [];
        $scope.currentStock = 0;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    console.log("productDetailPageZb : res : ", res);
                    $scope._dataArray = res.data;
                    /*if ($scope._dataArray.product_hightlight_video_embed != "") {
                        $scope._dataArray.product_image.unshift({
                            image_url: $scope.imgPath + 'img-play.png',
                            product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                        });
                    }*/
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    /*if ($scope._dataArray.product_description == '') {
                        $scope._viewTab(2);
                    }*/
                    $scope.names = [];
                    if (res.data.product_total_variant == 0 && res.data.product_total_stock > 0) {
                        for (var i = 0; i < parseInt(res.data.product_total_stock); i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    if (res.data.product_total_variant == 0 && res.data.product_total_stock < 0) {
                        for (var i = 0; i < 20; i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    if (res.data.product_total_variant > 0) {
                        for (var i = 0; i < 20; i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    if (res.data.product_attribute != undefined) {
                        if (res.data.product_attribute.option_data != undefined) {
                            if (res.data.product_attribute.option_data.variant_array != undefined) {
                                if (res.data.product_attribute.option_data.variant_array.length != 0) {
                                    var set_varia = res.data.product_attribute.option_data.variant_array[0].price;
                                    for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                        if (parseInt(set_varia) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                            set_varia = res.data.product_attribute.option_data.variant_array[i].price;
                                            $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                        }
                                    }
                                    if ($scope.data_min.length == 0) {
                                        $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                                    }
                                }
                            }
                        }
                    }
                    $scope._dataArray_tag = res.data.product_tags.split(",");
                    $scope.buildMultipleQuantity(res.data);
                    $scope.buildVariantOption(res.data);
                    $scope.builldRelateProduct(res.data);
                    $scope.currentStock = $scope._dataArray.product_total_stock;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.dataRelateProductArray = [];
        $scope.builldRelateProduct = function(dataObj) {
            console.log("_getDataArray", dataObj);
            var dataSend = {
                'cur_page': 1,
                'per_page': 5,
                'txt_filter_json': JSON.stringify({
                    "badge_id_array": [18],
                    "tags": dataObj.product_tags
                })
            };
            GAEAPI.get('product/lists', dataSend).then(function(e) {
                if (e.ok === 1) {
                    $scope.dataRelateProductArray = e.data.dataList;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVaraintsClick_Normal();
        };
        $scope.dataVariantsPick = [];
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onClickVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.nowMoment = moment().unix();
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope.saleprice = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.stateShow = false;
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var count = 0;
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                var _self = dataVariants[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    console.log("dataVariants : ", dataVariants);
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope.data.product_total_stock = dataVariants[i].total_stock;
                    console.log("tasdasdasdasest if", $scope.data.product_total_stock);
                    $scope.names = [];
                    if (parseInt($scope.data.product_total_stock) == 0) {
                        $scope.stateShow = false;
                        $scope.names = [1]; 
                    } else {
                        $scope.stateShow = true;
                        for (var i = 0; i < parseInt($scope.data.product_total_stock); i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    console.log("selectedOptionTextJson: option", _self);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope.data.product_image.length; im++) {
                            if ($scope.data.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope.slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.gallery-thumbnail .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                } else {
                    console.log("tasdasdasdasest else", $scope.data.product_total_stock);
                    $scope.stateShow = false;
                }
                if (!compareArray(variantsPick, optionJson)) {                    
                    count++;              
                }                
                if (count >= dataVariants.length) { 
                    $scope._dataArray.product_id = dataVariants[i].product_id;                                       
                    console.log("optionJson : 0000 ", count, dataVariants[i].total_stock);  
                    $scope.names = [1];       
                    $scope.stateShow = false;                     
                }
            }
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("width", $(".cover_image_item").css("width"));
            /*$(".cover_image_item_md_lg").css("height", $(".cover_image_item_md_lg").css("width"));
            $(".gallery_display_md_lg").css("height", $(".cover_image_item_md_lg").css("width"));*/
            $("iframe").css("height", $(".cover_image_item_md_lg").css("width"));
            $("iframe").css("width", $(".cover_image_item_md_lg").css("width"));
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                /*$scope.returnheight();
                $scope.timeCountStart();*/
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.data_viewTab = '1';
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope.currentOptionQtyPick = function(variant_key) {
            if ($('#detail_qty[variant-key="' + variant_key + '"]').val() != undefined) {
                var e = parseInt($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
            }
            return e;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('select[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('select[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            if ($('#detail_qty[variant-key="' + variant_key + '"]').val() != undefined) {
                $scope._data_qty_selected = parseInt($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
            }
            console.log("_data_qty_selected", $scope._data_qty_selected);
            /* parseInt(e.val());
            alert(i);onSelectVariantItems*/
            if ($scope._data_qty_selected <= 0 || typeof $scope._data_qty_selected == 'undefined' || isNaN($scope._data_qty_selected)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [];
            if (productObj.product_attribute.option_data != undefined && productObj.product_attribute.option_data.length > 0) {
                var p = productObj.product_attribute.option_data.variant_array;
                for (var i = 0; i < p.length; i++) {
                    if (p[i].status == 1 && p[i].status == 1) {
                        $scope.productQuantityMultiArray.push({
                            v_key: p[i].variant_key,
                            v_name: p[i].option_name_array[0],
                            v_qty: 1,
                            v_active: 0
                        });
                    }
                }
            }
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").find('select').val() != undefined) {
                check_int = parseInt($(".d_qty").find('select').val().substr(7));
            }
            return check_int;
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.outofstock = 0;
        $scope.getOutofstock = function() {
            $scope.outofstock = 1;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.onSelectVariantItems(0, '');
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.names = [];
                for (var i = 0; i < 20; i++) {
                    $scope.names.push(i + 1);
                }
                $scope._dataArray.product_id = $scope._idUrl($scope._viewRouteParams().product_id);
                $scope._dataArray.product_price = $scope.data_min.price;
                $scope.testyuyu = 0;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.dsetting').addClass("active");
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._idUrl($routeParams.product_id)
                }).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                        console.log("check_vareian 103", $scope.testyuyu);
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    console.log("check_vareian 104", $scope.testyuyu);
                    $scope.testyuyu = 0;
                    $scope.findVariantsData($scope.dataVariantsPick);
                    $(".d_qty").find('select').val("number:1");
                } else {
                    console.log("check_vareian 105", $scope.testyuyu);
                    $scope.testyuyu = 0;
                    $(".d_qty").find('select').val("number:1");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric, $scope.testyuyu);
            }
            /*alert($scope.dataVariantsPick);*/
        };
        $scope.video_code = "";
        $scope.videoShow = function() {
            $scope.video_code = $scope._dataArray.product_hightlight_video_embed;
            $(".videoHighlightOverlay").addClass("active");
            console.log("videoShow");
        }
        $scope.videoHide = function() {
            $scope.video_code = '';
            $(".videoHighlightOverlay").removeClass("active");
            console.log("videoHide");
        }
        $scope.viewHide = function(arrayData, optionData) {
            var reTest = false;
            if (optionData == arrayData.length) {
                for (var i = 0; arrayData.length > i; i++) {
                    console.log("arrayData[i]", arrayData[i]);
                    if (!arrayData[i]) {
                        reTest = false;
                        break;
                    } else {
                        reTest = true;
                    }
                }
            }
            return reTest;
        }
        $scope.viewHideOp = function(arrayData, optionData) {
            var e = false;
            if (optionData == 0 && arrayData.length == 0) {
                e = true;
            }
            return e;
        }
        $scope.qtuC = function() {
            var e = 1;
            if ($(".d_qty").find('select').val() == "") {
                $(".d_qty").find('select').val("number:1");
                var e = 1;
            } else {
                var e = $(".d_qty").find('select').val();
            }
            return e;
        }
        $scope.buyC = function() {
            var e = false;
            if ($scope.dataOption.length == 0 && $scope.viewHide($scope.dataVariantsPick, $scope.dataOption.length) == false) {
                if ($scope.names.length == 0) {
                    e = false
                } else {
                    e = true;
                }
            } else if ($scope.dataOption.length > 0) {
                if ($scope.viewHide($scope.dataVariantsPick, $scope.dataOption.length) == true) {
                    if ($scope.stateShow == true) {
                        e = true;
                    }
                } else {
                    e = false;
                }
            }
            return e;
        }
        $scope.outOfStockShow = function() {
            var e = false;
            if ($scope.buyC() == true) {
                e = true;
            } else {
                if ($scope.names.length == 20) {
                    e = true;
                } else {
                    e = false;
                }
            }
            return e;
        }
    };
    return promise;
});_ui_share_app.directive('componentProductDetails', function($rootScope, $routeParams, $location) {
    var templateComponent = 'componentProductDetails';
    var templateUrl = _ui_share_host + templateComponent + '/' + templateComponent + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        type: '@type',
        cart: '@cart',
        buycol: '@buycol',
        buyicon: '@buyicon',
        buytext: '@buytext',
        viewcarttext: '@viewcarttext',
        buylogin: '@buylogin',
        currency: '@currency',
        checkstaff: '@checkstaff',
        language: '@language',
        btnstyle: '@btnstyle',
        maxstock: '@maxstock',
        videotext: '@videotext',
        description: '@description',
        info: '@info',
        sandwiched : '@sandwiched',
        specification: '@specification',
        textbrand:'@textbrand',
        navigationhover: '@navigationhover',
        imageappcoverchecked: '@imageappcoverchecked',
        categorylists:'@categorylists',
        categorylistsurl: '@categorylistsurl',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templateUrl;
    promise.transclude = {
        'one': '?one',
        'two': '?two',
        'three': '?three',
    };
    promise.controller = function($scope, $timeout, $interval, $window, $http, share) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "componentProductDetails";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        $scope._componentType = _ui_share_host + $scope._component + "/type/";
        $scope._module = _ui_share_host + $scope._component + "/module/";
        $scope._class = ($scope.type != undefined && $scope.type != "") ? $scope.type : "default";
        /* scope */
        $scope._name = ($scope.name != undefined && $scope.name != "") ? $scope.name : "default";
        $scope._type = $scope._componentType + $scope._class + ".html";
        $scope._cart = ($scope.cart != undefined && $scope.cart != "") ? $scope.cart : "trumpComponentCarts";
        $scope._buycol = ($scope.buycol != undefined && $scope.buycol != "") ? parseInt($scope.buycol) : 15;
        $scope._maxstock = ($scope.maxstock != undefined && $scope.maxstock != "") ? parseInt($scope.maxstock) : 20;
        $scope._categorylistsurl = ($scope.categorylistsurl != undefined && $scope.categorylistsurl != "") ? $scope.categorylistsurl : "category-lists";
        $scope._btnstyle = ($scope.btnstyle != undefined && $scope.btnstyle != "") ? $scope.btnstyle : "filled_button_large";
        $scope._buylogin = ($scope.buylogin == "true" || $scope.buylogin == "t") ? true : false;
        $scope._checkstaff = ($scope.checkstaff == "true" || $scope.checkstaff == "t") ? true : false;
        $scope._categorylists = ($scope.categorylists != undefined && $scope.categorylists != "") ? $scope.categorylists : "สินค้า";
        $scope._sandwiched = ($scope.sandwiched != undefined && $scope.sandwiched != "") ? $scope.sandwiched : ">";
        $scope._currency = ($scope.currency != undefined && $scope.currency != "") ? $scope.currency : "THB";
        $scope._buyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope.buyicon : "icnt_outline_cart01_dark.png";
        $scope._buytext = ($scope.buytext != undefined && $scope.buytext != "") ? $scope.buytext : "เพิ่มในรถเข็น";
        $scope._viewcarttext = ($scope.viewcarttext != undefined && $scope.viewcarttext != "") ? $scope.viewcarttext : "ดูรถเข็น";
        $scope._videotext = ($scope.videotext != undefined && $scope.videotext != "") ? $scope.videotext : "Video";
        $scope._icebuyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope._icnPath + $scope.buyicon : $scope._icnPath + "icnt_outline_cart01_dark.png";
        $scope._language = ($scope.language != undefined && $scope.language != "") ? (($scope.language == "en") ? "en" : "th") : "th";
        $scope._textbrand = ($scope.textbrand != undefined && $scope.textbrand != "") ? $scope.textbrand : "Brand";
        $scope._navigationhover = ($scope.navigationhover != undefined && $scope.navigationhover != "") ? $scope.navigationhover : "primary";
        $scope._imageappcoverchecked = ($scope.imageappcoverchecked == "true" || $scope.imageappcoverchecked == "t") ? true : false;
        /* scope */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getNamePage: function(arr) {
                    var str = [];
                    for (var i = 0; i < arr.length; i++) {
                        if (i != 0) {
                            str.push(arr[i]);
                        }
                    }
                    return str.join(" ");
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = (params.product_id != undefined) ? params.product_id.split("-", 1).join("") : false;
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getReferralId: function(productReferralDisplay, callback) {
                    var _self = this;
                    var referral_id = 0;
                    if (productReferralDisplay.length != 0) {
                        if (productReferralDisplay.category != undefined) {
                            if (productReferralDisplay.category.length != 0) {
                                referral_id = productReferralDisplay.category[0].referral_id
                            }
                        }
                    }
                    callback(referral_id);
                },
                getStaffId: function(staffId, callback) {
                    var _self = this;
                    var res_staff = {
                        staff_id: (staffId != 0 && staffId != '' && staffId != undefined) ? staffId : '0',
                        status: (staffId != 0 && staffId != '' && staffId != undefined) ? true : false
                    }
                    callback(res_staff);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getCarousel = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carouselA: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            fade: true,
                            dots: false,
                            arrows: false,
                            infinite: true,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '',
                            nextArrow: '',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselB: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: true,
                            arrows: true,
                            infinite: true,
                            autoplay: false,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '
',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselBar: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: false,
                            infinite: false,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 6,
                            slidesToScroll: 6,
                            speed: 600,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: 5,
                                    slidesToScroll: 5,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: 4,
                                    slidesToScroll: 4,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: 3,
                                    slidesToScroll: 3,
                                }
                            }]
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                slickCarousel: function(carousel, index) {
                    var _self = this;
                    $scope.setCarousel.index = index;
                    setTimeout(function() {
                        $('[data-key="' + carousel + '"]').slick('slickGoTo', index);
                    }, 100);
                },
                prevIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != 0) ? image_index - 1 : image - 1;
                    _self.consoleLog("prevIndex index", $scope.setCarousel.index);
                },
                nextIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != (image - 1)) ? image_index + 1 : 0;
                    _self.consoleLog("nextIndex index", $scope.setCarousel.index);
                }
            }
            return getFunction;
        };
        $scope.getAttribute = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                productAttribute: function(productAttribute, callback) {
                    var _self = this;
                    var attribute = {
                        option_name: "",
                        option_attribute: []
                    };
                    if (productAttribute.option_data != undefined) {
                        if (productAttribute.option_data.variant_array != undefined && productAttribute.option_data.variant_array.length != 0) {
                            for (var a = 0; a < productAttribute.option_data.pclass_array.length; a++) {
                                attribute.option_name = attribute.option_name.concat(productAttribute.option_data.pclass_array[a].pclass_name, " ");
                            }
                            for (var b = 0; b < productAttribute.option_data.variant_array.length; b++) {
                                var product_attribute = {
                                    product_id: productAttribute.option_data.variant_array[b].product_id,
                                    product_sku: productAttribute.option_data.variant_array[b].sku,
                                    product_title: "",
                                    product_price: parseFloat(productAttribute.option_data.variant_array[b].price),
                                    product_compare_price: parseFloat(productAttribute.option_data.variant_array[b].compare_price),
                                    product_total_stock: parseFloat(productAttribute.option_data.variant_array[b].total_stock),
                                    product_image: productAttribute.option_data.variant_array[b].variant_image
                                }
                                for (var c = 0; c < productAttribute.option_data.variant_array[b].option_name_array.length; c++) {
                                    product_attribute.product_title = product_attribute.product_title.concat(productAttribute.option_data.variant_array[b].option_name_array[c], " ");
                                }
                                attribute.option_attribute.push(product_attribute);
                            }
                        }
                    }
                    _self.consoleLog("productAttribute attribute ", attribute);
                    callback(attribute);
                },
                checkDiscountPrice: function(productDiscount, resPrice, resComparePrice, callback) {
                    var _self = this;
                    var price = 0;
                    var compare_price = 0;
                    if (productDiscount.length == 0) {
                        price = parseFloat(resPrice);
                        compare_price = parseFloat(resComparePrice);
                    } else {
                        if (productDiscount.discount_type_id == '101') {
                            price = parseFloat(resPrice) - parseFloat(productDiscount.discount_price);
                            compare_price = parseFloat(resPrice);
                        } else if (productDiscount.discount_type_id == '102') {
                            price = (parseFloat(resPrice) * ((100 - parseFloat(productDiscount.discount_percent)) / 100));
                            compare_price = parseFloat(resPrice);
                        }
                    }
                    callback(price, compare_price);
                },
                checkMinPrice: function(option, callback) {
                    var _self = this;
                    var price_min = parseFloat(option.option_attribute[0].product_price);
                    var compare_price_min = parseFloat(option.option_attribute[0].product_compare_price);
                    var total_stock = parseFloat(option.option_attribute[0].product_total_stock);
                    for (var a = 0; a < option.option_attribute.length; a++) {
                        if (price_min >= parseFloat(option.option_attribute[a].product_price)) {
                            price_min = parseFloat(option.option_attribute[a].product_price);
                            compare_price_min = parseFloat(option.option_attribute[a].product_compare_price);
                            total_stock = parseFloat(option.option_attribute[a].product_total_stock);
                        }
                    }
                    _self.consoleLog("checkPriceMin price_min ", price_min);
                    _self.consoleLog("checkPriceMin compare_price_min ", compare_price_min);
                    _self.consoleLog("checkPriceMin total_stock ", total_stock);
                    callback(price_min, compare_price_min, total_stock);
                },
                getTotalStock: function(totalStock, mixStock, callback) {
                    var _self = this;
                    var total_stock = (totalStock > 0) ? ((totalStock <= mixStock) ? totalStock : mixStock) : ((totalStock == -1) ? mixStock : totalStock);
                    callback(total_stock);
                },
                checkMinPrices: function(api, attribute, callback) {
                    var _self = this;
                    var dataPrice = {
                        product_price: {
                            price_name: 'product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        product_compare_price: {
                            price_name: 'product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_price: {
                            price_name: 'sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_price: {
                            price_name: 'sum_product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_minus_sum_product_price: {
                            price_name: 'sum_product_compare_minus_sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        }
                    }
                    if (attribute.option_attribute.length == 0) {
                        _self.checkDiscountPrice(api.data.product_discount, api.data.product_price, api.data.product_compare_price, function(res_price, res_compare_price) {
                            _self.checkPrice(res_price, function(res_price_ecimals) {
                                dataPrice.product_price.price = res_price;
                                dataPrice.product_price.price_ecimals = res_price_ecimals;
                                dataPrice.sum_product_price.price = res_price;
                                dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                    dataPrice.product_compare_price.price = res_compare_price;
                                    dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    dataPrice.sum_product_compare_price.price = res_compare_price;
                                    dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                    _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                        dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                        dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                        _self.getTotalStock(api.data.product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                            dataPrice.product_price.total_stock = res_total_stock_s;
                                            dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                            callback(dataPrice, false);
                                        });
                                    });
                                });
                            });
                        });
                    } else {
                        _self.checkMinPrice(attribute, function(res_price_min, res_compare_price_min, res_total_stock) {
                            _self.checkDiscountPrice(api.data.product_discount, res_price_min, res_compare_price_min, function(res_price, res_compare_price) {
                                _self.checkPrice(res_price, function(res_price_ecimals) {
                                    dataPrice.product_price.price = res_price;
                                    dataPrice.product_price.price_ecimals = res_price_ecimals;
                                    dataPrice.sum_product_price.price = res_price;
                                    dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                    _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                        dataPrice.product_compare_price.price = res_compare_price;
                                        dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        dataPrice.sum_product_compare_price.price = res_compare_price;
                                        dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                        _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                            dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                            dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                            _self.getTotalStock(res_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                dataPrice.product_price.total_stock = res_total_stock_s;
                                                dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                callback(dataPrice, true);
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    }
                },
                priceIncludes: function(price, includes, callback) {
                    var _self = this;
                    var priceToString = (price == null) ? 0 : price;
                    _self.consoleLog('priceIncludes priceToString : ', priceToString);
                    callback(priceToString.toString().includes(includes));
                },
                checkPrice: function(price, callback) {
                    var _self = this;
                    _self.priceIncludes(price, '.', function(res) {
                        _self.consoleLog("checkPrice res ", res);
                        callback((!res) ? 0 : 2);
                    });
                },
                onSelectOption: function(productId) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = productId;
                    _self.consoleLog("onSelectOption productId ", productId);
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    for (var a = 0; a < $scope.data.attribute.dataArray.option_attribute.length; a++) {
                        _self.consoleLog("onSelectOption option_attribute ", $scope.data.attribute.dataArray.option_attribute[a]);
                        if ($scope.data.attribute.dataArray.option_attribute[a].product_id == productId) {
                            if ($scope.data.attribute.dataArray.option_attribute[a].product_image.length != 0) {
                                if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                                    for (var b = 0; b < $scope.dataApi.product.dataArray.product_image.length; b++) {
                                        if ($scope.dataApi.product.dataArray.product_image[b].image_id == $scope.data.attribute.dataArray.option_attribute[a].product_image[0].image_id) {
                                            $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, b);
                                        }
                                    }
                                }
                            }
                            _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[a].product_price, $scope.data.attribute.dataArray.option_attribute[a].product_compare_price, function(res_price_p, res_compare_price_p) {
                                _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                                    $scope.data.product_price.price = res_price_p;
                                    $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                                    $scope.data.sum_product_price.price = res_price_p;
                                    $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                                    _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                        $scope.data.product_compare_price.price = res_compare_price_p;
                                        $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                        $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                        _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                            $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                            $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                            _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[a].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                $scope.data.product_price.total_stock = res_total_stock_s;
                                                $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                /* stock */
                                                $scope.data.quantity.quantity_max = res_total_stock_s;
                                                $scope.data.quantity.quantity_select = [];
                                                for (var i = 0; i < res_total_stock_s; i++) {
                                                    $scope.data.quantity.quantity_select.push(i + 1);
                                                }
                                                /* stock */
                                            })
                                        });
                                    });
                                });
                            });
                            break;
                        }
                    }
                },
                onClickOption: function(index) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.data.attribute.productId = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    if ($scope.data.attribute.dataArray.option_attribute[index].product_image.length != 0) {
                        if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                            for (var i = 0; i < $scope.dataApi.product.dataArray.product_image.length; i++) {
                                if ($scope.dataApi.product.dataArray.product_image[i].image_id == $scope.data.attribute.dataArray.option_attribute[index].product_image[0].image_id) {
                                    $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, i);
                                }
                            }
                        }
                    }
                    _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[index].product_price, $scope.data.attribute.dataArray.option_attribute[index].product_compare_price, function(res_price_p, res_compare_price_p) {
                        _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                            $scope.data.product_price.price = res_price_p;
                            $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                            $scope.data.sum_product_price.price = res_price_p;
                            $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                            _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                $scope.data.product_compare_price.price = res_compare_price_p;
                                $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                    $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                    $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                    _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[index].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                        $scope.data.product_price.total_stock = res_total_stock_s;
                                        $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                        /* stock */
                                        $scope.data.quantity.quantity_max = res_total_stock_s;
                                        $scope.data.quantity.quantity_select = [];
                                        for (var i = 0; i < res_total_stock_s; i++) {
                                            $scope.data.quantity.quantity_select.push(i + 1);
                                        }
                                        /* stock */
                                    })
                                });
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.getAttributeCustom = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                createArray: function(productCustomTemplates, callback) {
                    var _self = this;
                    var custom_attributes = [];
                    if (productCustomTemplates.templates.length != 0) {
                        angular.forEach(productCustomTemplates.templates, function(item, index) {
                            if (item.option_sets.length != 0) {
                                _self.getAttributes(item.option_sets, function(res_attributes) {
                                    custom_attributes = custom_attributes.concat(res_attributes);
                                });
                            }
                        });
                        /* if (productCustomTemplates.templates[0].option_sets.length != 0) {
                            _self.getAttributes(productCustomTemplates.templates[0].option_sets, function(res_attributes) {
                                custom_attributes = res_attributes;
                            });
                        } */
                    }
                    _self.consoleLog("createArray : productCustomTemplates", productCustomTemplates);
                    _self.consoleLog("createArray : custom_attributes", custom_attributes);
                    callback(custom_attributes, true);
                },
                formatAttribute: function(index, optionSubsetIndex, setType, optionSetArray, callback) {
                    var _self = this;
                    var set_id = (setType == 'attribute') ? optionSetArray.set_id : optionSetArray.subset_id;
                    var attribute = {
                        attribute_index: index,
                        attribute_option_subset_index: optionSubsetIndex,
                        active_option_id: (optionSetArray.option_data.select_id != 0) ? optionSetArray.option_data.select_id : "-1",
                        active_option_index: -1,
                        active_option_index_str: "-1",
                        active_textarea: "",
                        active_array: [],
                        set_id: set_id,
                        name: optionSetArray.name,
                        set_type: optionSetArray.ss_type,
                        option: []
                    }
                    callback(attribute);
                },
                getOption: function(index, optionDataArray, callback) {
                    var _self = this;
                    var options = {
                        index: index,
                        ss_data_id: optionDataArray.ss_data_id,
                        name: optionDataArray.name,
                        image: optionDataArray.image,
                        price: optionDataArray.price,
                        compare_price: 0,
                        total_stock: 0
                    }
                    callback(options);
                },
                getActive: function(index, activeOptionId, activeOptionIdIn, optionDataArray, callback) {
                    var _self = this;
                    var actives_index = (optionDataArray.ss_data_id == activeOptionId) ? index : activeOptionIdIn;
                    var actives = (optionDataArray.ss_data_id != activeOptionId) ? "0" : "1";
                    callback(actives_index, actives);
                },
                getAttributes: function(optionSetArray, callback) {
                    var _self = this;
                    var attributes = [];
                    for (var index = 0; index < optionSetArray.length; index++) {
                        _self.formatAttribute(index, 0, 'attribute', optionSetArray[index], function(res_attribute) {
                            if (optionSetArray[index].option_subsets.length != 0) {
                                for (var option_subset_index = 0; option_subset_index < optionSetArray[index].option_subsets.length; option_subset_index++) {
                                    _self.formatAttribute(index, option_subset_index, res_attribute.set_type, optionSetArray[index].option_subsets[option_subset_index], function(res_attribute_sub) {
                                        var options = [];
                                        var active_option_id = -1;
                                        var active_option_array = [];
                                        for (var option = 0; option < optionSetArray[index].option_subsets[option_subset_index].option_data.options.length; option++) {
                                            _self.getOption(option, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_option) {
                                                options.push(res_option);
                                            });
                                            _self.getActive(option, res_attribute_sub.active_option_id, active_option_id, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_actives_index, res_actives) {
                                                active_option_id = res_actives_index;
                                                active_option_array.push(res_actives);
                                            });
                                        }
                                        res_attribute_sub.option = options;
                                        res_attribute_sub.active_option_index = active_option_id;
                                        res_attribute_sub.active_option_index_str = String(active_option_id);
                                        res_attribute_sub.active_array = active_option_array;
                                        attributes.push(res_attribute_sub);
                                    });
                                }
                            } else {
                                var options = [];
                                var active_option_id = -1;
                                var active_option_array = [];
                                for (var option = 0; option < optionSetArray[index].option_data.options.length; option++) {
                                    _self.getOption(option, optionSetArray[index].option_data.options[option], function(res_option) {
                                        options.push(res_option);
                                    });
                                    _self.getActive(option, res_attribute.active_option_id, active_option_id, optionSetArray[index].option_data.options[option], function(res_actives_index, res_actives) {
                                        active_option_id = res_actives_index;
                                        active_option_array.push(res_actives);
                                    });
                                }
                                res_attribute.option = options;
                                res_attribute.active_option_index = active_option_id;
                                res_attribute.active_option_index_str = String(active_option_id);
                                res_attribute.active_array = active_option_array;
                                attributes.push(res_attribute);
                            }
                        });
                    }
                    callback(attributes)
                },
                getformatQuantity: function(index, attributeCustom, callback) {
                    var _self = this;
                    var quantity = {
                        name: String(index + 1),
                        dataArray: attributeCustom
                    }
                    callback(quantity);
                },
                onClickRadio: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickRadio : index", index);
                    _self.consoleLog("onClickRadio : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickRadio : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickDropdown: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickDropdown : index", index);
                    _self.consoleLog("onClickDropdown : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickDropdown : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickCheckbox: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickCheckbox : index", index);
                    _self.consoleLog("onClickCheckbox : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i == parseInt(index_option)) ? (($scope.data.attribute_custom.dataArray[index].active_array[i] != "0") ? "0" : "1") : $scope.data.attribute_custom.dataArray[index].active_array[i];
                    }
                    _self.consoleLog("onClickCheckbox : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                }
            }
            return getFunction;
        };
        $scope.getReward = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                momentUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    callback(now);
                },
                getCalculator: function(sumProductPrice, reward, callback) {
                    var _self = this;
                    _self.consoleLog("getCalculator : sumProductPrice", sumProductPrice);
                    _self.consoleLog("getCalculator : reward", reward);
                    var point_reward = 0;
                    if (reward.type_id == "100") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    } else if (reward.type_id == "101") {
                        point_reward = reward.reward_amount;
                    } else if (reward.type_id == "102") {
                        point_reward = (reward.reward_percent * sumProductPrice.price) / 100;
                    } else if (reward.type_id == "103") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    }
                    _self.consoleLog("getCalculator : point_reward", point_reward);
                    callback(point_reward);
                },
                getProductReward: function(now, productReward, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (productReward.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(productReward.reward_lifetime.lifetime_start_time);
                        reward.lifetime_end_time = parseInt(productReward.reward_lifetime.lifetime_end_time);
                        reward.type_id = productReward.reward_type_id;
                        reward.amount = parseInt(productReward.reward_amount);
                        reward.percent = parseInt(productReward.reward_percent);
                        reward.every_price = parseInt(productReward.reward_every_price);
                    }
                    _self.consoleLog("getProductReward : reward", reward);
                    callback(reward);
                },
                getPointConfig: function(now, shopPointConfig, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (shopPointConfig.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(shopPointConfig.er_from);
                        reward.lifetime_end_time = parseInt(shopPointConfig.er_to);
                        reward.type_id = "100";
                        reward.amount = parseInt(shopPointConfig.er_earn);
                        reward.every_price = parseInt(shopPointConfig.er_rate);
                    }
                    _self.consoleLog("getPointConfig : reward", reward);
                    callback(reward);
                },
                checkPointReward: function(reward, callback) {
                    var _self = this;
                    var state = false;
                    if (reward.reward_length) {
                        var start = reward.lifetime_start_time < reward.lifetime_time && reward.lifetime_start_time != 0;
                        var end = (reward.lifetime_end_time != -1) ? reward.lifetime_time <= reward.lifetime_end_time && reward.lifetime_end_time != 0 : true;
                        if (start && end) {
                            if (reward.type_id == "100") {
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            } else if (reward.type_id == "101") {
                                var amount = reward.amount != 0;
                                if (amount) {
                                    state = true;
                                }
                            } else if (reward.type_id == "102") {
                                var percent = reward.percent != 0;
                                if (percent) {
                                    state = true;
                                }
                            } else if (reward.type_id == "103") {
                                var percent = reward.percent != 0;
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            }
                        }
                    }
                    callback(state);
                },
                checkReward: function(rewardProduct, rewardPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("checkReward : rewardProduct", rewardProduct);
                    _self.consoleLog("checkReward : rewardPointConfig", rewardPointConfig);
                    var reward = {
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    _self.checkPointReward(rewardProduct, function(res_state_product) {
                        _self.checkPointReward(rewardPointConfig, function(res_state_point_config) {
                            if (res_state_point_config) {
                                reward.type_id = rewardPointConfig.type_id;
                                reward.type_id = rewardPointConfig.type_id;
                                reward.amount = rewardPointConfig.amount;
                                reward.percent = rewardPointConfig.percent;
                                reward.every_price = rewardPointConfig.every_price;
                            } else if (res_state_product) {
                                reward.type_id = rewardProduct.type_id;
                                reward.amount = rewardProduct.amount;
                                reward.percent = rewardProduct.percent;
                                reward.every_price = rewardProduct.every_price;
                            }
                            _self.consoleLog("checkReward : reward", reward);
                            callback(reward);
                        });
                    });
                },
                checkRewardType: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.momentUnix(function(now) {
                        _self.getProductReward(now, productReward, function(res_reward_product) {
                            _self.getPointConfig(now, shopPointConfig, function(res_reward_point_config) {
                                _self.checkReward(res_reward_product, res_reward_point_config, function(res_reward) {
                                    callback(res_reward);
                                });
                            });
                        });
                    });
                },
                createReward: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("createReward : productReward", productReward);
                    _self.consoleLog("createReward : shopPointConfig", shopPointConfig);
                    _self.checkRewardType(productReward, shopPointConfig, function(res_reward) {
                        _self.consoleLog("createReward : res_reward", res_reward);
                        callback(res_reward);
                    });
                }
            }
            return getFunction;
        };
        $scope.getQuantity = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                upDateReward: function() {
                    var _self = this;
                },
                upDateReward: function() {
                    var _self = this;
                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                        $scope.data.reward.point_reward = res_point_reward;
                    });
                },
                upDatePrice: function() {
                    var _self = this;
                    var product_price = $scope.data.product_price.price * $scope.data.quantity.quantity_input;
                    var product_compare_price = $scope.data.product_compare_price.price * $scope.data.quantity.quantity_input;
                    $scope.getAttribute().checkPrice(product_price, function(res_price_ecimals) {
                        $scope.data.sum_product_price.price = product_price;
                        $scope.data.sum_product_price.price_ecimals = res_price_ecimals;
                        $scope.getAttribute().checkPrice(product_compare_price, function(res_compare_price_ecimals) {
                            $scope.data.sum_product_compare_price.price = product_compare_price;
                            $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                            var compare_price_minus_price = ((product_compare_price - product_price) > 0) ? product_compare_price - product_price : 0;
                            $scope.getAttribute().checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                _self.upDateReward();
                            });
                        });
                    });
                },
                input: function(quantityInput) {
                    var _self = this;
                    quantityInput = (quantityInput == null) ? 1 : parseInt(quantityInput);
                    _self.consoleLog("input : quantityInput", quantityInput);
                    if (quantityInput != null) {
                        if (quantityInput >= $scope.data.quantity.quantity_max) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_max;
                        }
                        if (quantityInput <= $scope.data.quantity.quantity_min) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                        }
                    } else {
                        $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                    }
                    _self.upDatePrice();
                },
                minus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input - 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_min", $scope.data.quantity.quantity_min);
                    if (quantity >= $scope.data.quantity.quantity_min) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                },
                plus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input + 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_max", $scope.data.quantity.quantity_max);
                    if (quantity <= $scope.data.quantity.quantity_max) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                }
            }
            return getFunction;
        };
        $scope.getBuy = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = params.product_id.split("-", 1).join("");
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                postApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.post(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                UiCartProductAdd: function(productId, quantityInput, promotionId, customOptions, callback) {
                    quantityInput = (quantityInput > $scope.data.quantity.quantity_max) ? $scope.data.quantity.quantity_max : quantityInput;
                    UiCart.delegate.product.add(productId, quantityInput, promotionId, function(res_data) {
                        callback(res_data);
                    });
                },
                isLogin: function(callback) {
                    var buy_login = $scope._buylogin;
                    var is_login = UiCustomerBox.delegate.get.isLogin();
                    var is_state = (buy_login) ? (!is_login) ? true : false : false;
                    callback(is_state);
                },
                formLogin: function(is_state, callback) {
                    if (is_state) {
                        $inloginPopup.open();
                    }
                    callback(is_state);
                },
                getProductStaffId(staff_id_check, callback) {
                    var res_staff_id_check = staff_id_check;
                    var res_staff_id = $scope.dataApi.product.dataArray.product_staff_id;
                    var res_is_state = (res_staff_id != 0 && res_staff_id != '0' && res_staff_id != undefined) ? true : false;
                    callback(res_staff_id_check, res_staff_id, res_is_state);
                },
                isStaffId: function(staff_id_check, callback) { /* todo */
                    var _self = this;
                    _self.getProductStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        callback(res_staff_id_check, res_staff_id, res_is_state);
                    });
                },
                checkCartDuplicateStaff: function(res_staff_id_check, txt_staff_id, res_is_state, callback) {
                    var _self = this
                    var res_is_state = true;
                    if (res_staff_id_check) {
                        var dataSend = {
                            'txt_staff_id': txt_staff_id,
                        };
                        _self.dataSend("cart/duplicate_staff", dataSend, function(res_api, res_dataSend) {
                            _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                                res_is_state = res_api.data.duplicate;
                                callback(res_is_state);
                            });
                        });
                    } else {
                        callback(res_is_state);
                    }
                },
                showAlert: function(res_staff_id_check, res_staff_id, res_is_state, res_api, callback) {
                    var res_state = (res_staff_id_check) ? ((res_api) ? ((res_is_state) ? false : true) : true) : false;
                    if (res_state) {
                        if (!res_api) {
                            if (res_staff_id != '0' && res_staff_id != 0) {
                                $scope.controlAlert().alert('002');
                            } else {
                                $scope.controlAlert().alert('003');
                            }
                        } else {
                            if (!res_is_state) {
                                $scope.controlAlert().alert('003');
                            }
                        }
                    }
                    callback(res_state);
                },
                checkStaff: function(callback) {
                    var _self = this
                    var staff_id_check = $scope._checkstaff;
                    var res_check = false;
                    _self.isStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        _self.checkCartDuplicateStaff(res_staff_id_check, res_staff_id, res_is_state, function(res_api) {
                            _self.showAlert(res_staff_id_check, res_staff_id, res_is_state, res_api, function(res_state) {
                                res_check = res_state;
                                callback(res_check);
                            });
                        });
                    });
                },
                isProgress: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isProgress(productId)) ? true : false;
                    _self.consoleLog("isProgress : productId", productId);
                    _self.consoleLog("isProgress : state", state);
                    callback(state);
                },
                isSelected: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    _self.consoleLog("isSelected : productId", productId);
                    _self.consoleLog("isSelected : state", state);
                    callback(state);
                },
                isSelectedReturn: function(productId) {
                    var _self = this;
                    var ui_cart_state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    if (!$scope.setBuy.state_active) {
                        $scope.setBuy.state_active = true;
                        var state_process = $scope.setBuy.state_process;
                        var state_step = $scope.setBuy.state_step;
                        if (ui_cart_state && !state_process && state_step != 4) /* cart */ {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_active = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else if (!ui_cart_state && !state_process && state_step != 0) /* unset */ {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_active = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        } else {
                            $scope.setBuy.state_active = false;
                        }
                    }
                    return ui_cart_state;
                },
                updateState: function(productId) {
                    _self = this;
                    _self.isSelected(productId, function(res_state) {
                        if (res_state) {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_process = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        }
                        return res_state;
                    });
                },
                uiCart: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    _self.UiCartProductAdd(productId, quantityInput, promotionId, customOptions, function(res_data) {
                        if (res_data) {
                            _self.onTimeout(500, function() {
                                _self.onPass(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            }
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onError(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onUnset(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                        });
                                    });
                                });
                            });
                        }
                    });
                },
                postApiA: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    var custom_options = {};
                    var dataSend = {
                        'txt_product_id': productId,
                        'txt_amount': quantityInput,
                        'txt_is_clear_cart_before': "0",
                        'txt_custom_options_json': JSON.stringify(custom_options)
                    };
                    _self.dataSend("cart/product_add", dataSend, function(res_api, res_dataSend) {
                        _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                            if (res_ok) {
                                _self.onTimeout(500, function() {
                                    _self.onPass(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onCart(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            });
                                        });
                                    });
                                });
                            } else {
                                _self.onTimeout(500, function() {
                                    _self.onError(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onUnset(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                            });
                                        });
                                    });
                                });
                            }
                        });
                    });
                },
                onProcess: function(data, productId, quantityInput, promotionId, customOptions) {
                    var _self = this;
                    _self.isLogin(function(res_is_login) {
                        _self.formLogin(res_is_login, function(res_form) {
                            _self.checkStaff(function(res_is_state) {
                                if (!$scope.setBuy.state_process && !res_form && !res_is_state) {
                                    $scope.setBuy.state_process = true;
                                    _self.isSelected(productId, function(res_state) {
                                        if (!res_state) {
                                            _self.onLoad($scope.setBuy.state_step, function(res_step) {
                                                if (data.sum_product_price.price != 0 && data.quantity.quantity_max != 0 && (data.attribute.state == (data.attribute.productId != ''))) {
                                                    /* UiCart */
                                                    _self.uiCart(productId, quantityInput, promotionId, customOptions, res_step);
                                                    /* api post offline */
                                                    /*_self.postApiA(productId, quantityInput, promotionId, customOptions, res_step); */
                                                } else {
                                                    _self.onTimeout(500, function() {
                                                        _self.onError(res_step, function(res_step) {
                                                            _self.onTimeout(1000, function() {
                                                                _self.onUnset(res_step, function(res_step) {
                                                                    $scope.setBuy.state_process = false;
                                                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                                                });
                                                            });
                                                        });
                                                    });
                                                }
                                            });
                                        } else {
                                            $scope.setBuy.state_process = false;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            } else if ($scope._cart == "viewcart") {
                                                _self.viewCart($scope._cart);
                                            }
                                        }
                                    });
                                }
                            });
                        });
                    });
                },
                onTimeout: function(time, callback) {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        callback(true)
                    }, time);
                },
                onUnset: function(step, callback) {
                    var _self = this;
                    step = (step == 0) ? 0 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onLoad: function(step, callback) {
                    var _self = this;
                    step = (step == 0 || step == 1) ? 1 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onPass: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 2) ? 2 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onError: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 3) ? 3 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onCart: function(step, callback) {
                    var _self = this;
                    step = (step == 2 || step == 4) ? 4 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                trumpComponentCarts: function() {
                    var controlCart = share.getTrumpComponentCarts();
                    var component_carts = $('.cover-cards').hasClass('active');
                    if (!component_carts) {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.cart();
                        }
                    } else {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.load();
                        }
                    }
                },
                viewCart: function(viewcart) {
                    var _self = this;
                    _self.pageUrl(viewcart);
                },
                locationUrlReplace: function(page) {
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                main: function(callback) {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getDetail = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getDetail: function(api, callback) {
                    var _self = this;
                    var description = api.product_description;
                    var info = api.product_more_info;
                    var specificatio = [];
                    if (api.product_attribute.specification_data != undefined) {
                        specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? api.product_attribute.specification_data.pclass_array : [];
                    }
                    var state_specificatio = false;
                    if (api.product_attribute.specification_data != undefined) {
                        state_specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? true : false;
                    }
                    var state_info = (api.product_is_more_info == 1) ? true : false;
                    _self.consoleLog("getDetail : description", description);
                    _self.consoleLog("getDetail : info", info);
                    _self.consoleLog("getDetail : state_info", state_info);
                    _self.consoleLog("getDetail : specificatio", specificatio);
                    _self.consoleLog("getDetail : state_specificatio", state_specificatio);
                    callback(description, info, state_info, specificatio, state_specificatio);
                },
                onClickDetail: function(index) {
                    var _self = this;
                    $scope.data.detail.active = index;
                    _self.consoleLog("onClickDetail : data.detail.active", $scope.data.detail.active);
                }
            }
            return getFunction;
        };
        $scope.pages = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageName: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page_name);
                },
                pageUrl: function(page_name, id, name_url) {
                    var _self = this;
                    var page = page_name + "/" + id + "-" + name_url;
                    _self.locationUrlReplace(page);
                }
            }
            return getFunction;
        };
        $scope.countDown = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getLocation: function(callback) {
                    var _self = this;
                    var res_location = $location;
                    _self.consoleLog("getLocation", "res_location", res_location);
                    callback(res_location);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(params);
                },
                getLocationUrlNameProductDetail: function(callback) {
                    var _self = this;
                    _self.getRouteParams(function(res_params) {
                        _self.getLocation(function(res_location) {
                            var url_page_name = "/product-detail/" + res_params.product_id;
                            var res_url_name_product_detail = (res_location.url() == url_page_name) ? true : false;
                            _self.consoleLog("getLocationUrlNameProductDeal", "res_url_name_product_detail", res_url_name_product_detail);
                            callback(res_url_name_product_detail);
                        });
                    });
                },
                getUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    _self.consoleLog("getUnix", "now", now);
                    callback(now);
                },
                getCountDown: function(now, product_lifetime, callback) {
                    var _self = this;
                    var countdown_unix = parseInt(product_lifetime.lifetime_end_time) - now;
                    var milliseconds = moment.duration(countdown_unix * 1000, "milliseconds");
                    var res_countdown = ((milliseconds.days() <= 9) ? '0' + milliseconds.days() : milliseconds.days());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.hours() <= 9) ? '0' + milliseconds.hours() : milliseconds.hours());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.minutes() <= 9) ? '0' + milliseconds.minutes() : milliseconds.minutes());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.seconds() <= 9) ? '0' + milliseconds.seconds() : milliseconds.seconds());
                    _self.consoleLog("getCountDown", "res_countdown", res_countdown);
                    callback(res_countdown, countdown_unix);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                countDownByProduct: function(now, data_array, callback) {
                    var _self = this;
                    if (data_array.length != 0) {
                        if (data_array.product_lifetime.length != 0) {
                            _self.getCountDown(now, data_array.product_lifetime, function(res_count_down, res_countdown_unix) {
                                data_array.product_lifetime.lifetime_countdown = (res_countdown_unix > 0) ? res_count_down : "";
                                if (data_array.product_lifetime.lifetime_countdown == "") {
                                    _self.getNameUrl(data_array.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", data_array.product_set_array[0].product_id, res_name);
                                    });
                                }
                            });
                        }
                    }
                    _self.consoleLog("countDownByProduct", "data_array", data_array);
                    callback(data_array);
                },
                loop: function() {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        _self.getUnix(function(res_now) {
                            _self.countDownByProduct(res_now, $scope.dataApi.product.dataArray, function(data_array) {
                                $scope.dataApi.product.dataArray = data_array;
                                _self.getLocationUrlNameProductDetail(function(res_url_name_product_detail) {
                                    if (res_url_name_product_detail) {
                                        _self.loop();
                                    }
                                });
                            });
                        });
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.getPromotion = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                setPromotionId: function(promotion_id) {
                    var _self = this;
                    _self.consoleLog("setPromotionId", "promotion_id", promotion_id);
                    $scope.data.promotion.promotion_id = promotion_id;
                    _self.consoleLog("setPromotionId", "data.promotion.promotion_id", $scope.data.promotion.promotion_id);
                },
            }
            return getFunction;
        };
        $scope.control = function() {
            var getFunction = {
                popupVideo: function(state, video_link, video_embed_code) {
                    var _self = this;
                    if (video_embed_code != '') {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    } else if (video_link != '') {
                        window.open(video_link, '_blank');
                    } else {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.data_control = {
            page_video: {
                popup: false,
                shop_video_embed_code: ""
            }
        }
        $scope.control_alert = {
            alert: {
                error_id: '',
                index: null,
                state: true,
                error: [{
                    id: '001',
                    title: 'การสั่งซื้อ',
                    messages: 'สามารถสั่งซื้อได้เพียงทีละออเดอร์เท่านั้น'
                }, {
                    id: '002',
                    title: 'การเพิ่มสินค้า',
                    messages: 'ไม่สามารถเพิ่มสินค้าของร้านมากกว่า 1 ร้านค้าได้'
                }, {
                    id: '003',
                    title: 'การสั่งซื้อ',
                    messages: 'ไม่สามารถเพิ่มสินค้า(ไม่มีร้านค้า)'
                }]
            }
        };
        $scope.controlAlert = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getErrorMessages: function(error_id, callback) {
                    var _self = this;
                    var messages = {
                        res_error_id: '',
                        res_index: null
                    }
                    angular.forEach($scope.control_alert.alert.error, function(item, index) {
                        if (item.id == error_id) {
                            messages.res_error_id = item.id;
                            messages.res_index = index;
                        }
                    });
                    callback(messages.res_error_id, messages.res_index);
                },
                alert: function(error_id) {
                    var _self = this;
                    _self.getErrorMessages(error_id, function(res_error_id, res_index) {
                        $scope.control_alert.alert.error_id = res_error_id;
                        $scope.control_alert.alert.index = res_index;
                        $scope.control_alert.alert.state = (!$scope.control.alert && res_error_id != '') ? true : false;
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.countDown().loop();
        /* set carousel  */
        $scope.setCarousel = {
            carousel: 0,
            index: 0
        };
        $scope.getCarousel().getCarousel($scope.setCarousel.carousel, function(res_carousel_id) {
            $scope.setCarousel.carousel = res_carousel_id;
        });
        /* set carousel  */
        /* get product api */
        $scope.dataApi = {
            reward: {
                dataSend: {},
                api: "shop/current",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            staff: {
                dataSend: {
                    txt_staff_id: 0
                },
                api: "staff/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            product: {
                dataSend: {
                    txt_product_id: 0
                },
                api: "product/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            relation: {
                dataSend: {
                    txt_referral_id: 0
                },
                api: "referral/relation",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.data = {
            attribute: {
                state: false,
                productId: "",
                dataArray: []
            },
            attribute_custom: {
                state: false,
                dataArray: []
            },
            reward: {
                quantity_name: 'reward',
                type_id: "0",
                reward_amount: 0,
                reward_percent: 0,
                reward_every_price: 0,
                point_reward: 0
            },
            quantity: {
                quantity_name: 'quantity',
                quantity_min: 1,
                quantity_max: 1,
                quantity_input: 1,
                quantity_select: []
            },
            product_price: {
                price_name: 'product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            product_compare_price: {
                price_name: 'product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_price: {
                price_name: 'sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_price: {
                price_name: 'sum_product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_minus_sum_product_price: {
                price_name: 'sum_product_compare_minus_sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            detail: {
                active: '0',
                dataArray: [{
                    index: '0',
                    state: true,
                    en: ($scope.description != undefined && $scope.description != "") ? $scope.description : 'Description',
                    th: 'ภาพรวม',
                    data: '',
                    dataArray: []
                }, {
                    index: '1',
                    state: true,
                    en: ($scope.info != undefined && $scope.info != "") ? $scope.info : 'Info',
                    th: 'ข้อมูล',
                    data: '',
                    dataArray: []
                }, {
                    index: '2',
                    state: true,
                    en: ($scope.specification != undefined && $scope.specification != "") ? $scope.specification : 'Specification',
                    th: 'สเปค',
                    data: '',
                    dataArray: []
                }, {
                    index: '3',
                    state: true,
                    en: '',
                    th: 'คลังรูปภาพ/วิดีโอ',
                    data: '',
                    dataArray: []
                }, {
                    index: '4',
                    state: true,
                    en: '',
                    th: 'พูดคุยผู้ใช้',
                    data: '',
                    dataArray: []
                }]
            },
            promotion : {
                promotion_id : '0'
            }
        };
        $scope.setBuy = {
            state_active: false,
            state_process: false,
            state_step: 0,
            state_data_font_color: "",
            state_data_background_color: "",
            stepArray: [{
                step: 0,
                name: "unset",
                icon: $scope._icebuyicon,
                state: $scope._buytext,
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 1,
                name: "load",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 2,
                name: "pass",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 3,
                name: "error",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 4,
                name: "cart",
                icon: "",
                state: $scope._viewcarttext,
                data_font_color: "",
                data_background_color: "primary_darkest"
            }]
        };
        /* - get api product/id start - */
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.product.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                $scope.dataApi.product.dataSend.txt_product_id = (res_product_id != false) ? res_product_id : 0;
                $scope.getData().dataSend($scope.dataApi.product.api, $scope.dataApi.product.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_product, res_state) {
                        $scope.dataApi.product.ok = res_ok;
                        if ($scope._imageappcoverchecked) {
                            var images = [];
                            angular.forEach(get_res_api_product.data.product_image,function(image,index_image){
                                if (!image.image_app_cover_checked) {
                                    images.push(image)
                                }
                            });
                            get_res_api_product.data.product_image = images;
                        }
                        $scope.dataApi.product.dataArray = get_res_api_product.data;
                        $scope.getData().consoleLog("get_res_api_product", get_res_api_product);
                        $scope.dataApi.product.dataArrayState = res_state;
                        /* -- get api shop/current to reward -- */
                        if (res_ok) {
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.reward.dataArrayState = res_state;
                                $scope.getData().dataSend($scope.dataApi.reward.api, $scope.dataApi.reward.dataSend, function(res_api, res_dataSend) {
                                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                                        $scope.dataApi.reward.ok = res_ok;
                                        $scope.dataApi.reward.dataArray = get_res_api_shop.data;
                                        $scope.dataApi.reward.dataArrayState = res_state;
                                        $scope.getReward().createReward($scope.dataApi.product.dataArray.product_reward, get_res_api_shop.data.shop_point_config, function(res_reward) {
                                            $scope.data.reward.type_id = res_reward.type_id;
                                            $scope.data.reward.reward_amount = res_reward.amount;
                                            $scope.data.reward.reward_percent = res_reward.percent;
                                            $scope.data.reward.reward_every_price = res_reward.every_price;
                                            /* --- Wait product/id ,shop/current --- */
                                            /* ---- get attribute ---- */
                                            $scope.getAttribute().productAttribute(get_res_api_product.data.product_attribute, function(res_attribute) {
                                                $scope.data.attribute.dataArray = res_attribute;
                                                $scope.getAttribute().checkMinPrices(get_res_api_product, res_attribute, function(res_data_price, res_state) {
                                                    $scope.data.attribute.state = res_state;
                                                    $scope.data.product_price = res_data_price.product_price;
                                                    $scope.data.product_compare_price = res_data_price.product_compare_price;
                                                    $scope.data.sum_product_price = res_data_price.sum_product_price;
                                                    $scope.data.sum_product_compare_price = res_data_price.sum_product_compare_price;
                                                    $scope.data.sum_product_compare_minus_sum_product_price = res_data_price.sum_product_compare_minus_sum_product_price;
                                                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                                                        $scope.data.reward.point_reward = res_point_reward;
                                                    });
                                                    /* ----- stock ----- */
                                                    $scope.data.quantity.quantity_max = res_data_price.product_price.total_stock;
                                                    $scope.data.quantity.quantity_select = [];
                                                    for (var i = 0; i < res_data_price.product_price.total_stock; i++) {
                                                        $scope.data.quantity.quantity_select.push(i + 1);
                                                    }
                                                    /* ----- stock ----- */
                                                });
                                            });
                                            /* ---- get attribute ---- */
                                            /* ---- get attribute custom ---- */
                                            $scope.getAttributeCustom().createArray(get_res_api_product.data.product_custom_templates, function(res_custom_attribute, res_state) {
                                                $scope.data.attribute_custom.state = res_state;
                                                $scope.data.attribute_custom.dataArray = res_custom_attribute;
                                            });
                                            /* ---- get attribute custom ---- */
                                            /* ---- get detail ---- */
                                            $scope.getDetail().getDetail(get_res_api_product.data, function(res_description, res_info, res_state_info, res_specificatio, res_state_specificatio) {
                                                $scope.data.detail.dataArray[0].data = res_description;
                                                $scope.data.detail.dataArray[1].data = res_info;
                                                $scope.data.detail.dataArray[1].state = res_state_info;
                                                $scope.data.detail.dataArray[2].dataArray = res_specificatio;
                                                $scope.data.detail.dataArray[2].state = res_state_specificatio;
                                            });
                                            /* ---- get detail ---- */
                                            /* ---- update state ---- */
                                            $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                                            /* ---- update state ---- */
                                            /* --- Wait product/id ,shop/current --- */
                                        });
                                    });
                                });
                            });
                            /* -- get api shop/current to reward -- */
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.relation.dataArrayState = res_state;
                                $scope.getData().getReferralId(get_res_api_product.data.product_referral_display, function(res_referral_id) {
                                    $scope.dataApi.relation.dataSend.txt_referral_id = res_referral_id;
                                    $scope.getData().dataSend($scope.dataApi.relation.api, $scope.dataApi.relation.dataSend, function(res_api, res_dataSend) {
                                        $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_referral, res_state) {
                                            $scope.dataApi.relation.ok = res_ok;
                                            $scope.dataApi.relation.dataArray = (res_referral_id != 0) ? get_res_api_referral.data : [];
                                            $scope.dataApi.relation.dataArrayState = res_state;
                                        });
                                    });
                                });
                            });
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.getData().getStaffId(get_res_api_product.data.product_staff_id, function(res_staff) {
                                    if (res_staff.status) {
                                        $scope.dataApi.staff.dataArrayState = res_state;
                                        $scope.dataApi.staff.dataSend.txt_staff_id = res_staff.staff_id;
                                        $scope.getData().dataSend($scope.dataApi.staff.api, $scope.dataApi.staff.dataSend, function(res_api, res_dataSend) {
                                            $scope.getData().getApi(res_api, res_dataSend, function(res_ok, res, res_state) {
                                                $scope.dataApi.staff.ok = res_ok;
                                                $scope.dataApi.staff.dataArray = res.data;
                                                $scope.getData().getNameUrl(res.data.staff_first_name, function(res_staff_first_name_url) {
                                                    $scope.dataApi.staff.dataArray.staff_first_name_url = res_staff_first_name_url;
                                                    $scope.dataApi.staff.dataArrayState = res_state;
                                                });
                                            });
                                        });
                                    }
                                });
                            });
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                        } else {
                            /* ok = false */
                            if ($scope.dataApi.product.dataArray.length != 0) {
                                /* product deal to product original */
                                if ($scope.dataApi.product.dataArray.product_set_array.length != 0) {
                                    $scope.countDown().getNameUrl($scope.dataApi.product.dataArray.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", $scope.dataApi.product.dataArray.product_set_array[0].product_id, res_name);
                                    });
                                } else {
                                    $scope.pages().pageName("home");
                                }
                            } else {
                                /* product null */
                                $scope.pages().pageName("home");
                            }
                        }
                    });
                });
            });
        });
        /* - get api product/id end - */
        /* get product api */
    };
    return promise;
});_ui_share_app.directive('productDetailPageX', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageX';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_host + templateName + '/';
        $scope.qtyProduct = 1;
        $scope.data = false;
        $scope.dataPreserve = false;
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;         
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        var dataSend = {
            'txt_product_id': $scope._getPostIdFromURL(),
        };
        if (CUR_THEME.shop_id() == "541") {
            $http.get("https://zoomcamera.getappeasy.com/store/api/v1/product/id", {
                params: dataSend
            }).then(function(res) {
                var e = res.data;
                if (e.ok == 1) {
                    console.log("product_set_array : data", e.data);
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope._getSupportDataCategory('category', e.data);
                    $scope.buildDataProductRelate($scope._getPostIdFromURL());
                    console.log("product_set_array : data", e.data);
                    if (typeof $scope.data.product_attribute.option_data !== 'undefined' && $scope.data.product_total_variant > 0) {
                        if (typeof $scope.data.product_attribute.option_data.pclass_array !== 'undefined' && $scope.data.product_attribute.option_data.pclass_array.length) {
                            $scope.buildVariantOption(e.data);
                        }
                    }
                    if (res.data.product_attribute.length != 0) {
                        $scope.buildMultipleQuantity(res.data);
                    }
                }
            });
        } else {
            $componentProductDetail.get('product/id', {
                'txt_product_id': $scope._getPostIdFromURL()
            }, function(e) {
                if (e.ok == 1) {
                    $scope.data = e.data;
                    $scope.dataPreserve = e.data;
                    $scope._getSupportDataCategory('category', e.data);
                    $scope.buildDataProductRelate($scope._getPostIdFromURL());
                    if (typeof $scope.data.product_attribute.option_data !== 'undefined' && $scope.data.product_total_variant > 0) {
                        if (typeof $scope.data.product_attribute.option_data.pclass_array !== 'undefined' && $scope.data.product_attribute.option_data.pclass_array.length) {
                            $scope.buildVariantOption(e.data);
                        }
                    }
                    if (e.data.product_attribute.length != 0) {
                        $scope.buildMultipleQuantity(e.data);
                    }
                }
            });
        }
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [],
                p = productObj.product_attribute.option_data.variant_array;
            for (var i = 0; i < p.length; i++) {
                if (p[i].status == 1 && p[i].status == 1) {
                    $scope.productQuantityMultiArray.push({
                        v_key: p[i].variant_key,
                        v_name: p[i].option_name_array[0],
                        v_qty: 1,
                        v_active: 0
                    });
                }
            }
        };
        $scope.currentOptionQtyPick = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            return e.val();
        };
        $scope.dataRelate = [];
        $scope.buildDataProductRelate = function(product_id) {
            var j = {
                'relate_product_id_array': [product_id],
                'badge_id_array': [18]
            };
            var d = {
                'cur_page': 1,
                'per_page': 8,
                'txt_filter_json': JSON.stringify(j)
            };
            GAEAPI.get('product/lists', d).then(function(e) {
                if (e.ok == 1) {
                    var d = [];
                    angular.forEach(e.data.dataList, function(item) {
                        if (item.product_id !== $scope.data.product_id) {
                            d.push(item);
                        }
                    });
                    $scope.dataRelate = d;
                }
            });
        };
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            $scope.buildDataProductRelate($scope._getPostIdFromURL());
            if (objectData.product_total_variant <= 0) {
                /*return;*/
            }
            if (typeof $scope.data.product_attribute.option_data !== 'undefined' && $scope.data.product_total_variant > 0) {
                if (typeof $scope.data.product_attribute.option_data.pclass_array !== 'undefined' && $scope.data.product_attribute.option_data.pclass_array.length) {
                    $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
                    $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
                }
            }
        };
        $scope.ifOptionUnSelect = function() {
            return ($('.d_qty_price.active.inin').length > 0) ? true : false;
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $('.d_qty_not_result').removeClass("active");
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            if ($index == 0 && option_id == '') {
                
                return $componentProductDetail.get('product/id', {
                    'txt_product_id': $scope._getPostIdFromURL()
                }, function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                    $scope.findVariantsData($scope.dataVariantsPick);
                }
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope.data.product_id = dataVariants[i].product_id;
                    $scope.data.product_sku = dataVariants[i].sku;
                    $scope.data.product_price = dataVariants[i].price;
                    $scope.data.product_compare_price = dataVariants[i].compare_price;
                    $scope.switchQuantityByKey('-' + variantsPick.join('-') + '-');
                    break;
                }
            }
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $rootScope.$on('repeatend', function() {
            /* Slider Send */
            var optionsParmas = {
                autoplay: true,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                infinite: true
            };
            var extraOptions = {
                animate: false
            };
            $timeout(function() {
                sliderProvider("#gallery_slider", optionsParmas, "", "", extraOptions);
            }, 500);
        });
        /* Slick Events */
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('#gallery_slider').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('#gallery_slider').slick('slickNext');
            }, 100);
        };
        /* Click SLick Item */
        $scope.slickGoto = function(idx) {
            $timeout(function() {
                $('#gallery_slider').slick('slickGoTo', idx);
            }, 100);
        };
        /* Calcu Nav Arrows */
        $scope.navArrowsCalculate = function() {
            var size = (500 / 2);
            var n = (size + 18) + 20;
            return '-' + n + 'px';
        };
        $scope.navArrowWidth = function() {
            return $('#gallery_slider').width() + 'px';
        };
        /* Build title for Address link*/
        $scope.buildTitleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
        /* Calculate discount (simple mode)
         * @params {expensivePrice}
         * @params {salePrice}
         * @return int
         */
        $scope.calculateDiscount = function(expensivePrice, salePrice) {
            var dif = expensivePrice - salePrice;
            return parseInt(dif * 100 / expensivePrice);
        };
        $scope.support_data = {
            category: [],
        };
        $scope._getSupportDataCategory = function(type, data) {
            var dataSend = {
                'txt_referral_id': data.product_referral_display.category[0].referral_id
            };
            GAEAPI.get('referral/relation', dataSend).then(function(e) {
                if (e.ok == 1) {
                    $scope.support_data.category = e.data;
                }
            });
        };
        /* Optimize image size by device pixel 
         * @params {size} (integer) prefer size
         * @params {image_url} (string) original image source link
         * @params {image_width} (string) original image width
         * @return string
         */
        $scope.viewOptimizeImage = function(size, image_url, image_width) {
            if (window.devicePixelRatio >= 2 || parseInt(image_width) <= size) {
                return image_url;
            }
            var a = image_url.split("/"),
                b = a[a.length - 1];
            a[a.length - 1] = 't' + size + '_' + b;
            return a.join("/");
        };
        /* Hide when visible badge */
        $scope.exceptVisibleBadge = function(objectItem) {
            var r = parseInt(objectItem.badge_id);
            var s = false;
            switch (r) {
                case 16:
                case 72:
                case 74:
                case 75:
                    s = true;
                    break;
                default:
                    s = false;
                    break;
            }
            return s;
        };
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.invited = [];
        $scope.insertinvited = function(user) {
            if (user) {
                if (user.product_attribute.length != 0) {
                    if ($scope.invited[0] == user.product_id) {
                        return;
                    }
                    $scope.invited.push(user.product_id);
                } else {
                    alert("item can't compare");
                }
            } else {                
                console.log("test_array :", $scope.invited);
            }
        };
        /* Display Badge Name */
        $scope.renderBadgeType = function(objectItem) {
            var r = parseInt(objectItem.badge_id);
            var str = 'No Badge';
            switch (r) {
                case 16:
                    str = "FEATURED";
                    break;
                case 72:
                    str = "NEW";
                    break;
                case 74:
                    str = "RECOMMEND";
                    break;
                case 75:
                    str = "BEST SELLER";
                    break;
                case 82:
                    str = "NEW (App)";
                    break;
                case 83:
                    str = "RECOMMEND (App)";
                    break;
                case 84:
                    str = "BEST SELLER (App)";
                    break;
            }
            return str;
        };
        $scope.renderBadgeTypeImg = function() {
            var returnData = false;
            if (CUR_THEME.shop_id() == "717") {
                returnData = true;
            } else {
                returnData = false;
            }
            return returnData;
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageXa', function($rootScope, $routeParams, sliderProvider, $componentProductDetail, $location) {
    var templateName = 'productDetailPageXa';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
        imgcart: '@imgcart',
        view: '@viewcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        if ($scope.imgcart != undefined) {
            $scope.setimg_cart = $scope.icnPath + $scope.imgcart;
        }
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            var tag = {
                'tags': product_tag
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(tag)
            };
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    /*if ($scope._dataArray.product_hightlight_video_embed != "") {
                        $scope._dataArray.product_image.unshift({
                            image_url: $scope.imgPath + 'img-play.png',
                            product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                        });
                    }*/
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags);
                    $scope.buildVariantOption(res.data);
                    if (res.data.product_attribute.length != 0) {
                        $scope.buildMultipleQuantity(res.data);
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '#gallery_slider[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope.viewQuantity = function() {
            return $(".d_qty.active.inin").find('input').val() || 1;
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.onSelectVariantItems(0, '');
        };
        $scope.dataVariantsPick = [];
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx, obj) {
                    var optionElementFirst = $(this).find('option[data-index="' + idx + '"]').eq(0);
                    optionElementFirst.prop("selected", true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var _self = dataVariants[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope.switchQuantityByKey('-' + variantsPick.join('-') + '-');
                    console.log("selectedOptionTextJson: option", _self);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope._dataArray.product_image.length; im++) {
                            if ($scope._dataArray.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope._slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.gallery-thumbnail .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                }
            }
        };
        $scope.data_viewTab = 1;
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope.currentOptionQtyPick = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            return e.val();
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [],
                p = productObj.product_attribute.option_data.variant_array;
            for (var i = 0; i < p.length; i++) {
                if (p[i].status == 1 && p[i].status == 1) {
                    $scope.productQuantityMultiArray.push({
                        v_key: p[i].variant_key,
                        v_name: p[i].option_name_array[0],
                        v_qty: 1,
                        v_active: 0
                    });
                }
            }
        };
        $scope.dataVariantsPick = [];
        $scope.electric = [];
        $scope.testyuyu = 0;
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.testyuyu = 0;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._idUrl($scope._viewRouteParams().product_id)
                }).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    $scope.testyuyu = 0;
                    $('.d_qty_not_result').removeClass("active");
                    $scope.findVariantsData($scope.dataVariantsPick);
                } else {
                    $scope.testyuyu = 0;
                    $('.d_qty').removeClass('active').removeClass('inin');
                    $('.d_qty_price').removeClass("active");
                    $('.d_qty_price').removeClass("inin");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric);
            }
        };
        $scope.ifOptionUnSelect = function() {
            return ($('.d_qty_price.active.inin').length > 0) ? true : false;
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("width", $(".cover_image_item").css("width"));
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.newLoginregister = function(name) {
            window.location.href = GURL.base_url() + name;
        };
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageZ', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageZ';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
        iconbuy: '@iconbuy',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.login = function() {
            var login = {
                showLogin: function() {
                    return UiCustomerBox.delegate.get.isLogin();
                },
                isLogin: function(callback) {
                    callback(UiCustomerBox.delegate.get.isLogin());
                },
                totalAmount: function() {
                    return UiCart.delegate.get.totalAmount() || 0;
                },
                pageLogin: function() {
                    var _self = this;
                    _self.isLogin(function(isLogin) {
                        if (!isLogin) {
                            $inloginPopupTypeGrip.open();
                        }
                    });
                }
            }
            return login;
        };
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope._dataArray_tag = [];
        $scope._dataArray = [];
        $scope.data_min = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.names = [];
        $scope.currentStock = 0;
        $scope.buildTitleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
        $scope.encodeURIComponentOut = function(str) {
            var output = encodeURIComponent(str);
            return output;
        };
        $scope.checkPrice = function(price) {
            var check_price = 0;
            var _price = (price != undefined && price != "" && price != null) ? price.toString() : "0";
            if (_price.includes(".")) {
                check_price = 2;
            }
            return check_price;
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend, $scope).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    /*if ($scope._dataArray.product_hightlight_video_embed != "") {
                        $scope._dataArray.product_image.unshift({
                            image_url: $scope.imgPath + 'img-play.png',
                            product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                        });
                    }*/
                    $('.gallery_container').css('height', '0');
                    $('.gallery_container').css('opacity', '0');
                    setTimeout(function() {
                        $('.gallery_container').css('height', 'auto');
                        $('.gallery_container').css('opacity', '1');
                    }, 2000);
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    /*if ($scope._dataArray.product_description == '') {
                        $scope._viewTab(2);
                    }*/
                    $scope.names = [];
                    if (res.data.product_total_variant == 0 && res.data.product_total_stock > 0) {
                        for (var i = 0; i < parseFloat(res.data.product_total_stock); i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    if (res.data.product_total_variant == 0 && res.data.product_total_stock < 0) {
                        for (var i = 0; i < 20; i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    if (res.data.product_total_variant > 0) {
                        for (var i = 0; i < 20; i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    if (res.data.product_attribute != undefined) {
                        if (res.data.product_attribute.option_data != undefined) {
                            if (res.data.product_attribute.option_data.variant_array != undefined) {
                                if (res.data.product_attribute.option_data.variant_array.length != 0) {
                                    var set_varia = res.data.product_attribute.option_data.variant_array[0].price;
                                    for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                        if (parseFloat(set_varia) >= parseFloat(res.data.product_attribute.option_data.variant_array[i].price)) {
                                            set_varia = res.data.product_attribute.option_data.variant_array[i].price;
                                            $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                        }
                                    }
                                    if ($scope.data_min.length == 0) {
                                        $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                                    }
                                }
                            }
                        }
                    }
                    $scope._dataArray_tag = res.data.product_tags.split(",");
                    $scope.buildMultipleQuantity(res.data);
                    $scope.buildVariantOption(res.data);
                    // $scope.builldRelateProduct(res.data);
                    $scope.currentStock = $scope._dataArray.product_total_stock;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.dataRelateProductArray = [];
        $scope.builldRelateProduct = function(dataObj) {
            console.log("_getDataArray", dataObj);
            var dataSend = {
                'cur_page': 1,
                'per_page': 5,
                'txt_filter_json': JSON.stringify({
                    "badge_id_array": [18],
                    "tags": dataObj.product_tags
                })
            };
            GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope.dataRelateProductArray = e.data.dataList;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVaraintsClick_Normal();
        };
        $scope.dataVariantsPick = [];
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onClickVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.nowMoment = moment().unix();
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope.saleprice = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.stateShow = false;
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var count = 0;
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                var _self = dataVariants[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope.data.product_total_stock = dataVariants[i].total_stock;
                    console.log("tasdasdasdasest if", $scope.data.product_total_stock);
                    $scope.names = [];
                    if (parseFloat($scope.data.product_total_stock) == 0) {
                        $scope.stateShow = false;
                        $scope.names = [1]; 
                    } else {
                        $scope.stateShow = true;
                        for (var i = 0; i < parseFloat($scope.data.product_total_stock); i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    console.log("selectedOptionTextJson: option", _self);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope.data.product_image.length; im++) {
                            if ($scope.data.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope.slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.gallery-thumbnail .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                } else {
                    console.log("tasdasdasdasest else", $scope.data.product_total_stock);
                    $scope.stateShow = false;
                }
                if (!compareArray(variantsPick, optionJson)) {                    
                    count++;              
                }                
                if (count >= dataVariants.length) { 
                    $scope._dataArray.product_id = dataVariants[i].product_id;                                       
                    console.log("optionJson : 0000 ", count, dataVariants[i].total_stock);  
                    $scope.names = [1];       
                    $scope.stateShow = false;                     
                }
            }
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("width", $(".cover_image_item").css("width"));
            /*$(".cover_image_item_md_lg").css("height", $(".cover_image_item_md_lg").css("width"));
            $(".gallery_display_md_lg").css("height", $(".cover_image_item_md_lg").css("width"));*/
            $("iframe").css("height", $(".cover_image_item_md_lg").css("width"));
            $("iframe").css("width", $(".cover_image_item_md_lg").css("width"));
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                /*$scope.returnheight();
                $scope.timeCountStart();*/
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.data_viewTab = '1';
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope.currentOptionQtyPick = function(variant_key) {
            if ($('#detail_qty[variant-key="' + variant_key + '"]').val() != undefined) {
                var e = parseFloat($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
            }
            return e;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('select[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('select[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            if ($('#detail_qty[variant-key="' + variant_key + '"]').val() != undefined) {
                $scope._data_qty_selected = parseFloat($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
            }
            console.log("_data_qty_selected", $scope._data_qty_selected);
            /* parseFloat(e.val());
            alert(i);onSelectVariantItems*/
            if ($scope._data_qty_selected <= 0 || typeof $scope._data_qty_selected == 'undefined' || isNaN($scope._data_qty_selected)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [];
            if (productObj.product_attribute.option_data != undefined && productObj.product_attribute.option_data.length > 0) {
                var p = productObj.product_attribute.option_data.variant_array;
                for (var i = 0; i < p.length; i++) {
                    if (p[i].status == 1 && p[i].status == 1) {
                        $scope.productQuantityMultiArray.push({
                            v_key: p[i].variant_key,
                            v_name: p[i].option_name_array[0],
                            v_qty: 1,
                            v_active: 0
                        });
                    }
                }
            }
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").find('select').val() != undefined) {
                check_int = parseFloat($(".d_qty").find('select').val().substr(7));
            }
            return check_int;
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.outofstock = 0;
        $scope.getOutofstock = function() {
            $scope.outofstock = 1;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.onSelectVariantItems(0, '');
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.names = [];
                for (var i = 0; i < 20; i++) {
                    $scope.names.push(i + 1);
                }
                $scope._dataArray.product_id = $scope._idUrl($scope._viewRouteParams().product_id);
                $scope._dataArray.product_price = $scope.data_min.price;
                $scope.testyuyu = 0;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.dsetting').addClass("active");
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._idUrl($routeParams.product_id)
                }, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                        console.log("check_vareian 103", $scope.testyuyu);
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    console.log("check_vareian 104", $scope.testyuyu);
                    $scope.testyuyu = 0;
                    $scope.findVariantsData($scope.dataVariantsPick);
                    $(".d_qty").find('select').val("number:1");
                } else {
                    console.log("check_vareian 105", $scope.testyuyu);
                    $scope.testyuyu = 0;
                    $(".d_qty").find('select').val("number:1");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric, $scope.testyuyu);
            }
            /*alert($scope.dataVariantsPick);*/
        };
        $scope.video_code = "";
        $scope.videoShow = function() {
            $scope.video_code = $scope._dataArray.product_hightlight_video_embed;
            $(".videoHighlightOverlay").addClass("active");
            console.log("videoShow");
        }
        $scope.videoHide = function() {
            $scope.video_code = '';
            $(".videoHighlightOverlay").removeClass("active");
            console.log("videoHide");
        }
        $scope.viewHide = function(arrayData, optionData) {
            var reTest = false;
            if (optionData == arrayData.length) {
                for (var i = 0; arrayData.length > i; i++) {
                    console.log("arrayData[i]", arrayData[i]);
                    if (!arrayData[i]) {
                        reTest = false;
                        break;
                    } else {
                        reTest = true;
                    }
                }
            }
            return reTest;
        }
        $scope.viewHideOp = function(arrayData, optionData) {
            var e = false;
            if (optionData == 0 && arrayData.length == 0) {
                e = true;
            }
            return e;
        }
        $scope.qtuC = function() {
            var e = 1;
            if ($(".d_qty").find('select').val() == "") {
                $(".d_qty").find('select').val("number:1");
                var e = 1;
            } else {
                var e = $(".d_qty").find('select').val();
            }
            return e;
        }
        $scope.buyC = function() {
            var e = false;
            if ($scope.dataOption.length == 0 && $scope.viewHide($scope.dataVariantsPick, $scope.dataOption.length) == false) {
                if ($scope.names.length == 0) {
                    e = false
                } else {
                    e = true;
                }
            } else if ($scope.dataOption.length > 0) {
                if ($scope.viewHide($scope.dataVariantsPick, $scope.dataOption.length) == true) {
                    if ($scope.stateShow == true) {
                        e = true;
                    }
                } else {
                    e = false;
                }
            }
            return e;
        }
        $scope.outOfStockShow = function() {
            var e = false;
            if ($scope.buyC() == true) {
                e = true;
            } else {
                if ($scope.names.length == 20) {
                    e = true;
                } else {
                    e = false;
                }
            }
            return e;
        }
    };
    return promise;
});_ui_share_app.directive('productDetailPageZa', function($rootScope, $routeParams, sliderProvider, $componentProductDetail) {
    var templateName = 'productDetailPageZa';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        buttonicon: '@buttonicon',
        buttontext: '@buttontext',
        stylebutton: '@stylebutton',
        promotelink: '@promotelink',
        id: '@id',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._stylebutton = ($scope.stylebutton == undefined || $scope.stylebutton == "") ? 'filled_button_round_small' : $scope.stylebutton;
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope.dataRelatetag = [];
        $scope.dataRelatetagState = {
            load: true,
            done: false
        };
        $scope.productRelateTag = function(product_tag) {
            $scope.dataRelatetagState = $scope.StateData(true, false);
            var tag = {
                'tags': product_tag
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 4,
                'txt_filter_json': JSON.stringify(tag)
            };
            console.log("dataSend :", dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                if (output.ok == 1) {
                    $scope.dataRelatetag = output.data.dataList;
                    console.log("dataSend :", output.data);
                }
                $scope.dataRelatetagState = $scope.StateData(false, true);
            });
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    /* add data video */
                    /*if ($scope._dataArray.product_hightlight_video_embed != "") {
                        $scope._dataArray.product_image.unshift({
                            image_url: $scope.imgPath + 'img-play.png',
                            product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                        });
                    }*/
                    /* add data video */
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    $scope.productRelateTag($scope._dataArray.product_tags);
                    $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope._data_qty_model = '1';
        $scope.viewQuantity = function() {
            /*return $(".d_qty.active.inin").find('input').val() || 1;*/
            return $( "#d_qty option:selected" ).text();
        };
        $scope.decreseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i > 1) {
                e.val(i - 1);
                $scope._data_qty_selected = (i - 1);
            }
            return $scope._data_qty_selected;
        };
        $scope.increseQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (isNaN(i)) {
                i = 0;
            }
            e.val(i + 1);
            $scope._data_qty_selected = (i + 1);
            return $scope._data_qty_selected;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('input[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('input[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            var i = parseInt(e.val());
            if (i <= 0 || typeof i == 'undefined' || isNaN(i)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVaraintsClick_Normal();
        };
        $scope.dataVariantsPick = [""];
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.dataVariantsPick = [""];
        $scope.onSelectVariantItems = function($index, option_id){
            console.log("onSelectVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if($scope.dataVariantsPick.length >= $scope.dataOption.length){
                $scope.findVariantsData($scope.dataVariantsPick);                
            }
        };
        $scope.makeVariantsClick = function(){            
            var s = $timeout(function(){
                $timeout.cancel(s);
                $('select.variantSelector').each(function(idx,obj){
                    var optionElementFirst = $(this).find('option[data-index="'+idx+'"]').eq(0);
                    optionElementFirst.prop("selected",true);
                    $scope.onSelectVariantItems(optionElementFirst.attr('data-index'), optionElementFirst.attr('data-option'));
                });
            }, 2000);
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                pricefull = price;
            } else {
                if (compare_price != 0) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    break;
                }
            }
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("width", $(".cover_image_item").css("width"));
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                $scope.returnheight();
                $scope.timeCountStart();
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
        /* Change Big Image when click thumbnail */
        $scope.dataChangeBigImage = 0;
        $scope.changeBigImage = function(dataObject,index) {
            $scope.dataChangeBigImage = index;
            $timeout(function() {
                var e = $('.gallery-display');
                var el = $('.gallery-display').find('img').eq(0);
                e.css('opacity', '0');
                $timeout(function() {
                    el.attr('original-src', el.attr('src'));
                    el.attr('src', dataObject.image_url);
                    el.addClass('has-changed');
                    e.css('opacity', '1');
                }, 600);
            }, 300);
        };
    };
    return promise;
});_ui_share_app.directive('productDetailPageZb', function($rootScope, $routeParams, sliderProvider, $componentProductDetail, $location) {
    var templateName = 'productDetailPageZb';
    var componentMain = 'componentProductDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        imgpath: '@imgpath',
        promotelink: '@promotelink',
        id: '@id',
        iconbuy: '@iconbuy',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope.login = function() {
            var login = {
                showLogin: function() {
                    return UiCustomerBox.delegate.get.isLogin();
                },
                isLogin: function(callback) {
                    callback(UiCustomerBox.delegate.get.isLogin());
                },
                pageLogin: function() {
                    var _self = this;
                    _self.isLogin(function(isLogin) {
                        if (!isLogin) {
                            /* $location.url('member').replace(); */
                            window.location.href = "member";
                        }
                    });
                }
            }
            return login;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.titleUrl = function(str) {
            var res_str = '';
            if (str != undefined) {
                var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                res_str = s.toLowerCase();
            }
            return res_str;
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var d = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', d).then(function(e) {
                if (e.ok == 1) {
                    $scope.dataRelation = e.data;
                }
            });
        };
        $scope._dataArray_tag = {};
        $scope._dataArray = [];
        $scope.data_min = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope.names = [];
        $scope.currentStock = 0;
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    console.log("productDetailPageZb : res : ", res);
                    $scope._dataArray = res.data;
                    /*if ($scope._dataArray.product_hightlight_video_embed != "") {
                        $scope._dataArray.product_image.unshift({
                            image_url: $scope.imgPath + 'img-play.png',
                            product_hightlight_video_embed: $scope._dataArray.product_hightlight_video_embed
                        });
                    }*/
                    $scope._dataArrayRelateProductId = res.data.product_id;
                    if ($scope._dataArray.product_referral_display.category != undefined) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    /*if ($scope._dataArray.product_description == '') {
                        $scope._viewTab(2);
                    }*/
                    $scope.names = [];
                    if (res.data.product_total_variant == 0 && res.data.product_total_stock > 0) {
                        for (var i = 0; i < parseInt(res.data.product_total_stock); i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    if (res.data.product_total_variant == 0 && res.data.product_total_stock < 0) {
                        for (var i = 0; i < 20; i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    if (res.data.product_total_variant > 0) {
                        for (var i = 0; i < 20; i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    if (res.data.product_attribute != undefined) {
                        if (res.data.product_attribute.option_data != undefined) {
                            if (res.data.product_attribute.option_data.variant_array != undefined) {
                                if (res.data.product_attribute.option_data.variant_array.length != 0) {
                                    var set_varia = res.data.product_attribute.option_data.variant_array[0].price;
                                    for (var i = 0; i < res.data.product_attribute.option_data.variant_array.length; i++) {
                                        if (parseInt(set_varia) >= parseInt(res.data.product_attribute.option_data.variant_array[i].price)) {
                                            set_varia = res.data.product_attribute.option_data.variant_array[i].price;
                                            $scope.data_min = res.data.product_attribute.option_data.variant_array[i];
                                        }
                                    }
                                    if ($scope.data_min.length == 0) {
                                        $scope.data_min = res.data.product_attribute.option_data.variant_array[0];
                                    }
                                }
                            }
                        }
                    }
                    $scope._dataArray_tag = res.data.product_tags.split(",");
                    $scope.buildMultipleQuantity(res.data);
                    $scope.buildVariantOption(res.data);
                    $scope.builldRelateProduct(res.data);
                    $scope.currentStock = $scope._dataArray.product_total_stock;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.dataRelateProductArray = [];
        $scope.builldRelateProduct = function(dataObj) {
            console.log("_getDataArray", dataObj);
            var dataSend = {
                'cur_page': 1,
                'per_page': 5,
                'txt_filter_json': JSON.stringify({
                    "badge_id_array": [18],
                    "tags": dataObj.product_tags
                })
            };
            GAEAPI.get('product/lists', dataSend).then(function(e) {
                if (e.ok === 1) {
                    $scope.dataRelateProductArray = e.data.dataList;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope._viewRouteParams().product_id));
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoto = function(idx) {
            setTimeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickGoTo', idx);
            }, 100);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-key="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        $scope._itemCarousel = function() {
            var elementName = '[data-key="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                /*autoplay: (window.location.host !== 'localhost') ? true : false,*/
                autoplay: false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-key="' + $scope._uniqueKey + '"]').not('.slick-initialized')) {
                $timeout(function() {
                    $scope._itemCarousel();
                }, 500);
            }
        });
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVaraintsClick_Normal();
        };
        $scope.dataVariantsPick = [];
        $scope.onClickVariantItems = function($index, option_id) {
            console.log("onClickVariantItems:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.nowMoment = moment().unix();
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleState.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleState.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope.saleprice = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope.calculate = function(price, compare_price, discount_id, lifetime_start_time, lifetime_end_time, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined && lifetime_start_time <= $scope.nowMoment && (lifetime_end_time == -1 || lifetime_end_time >= $scope.nowMoment)) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.stateShow = false;
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var count = 0;
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                var _self = dataVariants[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                if (compareArray(variantsPick, optionJson)) {
                    console.log("dataVariants : ", dataVariants);
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    $scope._dataArray.product_sku = dataVariants[i].sku;
                    $scope._dataArray.product_price = dataVariants[i].price;
                    $scope._dataArray.product_compare_price = dataVariants[i].compare_price;
                    $scope.data.product_total_stock = dataVariants[i].total_stock;
                    console.log("tasdasdasdasest if", $scope.data.product_total_stock);
                    $scope.names = [];
                    if (parseInt($scope.data.product_total_stock) == 0) {
                        $scope.stateShow = false;
                        $scope.names = [1]; 
                    } else {
                        $scope.stateShow = true;
                        for (var i = 0; i < parseInt($scope.data.product_total_stock); i++) {
                            $scope.names.push(i + 1);
                        }
                    }
                    console.log("selectedOptionTextJson: option", _self);
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope.data.product_image.length; im++) {
                            if ($scope.data.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        $timeout(function() {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope.slickGoto('gallery_show', rightImagePosition);
                            } else {
                                angular.element('.gallery-thumbnail .thumb-img[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);
                    }
                    break;
                } else {
                    console.log("tasdasdasdasest else", $scope.data.product_total_stock);
                    $scope.stateShow = false;
                }
                if (!compareArray(variantsPick, optionJson)) {                    
                    count++;              
                }                
                if (count >= dataVariants.length) { 
                    $scope._dataArray.product_id = dataVariants[i].product_id;                                       
                    console.log("optionJson : 0000 ", count, dataVariants[i].total_stock);  
                    $scope.names = [1];       
                    $scope.stateShow = false;                     
                }
            }
        };
        $scope.makeVaraintsClick_Normal = function() {
            $timeout(function() {
                $('div.variantSelector').each(function(idx, obj) {
                    $(this).find('span[data-index="' + idx + '"]').eq(0).click();
                });
            }, 2000);
        };
        $scope.returnheight = function() {
            $(".cover_image_item").css("height", $(".cover_image_item").css("width"));
            $(".gallery_display").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("height", $(".cover_image_item").css("width"));
            $("iframe").css("width", $(".cover_image_item").css("width"));
            /*$(".cover_image_item_md_lg").css("height", $(".cover_image_item_md_lg").css("width"));
            $(".gallery_display_md_lg").css("height", $(".cover_image_item_md_lg").css("width"));*/
            $("iframe").css("height", $(".cover_image_item_md_lg").css("width"));
            $("iframe").css("width", $(".cover_image_item_md_lg").css("width"));
        }
        $scope.timeCountStart = function() {
            $scope.timeout_promise = $timeout(function() {
                /*$scope.returnheight();
                $scope.timeCountStart();*/
            }, 1000);
        }
        $scope.timeCountStart();
        $scope.data_viewTab = '1';
        $scope._viewTab = function(index) {
            $scope.data_viewTab = index;
        };
        $scope._data_qty_model = 1;
        $scope._data_qty_selected = 1;
        $scope.currentOptionQtyPick = function(variant_key) {
            if ($('#detail_qty[variant-key="' + variant_key + '"]').val() != undefined) {
                var e = parseInt($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
            }
            return e;
        };
        $scope.watchQty = function(variant_key) {
            var e = angular.element('select[name="detail_qty"]');
            if (typeof variant_key !== 'undefined') {
                e = angular.element('select[name="detail_qty"][variant-key="' + variant_key + '"]');
            }
            if ($('#detail_qty[variant-key="' + variant_key + '"]').val() != undefined) {
                $scope._data_qty_selected = parseInt($('#detail_qty[variant-key="' + variant_key + '"]').val().substr(7));
            }
            console.log("_data_qty_selected", $scope._data_qty_selected);
            /* parseInt(e.val());
            alert(i);onSelectVariantItems*/
            if ($scope._data_qty_selected <= 0 || typeof $scope._data_qty_selected == 'undefined' || isNaN($scope._data_qty_selected)) {
                var t = $timeout(function() {
                    $timeout.cancel(t);
                    $scope._data_qty_selected = 1;
                    e.val(1);
                }, 600);
            }
        };
        $scope.productQuantityMultiArray = [];
        $scope.lastCheckedVariantKey = '';
        $scope.buildMultipleQuantity = function(productObj) {
            $scope.productQuantityMultiArray = [];
            var r = [];
            if (productObj.product_attribute.option_data != undefined && productObj.product_attribute.option_data.length > 0) {
                var p = productObj.product_attribute.option_data.variant_array;
                for (var i = 0; i < p.length; i++) {
                    if (p[i].status == 1 && p[i].status == 1) {
                        $scope.productQuantityMultiArray.push({
                            v_key: p[i].variant_key,
                            v_name: p[i].option_name_array[0],
                            v_qty: 1,
                            v_active: 0
                        });
                    }
                }
            }
        };
        $scope.switchQuantityByKey = function(variant_key) {
            $scope.lastCheckedVariantKey = variant_key;
            $('.d_qty').removeClass('active').removeClass('inin');
            $('.d_qty_price[variant-key!="' + variant_key + '"]').removeClass('active').removeClass('inin');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('active');
            $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
            $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('active');
            $timeout(function() {
                $('.d_qty[variant-key="' + variant_key + '"]').addClass('inin');
                $('.d_qty_price[variant-key="' + variant_key + '"]').addClass('inin');
            }, 300);
        };
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").find('select').val() != undefined) {
                check_int = parseInt($(".d_qty").find('select').val().substr(7));
            }
            return check_int;
        };
        $scope.warning = 0;
        $scope.getWarn = function() {
            $scope.warning = 1;
        };
        $scope.outofstock = 0;
        $scope.getOutofstock = function() {
            $scope.outofstock = 1;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.onSelectVariantItems(0, '');
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            $scope.testyuyu = 0;
            if (option_id == '') {
                $scope.names = [];
                for (var i = 0; i < 20; i++) {
                    $scope.names.push(i + 1);
                }
                $scope._dataArray.product_id = $scope._idUrl($scope._viewRouteParams().product_id);
                $scope._dataArray.product_price = $scope.data_min.price;
                $scope.testyuyu = 0;
                $('.d_qty_price').removeClass("active");
                $('.d_qty_price').removeClass("inin");
                $('.d_qty').removeClass('active').removeClass('inin');
                $('.dsetting').addClass("active");
                $('.d_qty_not_result').addClass("active");
                $scope.dataVariantsPick[$index] = option_id;
                console.log("check_vareian 1000:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length);
                return GAEAPI.get('product/id', {
                    'txt_product_id': $scope._idUrl($routeParams.product_id)
                }).then(function(e) {
                    if (e.ok == 1) {
                        $scope.data = e.data;
                        $scope.dataPreserve = e.data;
                    }
                });
            } else {
                $scope.dataVariantsPick[$index] = option_id;
                for (var i = 0; i < $scope.dataVariantsPick.length; i++) {
                    if ($scope.dataVariantsPick[i] != undefined && $scope.dataVariantsPick[i] != "") {
                        $scope.testyuyu++;
                        console.log("check_vareian 103", $scope.testyuyu);
                    }
                }
                if ($scope.testyuyu >= $scope.dataOption.length) {
                    console.log("check_vareian 104", $scope.testyuyu);
                    $scope.testyuyu = 0;
                    $scope.findVariantsData($scope.dataVariantsPick);
                    $(".d_qty").find('select').val("number:1");
                } else {
                    console.log("check_vareian 105", $scope.testyuyu);
                    $scope.testyuyu = 0;
                    $(".d_qty").find('select').val("number:1");
                }
                console.log("check_vareian 1001:", $scope.dataVariantsPick.length, $index, $scope.dataVariantsPick, $scope.dataOption.length, $scope.electric, $scope.testyuyu);
            }
            /*alert($scope.dataVariantsPick);*/
        };
        $scope.video_code = "";
        $scope.videoShow = function() {
            $scope.video_code = $scope._dataArray.product_hightlight_video_embed;
            $(".videoHighlightOverlay").addClass("active");
            console.log("videoShow");
        }
        $scope.videoHide = function() {
            $scope.video_code = '';
            $(".videoHighlightOverlay").removeClass("active");
            console.log("videoHide");
        }
        $scope.viewHide = function(arrayData, optionData) {
            var reTest = false;
            if (optionData == arrayData.length) {
                for (var i = 0; arrayData.length > i; i++) {
                    console.log("arrayData[i]", arrayData[i]);
                    if (!arrayData[i]) {
                        reTest = false;
                        break;
                    } else {
                        reTest = true;
                    }
                }
            }
            return reTest;
        }
        $scope.viewHideOp = function(arrayData, optionData) {
            var e = false;
            if (optionData == 0 && arrayData.length == 0) {
                e = true;
            }
            return e;
        }
        $scope.qtuC = function() {
            var e = 1;
            if ($(".d_qty").find('select').val() == "") {
                $(".d_qty").find('select').val("number:1");
                var e = 1;
            } else {
                var e = $(".d_qty").find('select').val();
            }
            return e;
        }
        $scope.buyC = function() {
            var e = false;
            if ($scope.dataOption.length == 0 && $scope.viewHide($scope.dataVariantsPick, $scope.dataOption.length) == false) {
                if ($scope.names.length == 0) {
                    e = false
                } else {
                    e = true;
                }
            } else if ($scope.dataOption.length > 0) {
                if ($scope.viewHide($scope.dataVariantsPick, $scope.dataOption.length) == true) {
                    if ($scope.stateShow == true) {
                        e = true;
                    }
                } else {
                    e = false;
                }
            }
            return e;
        }
        $scope.outOfStockShow = function() {
            var e = false;
            if ($scope.buyC() == true) {
                e = true;
            } else {
                if ($scope.names.length == 20) {
                    e = true;
                } else {
                    e = false;
                }
            }
            return e;
        }
    };
    return promise;
});_ui_share_app.directive('componentProductDetails', function($rootScope, $routeParams, $location) {
    var templateComponent = 'componentProductDetails';
    var templateUrl = _ui_share_host + templateComponent + '/' + templateComponent + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        type: '@type',
        cart: '@cart',
        buycol: '@buycol',
        buyicon: '@buyicon',
        buytext: '@buytext',
        viewcarttext: '@viewcarttext',
        buylogin: '@buylogin',
        currency: '@currency',
        checkstaff: '@checkstaff',
        language: '@language',
        btnstyle: '@btnstyle',
        maxstock: '@maxstock',
        videotext: '@videotext',
        description: '@description',
        info: '@info',
        sandwiched : '@sandwiched',
        specification: '@specification',
        textbrand:'@textbrand',
        navigationhover: '@navigationhover',
        imageappcoverchecked: '@imageappcoverchecked',
        categorylists:'@categorylists',
        categorylistsurl: '@categorylistsurl',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templateUrl;
    promise.transclude = {
        'one': '?one',
        'two': '?two',
        'three': '?three',
    };
    promise.controller = function($scope, $timeout, $interval, $window, $http, share) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "componentProductDetails";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        $scope._componentType = _ui_share_host + $scope._component + "/type/";
        $scope._module = _ui_share_host + $scope._component + "/module/";
        $scope._class = ($scope.type != undefined && $scope.type != "") ? $scope.type : "default";
        /* scope */
        $scope._name = ($scope.name != undefined && $scope.name != "") ? $scope.name : "default";
        $scope._type = $scope._componentType + $scope._class + ".html";
        $scope._cart = ($scope.cart != undefined && $scope.cart != "") ? $scope.cart : "trumpComponentCarts";
        $scope._buycol = ($scope.buycol != undefined && $scope.buycol != "") ? parseInt($scope.buycol) : 15;
        $scope._maxstock = ($scope.maxstock != undefined && $scope.maxstock != "") ? parseInt($scope.maxstock) : 20;
        $scope._categorylistsurl = ($scope.categorylistsurl != undefined && $scope.categorylistsurl != "") ? $scope.categorylistsurl : "category-lists";
        $scope._btnstyle = ($scope.btnstyle != undefined && $scope.btnstyle != "") ? $scope.btnstyle : "filled_button_large";
        $scope._buylogin = ($scope.buylogin == "true" || $scope.buylogin == "t") ? true : false;
        $scope._checkstaff = ($scope.checkstaff == "true" || $scope.checkstaff == "t") ? true : false;
        $scope._categorylists = ($scope.categorylists != undefined && $scope.categorylists != "") ? $scope.categorylists : "สินค้า";
        $scope._sandwiched = ($scope.sandwiched != undefined && $scope.sandwiched != "") ? $scope.sandwiched : ">";
        $scope._currency = ($scope.currency != undefined && $scope.currency != "") ? $scope.currency : "THB";
        $scope._buyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope.buyicon : "icnt_outline_cart01_dark.png";
        $scope._buytext = ($scope.buytext != undefined && $scope.buytext != "") ? $scope.buytext : "เพิ่มในรถเข็น";
        $scope._viewcarttext = ($scope.viewcarttext != undefined && $scope.viewcarttext != "") ? $scope.viewcarttext : "ดูรถเข็น";
        $scope._videotext = ($scope.videotext != undefined && $scope.videotext != "") ? $scope.videotext : "Video";
        $scope._icebuyicon = ($scope.buyicon != undefined && $scope.buyicon != "") ? $scope._icnPath + $scope.buyicon : $scope._icnPath + "icnt_outline_cart01_dark.png";
        $scope._language = ($scope.language != undefined && $scope.language != "") ? (($scope.language == "en") ? "en" : "th") : "th";
        $scope._textbrand = ($scope.textbrand != undefined && $scope.textbrand != "") ? $scope.textbrand : "Brand";
        $scope._navigationhover = ($scope.navigationhover != undefined && $scope.navigationhover != "") ? $scope.navigationhover : "primary";
        $scope._imageappcoverchecked = ($scope.imageappcoverchecked == "true" || $scope.imageappcoverchecked == "t") ? true : false;
        /* scope */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getNamePage: function(arr) {
                    var str = [];
                    for (var i = 0; i < arr.length; i++) {
                        if (i != 0) {
                            str.push(arr[i]);
                        }
                    }
                    return str.join(" ");
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = (params.product_id != undefined) ? params.product_id.split("-", 1).join("") : false;
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getReferralId: function(productReferralDisplay, callback) {
                    var _self = this;
                    var referral_id = 0;
                    if (productReferralDisplay.length != 0) {
                        if (productReferralDisplay.category != undefined) {
                            if (productReferralDisplay.category.length != 0) {
                                referral_id = productReferralDisplay.category[0].referral_id
                            }
                        }
                    }
                    callback(referral_id);
                },
                getStaffId: function(staffId, callback) {
                    var _self = this;
                    var res_staff = {
                        staff_id: (staffId != 0 && staffId != '' && staffId != undefined) ? staffId : '0',
                        status: (staffId != 0 && staffId != '' && staffId != undefined) ? true : false
                    }
                    callback(res_staff);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getCarousel = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carouselA: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            fade: true,
                            dots: false,
                            arrows: false,
                            infinite: true,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '',
                            nextArrow: '',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselB: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: true,
                            arrows: true,
                            infinite: true,
                            autoplay: false,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: ' ',
                            nextArrow: '
',
                            nextArrow: ' ',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselD: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: true,
                            infinite: true,
                            autoplay: true,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: '
',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselD: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: true,
                            infinite: true,
                            autoplay: true,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            prevArrow: ' ',
                            nextArrow: '
',
                            nextArrow: ' ',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselBar: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: false,
                            infinite: false,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 6,
                            slidesToScroll: 6,
                            speed: 600,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: 5,
                                    slidesToScroll: 5,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: 4,
                                    slidesToScroll: 4,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: 3,
                                    slidesToScroll: 3,
                                }
                            }]
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                slickCarousel: function(carousel, index) {
                    var _self = this;
                    $scope.setCarousel.index = index;
                    setTimeout(function() {
                        $('[data-key="' + carousel + '"]').slick('slickGoTo', index);
                    }, 100);
                },
                prevIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != 0) ? image_index - 1 : image - 1;
                    _self.consoleLog("prevIndex index", $scope.setCarousel.index);
                },
                nextIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != (image - 1)) ? image_index + 1 : 0;
                    _self.consoleLog("nextIndex index", $scope.setCarousel.index);
                }
            }
            return getFunction;
        };
        $scope.getAttribute = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                productAttribute: function(productAttribute, callback) {
                    var _self = this;
                    var attribute = {
                        option_name: "",
                        option_attribute: []
                    };
                    if (productAttribute.option_data != undefined) {
                        if (productAttribute.option_data.variant_array != undefined && productAttribute.option_data.variant_array.length != 0) {
                            for (var a = 0; a < productAttribute.option_data.pclass_array.length; a++) {
                                attribute.option_name = attribute.option_name.concat(productAttribute.option_data.pclass_array[a].pclass_name, " ");
                            }
                            for (var b = 0; b < productAttribute.option_data.variant_array.length; b++) {
                                var product_attribute = {
                                    product_id: productAttribute.option_data.variant_array[b].product_id,
                                    product_sku: productAttribute.option_data.variant_array[b].sku,
                                    product_title: "",
                                    product_price: parseFloat(productAttribute.option_data.variant_array[b].price),
                                    product_compare_price: parseFloat(productAttribute.option_data.variant_array[b].compare_price),
                                    product_total_stock: parseFloat(productAttribute.option_data.variant_array[b].total_stock),
                                    product_image: productAttribute.option_data.variant_array[b].variant_image
                                }
                                for (var c = 0; c < productAttribute.option_data.variant_array[b].option_name_array.length; c++) {
                                    product_attribute.product_title = product_attribute.product_title.concat(productAttribute.option_data.variant_array[b].option_name_array[c], " ");
                                }
                                attribute.option_attribute.push(product_attribute);
                            }
                        }
                    }
                    _self.consoleLog("productAttribute attribute ", attribute);
                    callback(attribute);
                },
                checkDiscountPrice: function(productDiscount, resPrice, resComparePrice, callback) {
                    var _self = this;
                    var price = 0;
                    var compare_price = 0;
                    if (productDiscount.length == 0) {
                        price = parseFloat(resPrice);
                        compare_price = parseFloat(resComparePrice);
                    } else {
                        if (productDiscount.discount_type_id == '101') {
                            price = parseFloat(resPrice) - parseFloat(productDiscount.discount_price);
                            compare_price = parseFloat(resPrice);
                        } else if (productDiscount.discount_type_id == '102') {
                            price = (parseFloat(resPrice) * ((100 - parseFloat(productDiscount.discount_percent)) / 100));
                            compare_price = parseFloat(resPrice);
                        }
                    }
                    callback(price, compare_price);
                },
                checkMinPrice: function(option, callback) {
                    var _self = this;
                    var price_min = parseFloat(option.option_attribute[0].product_price);
                    var compare_price_min = parseFloat(option.option_attribute[0].product_compare_price);
                    var total_stock = parseFloat(option.option_attribute[0].product_total_stock);
                    for (var a = 0; a < option.option_attribute.length; a++) {
                        if (price_min >= parseFloat(option.option_attribute[a].product_price)) {
                            price_min = parseFloat(option.option_attribute[a].product_price);
                            compare_price_min = parseFloat(option.option_attribute[a].product_compare_price);
                            total_stock = parseFloat(option.option_attribute[a].product_total_stock);
                        }
                    }
                    _self.consoleLog("checkPriceMin price_min ", price_min);
                    _self.consoleLog("checkPriceMin compare_price_min ", compare_price_min);
                    _self.consoleLog("checkPriceMin total_stock ", total_stock);
                    callback(price_min, compare_price_min, total_stock);
                },
                getTotalStock: function(totalStock, mixStock, callback) {
                    var _self = this;
                    var total_stock = (totalStock > 0) ? ((totalStock <= mixStock) ? totalStock : mixStock) : ((totalStock == -1) ? mixStock : totalStock);
                    callback(total_stock);
                },
                checkMinPrices: function(api, attribute, callback) {
                    var _self = this;
                    var dataPrice = {
                        product_price: {
                            price_name: 'product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        product_compare_price: {
                            price_name: 'product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_price: {
                            price_name: 'sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_price: {
                            price_name: 'sum_product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_minus_sum_product_price: {
                            price_name: 'sum_product_compare_minus_sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        }
                    }
                    if (attribute.option_attribute.length == 0) {
                        _self.checkDiscountPrice(api.data.product_discount, api.data.product_price, api.data.product_compare_price, function(res_price, res_compare_price) {
                            _self.checkPrice(res_price, function(res_price_ecimals) {
                                dataPrice.product_price.price = res_price;
                                dataPrice.product_price.price_ecimals = res_price_ecimals;
                                dataPrice.sum_product_price.price = res_price;
                                dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                    dataPrice.product_compare_price.price = res_compare_price;
                                    dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    dataPrice.sum_product_compare_price.price = res_compare_price;
                                    dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                    _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                        dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                        dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                        _self.getTotalStock(api.data.product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                            dataPrice.product_price.total_stock = res_total_stock_s;
                                            dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                            callback(dataPrice, false);
                                        });
                                    });
                                });
                            });
                        });
                    } else {
                        _self.checkMinPrice(attribute, function(res_price_min, res_compare_price_min, res_total_stock) {
                            _self.checkDiscountPrice(api.data.product_discount, res_price_min, res_compare_price_min, function(res_price, res_compare_price) {
                                _self.checkPrice(res_price, function(res_price_ecimals) {
                                    dataPrice.product_price.price = res_price;
                                    dataPrice.product_price.price_ecimals = res_price_ecimals;
                                    dataPrice.sum_product_price.price = res_price;
                                    dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                    _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                        dataPrice.product_compare_price.price = res_compare_price;
                                        dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        dataPrice.sum_product_compare_price.price = res_compare_price;
                                        dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                        _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                            dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                            dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                            _self.getTotalStock(res_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                dataPrice.product_price.total_stock = res_total_stock_s;
                                                dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                callback(dataPrice, true);
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    }
                },
                priceIncludes: function(price, includes, callback) {
                    var _self = this;
                    var priceToString = (price == null) ? 0 : price;
                    _self.consoleLog('priceIncludes priceToString : ', priceToString);
                    callback(priceToString.toString().includes(includes));
                },
                checkPrice: function(price, callback) {
                    var _self = this;
                    _self.priceIncludes(price, '.', function(res) {
                        _self.consoleLog("checkPrice res ", res);
                        callback((!res) ? 0 : 2);
                    });
                },
                onSelectOption: function(productId) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = productId;
                    _self.consoleLog("onSelectOption productId ", productId);
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    for (var a = 0; a < $scope.data.attribute.dataArray.option_attribute.length; a++) {
                        _self.consoleLog("onSelectOption option_attribute ", $scope.data.attribute.dataArray.option_attribute[a]);
                        if ($scope.data.attribute.dataArray.option_attribute[a].product_id == productId) {
                            if ($scope.data.attribute.dataArray.option_attribute[a].product_image.length != 0) {
                                if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                                    for (var b = 0; b < $scope.dataApi.product.dataArray.product_image.length; b++) {
                                        if ($scope.dataApi.product.dataArray.product_image[b].image_id == $scope.data.attribute.dataArray.option_attribute[a].product_image[0].image_id) {
                                            $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, b);
                                        }
                                    }
                                }
                            }
                            _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[a].product_price, $scope.data.attribute.dataArray.option_attribute[a].product_compare_price, function(res_price_p, res_compare_price_p) {
                                _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                                    $scope.data.product_price.price = res_price_p;
                                    $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                                    $scope.data.sum_product_price.price = res_price_p;
                                    $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                                    _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                        $scope.data.product_compare_price.price = res_compare_price_p;
                                        $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                        $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                        _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                            $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                            $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                            _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[a].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                $scope.data.product_price.total_stock = res_total_stock_s;
                                                $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                /* stock */
                                                $scope.data.quantity.quantity_max = res_total_stock_s;
                                                $scope.data.quantity.quantity_select = [];
                                                for (var i = 0; i < res_total_stock_s; i++) {
                                                    $scope.data.quantity.quantity_select.push(i + 1);
                                                }
                                                /* stock */
                                            })
                                        });
                                    });
                                });
                            });
                            break;
                        }
                    }
                },
                onClickOption: function(index) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.data.attribute.productId = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    if ($scope.data.attribute.dataArray.option_attribute[index].product_image.length != 0) {
                        if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                            for (var i = 0; i < $scope.dataApi.product.dataArray.product_image.length; i++) {
                                if ($scope.dataApi.product.dataArray.product_image[i].image_id == $scope.data.attribute.dataArray.option_attribute[index].product_image[0].image_id) {
                                    $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, i);
                                }
                            }
                        }
                    }
                    _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[index].product_price, $scope.data.attribute.dataArray.option_attribute[index].product_compare_price, function(res_price_p, res_compare_price_p) {
                        _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                            $scope.data.product_price.price = res_price_p;
                            $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                            $scope.data.sum_product_price.price = res_price_p;
                            $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                            _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                $scope.data.product_compare_price.price = res_compare_price_p;
                                $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                    $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                    $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                    _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[index].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                        $scope.data.product_price.total_stock = res_total_stock_s;
                                        $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                        /* stock */
                                        $scope.data.quantity.quantity_max = res_total_stock_s;
                                        $scope.data.quantity.quantity_select = [];
                                        for (var i = 0; i < res_total_stock_s; i++) {
                                            $scope.data.quantity.quantity_select.push(i + 1);
                                        }
                                        /* stock */
                                    })
                                });
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.getAttributeCustom = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                createArray: function(productCustomTemplates, callback) {
                    var _self = this;
                    var custom_attributes = [];
                    if (productCustomTemplates.templates.length != 0) {
                        angular.forEach(productCustomTemplates.templates, function(item, index) {
                            if (item.option_sets.length != 0) {
                                _self.getAttributes(item.option_sets, function(res_attributes) {
                                    custom_attributes = custom_attributes.concat(res_attributes);
                                });
                            }
                        });
                        /* if (productCustomTemplates.templates[0].option_sets.length != 0) {
                            _self.getAttributes(productCustomTemplates.templates[0].option_sets, function(res_attributes) {
                                custom_attributes = res_attributes;
                            });
                        } */
                    }
                    _self.consoleLog("createArray : productCustomTemplates", productCustomTemplates);
                    _self.consoleLog("createArray : custom_attributes", custom_attributes);
                    callback(custom_attributes, true);
                },
                formatAttribute: function(index, optionSubsetIndex, setType, optionSetArray, callback) {
                    var _self = this;
                    var set_id = (setType == 'attribute') ? optionSetArray.set_id : optionSetArray.subset_id;
                    var attribute = {
                        attribute_index: index,
                        attribute_option_subset_index: optionSubsetIndex,
                        active_option_id: (optionSetArray.option_data.select_id != 0) ? optionSetArray.option_data.select_id : "-1",
                        active_option_index: -1,
                        active_option_index_str: "-1",
                        active_textarea: "",
                        active_array: [],
                        set_id: set_id,
                        name: optionSetArray.name,
                        set_type: optionSetArray.ss_type,
                        option: []
                    }
                    callback(attribute);
                },
                getOption: function(index, optionDataArray, callback) {
                    var _self = this;
                    var options = {
                        index: index,
                        ss_data_id: optionDataArray.ss_data_id,
                        name: optionDataArray.name,
                        image: optionDataArray.image,
                        price: optionDataArray.price,
                        compare_price: 0,
                        total_stock: 0
                    }
                    callback(options);
                },
                getActive: function(index, activeOptionId, activeOptionIdIn, optionDataArray, callback) {
                    var _self = this;
                    var actives_index = (optionDataArray.ss_data_id == activeOptionId) ? index : activeOptionIdIn;
                    var actives = (optionDataArray.ss_data_id != activeOptionId) ? "0" : "1";
                    callback(actives_index, actives);
                },
                getAttributes: function(optionSetArray, callback) {
                    var _self = this;
                    var attributes = [];
                    for (var index = 0; index < optionSetArray.length; index++) {
                        _self.formatAttribute(index, 0, 'attribute', optionSetArray[index], function(res_attribute) {
                            if (optionSetArray[index].option_subsets.length != 0) {
                                for (var option_subset_index = 0; option_subset_index < optionSetArray[index].option_subsets.length; option_subset_index++) {
                                    _self.formatAttribute(index, option_subset_index, res_attribute.set_type, optionSetArray[index].option_subsets[option_subset_index], function(res_attribute_sub) {
                                        var options = [];
                                        var active_option_id = -1;
                                        var active_option_array = [];
                                        for (var option = 0; option < optionSetArray[index].option_subsets[option_subset_index].option_data.options.length; option++) {
                                            _self.getOption(option, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_option) {
                                                options.push(res_option);
                                            });
                                            _self.getActive(option, res_attribute_sub.active_option_id, active_option_id, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_actives_index, res_actives) {
                                                active_option_id = res_actives_index;
                                                active_option_array.push(res_actives);
                                            });
                                        }
                                        res_attribute_sub.option = options;
                                        res_attribute_sub.active_option_index = active_option_id;
                                        res_attribute_sub.active_option_index_str = String(active_option_id);
                                        res_attribute_sub.active_array = active_option_array;
                                        attributes.push(res_attribute_sub);
                                    });
                                }
                            } else {
                                var options = [];
                                var active_option_id = -1;
                                var active_option_array = [];
                                for (var option = 0; option < optionSetArray[index].option_data.options.length; option++) {
                                    _self.getOption(option, optionSetArray[index].option_data.options[option], function(res_option) {
                                        options.push(res_option);
                                    });
                                    _self.getActive(option, res_attribute.active_option_id, active_option_id, optionSetArray[index].option_data.options[option], function(res_actives_index, res_actives) {
                                        active_option_id = res_actives_index;
                                        active_option_array.push(res_actives);
                                    });
                                }
                                res_attribute.option = options;
                                res_attribute.active_option_index = active_option_id;
                                res_attribute.active_option_index_str = String(active_option_id);
                                res_attribute.active_array = active_option_array;
                                attributes.push(res_attribute);
                            }
                        });
                    }
                    callback(attributes)
                },
                getformatQuantity: function(index, attributeCustom, callback) {
                    var _self = this;
                    var quantity = {
                        name: String(index + 1),
                        dataArray: attributeCustom
                    }
                    callback(quantity);
                },
                onClickRadio: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickRadio : index", index);
                    _self.consoleLog("onClickRadio : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickRadio : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickDropdown: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickDropdown : index", index);
                    _self.consoleLog("onClickDropdown : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickDropdown : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickCheckbox: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickCheckbox : index", index);
                    _self.consoleLog("onClickCheckbox : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i == parseInt(index_option)) ? (($scope.data.attribute_custom.dataArray[index].active_array[i] != "0") ? "0" : "1") : $scope.data.attribute_custom.dataArray[index].active_array[i];
                    }
                    _self.consoleLog("onClickCheckbox : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                }
            }
            return getFunction;
        };
        $scope.getReward = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                momentUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    callback(now);
                },
                getCalculator: function(sumProductPrice, reward, callback) {
                    var _self = this;
                    _self.consoleLog("getCalculator : sumProductPrice", sumProductPrice);
                    _self.consoleLog("getCalculator : reward", reward);
                    var point_reward = 0;
                    if (reward.type_id == "100") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    } else if (reward.type_id == "101") {
                        point_reward = reward.reward_amount;
                    } else if (reward.type_id == "102") {
                        point_reward = (reward.reward_percent * sumProductPrice.price) / 100;
                    } else if (reward.type_id == "103") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    }
                    _self.consoleLog("getCalculator : point_reward", point_reward);
                    callback(point_reward);
                },
                getProductReward: function(now, productReward, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (productReward.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(productReward.reward_lifetime.lifetime_start_time);
                        reward.lifetime_end_time = parseInt(productReward.reward_lifetime.lifetime_end_time);
                        reward.type_id = productReward.reward_type_id;
                        reward.amount = parseInt(productReward.reward_amount);
                        reward.percent = parseInt(productReward.reward_percent);
                        reward.every_price = parseInt(productReward.reward_every_price);
                    }
                    _self.consoleLog("getProductReward : reward", reward);
                    callback(reward);
                },
                getPointConfig: function(now, shopPointConfig, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (shopPointConfig.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(shopPointConfig.er_from);
                        reward.lifetime_end_time = parseInt(shopPointConfig.er_to);
                        reward.type_id = "100";
                        reward.amount = parseInt(shopPointConfig.er_earn);
                        reward.every_price = parseInt(shopPointConfig.er_rate);
                    }
                    _self.consoleLog("getPointConfig : reward", reward);
                    callback(reward);
                },
                checkPointReward: function(reward, callback) {
                    var _self = this;
                    var state = false;
                    if (reward.reward_length) {
                        var start = reward.lifetime_start_time < reward.lifetime_time && reward.lifetime_start_time != 0;
                        var end = (reward.lifetime_end_time != -1) ? reward.lifetime_time <= reward.lifetime_end_time && reward.lifetime_end_time != 0 : true;
                        if (start && end) {
                            if (reward.type_id == "100") {
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            } else if (reward.type_id == "101") {
                                var amount = reward.amount != 0;
                                if (amount) {
                                    state = true;
                                }
                            } else if (reward.type_id == "102") {
                                var percent = reward.percent != 0;
                                if (percent) {
                                    state = true;
                                }
                            } else if (reward.type_id == "103") {
                                var percent = reward.percent != 0;
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            }
                        }
                    }
                    callback(state);
                },
                checkReward: function(rewardProduct, rewardPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("checkReward : rewardProduct", rewardProduct);
                    _self.consoleLog("checkReward : rewardPointConfig", rewardPointConfig);
                    var reward = {
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    _self.checkPointReward(rewardProduct, function(res_state_product) {
                        _self.checkPointReward(rewardPointConfig, function(res_state_point_config) {
                            if (res_state_point_config) {
                                reward.type_id = rewardPointConfig.type_id;
                                reward.type_id = rewardPointConfig.type_id;
                                reward.amount = rewardPointConfig.amount;
                                reward.percent = rewardPointConfig.percent;
                                reward.every_price = rewardPointConfig.every_price;
                            } else if (res_state_product) {
                                reward.type_id = rewardProduct.type_id;
                                reward.amount = rewardProduct.amount;
                                reward.percent = rewardProduct.percent;
                                reward.every_price = rewardProduct.every_price;
                            }
                            _self.consoleLog("checkReward : reward", reward);
                            callback(reward);
                        });
                    });
                },
                checkRewardType: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.momentUnix(function(now) {
                        _self.getProductReward(now, productReward, function(res_reward_product) {
                            _self.getPointConfig(now, shopPointConfig, function(res_reward_point_config) {
                                _self.checkReward(res_reward_product, res_reward_point_config, function(res_reward) {
                                    callback(res_reward);
                                });
                            });
                        });
                    });
                },
                createReward: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("createReward : productReward", productReward);
                    _self.consoleLog("createReward : shopPointConfig", shopPointConfig);
                    _self.checkRewardType(productReward, shopPointConfig, function(res_reward) {
                        _self.consoleLog("createReward : res_reward", res_reward);
                        callback(res_reward);
                    });
                }
            }
            return getFunction;
        };
        $scope.getQuantity = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                upDateReward: function() {
                    var _self = this;
                },
                upDateReward: function() {
                    var _self = this;
                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                        $scope.data.reward.point_reward = res_point_reward;
                    });
                },
                upDatePrice: function() {
                    var _self = this;
                    var product_price = $scope.data.product_price.price * $scope.data.quantity.quantity_input;
                    var product_compare_price = $scope.data.product_compare_price.price * $scope.data.quantity.quantity_input;
                    $scope.getAttribute().checkPrice(product_price, function(res_price_ecimals) {
                        $scope.data.sum_product_price.price = product_price;
                        $scope.data.sum_product_price.price_ecimals = res_price_ecimals;
                        $scope.getAttribute().checkPrice(product_compare_price, function(res_compare_price_ecimals) {
                            $scope.data.sum_product_compare_price.price = product_compare_price;
                            $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                            var compare_price_minus_price = ((product_compare_price - product_price) > 0) ? product_compare_price - product_price : 0;
                            $scope.getAttribute().checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                _self.upDateReward();
                            });
                        });
                    });
                },
                input: function(quantityInput) {
                    var _self = this;
                    quantityInput = (quantityInput == null) ? 1 : parseInt(quantityInput);
                    _self.consoleLog("input : quantityInput", quantityInput);
                    if (quantityInput != null) {
                        if (quantityInput >= $scope.data.quantity.quantity_max) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_max;
                        }
                        if (quantityInput <= $scope.data.quantity.quantity_min) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                        }
                    } else {
                        $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                    }
                    _self.upDatePrice();
                },
                minus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input - 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_min", $scope.data.quantity.quantity_min);
                    if (quantity >= $scope.data.quantity.quantity_min) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                },
                plus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input + 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_max", $scope.data.quantity.quantity_max);
                    if (quantity <= $scope.data.quantity.quantity_max) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                }
            }
            return getFunction;
        };
        $scope.getBuy = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = params.product_id.split("-", 1).join("");
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                postApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.post(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                UiCartProductAdd: function(productId, quantityInput, promotionId, customOptions, callback) {
                    quantityInput = (quantityInput > $scope.data.quantity.quantity_max) ? $scope.data.quantity.quantity_max : quantityInput;
                    UiCart.delegate.product.add(productId, quantityInput, promotionId, function(res_data) {
                        callback(res_data);
                    });
                },
                isLogin: function(callback) {
                    var buy_login = $scope._buylogin;
                    var is_login = UiCustomerBox.delegate.get.isLogin();
                    var is_state = (buy_login) ? (!is_login) ? true : false : false;
                    callback(is_state);
                },
                formLogin: function(is_state, callback) {
                    if (is_state) {
                        $inloginPopup.open();
                    }
                    callback(is_state);
                },
                getProductStaffId(staff_id_check, callback) {
                    var res_staff_id_check = staff_id_check;
                    var res_staff_id = $scope.dataApi.product.dataArray.product_staff_id;
                    var res_is_state = (res_staff_id != 0 && res_staff_id != '0' && res_staff_id != undefined) ? true : false;
                    callback(res_staff_id_check, res_staff_id, res_is_state);
                },
                isStaffId: function(staff_id_check, callback) { /* todo */
                    var _self = this;
                    _self.getProductStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        callback(res_staff_id_check, res_staff_id, res_is_state);
                    });
                },
                checkCartDuplicateStaff: function(res_staff_id_check, txt_staff_id, res_is_state, callback) {
                    var _self = this
                    var res_is_state = true;
                    if (res_staff_id_check) {
                        var dataSend = {
                            'txt_staff_id': txt_staff_id,
                        };
                        _self.dataSend("cart/duplicate_staff", dataSend, function(res_api, res_dataSend) {
                            _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                                res_is_state = res_api.data.duplicate;
                                callback(res_is_state);
                            });
                        });
                    } else {
                        callback(res_is_state);
                    }
                },
                showAlert: function(res_staff_id_check, res_staff_id, res_is_state, res_api, callback) {
                    var res_state = (res_staff_id_check) ? ((res_api) ? ((res_is_state) ? false : true) : true) : false;
                    if (res_state) {
                        if (!res_api) {
                            if (res_staff_id != '0' && res_staff_id != 0) {
                                $scope.controlAlert().alert('002');
                            } else {
                                $scope.controlAlert().alert('003');
                            }
                        } else {
                            if (!res_is_state) {
                                $scope.controlAlert().alert('003');
                            }
                        }
                    }
                    callback(res_state);
                },
                checkStaff: function(callback) {
                    var _self = this
                    var staff_id_check = $scope._checkstaff;
                    var res_check = false;
                    _self.isStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        _self.checkCartDuplicateStaff(res_staff_id_check, res_staff_id, res_is_state, function(res_api) {
                            _self.showAlert(res_staff_id_check, res_staff_id, res_is_state, res_api, function(res_state) {
                                res_check = res_state;
                                callback(res_check);
                            });
                        });
                    });
                },
                isProgress: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isProgress(productId)) ? true : false;
                    _self.consoleLog("isProgress : productId", productId);
                    _self.consoleLog("isProgress : state", state);
                    callback(state);
                },
                isSelected: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    _self.consoleLog("isSelected : productId", productId);
                    _self.consoleLog("isSelected : state", state);
                    callback(state);
                },
                isSelectedReturn: function(productId) {
                    var _self = this;
                    var ui_cart_state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    if (!$scope.setBuy.state_active) {
                        $scope.setBuy.state_active = true;
                        var state_process = $scope.setBuy.state_process;
                        var state_step = $scope.setBuy.state_step;
                        if (ui_cart_state && !state_process && state_step != 4) /* cart */ {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_active = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else if (!ui_cart_state && !state_process && state_step != 0) /* unset */ {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_active = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        } else {
                            $scope.setBuy.state_active = false;
                        }
                    }
                    return ui_cart_state;
                },
                updateState: function(productId) {
                    _self = this;
                    _self.isSelected(productId, function(res_state) {
                        if (res_state) {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_process = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        }
                        return res_state;
                    });
                },
                uiCart: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    _self.UiCartProductAdd(productId, quantityInput, promotionId, customOptions, function(res_data) {
                        if (res_data) {
                            _self.onTimeout(500, function() {
                                _self.onPass(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            }
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onError(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onUnset(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                        });
                                    });
                                });
                            });
                        }
                    });
                },
                postApiA: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    var custom_options = {};
                    var dataSend = {
                        'txt_product_id': productId,
                        'txt_amount': quantityInput,
                        'txt_is_clear_cart_before': "0",
                        'txt_custom_options_json': JSON.stringify(custom_options)
                    };
                    _self.dataSend("cart/product_add", dataSend, function(res_api, res_dataSend) {
                        _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                            if (res_ok) {
                                _self.onTimeout(500, function() {
                                    _self.onPass(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onCart(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            });
                                        });
                                    });
                                });
                            } else {
                                _self.onTimeout(500, function() {
                                    _self.onError(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onUnset(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                            });
                                        });
                                    });
                                });
                            }
                        });
                    });
                },
                onProcess: function(data, productId, quantityInput, promotionId, customOptions) {
                    var _self = this;
                    _self.isLogin(function(res_is_login) {
                        _self.formLogin(res_is_login, function(res_form) {
                            _self.checkStaff(function(res_is_state) {
                                if (!$scope.setBuy.state_process && !res_form && !res_is_state) {
                                    $scope.setBuy.state_process = true;
                                    _self.isSelected(productId, function(res_state) {
                                        if (!res_state) {
                                            _self.onLoad($scope.setBuy.state_step, function(res_step) {
                                                if (data.sum_product_price.price != 0 && data.quantity.quantity_max != 0 && (data.attribute.state == (data.attribute.productId != ''))) {
                                                    /* UiCart */
                                                    _self.uiCart(productId, quantityInput, promotionId, customOptions, res_step);
                                                    /* api post offline */
                                                    /*_self.postApiA(productId, quantityInput, promotionId, customOptions, res_step); */
                                                } else {
                                                    _self.onTimeout(500, function() {
                                                        _self.onError(res_step, function(res_step) {
                                                            _self.onTimeout(1000, function() {
                                                                _self.onUnset(res_step, function(res_step) {
                                                                    $scope.setBuy.state_process = false;
                                                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                                                });
                                                            });
                                                        });
                                                    });
                                                }
                                            });
                                        } else {
                                            $scope.setBuy.state_process = false;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            } else if ($scope._cart == "viewcart") {
                                                _self.viewCart($scope._cart);
                                            }
                                        }
                                    });
                                }
                            });
                        });
                    });
                },
                onTimeout: function(time, callback) {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        callback(true)
                    }, time);
                },
                onUnset: function(step, callback) {
                    var _self = this;
                    step = (step == 0) ? 0 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onLoad: function(step, callback) {
                    var _self = this;
                    step = (step == 0 || step == 1) ? 1 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onPass: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 2) ? 2 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onError: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 3) ? 3 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onCart: function(step, callback) {
                    var _self = this;
                    step = (step == 2 || step == 4) ? 4 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                trumpComponentCarts: function() {
                    var controlCart = share.getTrumpComponentCarts();
                    var component_carts = $('.cover-cards').hasClass('active');
                    if (!component_carts) {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.cart();
                        }
                    } else {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.load();
                        }
                    }
                },
                viewCart: function(viewcart) {
                    var _self = this;
                    _self.pageUrl(viewcart);
                },
                locationUrlReplace: function(page) {
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                main: function(callback) {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getDetail = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getDetail: function(api, callback) {
                    var _self = this;
                    var description = api.product_description;
                    var info = api.product_more_info;
                    var specificatio = [];
                    if (api.product_attribute.specification_data != undefined) {
                        specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? api.product_attribute.specification_data.pclass_array : [];
                    }
                    var state_specificatio = false;
                    if (api.product_attribute.specification_data != undefined) {
                        state_specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? true : false;
                    }
                    var state_info = (api.product_is_more_info == 1) ? true : false;
                    _self.consoleLog("getDetail : description", description);
                    _self.consoleLog("getDetail : info", info);
                    _self.consoleLog("getDetail : state_info", state_info);
                    _self.consoleLog("getDetail : specificatio", specificatio);
                    _self.consoleLog("getDetail : state_specificatio", state_specificatio);
                    callback(description, info, state_info, specificatio, state_specificatio);
                },
                onClickDetail: function(index) {
                    var _self = this;
                    $scope.data.detail.active = index;
                    _self.consoleLog("onClickDetail : data.detail.active", $scope.data.detail.active);
                }
            }
            return getFunction;
        };
        $scope.pages = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageName: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page_name);
                },
                pageUrl: function(page_name, id, name_url) {
                    var _self = this;
                    var page = page_name + "/" + id + "-" + name_url;
                    _self.locationUrlReplace(page);
                }
            }
            return getFunction;
        };
        $scope.countDown = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getLocation: function(callback) {
                    var _self = this;
                    var res_location = $location;
                    _self.consoleLog("getLocation", "res_location", res_location);
                    callback(res_location);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(params);
                },
                getLocationUrlNameProductDetail: function(callback) {
                    var _self = this;
                    _self.getRouteParams(function(res_params) {
                        _self.getLocation(function(res_location) {
                            var url_page_name = "/product-detail/" + res_params.product_id;
                            var res_url_name_product_detail = (res_location.url() == url_page_name) ? true : false;
                            _self.consoleLog("getLocationUrlNameProductDeal", "res_url_name_product_detail", res_url_name_product_detail);
                            callback(res_url_name_product_detail);
                        });
                    });
                },
                getUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    _self.consoleLog("getUnix", "now", now);
                    callback(now);
                },
                getCountDown: function(now, product_lifetime, callback) {
                    var _self = this;
                    var countdown_unix = parseInt(product_lifetime.lifetime_end_time) - now;
                    var milliseconds = moment.duration(countdown_unix * 1000, "milliseconds");
                    var res_countdown = ((milliseconds.days() <= 9) ? '0' + milliseconds.days() : milliseconds.days());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.hours() <= 9) ? '0' + milliseconds.hours() : milliseconds.hours());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.minutes() <= 9) ? '0' + milliseconds.minutes() : milliseconds.minutes());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.seconds() <= 9) ? '0' + milliseconds.seconds() : milliseconds.seconds());
                    _self.consoleLog("getCountDown", "res_countdown", res_countdown);
                    callback(res_countdown, countdown_unix);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                countDownByProduct: function(now, data_array, callback) {
                    var _self = this;
                    if (data_array.length != 0) {
                        if (data_array.product_lifetime.length != 0) {
                            _self.getCountDown(now, data_array.product_lifetime, function(res_count_down, res_countdown_unix) {
                                data_array.product_lifetime.lifetime_countdown = (res_countdown_unix > 0) ? res_count_down : "";
                                if (data_array.product_lifetime.lifetime_countdown == "") {
                                    _self.getNameUrl(data_array.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", data_array.product_set_array[0].product_id, res_name);
                                    });
                                }
                            });
                        }
                    }
                    _self.consoleLog("countDownByProduct", "data_array", data_array);
                    callback(data_array);
                },
                loop: function() {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        _self.getUnix(function(res_now) {
                            _self.countDownByProduct(res_now, $scope.dataApi.product.dataArray, function(data_array) {
                                $scope.dataApi.product.dataArray = data_array;
                                _self.getLocationUrlNameProductDetail(function(res_url_name_product_detail) {
                                    if (res_url_name_product_detail) {
                                        _self.loop();
                                    }
                                });
                            });
                        });
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.getPromotion = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                setPromotionId: function(promotion_id) {
                    var _self = this;
                    _self.consoleLog("setPromotionId", "promotion_id", promotion_id);
                    $scope.data.promotion.promotion_id = promotion_id;
                    _self.consoleLog("setPromotionId", "data.promotion.promotion_id", $scope.data.promotion.promotion_id);
                },
            }
            return getFunction;
        };
        $scope.control = function() {
            var getFunction = {
                popupVideo: function(state, video_link, video_embed_code) {
                    var _self = this;
                    if (video_embed_code != '') {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    } else if (video_link != '') {
                        window.open(video_link, '_blank');
                    } else {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.data_control = {
            page_video: {
                popup: false,
                shop_video_embed_code: ""
            }
        }
        $scope.control_alert = {
            alert: {
                error_id: '',
                index: null,
                state: true,
                error: [{
                    id: '001',
                    title: 'การสั่งซื้อ',
                    messages: 'สามารถสั่งซื้อได้เพียงทีละออเดอร์เท่านั้น'
                }, {
                    id: '002',
                    title: 'การเพิ่มสินค้า',
                    messages: 'ไม่สามารถเพิ่มสินค้าของร้านมากกว่า 1 ร้านค้าได้'
                }, {
                    id: '003',
                    title: 'การสั่งซื้อ',
                    messages: 'ไม่สามารถเพิ่มสินค้า(ไม่มีร้านค้า)'
                }]
            }
        };
        $scope.controlAlert = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getErrorMessages: function(error_id, callback) {
                    var _self = this;
                    var messages = {
                        res_error_id: '',
                        res_index: null
                    }
                    angular.forEach($scope.control_alert.alert.error, function(item, index) {
                        if (item.id == error_id) {
                            messages.res_error_id = item.id;
                            messages.res_index = index;
                        }
                    });
                    callback(messages.res_error_id, messages.res_index);
                },
                alert: function(error_id) {
                    var _self = this;
                    _self.getErrorMessages(error_id, function(res_error_id, res_index) {
                        $scope.control_alert.alert.error_id = res_error_id;
                        $scope.control_alert.alert.index = res_index;
                        $scope.control_alert.alert.state = (!$scope.control.alert && res_error_id != '') ? true : false;
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.countDown().loop();
        /* set carousel  */
        $scope.setCarousel = {
            carousel: 0,
            index: 0
        };
        $scope.getCarousel().getCarousel($scope.setCarousel.carousel, function(res_carousel_id) {
            $scope.setCarousel.carousel = res_carousel_id;
        });
        /* set carousel  */
        /* get product api */
        $scope.dataApi = {
            reward: {
                dataSend: {},
                api: "shop/current",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            staff: {
                dataSend: {
                    txt_staff_id: 0
                },
                api: "staff/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            product: {
                dataSend: {
                    txt_product_id: 0
                },
                api: "product/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            relation: {
                dataSend: {
                    txt_referral_id: 0
                },
                api: "referral/relation",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.data = {
            attribute: {
                state: false,
                productId: "",
                dataArray: []
            },
            attribute_custom: {
                state: false,
                dataArray: []
            },
            reward: {
                quantity_name: 'reward',
                type_id: "0",
                reward_amount: 0,
                reward_percent: 0,
                reward_every_price: 0,
                point_reward: 0
            },
            quantity: {
                quantity_name: 'quantity',
                quantity_min: 1,
                quantity_max: 1,
                quantity_input: 1,
                quantity_select: []
            },
            product_price: {
                price_name: 'product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            product_compare_price: {
                price_name: 'product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_price: {
                price_name: 'sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_price: {
                price_name: 'sum_product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_minus_sum_product_price: {
                price_name: 'sum_product_compare_minus_sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            detail: {
                active: '0',
                dataArray: [{
                    index: '0',
                    state: true,
                    en: ($scope.description != undefined && $scope.description != "") ? $scope.description : 'Description',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '1',
                    state: true,
                    en: ($scope.info != undefined && $scope.info != "") ? $scope.info : 'Info',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '2',
                    state: true,
                    en: ($scope.specification != undefined && $scope.specification != "") ? $scope.specification : 'Specification',
                    th: '',
                    data: '',
                    dataArray: []
                }]
            },
            promotion : {
                promotion_id : '0'
            }
        };
        $scope.setBuy = {
            state_active: false,
            state_process: false,
            state_step: 0,
            state_data_font_color: "",
            state_data_background_color: "",
            stepArray: [{
                step: 0,
                name: "unset",
                icon: $scope._icebuyicon,
                state: $scope._buytext,
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 1,
                name: "load",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 2,
                name: "pass",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 3,
                name: "error",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 4,
                name: "cart",
                icon: "",
                state: $scope._viewcarttext,
                data_font_color: "",
                data_background_color: "primary_darkest"
            }]
        };
        /* - get api product/id start - */
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.product.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                $scope.dataApi.product.dataSend.txt_product_id = (res_product_id != false) ? res_product_id : 0;
                $scope.getData().dataSend($scope.dataApi.product.api, $scope.dataApi.product.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_product, res_state) {
                        $scope.dataApi.product.ok = res_ok;
                        if ($scope._imageappcoverchecked) {
                            var images = [];
                            angular.forEach(get_res_api_product.data.product_image,function(image,index_image){
                                if (!image.image_app_cover_checked) {
                                    images.push(image)
                                }
                            });
                            get_res_api_product.data.product_image = images;
                        }
                        angular.element('.load-effect').removeClass('is-active');
                        $scope.dataApi.product.dataArray = get_res_api_product.data;
                        $scope.getData().consoleLog("get_res_api_product", get_res_api_product);
                        $scope.dataApi.product.dataArrayState = res_state;
                        /* -- get api shop/current to reward -- */
                        if (res_ok) {
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.reward.dataArrayState = res_state;
                                $scope.getData().dataSend($scope.dataApi.reward.api, $scope.dataApi.reward.dataSend, function(res_api, res_dataSend) {
                                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                                        $scope.dataApi.reward.ok = res_ok;
                                        $scope.dataApi.reward.dataArray = get_res_api_shop.data;
                                        $scope.dataApi.reward.dataArrayState = res_state;
                                        $scope.getReward().createReward($scope.dataApi.product.dataArray.product_reward, get_res_api_shop.data.shop_point_config, function(res_reward) {
                                            $scope.data.reward.type_id = res_reward.type_id;
                                            $scope.data.reward.reward_amount = res_reward.amount;
                                            $scope.data.reward.reward_percent = res_reward.percent;
                                            $scope.data.reward.reward_every_price = res_reward.every_price;
                                            /* --- Wait product/id ,shop/current --- */
                                            /* ---- get attribute ---- */
                                            $scope.getAttribute().productAttribute(get_res_api_product.data.product_attribute, function(res_attribute) {
                                                $scope.data.attribute.dataArray = res_attribute;
                                                $scope.getAttribute().checkMinPrices(get_res_api_product, res_attribute, function(res_data_price, res_state) {
                                                    $scope.data.attribute.state = res_state;
                                                    $scope.data.product_price = res_data_price.product_price;
                                                    $scope.data.product_compare_price = res_data_price.product_compare_price;
                                                    $scope.data.sum_product_price = res_data_price.sum_product_price;
                                                    $scope.data.sum_product_compare_price = res_data_price.sum_product_compare_price;
                                                    $scope.data.sum_product_compare_minus_sum_product_price = res_data_price.sum_product_compare_minus_sum_product_price;
                                                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                                                        $scope.data.reward.point_reward = res_point_reward;
                                                    });
                                                    /* ----- stock ----- */
                                                    $scope.data.quantity.quantity_max = res_data_price.product_price.total_stock;
                                                    $scope.data.quantity.quantity_select = [];
                                                    for (var i = 0; i < res_data_price.product_price.total_stock; i++) {
                                                        $scope.data.quantity.quantity_select.push(i + 1);
                                                    }
                                                    /* ----- stock ----- */
                                                });
                                            });
                                            /* ---- get attribute ---- */
                                            /* ---- get attribute custom ---- */
                                            $scope.getAttributeCustom().createArray(get_res_api_product.data.product_custom_templates, function(res_custom_attribute, res_state) {
                                                $scope.data.attribute_custom.state = res_state;
                                                $scope.data.attribute_custom.dataArray = res_custom_attribute;
                                            });
                                            /* ---- get attribute custom ---- */
                                            /* ---- get detail ---- */
                                            $scope.getDetail().getDetail(get_res_api_product.data, function(res_description, res_info, res_state_info, res_specificatio, res_state_specificatio) {
                                                $scope.data.detail.dataArray[0].data = res_description;
                                                $scope.data.detail.dataArray[1].data = res_info;
                                                $scope.data.detail.dataArray[1].state = res_state_info;
                                                $scope.data.detail.dataArray[2].dataArray = res_specificatio;
                                                $scope.data.detail.dataArray[2].state = res_state_specificatio;
                                            });
                                            /* ---- get detail ---- */
                                            /* ---- update state ---- */
                                            $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                                            /* ---- update state ---- */
                                            /* --- Wait product/id ,shop/current --- */
                                        });
                                    });
                                });
                            });
                            /* -- get api shop/current to reward -- */
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.relation.dataArrayState = res_state;
                                $scope.getData().getReferralId(get_res_api_product.data.product_referral_display, function(res_referral_id) {
                                    $scope.dataApi.relation.dataSend.txt_referral_id = res_referral_id;
                                    $scope.getData().dataSend($scope.dataApi.relation.api, $scope.dataApi.relation.dataSend, function(res_api, res_dataSend) {
                                        $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_referral, res_state) {
                                            $scope.dataApi.relation.ok = res_ok;
                                            $scope.dataApi.relation.dataArray = (res_referral_id != 0) ? get_res_api_referral.data : [];
                                            $scope.dataApi.relation.dataArrayState = res_state;
                                        });
                                    });
                                });
                            });
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.getData().getStaffId(get_res_api_product.data.product_staff_id, function(res_staff) {
                                    if (res_staff.status) {
                                        $scope.dataApi.staff.dataArrayState = res_state;
                                        $scope.dataApi.staff.dataSend.txt_staff_id = res_staff.staff_id;
                                        $scope.getData().dataSend($scope.dataApi.staff.api, $scope.dataApi.staff.dataSend, function(res_api, res_dataSend) {
                                            $scope.getData().getApi(res_api, res_dataSend, function(res_ok, res, res_state) {
                                                $scope.dataApi.staff.ok = res_ok;
                                                $scope.dataApi.staff.dataArray = res.data;
                                                $scope.getData().getNameUrl(res.data.staff_first_name, function(res_staff_first_name_url) {
                                                    $scope.dataApi.staff.dataArray.staff_first_name_url = res_staff_first_name_url;
                                                    $scope.dataApi.staff.dataArrayState = res_state;
                                                });
                                            });
                                        });
                                    }
                                });
                            });
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                        } else {
                            /* ok = false */
                            if ($scope.dataApi.product.dataArray.length != 0) {
                                /* product deal to product original */
                                if ($scope.dataApi.product.dataArray.product_set_array.length != 0) {
                                    $scope.countDown().getNameUrl($scope.dataApi.product.dataArray.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", $scope.dataApi.product.dataArray.product_set_array[0].product_id, res_name);
                                    });
                                } else {
                                    $scope.pages().pageName("home");
                                }
                            } else {
                                /* product null */
                                $scope.pages().pageName("home");
                            }
                        }
                    });
                });
            });
        });
        /* - get api product/id end - */
        /* get product api */
    };
    return promise;
});_ui_share_app.directive('componentProductDiscount', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductDiscount';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        'feature':'@feature',
        'badgeid':'@badgeid',
        'badgetext':'@badgetext',
        'imgpath':'@imgpath',
        'margin':'@margin',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval) {      
        $scope.use_feature = (typeof $scope.feature !== 'undefined' && $scope.feature == 'true') ? true : false;
        /**
        * Check if object array available for "website application" or "Mobile application" or "Featured"
        * @params object array
        * return true | false (default)
        */
        $scope._showWeb = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 18) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showApp = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 19) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showFeature = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 16) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /*
        * view current routeParams
        * @params (default)
        * @return function
        */
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        /* Dummy */
        $scope.getDummyArray = function(){            
            var r = [];
            var max = 6;
            for(var i = 0; i < max; i++){
                r.push({
                    product_id: '999999',
                    product_title: 'Samsung Galaxy S8',
                    product_price: '45000',
                    product_compare_price: '55000',
                    product_image:[{image_url:'extensions/themes/gae_default301/staticfiles/images/default/490x490.gif'}],
                    product_badge:[{badge_id:18}],
                    callback_array:true
                });
            }
            return r;
        };
        $scope.data = [];
        $scope.data_discount = [];
        $scope.data_done = false;
        /* Get referral data (all)
        * @params none
        * @return array
        */
        $scope.getData = function(badgeId){
            $scope.data = [];
            $scope.data_discount = [];
            $scope.data_discount.discount_price = 0;
            $scope.data_done = false;
            var filterJson = {'badge_id_array':[18]};    
            if($scope.use_feature){
                filterJson.badge_id_array.push(16);
            }        
            var d = {
                'cur_page':1,
                'per_page':8,
                'txt_filter_json':JSON.stringify(filterJson),
            };
            GAEAPI.get('product/lists',d,$scope).then(function(e){               
                if(e.ok == 1){
                    if(e.data.dataList.length > 0){
                        $scope.data = e.data.dataList;
                        for (var i = 0; i < e.data.dataList.length; i++) {
                            console.log("test_discount : ",i,e.data.dataList[i].product_discount.length , e.data.dataList[i].product_discount);
                            
                            if(e.data.dataList[i].product_discount.length == undefined && e.data.dataList[i].product_discount){
                                console.log("test_discount",e.data.dataList[i].product_discount);
                                $scope.data_discount.push(e.data.dataList[i]);
                                if(e.data.dataList[i].product_discount.discount_price != 0){
                                    $scope.data_discount[i].discount_price = (e.data.dataList[i].product_price-e.data.dataList[i].product_discount.discount_price);
                                }else if(e.data.dataList[i].product_discount.discount_price == 0 && e.data.dataList[i].product_discount.discount_percent != 0){
                                     $scope.data_discount[i].discount_price = (e.data.dataList[i].product_price-((e.data.dataList[i].product_price*e.data.dataList[i].product_discount.discount_percent)/100));
                                }
                                console.log("test_discount_price",$scope.data_discount[i].discount_price);
                            }
                        }
                    } else {
                        var dummy = $scope.getDummyArray();
                        $scope.data = dummy;
                    }
                    $scope.buildImageSlider($scope.data);
                    $scope.data_done = true;
                }
            });
        };
        /* Get referral data (by referral_id)
        * @params id = referral_id
        * @return array
        */
        $scope.getDataReferral = function(id){
            $scope.data = [];
            $scope.data_done = false;
            var d = {
                'txt_referral_id':id
            };
            GAEAPI.get('referral/id_map',d,$scope).then(function(e){
                if(e.ok == 1){
                    $scope.data[0] = e.data;
                    $scope.data_done = true;
                    $scope.buildImageSlider($scope.data);
                }
            });
        };
        /*
        * params listener
        * @params newValue
        * @params oldValue
        * @return function
        */
        $scope.$watch('badgeid', function (newValue, oldValue) {
            if (!newValue){
                return;
            }
            $scope.getData(newValue);
        });
        /*
        * check if image array exist or build dummy image array
        * @params arrayObject = object array
        * @return array
        */
        $scope.buildImageSlider = function(){
            var imageArray = function(){
                return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1.jpg'},
                    /*{'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},*/
                ];
            };
            var imageBannerArray = function(){
                return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1.jpg'},
                    /*{'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2.jpg'},*/
                ];
            };
            angular.forEach($scope.data, function(item,key){
                if(typeof item.product_image == 'undefined'){
                    item.product_image = [];
                }
                /*if(typeof item.referral_image_banner == 'undefined'){
                    item.referral_image_banner = [];
                }*/
                if(!item.product_image.length){
                    item.product_image = imageArray();                    
                }
                /*item.referral_image_banner = imageBannerArray();*/
            });
        };
        /* Make Carousel */
        $scope._makeProductToCarousel = function (keyCustom) {
            var elementName = '[data-id="' + keyCustom + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                
            };            
            return sliderProvider(elementName, optionsParmas, "", keyCustom);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(){          
            return  "-" + (($('.row.slick-slider[data-id="'+$scope._uniqueKey+'"]').height() / 2) + 34) + "px";
        };
        /* Carousel Arrow Click */
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        /* Carousel Arrow Click */
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Event Listener when ng-repeat end */
        $rootScope.$on('repeatend', function() {           
            if($('[data-id*="gallery-"]').length){
                $('[data-id*="gallery-"]').not('.slick-initialized').each(function(Key,Object){
                    if($(this).find('.imageItem').length > 0){
                        $scope._makeProductToCarousel($(this).attr('data-id'));
                    }
                });
            }
        });
        /* Check if seo enable */
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.buildTitleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
if (typeof $productTimingRequest == 'undefined') {
    var $productTimingRequest = {
        request: 0,
        data: 0,
        timeMemory: null,
        checkAllDone: function() {
            console.log("checkAllDone", this.data, this.request);
            if (this.data > 0 && this.data >= this.request) {
                $('.all-load').addClass('active');
                $('.all-content').addClass('active');
                this.timeMemory = setTimeout(function() {
                    $('.all-content').addClass('shown');
                    window.clearTimeout(this.timeMemory);
                }, 650);
            }
        },
        instantDisplay: function() {
            console.log("checkAllDone: not match => display");
            $('.all-load').addClass('active');
            $('.all-content').addClass('active');
            $('.all-content').addClass('shown');
            this.timeMemory = null;
        }
    };
}
var _countHide = 0;
_ui_share_app.directive('componentProductLayout', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductLayout';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
        imgcart: '@imgcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.productData = [];
        $scope.productDataload = false;
        $scope.type = $scope.request;
        $scope.done = false;
        /* GET product list in category (feature *any) */
        $scope._get_category_feature = function() {
            $scope.productData = [];
            var dataSendCat = {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'referral_sort_index_asc_name_asc',
                'txt_filter_json': JSON.stringify([{
                    'badge_id_array': [16]
                }])
            };
            /*     badge_sort_index_asc*/
            GAEAPI.get('referral/lists', dataSendCat, $scope).then(function(resultCategory) {
                var ref = [];
                for (var i = 0; i < resultCategory.data.dataList.length; i++) {
                    for (var ii = 0; ii < resultCategory.data.dataList[i].referral_badge.length; ii++) {
                        if (resultCategory.data.dataList[i].referral_badge[ii].badge_id == 16) {
                            ref.push(parseInt(resultCategory.data.dataList[i].referral_id));
                            break;
                        }
                    }
                }
                $scope.productDataload = false;
                var jsonFilter = {
                    'referral_id_array_or': ref,
                    'badge_id_array': [18]
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'txt_sortby': 'root_category_index_asc',
                    'txt_filter_json': JSON.stringify(jsonFilter)
                };
                GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.productData = e.data.dataList;
                        $scope.productDataload = true;
                    }
                });
            });
        };
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        $scope._get_product_by_badge = function(badgeId) {
            $scope.productData = [];
            $scope.productDataload = false;
            var jsonFilter = {
                'badge_id_array': [18, badgeId]
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_sortby': 'root_category_index_asc',
                'txt_filter_json': JSON.stringify(jsonFilter)
            };
            /*product_lastest_create  */
            GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.productData = e.data.dataList;
                    $scope.productDataload = true;
                }
            });
        };
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function(referral_id) {
            $scope.productDataload = false;
            $productTimingRequest.request = $productTimingRequest.request + 1;
            var j = {
                'badge_id_array': [18],
                'referral_id_array': [referral_id]
            };
            var d = {
                'cur_page': 1,
                'per_page': 30,
                'txt_sortby': 'root_category_index_asc',
                'txt_filter_json': JSON.stringify(j)
            };
            /* root_category_index_asc */
            console.log("Fetching 1", $scope.referral);
            GAEAPI.get('product/lists', d, $scope).then(function(e) {
                $scope.productDataload = true;
                $scope.productData = e.data.dataList;
                $productTimingRequest.data = $productTimingRequest.data + 1;
                $productTimingRequest.checkAllDone();
                if (e.data.dataList.length <= 0 && $routeParams.referral_id == referral_id) {
                    /* window.location.href="home";*/
                } else if (e.data.dataList.length <= 0) {
                    $('div[data-id="' + $scope.referral + '"]').hide();
                }
                if (typeof $routeParams.section !== 'undefined') {
                    // alert($routeParams.section);
                    $timeout(function() {
                        $('html, body').animate({
                            scrollTop: $("div[id='" + $routeParams.section + "']").offset().top - 250
                        }, 200);
                    }, 200);
                }
                console.log("Fetching 2", $scope.referral, " : result :", $scope.productData);
            });
        };
        $scope.$watch('type', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            if (newValue == 'category_feature') {
                /* Featured Product */
                /*return $scope._get_category_feature();*/
                return $scope._get_product_by_badge(16);
            }
            if (newValue == 'product_newarrival' || newValue == 'new_arrival') {
                /* New Arrival */
                return $scope._get_product_by_badge(72);
            }
            if (newValue == 'product_bestseller' || newValue == 'best_seller') {
                /* New Arrival */
                return $scope._get_product_by_badge(75);
            }
            if (newValue == 'product_feature' || newValue == 'product_recommend') {
                /* Recommend */
                return $scope._get_product_by_badge(74);
            }
            if (newValue == 'product_list_by_category') {
                return $scope._get_product_list_by_category($scope.referral);
            }
        });
        $scope.shopid = '';
        $scope.getShopid = function() {
            $scope.shopid = CUR_THEME.shop_id();
        };
        $scope.getShopid();
        $scope.initSlider = function() {
            var elementName = '.row-product[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                centerMode: true,
                centerPadding: '0px',
                slidesToShow: 3,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                infinite: true,
                responsive: [{
                    breakpoint: 768,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 2
                    }
                }, {
                    breakpoint: 480,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 2
                    }
                }]
            };
            var extraOptions = {
                animate: false
            };
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(v) {
            return "-" + ($('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2) + v + "px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function(v) {
            return $('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2;
        };
        $rootScope.$on('repeatend', function() {
            if ($scope.use_carousel) {
                var t = $interval(function() {
                    if ($scope._uniqueKey !== "") {
                        $interval.cancel(t);
                        var tt = $timeout(function() {
                            $timeout.cancel(tt);
                            $scope.done = true;
                            $scope.initSlider();
                        }, 300);
                    }
                }, 500);
            }
        });
        $scope.checkHideCondition = function(referral_id) {
            return true;
            if ($location.path() != '/' && $location.path() !== '/home') {
                if (typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id) {
                    return false; /* hide */
                }
                return true;
            }
            return true;
        };
    };
    return promise;
});
var _countHide = 0;
_ui_share_app.directive('componentProductLayoutA', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductLayoutA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
    	'text_first':'?textFirst',
    	'text_second':'?textSecond',
    };
    promise.link = function (scope, element, attr) {};
    promise.controller = function ($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.productData = [];
        $scope.type = $scope.request;
        /* GET product list in category (feature *any) */
        $scope._get_category_feature = function(){
        	$scope.productData = [];
        	
        	var dataSendCat = {
        		'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'referral_sort_index_asc_name_asc',   
                'txt_filter_json': JSON.stringify([{'badge_id_array': [16]}])
        	};
             /*     badge_sort_index_asc*/
        	GAEAPI.get('referral/lists', dataSendCat).then(function(resultCategory){   
	        	var ref = [];    		
        		for(var i = 0; i < resultCategory.data.dataList.length; i++){        			
        			for(var ii = 0; ii < resultCategory.data.dataList[i].referral_badge.length; ii++){
        				if(resultCategory.data.dataList[i].referral_badge[ii].badge_id == 16){
        					ref.push(parseInt(resultCategory.data.dataList[i].referral_id));
        					break;
        				}
        			}        			
        		}
        		var jsonFilter = {
                    'referral_id_array_or': ref,
                    'badge_id_array': [18]
                };
        		var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'txt_sortby': 'product_title_a-z',
                	'txt_filter_json': JSON.stringify(jsonFilter)
                };
                GAEAPI.get('product/lists', dataSend).then(function(e){                	
                	if(e.ok == 1){
                		$scope.productData = e.data.dataList;
                	}
                });     		
        	}); 
        }; 
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        $scope._get_product_by_badge = function(badgeId){
        	$scope.productData = [];
        	var jsonFilter = {
                'badge_id_array': [18,badgeId]
            };
    		var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_sortby': 'badge_sort_index_asc',
            	'txt_filter_json': JSON.stringify(jsonFilter)
            };
            /*product_lastest_create  */
            GAEAPI.get('product/lists', dataSend).then(function(e){
            	if(e.ok == 1){
            		$scope.productData = e.data.dataList;            		
            	}
            });
        };
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function(referral_id){
            var j = {
                'badge_id_array': [18],
                'referral_id_array': [referral_id]
            };
            var d = {
                'cur_page': 1,
                'per_page': 30,
                'txt_sortby':'root_category_index_0-9',
                'txt_filter_json': JSON.stringify(j)
            };
            /* root_category_index_asc */
            console.log("Fetching ", $scope.referral);
            if(CUR_THEME.shop_id() == 500){
                $scope.text_first = 'testtt';
                $http.get('https://missmonribs.getappeasy.com/store/api/v1/product/lists',{params:d}).then(function(res){
                    var e = res.data;
                    $scope.productData = e.data.dataList;
                    console.log("Fetching ", $scope.referral, " : result :", $scope.productData);    
                    if($scope.productData.length <= 0 && $routeParams.referral_id == referral_id){
                        return $location.path("/home");
                    }                               
                });
            } else {
                GAEAPI.get('product/lists',d).then(function(e){
                    $scope.productData =  e.data.dataList;
                    console.log("Fetching ", $scope.referral, " : result :", e);  
                });
            }
        };
        $scope.$watch('type', function(newValue,oldValue){
        	if(!newValue){
        		return;
        	}
        	if(newValue == 'category_feature'){
                /* Featured Product */
	        	/*return $scope._get_category_feature();*/
                return $scope._get_product_by_badge(16);
	        }
            if(newValue == 'product_newarrival' || newValue == 'new_arrival') {
                /* New Arrival */
                return $scope._get_product_by_badge(72);
            }
            if(newValue == 'product_feature' || newValue == 'product_recommend') {
                /* Recommend */
                return $scope._get_product_by_badge(74);
            }
            if(newValue == 'product_list_by_category'){
	        	return $scope._get_product_list_by_category($scope.referral);
	        }
        });        
        $scope._makeProductToCarousel = function () {
            var elementName = '[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 4,
                slidesToScroll: 4,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                responsive: [
                {
                    breakpoint: 769,
                    settings: {
                        slidesToShow: 3,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false
                    }
                }, {
                    breakpoint: 601,
                    settings: {
                        slidesToShow: 2,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false
                    }
                }, {
                    breakpoint: 481,
                    settings: {
                        slidesToShow: 1,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false,
                        dots: false
                    }
                }
                ]
            };            
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(v){         
            return  "-" + ($('[data-id="'+$scope._uniqueKey+'"]').height() / 2) + "."+ v + "px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function(v){        	
        	return  $('[data-id="'+$scope._uniqueKey+'"]').height() / 2;
        };
        $rootScope.$on('repeatend', function() {
            if($('[data-id="'+$scope._uniqueKey+'"]').not('.slick-initialized') && $scope.use_carousel){
                $timeout(function(){
                    $scope._makeProductToCarousel();
                }, 500);                
            }
            
        });
        $scope.checkHideCondition = function(referral_id){
            return true;
            if($location.path() != '/' && $location.path() !== '/home'){
                if(typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id){
                    return false; /* hide */
                }   
                return true;                             
            }
            return true;
        };
    };
    return promise;
});
var _countHide = 0;
_ui_share_app.directive('componentProductLayoutB', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductLayoutB';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
        lesspad: '@lesspad',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
    	'text_first':'?textFirst',
    	'text_second':'?textSecond',
    };
    promise.link = function (scope, element, attr) {};
    promise.controller = function ($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        $scope.use_lesspad = (typeof $scope.lesspad !== 'undefined' && $scope.lesspad == 'true') ? true : false;
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.productData = [];
        $scope.type = $scope.request;
        /* GET product list in category (feature *any) */
        $scope._get_category_feature = function(){
        	$scope.productData = [];
        	
        	var dataSendCat = {
        		'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'referral_sort_index_asc_name_asc',   
                'txt_filter_json': JSON.stringify([{'badge_id_array': [16]}])
        	};
             /*     badge_sort_index_asc*/
        	GAEAPI.get('referral/lists', dataSendCat).then(function(resultCategory){   
	        	var ref = [];    		
        		for(var i = 0; i < resultCategory.data.dataList.length; i++){        			
        			for(var ii = 0; ii < resultCategory.data.dataList[i].referral_badge.length; ii++){
        				if(resultCategory.data.dataList[i].referral_badge[ii].badge_id == 16){
        					ref.push(parseInt(resultCategory.data.dataList[i].referral_id));
        					break;
        				}
        			}        			
        		}
        		var jsonFilter = {
                    'referral_id_array_or': ref,
                    'badge_id_array': [18]
                };
        		var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'txt_sortby': 'product_title_a-z',
                	'txt_filter_json': JSON.stringify(jsonFilter)
                };
                GAEAPI.get('product/lists', dataSend).then(function(e){                	
                	if(e.ok == 1){
                		$scope.productData = e.data.dataList;
                        console.log("tiuuiy111",$scope.productData);   
                	}
                });     		
        	}); 
        }; 
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        $scope._get_product_by_badge = function(badgeId){
        	$scope.productData = [];
        	var jsonFilter = {
                'badge_id_array': [18,badgeId]
            };
    		var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_sortby': 'badge_sort_index_asc',
            	'txt_filter_json': JSON.stringify(jsonFilter)
            };
            /*product_lastest_create  */
            GAEAPI.get('product/lists', dataSend).then(function(e){
            	if(e.ok == 1){
            		$scope.productData = e.data.dataList; 
                    console.log("tiuuiy222",$scope.productData);           		
            	}
            });
        };
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function(referral_id){
            var j = {
                'badge_id_array': [18],
                'referral_id_array': [referral_id]
            };
            var d = {
                'cur_page': 1,
                'per_page': 30,
                'txt_sortby':'root_category_index_0-9',
                'txt_filter_json': JSON.stringify(j)
            };
            /* root_category_index_asc */
            console.log("Fetching ", $scope.referral);
            if(CUR_THEME.shop_id() == 500){
                $scope.text_first = 'testtt';
                $http.get('https://missmonribs.getappeasy.com/store/api/v1/product/lists',{params:d}).then(function(res){
                    var e = res.data;
                    $scope.productData = e.data.dataList;
                    console.log("Fetching ", $scope.referral, " : result :", $scope.productData);    
                    if($scope.productData.length <= 0 && $routeParams.referral_id == referral_id){
                        return $location.path("/home");
                    }                               
                });
            } else {
                GAEAPI.get('product/lists',d).then(function(e){
                    $scope.productData =  e.data.dataList;
                    console.log("Fetching ", $scope.referral, " : result :", e);  
                    console.log("tiuuiy333",$scope.productData);   
                });
            }
        };
        $scope.$watch('type', function(newValue,oldValue){
        	if(!newValue){
        		return;
        	}
        	if(newValue == 'category_feature'){
                /* Featured Product */
	        	/*return $scope._get_category_feature();*/
                return $scope._get_product_by_badge(16);
	        }
            if(newValue == 'product_newarrival' || newValue == 'new_arrival') {
                /* New Arrival */
                return $scope._get_product_by_badge(72);
            }
            if(newValue == 'product_feature' || newValue == 'product_recommend') {
                /* Recommend */
                return $scope._get_product_by_badge(74);
            }
            if(newValue == 'product_list_by_category'){
	        	return $scope._get_product_list_by_category($scope.referral);
	        }
        });        
        $scope._makeProductToCarousel = function () {
            var elementName = '[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 3,
                slidesToScroll: 3,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                responsive: [
                {
                    breakpoint: 769,
                    settings: {
                        slidesToShow: 2,
                        slidesToScroll: 2,
                        variableWidth: false,
                        centerMode: false
                    }
                }, {
                    breakpoint: 601,
                    settings: {
                        slidesToShow: 1,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false
                    }
                }, {
                    breakpoint: 481,
                    settings: {
                        slidesToShow: 1,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false,
                        dots: false
                    }
                }
                ]
            };            
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(v){         
            return  "-" + ($('[data-id="'+$scope._uniqueKey+'"]').height() / 2) + v + "px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function(v){        	
        	return  $('[data-id="'+$scope._uniqueKey+'"]').height() / 2;
        };
        $rootScope.$on('repeatend', function() {
            if($('[data-id="'+$scope._uniqueKey+'"]').not('.slick-initialized') && $scope.use_carousel){
                $timeout(function(){
                    $scope._makeProductToCarousel();
                }, 500);                
            }
            
        });
        $scope.checkHideCondition = function(referral_id){
            return true;
            if($location.path() != '/' && $location.path() !== '/home'){
                if(typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id){
                    return false; /* hide */
                }   
                return true;                             
            }
            return true;
        };
    };
    return promise;
});
var _countHide = 0;
_ui_share_app.directive('componentProductLayoutC', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductLayoutC';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
        imgcart: '@imgcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.productData = [];
        $scope.productDataload = false;
        $scope.type = $scope.request;
        $scope.done = false;
        /* GET product list in category (feature *any) */
        $scope._get_category_feature = function() {
            $scope.productData = [];
            var dataSendCat = {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'referral_sort_index_asc_name_asc',
                'txt_filter_json': JSON.stringify([{
                    'badge_id_array': [16]
                }])
            };
            /*     badge_sort_index_asc*/
            GAEAPI.get('referral/lists', dataSendCat, $scope).then(function(resultCategory) {
                var ref = [];
                for (var i = 0; i < resultCategory.data.dataList.length; i++) {
                    for (var ii = 0; ii < resultCategory.data.dataList[i].referral_badge.length; ii++) {
                        if (resultCategory.data.dataList[i].referral_badge[ii].badge_id == 16) {
                            ref.push(parseInt(resultCategory.data.dataList[i].referral_id));
                            break;
                        }
                    }
                }
                $scope.productDataload = false;
                var jsonFilter = {
                    'referral_id_array_or': ref,
                    'badge_id_array': [18]
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'txt_sortby': 'root_category_index_asc',
                    'txt_filter_json': JSON.stringify(jsonFilter)
                };
                GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.productData = e.data.dataList;
                        $scope.productDataload = true;
                    }
                });
            });
        };
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        $scope._get_product_by_badge = function(badgeId) {
            $scope.productData = [];
            $scope.productDataload = false;
            var jsonFilter = {
                'badge_id_array': [18, badgeId]
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_sortby': 'root_category_index_asc',
                'txt_filter_json': JSON.stringify(jsonFilter)
            };
            /*product_lastest_create  */
            GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.productData = e.data.dataList;
                    $scope.productDataload = true;
                }
            });
        };
        
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function(referral_id) {
            // $scope.productData = [];
            $scope.productDataload = false;
            $productTimingRequest.request = $productTimingRequest.request + 1;
            
           
            var f_first = {
                'txt_referral_id': referral_id
            }
            GAEAPI.get('referral/id_map', f_first, $scope).then(function(e) {
               
                if (e.ok == 1) {
                    if(e.data.referral_sub_array.length > 0){
                         $scope.productDataload = true;
                        $scope.productData = e.data.referral_sub_array;
                        console.log("pop kai sod test 1 :",$scope.productData);
                        $scope.havsub = true;
                    }else{
                        var j = {
                            'badge_id_array': [18],
                            'referral_id_array': [referral_id]
                        };
                        var d = {
                            'cur_page': 1,
                            'per_page': 30,
                            'txt_sortby': 'root_category_index_asc',
                            'txt_filter_json': JSON.stringify(j)
                        };
                        $scope.havsub = false;
                        console.log("Fetching 1", $scope.referral);
                        GAEAPI.get('product/lists', d, $scope).then(function(e) {
                            $scope.productDataload = true;
                            $scope.productData = e.data.dataList;
                            console.log("pop kai sod test 2 :",$scope.productData);
                            $productTimingRequest.data = $productTimingRequest.data + 1;
                            $productTimingRequest.checkAllDone();
                            if (e.data.dataList.length <= 0 && $routeParams.referral_id == referral_id) {
                                /* window.location.href="home";*/
                            } else if (e.data.dataList.length <= 0) {
                                $('div[data-id="' + $scope.referral + '"]').hide();
                            }
                            if (typeof $routeParams.section !== 'undefined') {
                                // alert($routeParams.section);
                                $timeout(function() {
                                    $('html, body').animate({
                                        scrollTop: $("div[id='" + $routeParams.section + "']").offset().top - 250
                                    }, 200);
                                }, 200);
                            }
                            console.log("Fetching 2", $scope.referral, " : result :", $scope.productData);
                        });
                    }
                }
            });
            /* root_category_index_asc */
        };
        $scope.$watch('type', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            if (newValue == 'category_feature') {
                /* Featured Product */
                /*return $scope._get_category_feature();*/
                return $scope._get_product_by_badge(16);
            }
            if (newValue == 'product_newarrival' || newValue == 'new_arrival') {
                /* New Arrival */
                return $scope._get_product_by_badge(72);
            }
            if (newValue == 'product_bestseller' || newValue == 'best_seller') {
                /* New Arrival */
                return $scope._get_product_by_badge(75);
            }
            if (newValue == 'product_feature' || newValue == 'product_recommend') {
                /* Recommend */
                return $scope._get_product_by_badge(74);
            }
            if (newValue == 'product_list_by_category') {
                // $scope.havsub = false;
                return $scope._get_product_list_by_category($scope.referral);
            }
        });
        $scope.shopid = '';
        $scope.getShopid = function() {
            $scope.shopid = CUR_THEME.shop_id();
        };
        $scope.getShopid();
        $scope.initSlider = function() {
            var elementName = '.row-product[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                centerMode: true,
                centerPadding: '0px',
                slidesToShow: 3,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                infinite: true,
                responsive: [{
                    breakpoint: 768,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 2
                    }
                }, {
                    breakpoint: 480,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 2
                    }
                }]
            };
            var extraOptions = {
                animate: false
            };
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(v) {
            return "-" + ($('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2) + v + "px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function(v) {
            return $('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2;
        };
        $rootScope.$on('repeatend', function() {
            if ($scope.use_carousel) {
                var t = $interval(function() {
                    if ($scope._uniqueKey !== "") {
                        $interval.cancel(t);
                        var tt = $timeout(function() {
                            $timeout.cancel(tt);
                            $scope.done = true;
                            $scope.initSlider();
                        }, 300);
                    }
                }, 500);
            }
        });
        $scope.checkHideCondition = function(referral_id) {
            return true;
            if ($location.path() != '/' && $location.path() !== '/home') {
                if (typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id) {
                    return false; /* hide */
                }
                return true;
            }
            return true;
        };
    };
    return promise;
});_ui_share_app.factory('$componentProductLayoutMain', function componentProductLayoutMain($routeParams, $timeout) {
    return
});_ui_share_app.directive('componentProductLayoutMainA', function($rootScope, $routeParams) {
    var templateName = 'componentProductLayoutMainA';
    var componentMain = 'componentProductLayoutMain';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
        stylebutton: '@stylebutton',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        $scope.productData = [];
        $scope.productDataload = false;
        $scope.type = $scope.request;
        /* GET product list in category (feature *any) */
        $scope._get_category_feature = function() {
            $scope.productData = [];
            var dataSendCat = {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'referral_sort_index_asc_name_asc',
                'txt_filter_json': JSON.stringify([{
                    'badge_id_array': [16]
                }])
            };
            /*     badge_sort_index_asc*/
            GAEAPI.get('referral/lists', dataSendCat, $scope).then(function(resultCategory) {
                var ref = [];
                for (var i = 0; i < resultCategory.data.dataList.length; i++) {
                    for (var ii = 0; ii < resultCategory.data.dataList[i].referral_badge.length; ii++) {
                        if (resultCategory.data.dataList[i].referral_badge[ii].badge_id == 16) {
                            ref.push(parseInt(resultCategory.data.dataList[i].referral_id));
                            break;
                        }
                    }
                }
                $scope.productDataload = false;
                var jsonFilter = {
                    'referral_id_array_or': ref,
                    'badge_id_array': [18]
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'txt_sortby': 'product_title_a-z',
                    'txt_filter_json': JSON.stringify(jsonFilter)
                };
                GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.productData = e.data.dataList;
                        $scope.productDataload = true;
                    }
                });
            });
        };
        $scope.categoryData = [];
        $scope._getCategory = function(badgeId) {
            var dataSend = {
                'txt_referral_type_id': 11
            };
            GAEAPI.get('referral/map', dataSend, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.categoryData = e.data;
                }
            });
        };
        $scope._getCategory();
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        $scope._get_product_by_badge = function(badgeId) {
            $scope.productData = [];
            $scope.productDataload = false;
            var jsonFilter = {
                'badge_id_array': [18, badgeId]
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_sortby': 'badge_sort_index_asc',
                'txt_filter_json': JSON.stringify(jsonFilter)
            };
            /*product_lastest_create  */
            GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.productData = e.data.dataList;
                    $scope.productDataload = true;
                }
            });
        };
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function(referral_id) {
            $scope.productDataload = false;
            $productTimingRequest.request = $productTimingRequest.request + 1;
            var j = {
                'badge_id_array': [18],
                'referral_id_array': [referral_id]
            };
            var d = {
                'cur_page': 1,
                'per_page': 30,
                'txt_sortby': 'root_category_index_asc',
                'txt_filter_json': JSON.stringify(j)
            };
            /* root_category_index_asc */
            console.log("Fetching 1", $scope.referral);
            GAEAPI.get('product/lists', d, $scope).then(function(e) {
                $scope.productDataload = true;
                $scope.productData = e.data.dataList;
                $productTimingRequest.data = $productTimingRequest.data + 1;
                $productTimingRequest.checkAllDone();
                if (e.data.dataList.length <= 0 && $routeParams.referral_id == referral_id) {
                    /* window.location.href="home";*/
                } else if (e.data.dataList.length <= 0) {
                    $('div[data-id="' + $scope.referral + '"]').hide();
                }
                console.log("Fetching 2", $scope.referral, " : result :", $scope.productData);
            });
        };
        $scope.$watch('type', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            if (newValue == 'category_feature') {
                /* Featured Product */
                /*return $scope._get_category_feature();*/
                return $scope._get_product_by_badge(16);
            }
            if (newValue == 'product_newarrival' || newValue == 'new_arrival') {
                /* New Arrival */
                return $scope._get_product_by_badge(72);
            }
            if (newValue == 'product_feature' || newValue == 'product_recommend') {
                /* Recommend */
                return $scope._get_product_by_badge(74);
            }
            if (newValue == 'product_list_by_category') {
                return $scope._get_product_list_by_category($scope.referral);
            }
        });
        $scope._makeProductToCarousel = function() {
            var elementName = '[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 3,
                slidesToScroll: 3,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                responsive: [{
                    breakpoint: 769,
                    settings: {
                        slidesToShow: 2,
                        slidesToScroll: 2,
                        variableWidth: false,
                        centerMode: false
                    }
                }, {
                    breakpoint: 601,
                    settings: {
                        slidesToShow: 1,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false
                    }
                }, {
                    breakpoint: 481,
                    settings: {
                        slidesToShow: 1,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false,
                        dots: false
                    }
                }]
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(v) {
            return "-" + ($('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2) + v + "px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function(v) {
            return $('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2;
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-id="' + $scope._uniqueKey + '"]').not('.slick-initialized') && $scope.use_carousel) {
                $timeout(function() {
                    $scope._makeProductToCarousel();
                }, 500);
            }
        });
        $scope.arrayDataDOno = function(id, indata) {
            var dataSend = 0;
            for (var i = 0; i < indata.length; i++) {
                if (indata[i].product_referral_display.category[0].referral_parent_id == id) {
                    dataSend++;
                }
            }
            return dataSend;
        };
        $scope.arrayDataDTwo = function(id, indata) {
            var dataSend = 0;
            for (var i = 0; i < indata.length; i++) {
                if (indata[i].product_referral_display.category[0].referral_id == id) {
                    dataSend++;
                }
            }
            return dataSend;
        };
        $scope.checkHideCondition = function(referral_id) {
            return true;
            if ($location.path() != '/' && $location.path() !== '/home') {
                if (typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id) {
                    return false; /* hide */
                }
                return true;
            }
            return true;
        };
    };
    return promise;
});
_ui_share_app.directive('componentProductLayoutZ', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductLayoutZ';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
        imgcart: '@imgcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.productData = [];
        $scope.productDataload = false;
        $scope.type = $scope.referral;
        $scope.done = false;
        /* GET product list in category (feature *any) */
        $scope._get_category_feature = function() {
            $scope.productData = [];
            var dataSendCat = {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'referral_sort_index_asc_name_asc',
                'txt_filter_json': JSON.stringify([{
                    'badge_id_array': [16]
                }])
            };
            /*     badge_sort_index_asc*/
            GAEAPI.get('referral/lists', dataSendCat, $scope).then(function(resultCategory) {
                var ref = [];
                for (var i = 0; i < resultCategory.data.dataList.length; i++) {
                    for (var ii = 0; ii < resultCategory.data.dataList[i].referral_badge.length; ii++) {
                        if (resultCategory.data.dataList[i].referral_badge[ii].badge_id == 16) {
                            ref.push(parseInt(resultCategory.data.dataList[i].referral_id));
                            break;
                        }
                    }
                }
                $scope.productDataload = false;
                var jsonFilter = {
                    'referral_id_array_or': ref,
                    'badge_id_array': [18]
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'txt_sortby': 'root_category_index_asc',
                    'txt_filter_json': JSON.stringify(jsonFilter)
                };
                GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.productData = e.data.dataList;
                        $scope.productDataload = true;
                    }
                });
            });
        };
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        $scope._get_product_by_badge = function(badgeId) {
            $scope.productData = [];
            $scope.productDataload = false;
            var jsonFilter = {
                'badge_id_array': [18, badgeId]
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_sortby': 'root_category_index_asc',
                'txt_filter_json': JSON.stringify(jsonFilter)
            };
            /*product_lastest_create  */
            GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.productData = e.data.dataList;
                    $scope.productDataload = true;
                }
            });
        };
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function(referral_id) {
            $scope.productDataload = false;
            $productTimingRequest.request = $productTimingRequest.request + 1;
            var j = {
                'badge_id_array': [18],
                'referral_id_array': [referral_id]
            };
            var d = {
                'cur_page': 1,
                'per_page': 30,
                'txt_sortby': 'root_category_index_asc',
                'txt_filter_json': JSON.stringify(j)
            };
            /* root_category_index_asc */
            console.log("Fetching 1", $scope.referral);
            GAEAPI.get('product/lists', d, $scope).then(function(e) {
                $scope.productDataload = true;
                $scope.productData = e.data.dataList;
                $productTimingRequest.data = $productTimingRequest.data + 1;
                $productTimingRequest.checkAllDone();
                if (e.data.dataList.length <= 0 && $routeParams.referral_id == referral_id) {
                    /* window.location.href="home";*/
                } else if (e.data.dataList.length <= 0) {
                    $('div[data-id="' + $scope.referral + '"]').hide();
                }
                if (typeof $routeParams.section !== 'undefined') {
                    // alert($routeParams.section);
                    $timeout(function() {
                        $('html, body').animate({
                            scrollTop: $("div[id='" + $routeParams.section + "']").offset().top - 250
                        }, 200);
                    }, 200);
                }
                console.log("Fetching 2", $scope.referral, " : result :", $scope.productData);
            });
        };
        $scope.$watch('type', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            if(newValue){
               
                $scope._get_product_list_by_category($scope.referral);
            }
            
        });
        $scope.shopid = '';
        $scope.getShopid = function() {
            $scope.shopid = CUR_THEME.shop_id();
        };
        $scope.getShopid();
        $scope.initSlider = function() {
            var elementName = '.row-product[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                centerMode: true,
                centerPadding: '0px',
                slidesToShow: 3,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                infinite: true,
                responsive: [{
                    breakpoint: 768,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 2
                    }
                }, {
                    breakpoint: 480,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 2
                    }
                }]
            };
            var extraOptions = {
                animate: false
            };
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(v) {
            return "-" + ($('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2) + v + "px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function(v) {
            return $('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2;
        };
        $rootScope.$on('repeatend', function() {
            if ($scope.use_carousel) {
                var t = $interval(function() {
                    if ($scope._uniqueKey !== "") {
                        $interval.cancel(t);
                        var tt = $timeout(function() {
                            $timeout.cancel(tt);
                            $scope.done = true;
                            $scope.initSlider();
                        }, 300);
                    }
                }, 500);
            }
        });
        $scope.checkHideCondition = function(referral_id) {
            return true;
            if ($location.path() != '/' && $location.path() !== '/home') {
                if (typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id) {
                    return false; /* hide */
                }
                return true;
            }
            return true;
        };
    };
    return promise;
});_ui_share_app.factory('$componentProductListBadge', function componentProductListBadge($routeParams, $timeout) {
    return 
});_ui_share_app.directive('componentProductListBadgeIdA', function($rootScope, $routeParams) {
    var templateName = 'componentProductListBadgeIdA';
    var componentMain = 'componentProductListBadge';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        margin: '@margin',
        stylebutton: '@stylebutton',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {};
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.data_per_page = 15;
        $scope.JsonDATA = {
            result_rows: 0,
            total_rows: 0
        };
        $scope.JsonProductArray = [];
        $scope.JsonProductArrayState = {
            load: false,
            done: false
        };
        $scope.getJsonProductArray = function(page, id) {
            $scope.JsonProductArrayState = $scope.StateData(true, false);
            var dataSend = {
                'cur_page': 1,
                'per_page': page,
                'txt_filter_json': JSON.stringify({
                    'badge_id_array': [18, id]
                })
            };
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    $scope.JsonProductArray = output.data;                    
                }
                $scope.JsonProductArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope.getJsonProductArray($scope.data_per_page, $scope._viewRouteParams().badge_id);
        $scope.loadMore = function() {
            $scope.data_per_page = parseInt($scope.data_per_page) + 8;
            $scope.getJsonProductArray($scope.data_per_page, $scope._viewRouteParams().badge_id);
        };
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});
if (typeof $productTimingRequest == 'undefined') {
    var $productTimingRequest = {
        request: 0,
        data: 0,
        timeMemory: null,
        checkAllDone: function () {
            console.log("checkAllDone", this.data, this.request);
            if (this.data > 0 && this.data >= this.request) {
                $('.all-load').addClass('active');
                $('.all-content').addClass('active');
                this.timeMemory = setTimeout(function () {
                    $('.all-content').addClass('shown');
                    window.clearTimeout(this.timeMemory);
                }, 650);
            }
        },
        instantDisplay: function () {
            console.log("checkAllDone: not match => display");
            $('.all-load').addClass('active');
            $('.all-content').addClass('active');
            $('.all-content').addClass('shown');
            this.timeMemory = null;
        }
    };
}
var _countHide = 0;
_ui_share_app.directive('componentProductRelate', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelate';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        tagname: '@tagname',
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
        datapid:'@datapid',
        
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function (scope, element, attr) {};
    promise.controller = function ($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        console.log("tagname : ",$scope.tagname);
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.productData = [];
        $scope.productDataload = false;
        $scope.type = $scope.request;
        /* GET product list in category (feature *any) */
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function () {
           
             $scope.productDataload = false;
            $productTimingRequest.request = $productTimingRequest.request + 1;
            var j = {
                'badge_id_array': [18],
                'tags': $scope.tagname,
            };
            var d = {
                'cur_page': 1,
                'per_page': 30,
                'txt_filter_json': JSON.stringify(j)
            };
            /* root_category_index_asc */
            console.log("Fetching 1", $scope.tagname);            
            GAEAPI.get('product/lists', d, $scope).then(function (e) {
                $scope.productDataload = true;
                if($scope.datapid != undefined){
                    for (var i = 0; i < e.data.dataList.length; i++) {
                        if(e.data.dataList[i].product_id != datapid){
                            $scope.productData.push(e.data.dataList[i]);
                        }
                    }
                }else{
                    $scope.productData = e.data.dataList;
                }
                $productTimingRequest.data = $productTimingRequest.data + 1;
                $productTimingRequest.checkAllDone();
                if (e.data.dataList.length <= 0 && $routeParams.referral_id == referral_id) {
                    /*window.location.href="home"; */
                } else if (e.data.dataList.length <= 0) {
                    $('div[data-id="' + $scope.referral + '"]').hide();
                }
    
                console.log("Fetching 2", $scope.referral, " : result :", $scope.productData);
            });
            
        };
        $scope.$watch("tagname",function(newValue){
            if(GAEAPI.getValue(newValue,"")!=""){
              $scope._get_product_list_by_category();
            }
            
        });
        $scope._makeProductToCarousel = function () {
            var elementName = '[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 4,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                responsive: [
                    {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 3,
                            slidesToScroll: 1,
                            variableWidth: false,
                            centerMode: false
                        }
                    }, {
                        breakpoint: 601,
                        settings: {
                            slidesToShow: 2,
                            slidesToScroll: 1,
                            variableWidth: false,
                            centerMode: false
                        }
                    }, {
                        breakpoint: 481,
                        settings: {
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            variableWidth: false,
                            centerMode: false,
                            dots: false
                        }
                    }
                ]
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function (v) {
            console.log("eeeeeeeeeeeee",("-"+($('.row-product[data-id="' + $scope._uniqueKey + '"]').height()/2))+"px");
            return  ("-"+(($('.row-product[data-id="' + $scope._uniqueKey + '"]').height()/2)+40))+"px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function (v) {
            return  $('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2;
        };
        $rootScope.$on('repeatend', function () {
            if ($('[data-id="' + $scope._uniqueKey + '"]').not('.slick-initialized') && $scope.use_carousel) {
                $timeout(function () {
                    $scope._makeProductToCarousel();
                }, 500);
            }
        });
        $scope.checkHideCondition = function (referral_id) {
            return true;
            if ($location.path() != '/' && $location.path() !== '/home') {
                if (typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id) {
                    return false; /* hide */
                }
                return true;
            }
            return true;
        };
    };
    return promise;
});
_ui_share_app.directive('componentProductRelateB', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateB';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        tagname: '@tagname',
        stylebutton: '@stylebutton',
        productid: '@productid',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.slideProductDeal = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.productLists = [];
        $scope.productLists_temp = [];
        $scope.productListsState = {
            load: true,
            done: false
        };
        $scope.getProductLists = function() {
            $scope.productListsState = $scope.StateData(true, false);
            var data = {
                'badge_id_array': [18],
                'tags': $scope.tagname,
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 30,
                'txt_filter_json': JSON.stringify(data)
            };
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    if($scope.productid != undefined){
                        for (var i = 0; i < output.data.dataList.length; i++) {
                            if(output.data.dataList[i].product_id != $scope.productid){
                                $scope.productLists.push(output.data.dataList[i]);
                            }
                        }
                         console.log("product relate is id :", $scope.productid , $scope.productLists);
                        
                    }else{
                        $scope.productLists = output.data.dataList;
                        console.log("product relate is id 2 :", $scope.productid);
                    }
                }
                $scope.productListsState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.getProductLists();
        $scope.showDebug = function() {
            return (typeof $routeParams.debugcontact !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentProductRelateC', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateC';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        tagnameclass: '@tagnameclass',
        stylebutton: '@stylebutton',
        productid: '@productid',
        imgpath : '@imgpath',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        
        $scope.slideProductDeal = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.productLists = [];
        $scope.productLists_temp = [];
        $scope.productListsState = {
            load: true,
            done: false
        };
        $scope.tag_name = [];
        $scope.getProductLists = function(tagname) {
            $scope.productListsState = $scope.StateData(true, false);
            $scope.tag_name = tagname.split(",");
            console.log("product relate is id 0 :",$scope.tag_name[0]);
            if($scope.tag_name.length > 1){
                var data = {
                    'badge_id_array': [18],
                    'tags': ($scope.tagname.split(",").join(",")+""),
                };
            }
            if($scope.tag_name.length == 1){
                var data = {
                    'badge_id_array': [18],
                    'tags': $scope.tag_name[0],
                };
            }
            var dataSend = {
                'cur_page': 1,
                'per_page': 30,
                'txt_filter_json': JSON.stringify(data)
            };
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    if($scope.productid != undefined){
                        for (var i = 0; i < output.data.dataList.length; i++) {
                            if(output.data.dataList[i].product_id != $scope.productid){
                                $scope.productLists.push(output.data.dataList[i]);
                            }
                        }
                         console.log("product relate is id :", $scope.productid , $scope.productLists , $scope.tag_name.length);
                        
                    }else{
                        $scope.productLists = output.data.dataList;
                        console.log("product relate is id 2 :", $scope.productid);
                    }
                }
                $scope.productListsState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.$watch('tagnameclass', function(newValue, oldValue) {
            if(newValue){
               $scope.getProductLists(newValue);
            }
            if (!newValue) return;
        });
        
        $scope.showDebug = function() {
            return (typeof $routeParams.debugcontact !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentProductRelateD', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateD';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        component: '@component',
        referralid: '@referralid',
        stylebutton: '@stylebutton',
        productid: '@productid',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.slideProductDeal = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.productLists = [];
        $scope.productLists_temp = [];
        $scope.productListsState = {
            load: true,
            done: false
        };
        $scope.getProductLists = function() {
            $scope.productListsState = $scope.StateData(true, false);
            var data = {
                'referral_id_array_in': $scope.referralid,
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 10,
                'txt_filter_json': JSON.stringify(data)
            };
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    if ($scope.productid != undefined) {
                        for (var i = 0; i < output.data.dataList.length; i++) {
                            if (output.data.dataList[i].product_id != $scope.productid) {
                                $scope.productLists.push(output.data.dataList[i]);
                            }
                        }
                        console.log("product relate is id :", $scope.productid, $scope.productLists);
                    } else {
                        $scope.productLists = output.data.dataList;
                        console.log("product relate is id 2 :", $scope.productid);
                    }
                }
                $scope.productListsState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.getProductLists();
        $scope.showDebug = function() {
            return (typeof $routeParams.debugcontact !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentProductRelateE', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateE';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        component: '@component',
        stylebutton: '@stylebutton',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_end': '?textEnd',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    console.log('componentProductRelateE : ', functionName, ' : ', data);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = params.product_id.split("-", 1).join("");
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.consoleLog("getApi api", api);
                        _self.consoleLog("getApi dataSend", dataSend);
                        _self.consoleLog("getApi res_api", res_api);
                        state = _self.stateData(false, true);
                        callback(res_api, state);
                    });
                },
                carousel: function(coverIn, carouselIn) {
                    $(coverIn).css('height', '0');
                    $(carouselIn).css('opacity', '0');
                    setTimeout(function() {
                        var carousel = $(carouselIn);
                        carousel.not('.slick-initialized').slick({
                            dots: false,
                            arrows: true,
                            autoplay: false,
                            autoplaySpeed: 4000,
                            slidesToShow: 4,
                            slidesToScroll: 1,
                            infinite: true,
                            speed: 600,
                            prevArrow: '
',
                            speed: 600,
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselBar: function(cover, carousel) {
                    var _self = this;
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    setTimeout(function() {
                        var carousels = $(carousel);
                        carousels.not('.slick-initialized').slick({
                            dots: false,
                            arrows: false,
                            infinite: false,
                            autoplay: false,
                            adaptiveHeight: true,
                            autoplaySpeed: 4000,
                            slidesToShow: 6,
                            slidesToScroll: 6,
                            speed: 600,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: 5,
                                    slidesToScroll: 5,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: 4,
                                    slidesToScroll: 4,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: 3,
                                    slidesToScroll: 3,
                                }
                            }]
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                slickCarousel: function(carousel, index) {
                    var _self = this;
                    $scope.setCarousel.index = index;
                    setTimeout(function() {
                        $('[data-key="' + carousel + '"]').slick('slickGoTo', index);
                    }, 100);
                },
                prevIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != 0) ? image_index - 1 : image - 1;
                    _self.consoleLog("prevIndex index", $scope.setCarousel.index);
                },
                nextIndex: function(product_image) {
                    var _self = this;
                    var image = product_image.length;
                    var image_index = $scope.setCarousel.index;
                    $scope.setCarousel.index = (image_index != (image - 1)) ? image_index + 1 : 0;
                    _self.consoleLog("nextIndex index", $scope.setCarousel.index);
                }
            }
            return getFunction;
        };
        $scope.getAttribute = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                productAttribute: function(productAttribute, callback) {
                    var _self = this;
                    var attribute = {
                        option_name: "",
                        option_attribute: []
                    };
                    if (productAttribute.option_data != undefined) {
                        if (productAttribute.option_data.variant_array != undefined && productAttribute.option_data.variant_array.length != 0) {
                            for (var a = 0; a < productAttribute.option_data.pclass_array.length; a++) {
                                attribute.option_name = attribute.option_name.concat(productAttribute.option_data.pclass_array[a].pclass_name, " ");
                            }
                            for (var b = 0; b < productAttribute.option_data.variant_array.length; b++) {
                                var product_attribute = {
                                    product_id: productAttribute.option_data.variant_array[b].product_id,
                                    product_sku: productAttribute.option_data.variant_array[b].sku,
                                    product_title: "",
                                    product_price: parseFloat(productAttribute.option_data.variant_array[b].price),
                                    product_compare_price: parseFloat(productAttribute.option_data.variant_array[b].compare_price),
                                    product_total_stock: parseFloat(productAttribute.option_data.variant_array[b].total_stock),
                                    product_image: productAttribute.option_data.variant_array[b].variant_image
                                }
                                for (var c = 0; c < productAttribute.option_data.variant_array[b].option_name_array.length; c++) {
                                    product_attribute.product_title = product_attribute.product_title.concat(productAttribute.option_data.variant_array[b].option_name_array[c], " ");
                                }
                                attribute.option_attribute.push(product_attribute);
                            }
                        }
                    }
                    _self.consoleLog("productAttribute attribute ", attribute);
                    callback(attribute);
                },
                checkDiscountPrice: function(productDiscount, resPrice, resComparePrice, callback) {
                    var _self = this;
                    var price = 0;
                    var compare_price = 0;
                    if (productDiscount.length == 0) {
                        price = parseFloat(resPrice);
                        compare_price = parseFloat(resComparePrice);
                    } else {
                        if (productDiscount.discount_type_id == '101') {
                            price = parseFloat(resPrice) - parseFloat(productDiscount.discount_price);
                            compare_price = parseFloat(resPrice);
                        } else if (productDiscount.discount_type_id == '102') {
                            price = (parseFloat(resPrice) * ((100 - parseFloat(productDiscount.discount_percent)) / 100));
                            compare_price = parseFloat(resPrice);
                        }
                    }
                    callback(price, compare_price);
                },
                checkMinPrice: function(option, callback) {
                    var _self = this;
                    var price_min = parseFloat(option.option_attribute[0].product_price);
                    var compare_price_min = parseFloat(option.option_attribute[0].product_compare_price);
                    var total_stock = parseFloat(option.option_attribute[0].product_total_stock);
                    for (var a = 0; a < option.option_attribute.length; a++) {
                        if (price_min >= parseFloat(option.option_attribute[a].product_price)) {
                            price_min = parseFloat(option.option_attribute[a].product_price);
                            compare_price_min = parseFloat(option.option_attribute[a].product_compare_price);
                            total_stock = parseFloat(option.option_attribute[a].product_total_stock);
                        }
                    }
                    _self.consoleLog("checkPriceMin price_min ", price_min);
                    _self.consoleLog("checkPriceMin compare_price_min ", compare_price_min);
                    _self.consoleLog("checkPriceMin total_stock ", total_stock);
                    callback(price_min, compare_price_min, total_stock);
                },
                getTotalStock: function(totalStock, mixStock, callback) {
                    var _self = this;
                    var total_stock = (totalStock > 0) ? ((totalStock <= mixStock) ? totalStock : mixStock) : ((totalStock == -1) ? mixStock : totalStock);
                    callback(total_stock);
                },
                checkMinPrices: function(api, attribute, callback) {
                    var _self = this;
                    var dataPrice = {
                        product_price: {
                            price_name: 'product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        product_compare_price: {
                            price_name: 'product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_price: {
                            price_name: 'sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_price: {
                            price_name: 'sum_product_compare_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        },
                        sum_product_compare_minus_sum_product_price: {
                            price_name: 'sum_product_compare_minus_sum_product_price',
                            price: 0,
                            price_ecimals: 0,
                            total_stock: 0
                        }
                    }
                    if (attribute.option_attribute.length == 0) {
                        _self.checkDiscountPrice(api.data.product_discount, api.data.product_price, api.data.product_compare_price, function(res_price, res_compare_price) {
                            _self.checkPrice(res_price, function(res_price_ecimals) {
                                dataPrice.product_price.price = res_price;
                                dataPrice.product_price.price_ecimals = res_price_ecimals;
                                dataPrice.sum_product_price.price = res_price;
                                dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                    dataPrice.product_compare_price.price = res_compare_price;
                                    dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    dataPrice.sum_product_compare_price.price = res_compare_price;
                                    dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                    var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                    _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                        dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                        dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                        _self.getTotalStock(api.data.product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                            dataPrice.product_price.total_stock = res_total_stock_s;
                                            dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                            dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                            callback(dataPrice, false);
                                        });
                                    });
                                });
                            });
                        });
                    } else {
                        _self.checkMinPrice(attribute, function(res_price_min, res_compare_price_min, res_total_stock) {
                            _self.checkDiscountPrice(api.data.product_discount, res_price_min, res_compare_price_min, function(res_price, res_compare_price) {
                                _self.checkPrice(res_price, function(res_price_ecimals) {
                                    dataPrice.product_price.price = res_price;
                                    dataPrice.product_price.price_ecimals = res_price_ecimals;
                                    dataPrice.sum_product_price.price = res_price;
                                    dataPrice.sum_product_price.price_ecimals = res_price_ecimals;
                                    _self.checkPrice(res_compare_price, function(res_compare_price_ecimals) {
                                        dataPrice.product_compare_price.price = res_compare_price;
                                        dataPrice.product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        dataPrice.sum_product_compare_price.price = res_compare_price;
                                        dataPrice.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                                        var compare_price_minus_price = ((res_compare_price - res_price) > 0) ? res_compare_price - res_price : 0;
                                        _self.checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                            dataPrice.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                            dataPrice.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                            _self.getTotalStock(res_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                dataPrice.product_price.total_stock = res_total_stock_s;
                                                dataPrice.product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_price.total_stock = res_total_stock_s;
                                                dataPrice.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                callback(dataPrice, true);
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    }
                },
                priceIncludes: function(price, includes, callback) {
                    var _self = this;
                    var priceToString = (price == null) ? 0 : price;
                    _self.consoleLog('priceIncludes priceToString : ', priceToString);
                    callback(priceToString.toString().includes(includes));
                },
                checkPrice: function(price, callback) {
                    var _self = this;
                    _self.priceIncludes(price, '.', function(res) {
                        _self.consoleLog("checkPrice res ", res);
                        callback((!res) ? 0 : 2);
                    });
                },
                onSelectOption: function(productId) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = productId;
                    _self.consoleLog("onSelectOption productId ", productId);
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    for (var a = 0; a < $scope.data.attribute.dataArray.option_attribute.length; a++) {
                        _self.consoleLog("onSelectOption option_attribute ", $scope.data.attribute.dataArray.option_attribute[a]);
                        if ($scope.data.attribute.dataArray.option_attribute[a].product_id == productId) {
                            if ($scope.data.attribute.dataArray.option_attribute[a].product_image.length != 0) {
                                if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                                    for (var b = 0; b < $scope.dataApi.product.dataArray.product_image.length; b++) {
                                        if ($scope.dataApi.product.dataArray.product_image[b].image_id == $scope.data.attribute.dataArray.option_attribute[a].product_image[0].image_id) {
                                            $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, b);
                                        }
                                    }
                                }
                            }
                            _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[a].product_price, $scope.data.attribute.dataArray.option_attribute[a].product_compare_price, function(res_price_p, res_compare_price_p) {
                                _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                                    $scope.data.product_price.price = res_price_p;
                                    $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                                    $scope.data.sum_product_price.price = res_price_p;
                                    $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                                    _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                        $scope.data.product_compare_price.price = res_compare_price_p;
                                        $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                        $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                        var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                        _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                            $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                            $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                            _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[a].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                                $scope.data.product_price.total_stock = res_total_stock_s;
                                                $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                                $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                                /* stock */
                                                $scope.data.quantity.quantity_max = res_total_stock_s;
                                                $scope.data.quantity.quantity_select = [];
                                                for (var i = 0; i < res_total_stock_s; i++) {
                                                    $scope.data.quantity.quantity_select.push(i + 1);
                                                }
                                                /* stock */
                                            })
                                        });
                                    });
                                });
                            });
                            break;
                        }
                    }
                },
                onClickOption: function(index) {
                    var _self = this;
                    $scope.data.quantity.quantity_input = 1;
                    $scope.dataApi.product.dataArray.product_id = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.data.attribute.productId = $scope.data.attribute.dataArray.option_attribute[index].product_id;
                    $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                    if ($scope.data.attribute.dataArray.option_attribute[index].product_image.length != 0) {
                        if ($scope.dataApi.product.dataArray.product_image.length != 0) {
                            for (var i = 0; i < $scope.dataApi.product.dataArray.product_image.length; i++) {
                                if ($scope.dataApi.product.dataArray.product_image[i].image_id == $scope.data.attribute.dataArray.option_attribute[index].product_image[0].image_id) {
                                    $scope.getCarousel().slickCarousel($scope.setCarousel.carousel, i);
                                }
                            }
                        }
                    }
                    _self.checkDiscountPrice($scope.dataApi.product.dataArray.product_discount, $scope.data.attribute.dataArray.option_attribute[index].product_price, $scope.data.attribute.dataArray.option_attribute[index].product_compare_price, function(res_price_p, res_compare_price_p) {
                        _self.checkPrice(res_price_p, function(res_price_ecimals_p) {
                            $scope.data.product_price.price = res_price_p;
                            $scope.data.product_price.price_ecimals = res_price_ecimals_p;
                            $scope.data.sum_product_price.price = res_price_p;
                            $scope.data.sum_product_price.price_ecimals = res_price_ecimals_p;
                            _self.checkPrice(res_compare_price_p, function(res_compare_price_ecimals_p) {
                                $scope.data.product_compare_price.price = res_compare_price_p;
                                $scope.data.product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                $scope.data.sum_product_compare_price.price = res_compare_price_p;
                                $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals_p;
                                var compare_price_minus_price_p = ((res_compare_price_p - res_price_p) > 0) ? res_compare_price_p - res_price_p : 0;
                                _self.checkPrice(compare_price_minus_price_p, function(res_compare_price_minus_price_ecimals_p) {
                                    $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price_p;
                                    $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals_p;
                                    _self.getTotalStock($scope.data.attribute.dataArray.option_attribute[index].product_total_stock, $scope._maxstock, function(res_total_stock_s) {
                                        $scope.data.product_price.total_stock = res_total_stock_s;
                                        $scope.data.product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_price.total_stock = res_total_stock_s;
                                        $scope.data.sum_product_compare_minus_sum_product_price.total_stock = res_total_stock_s;
                                        /* stock */
                                        $scope.data.quantity.quantity_max = res_total_stock_s;
                                        $scope.data.quantity.quantity_select = [];
                                        for (var i = 0; i < res_total_stock_s; i++) {
                                            $scope.data.quantity.quantity_select.push(i + 1);
                                        }
                                        /* stock */
                                    })
                                });
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.getAttributeCustom = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                createArray: function(productCustomTemplates, callback) {
                    var _self = this;
                    var custom_attributes = [];
                    if (productCustomTemplates.templates.length != 0) {
                        angular.forEach(productCustomTemplates.templates, function(item, index) {
                            if (item.option_sets.length != 0) {
                                _self.getAttributes(item.option_sets, function(res_attributes) {
                                    custom_attributes = custom_attributes.concat(res_attributes);
                                });
                            }
                        });
                        /* if (productCustomTemplates.templates[0].option_sets.length != 0) {
                            _self.getAttributes(productCustomTemplates.templates[0].option_sets, function(res_attributes) {
                                custom_attributes = res_attributes;
                            });
                        } */
                    }
                    _self.consoleLog("createArray : productCustomTemplates", productCustomTemplates);
                    _self.consoleLog("createArray : custom_attributes", custom_attributes);
                    callback(custom_attributes, true);
                },
                formatAttribute: function(index, optionSubsetIndex, setType, optionSetArray, callback) {
                    var _self = this;
                    var set_id = (setType == 'attribute') ? optionSetArray.set_id : optionSetArray.subset_id;
                    var attribute = {
                        attribute_index: index,
                        attribute_option_subset_index: optionSubsetIndex,
                        active_option_id: (optionSetArray.option_data.select_id != 0) ? optionSetArray.option_data.select_id : "-1",
                        active_option_index: -1,
                        active_option_index_str: "-1",
                        active_textarea: "",
                        active_array: [],
                        set_id: set_id,
                        name: optionSetArray.name,
                        set_type: optionSetArray.ss_type,
                        option: []
                    }
                    callback(attribute);
                },
                getOption: function(index, optionDataArray, callback) {
                    var _self = this;
                    var options = {
                        index: index,
                        ss_data_id: optionDataArray.ss_data_id,
                        name: optionDataArray.name,
                        image: optionDataArray.image,
                        price: optionDataArray.price,
                        compare_price: 0,
                        total_stock: 0
                    }
                    callback(options);
                },
                getActive: function(index, activeOptionId, activeOptionIdIn, optionDataArray, callback) {
                    var _self = this;
                    var actives_index = (optionDataArray.ss_data_id == activeOptionId) ? index : activeOptionIdIn;
                    var actives = (optionDataArray.ss_data_id != activeOptionId) ? "0" : "1";
                    callback(actives_index, actives);
                },
                getAttributes: function(optionSetArray, callback) {
                    var _self = this;
                    var attributes = [];
                    for (var index = 0; index < optionSetArray.length; index++) {
                        _self.formatAttribute(index, 0, 'attribute', optionSetArray[index], function(res_attribute) {
                            if (optionSetArray[index].option_subsets.length != 0) {
                                for (var option_subset_index = 0; option_subset_index < optionSetArray[index].option_subsets.length; option_subset_index++) {
                                    _self.formatAttribute(index, option_subset_index, res_attribute.set_type, optionSetArray[index].option_subsets[option_subset_index], function(res_attribute_sub) {
                                        var options = [];
                                        var active_option_id = -1;
                                        var active_option_array = [];
                                        for (var option = 0; option < optionSetArray[index].option_subsets[option_subset_index].option_data.options.length; option++) {
                                            _self.getOption(option, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_option) {
                                                options.push(res_option);
                                            });
                                            _self.getActive(option, res_attribute_sub.active_option_id, active_option_id, optionSetArray[index].option_subsets[option_subset_index].option_data.options[option], function(res_actives_index, res_actives) {
                                                active_option_id = res_actives_index;
                                                active_option_array.push(res_actives);
                                            });
                                        }
                                        res_attribute_sub.option = options;
                                        res_attribute_sub.active_option_index = active_option_id;
                                        res_attribute_sub.active_option_index_str = String(active_option_id);
                                        res_attribute_sub.active_array = active_option_array;
                                        attributes.push(res_attribute_sub);
                                    });
                                }
                            } else {
                                var options = [];
                                var active_option_id = -1;
                                var active_option_array = [];
                                for (var option = 0; option < optionSetArray[index].option_data.options.length; option++) {
                                    _self.getOption(option, optionSetArray[index].option_data.options[option], function(res_option) {
                                        options.push(res_option);
                                    });
                                    _self.getActive(option, res_attribute.active_option_id, active_option_id, optionSetArray[index].option_data.options[option], function(res_actives_index, res_actives) {
                                        active_option_id = res_actives_index;
                                        active_option_array.push(res_actives);
                                    });
                                }
                                res_attribute.option = options;
                                res_attribute.active_option_index = active_option_id;
                                res_attribute.active_option_index_str = String(active_option_id);
                                res_attribute.active_array = active_option_array;
                                attributes.push(res_attribute);
                            }
                        });
                    }
                    callback(attributes)
                },
                getformatQuantity: function(index, attributeCustom, callback) {
                    var _self = this;
                    var quantity = {
                        name: String(index + 1),
                        dataArray: attributeCustom
                    }
                    callback(quantity);
                },
                onClickRadio: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickRadio : index", index);
                    _self.consoleLog("onClickRadio : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickRadio : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickDropdown: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickDropdown : index", index);
                    _self.consoleLog("onClickDropdown : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i != parseInt(index_option)) ? "0" : "1";
                    }
                    _self.consoleLog("onClickDropdown : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                },
                onClickCheckbox: function(index, index_option) {
                    var _self = this;
                    _self.consoleLog("onClickCheckbox : index", index);
                    _self.consoleLog("onClickCheckbox : index_option", index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index = parseInt(index_option);
                    $scope.data.attribute_custom.dataArray[index].active_option_index_str = String(index_option);
                    for (var i = 0; i < $scope.data.attribute_custom.dataArray[index].active_array.length; i++) {
                        $scope.data.attribute_custom.dataArray[index].active_option_id = (i != parseInt(index_option)) ? $scope.data.attribute_custom.dataArray[index].active_option_id : $scope.data.attribute_custom.dataArray[index].option[i].ss_data_id;
                        $scope.data.attribute_custom.dataArray[index].active_array[i] = (i == parseInt(index_option)) ? (($scope.data.attribute_custom.dataArray[index].active_array[i] != "0") ? "0" : "1") : $scope.data.attribute_custom.dataArray[index].active_array[i];
                    }
                    _self.consoleLog("onClickCheckbox : $scope.data.attribute_custom.dataArray[index]", $scope.data.attribute_custom.dataArray[index]);
                }
            }
            return getFunction;
        };
        $scope.getReward = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                momentUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    callback(now);
                },
                getCalculator: function(sumProductPrice, reward, callback) {
                    var _self = this;
                    _self.consoleLog("getCalculator : sumProductPrice", sumProductPrice);
                    _self.consoleLog("getCalculator : reward", reward);
                    var point_reward = 0;
                    if (reward.type_id == "100") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    } else if (reward.type_id == "101") {
                        point_reward = reward.reward_amount;
                    } else if (reward.type_id == "102") {
                        point_reward = (reward.reward_percent * sumProductPrice.price) / 100;
                    } else if (reward.type_id == "103") {
                        point_reward = Math.floor((sumProductPrice.price / reward.reward_every_price)) * reward.reward_amount;
                    }
                    _self.consoleLog("getCalculator : point_reward", point_reward);
                    callback(point_reward);
                },
                getProductReward: function(now, productReward, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (productReward.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(productReward.reward_lifetime.lifetime_start_time);
                        reward.lifetime_end_time = parseInt(productReward.reward_lifetime.lifetime_end_time);
                        reward.type_id = productReward.reward_type_id;
                        reward.amount = parseInt(productReward.reward_amount);
                        reward.percent = parseInt(productReward.reward_percent);
                        reward.every_price = parseInt(productReward.reward_every_price);
                    }
                    _self.consoleLog("getProductReward : reward", reward);
                    callback(reward);
                },
                getPointConfig: function(now, shopPointConfig, callback) {
                    var _self = this;
                    var reward = {
                        reward_length: (shopPointConfig.length != 0) ? true : false,
                        lifetime_time: 0,
                        lifetime_start_time: 0,
                        lifetime_end_time: 0,
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    reward.lifetime_time = now;
                    if (reward.reward_length) {
                        reward.lifetime_start_time = parseInt(shopPointConfig.er_from);
                        reward.lifetime_end_time = parseInt(shopPointConfig.er_to);
                        reward.type_id = "100";
                        reward.amount = parseInt(shopPointConfig.er_earn);
                        reward.every_price = parseInt(shopPointConfig.er_rate);
                    }
                    _self.consoleLog("getPointConfig : reward", reward);
                    callback(reward);
                },
                checkPointReward: function(reward, callback) {
                    var _self = this;
                    var state = false;
                    if (reward.reward_length) {
                        var start = reward.lifetime_start_time < reward.lifetime_time && reward.lifetime_start_time != 0;
                        var end = (reward.lifetime_end_time != -1) ? reward.lifetime_time <= reward.lifetime_end_time && reward.lifetime_end_time != 0 : true;
                        if (start && end) {
                            if (reward.type_id == "100") {
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            } else if (reward.type_id == "101") {
                                var amount = reward.amount != 0;
                                if (amount) {
                                    state = true;
                                }
                            } else if (reward.type_id == "102") {
                                var percent = reward.percent != 0;
                                if (percent) {
                                    state = true;
                                }
                            } else if (reward.type_id == "103") {
                                var percent = reward.percent != 0;
                                var amount = reward.amount != 0;
                                var every_price = reward.every_price != 0;
                                if (amount && every_price) {
                                    state = true;
                                }
                            }
                        }
                    }
                    callback(state);
                },
                checkReward: function(rewardProduct, rewardPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("checkReward : rewardProduct", rewardProduct);
                    _self.consoleLog("checkReward : rewardPointConfig", rewardPointConfig);
                    var reward = {
                        type_id: "0",
                        amount: 0,
                        percent: 0,
                        every_price: 0
                    };
                    _self.checkPointReward(rewardProduct, function(res_state_product) {
                        _self.checkPointReward(rewardPointConfig, function(res_state_point_config) {
                            if (res_state_point_config) {
                                reward.type_id = rewardPointConfig.type_id;
                                reward.type_id = rewardPointConfig.type_id;
                                reward.amount = rewardPointConfig.amount;
                                reward.percent = rewardPointConfig.percent;
                                reward.every_price = rewardPointConfig.every_price;
                            } else if (res_state_product) {
                                reward.type_id = rewardProduct.type_id;
                                reward.amount = rewardProduct.amount;
                                reward.percent = rewardProduct.percent;
                                reward.every_price = rewardProduct.every_price;
                            }
                            _self.consoleLog("checkReward : reward", reward);
                            callback(reward);
                        });
                    });
                },
                checkRewardType: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.momentUnix(function(now) {
                        _self.getProductReward(now, productReward, function(res_reward_product) {
                            _self.getPointConfig(now, shopPointConfig, function(res_reward_point_config) {
                                _self.checkReward(res_reward_product, res_reward_point_config, function(res_reward) {
                                    callback(res_reward);
                                });
                            });
                        });
                    });
                },
                createReward: function(productReward, shopPointConfig, callback) {
                    var _self = this;
                    _self.consoleLog("createReward : productReward", productReward);
                    _self.consoleLog("createReward : shopPointConfig", shopPointConfig);
                    _self.checkRewardType(productReward, shopPointConfig, function(res_reward) {
                        _self.consoleLog("createReward : res_reward", res_reward);
                        callback(res_reward);
                    });
                }
            }
            return getFunction;
        };
        $scope.getQuantity = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                upDateReward: function() {
                    var _self = this;
                },
                upDateReward: function() {
                    var _self = this;
                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                        $scope.data.reward.point_reward = res_point_reward;
                    });
                },
                upDatePrice: function() {
                    var _self = this;
                    var product_price = $scope.data.product_price.price * $scope.data.quantity.quantity_input;
                    var product_compare_price = $scope.data.product_compare_price.price * $scope.data.quantity.quantity_input;
                    $scope.getAttribute().checkPrice(product_price, function(res_price_ecimals) {
                        $scope.data.sum_product_price.price = product_price;
                        $scope.data.sum_product_price.price_ecimals = res_price_ecimals;
                        $scope.getAttribute().checkPrice(product_compare_price, function(res_compare_price_ecimals) {
                            $scope.data.sum_product_compare_price.price = product_compare_price;
                            $scope.data.sum_product_compare_price.price_ecimals = res_compare_price_ecimals;
                            var compare_price_minus_price = ((product_compare_price - product_price) > 0) ? product_compare_price - product_price : 0;
                            $scope.getAttribute().checkPrice(compare_price_minus_price, function(res_compare_price_minus_price_ecimals) {
                                $scope.data.sum_product_compare_minus_sum_product_price.price = compare_price_minus_price;
                                $scope.data.sum_product_compare_minus_sum_product_price.price_ecimals = res_compare_price_minus_price_ecimals;
                                _self.upDateReward();
                            });
                        });
                    });
                },
                input: function(quantityInput) {
                    var _self = this;
                    quantityInput = (quantityInput == null) ? 1 : parseInt(quantityInput);
                    _self.consoleLog("input : quantityInput", quantityInput);
                    if (quantityInput != null) {
                        if (quantityInput >= $scope.data.quantity.quantity_max) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_max;
                        }
                        if (quantityInput <= $scope.data.quantity.quantity_min) {
                            $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                        }
                    } else {
                        $scope.data.quantity.quantity_input = $scope.data.quantity.quantity_min;
                    }
                    _self.upDatePrice();
                },
                minus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input - 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_min", $scope.data.quantity.quantity_min);
                    if (quantity >= $scope.data.quantity.quantity_min) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                },
                plus: function() {
                    var _self = this;
                    var quantity = $scope.data.quantity.quantity_input + 1;
                    _self.consoleLog("plus : quantity", quantity);
                    _self.consoleLog("plus : quantity_max", $scope.data.quantity.quantity_max);
                    if (quantity <= $scope.data.quantity.quantity_max) {
                        $scope.data.quantity.quantity_input = quantity;
                    }
                    _self.upDatePrice();
                }
            }
            return getFunction;
        };
        $scope.getBuy = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = params.product_id.split("-", 1).join("");
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                postApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.post(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                UiCartProductAdd: function(productId, quantityInput, promotionId, customOptions, callback) {
                    quantityInput = (quantityInput > $scope.data.quantity.quantity_max) ? $scope.data.quantity.quantity_max : quantityInput;
                    UiCart.delegate.product.add(productId, quantityInput, promotionId, function(res_data) {
                        callback(res_data);
                    });
                },
                isLogin: function(callback) {
                    var buy_login = $scope._buylogin;
                    var is_login = UiCustomerBox.delegate.get.isLogin();
                    var is_state = (buy_login) ? (!is_login) ? true : false : false;
                    callback(is_state);
                },
                formLogin: function(is_state, callback) {
                    if (is_state) {
                        $inloginPopup.open();
                    }
                    callback(is_state);
                },
                getProductStaffId(staff_id_check, callback) {
                    var res_staff_id_check = staff_id_check;
                    var res_staff_id = $scope.dataApi.product.dataArray.product_staff_id;
                    var res_is_state = (res_staff_id != 0 && res_staff_id != '0' && res_staff_id != undefined) ? true : false;
                    callback(res_staff_id_check, res_staff_id, res_is_state);
                },
                isStaffId: function(staff_id_check, callback) { /* todo */
                    var _self = this;
                    _self.getProductStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        callback(res_staff_id_check, res_staff_id, res_is_state);
                    });
                },
                checkCartDuplicateStaff: function(res_staff_id_check, txt_staff_id, res_is_state, callback) {
                    var _self = this
                    var res_is_state = true;
                    if (res_staff_id_check) {
                        var dataSend = {
                            'txt_staff_id': txt_staff_id,
                        };
                        _self.dataSend("cart/duplicate_staff", dataSend, function(res_api, res_dataSend) {
                            _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                                res_is_state = res_api.data.duplicate;
                                callback(res_is_state);
                            });
                        });
                    } else {
                        callback(res_is_state);
                    }
                },
                showAlert: function(res_staff_id_check, res_staff_id, res_is_state, res_api, callback) {
                    var res_state = (res_staff_id_check) ? ((res_api) ? ((res_is_state) ? false : true) : true) : false;
                    if (res_state) {
                        if (!res_api) {
                            if (res_staff_id != '0' && res_staff_id != 0) {
                                $scope.controlAlert().alert('002');
                            } else {
                                $scope.controlAlert().alert('003');
                            }
                        } else {
                            if (!res_is_state) {
                                $scope.controlAlert().alert('003');
                            }
                        }
                    }
                    callback(res_state);
                },
                checkStaff: function(callback) {
                    var _self = this
                    var staff_id_check = $scope._checkstaff;
                    var res_check = false;
                    _self.isStaffId(staff_id_check, function(res_staff_id_check, res_staff_id, res_is_state) {
                        _self.checkCartDuplicateStaff(res_staff_id_check, res_staff_id, res_is_state, function(res_api) {
                            _self.showAlert(res_staff_id_check, res_staff_id, res_is_state, res_api, function(res_state) {
                                res_check = res_state;
                                callback(res_check);
                            });
                        });
                    });
                },
                isProgress: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isProgress(productId)) ? true : false;
                    _self.consoleLog("isProgress : productId", productId);
                    _self.consoleLog("isProgress : state", state);
                    callback(state);
                },
                isSelected: function(productId, callback) {
                    var _self = this;
                    var state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    _self.consoleLog("isSelected : productId", productId);
                    _self.consoleLog("isSelected : state", state);
                    callback(state);
                },
                isSelectedReturn: function(productId) {
                    var _self = this;
                    var ui_cart_state = (UiCart.delegate.product.isSelected(productId)) ? true : false;
                    if (!$scope.setBuy.state_active) {
                        $scope.setBuy.state_active = true;
                        var state_process = $scope.setBuy.state_process;
                        var state_step = $scope.setBuy.state_step;
                        if (ui_cart_state && !state_process && state_step != 4) /* cart */ {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_active = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else if (!ui_cart_state && !state_process && state_step != 0) /* unset */ {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_active = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        } else {
                            $scope.setBuy.state_active = false;
                        }
                    }
                    return ui_cart_state;
                },
                updateState: function(productId) {
                    _self = this;
                    _self.isSelected(productId, function(res_state) {
                        if (res_state) {
                            _self.onTimeout(250, function() {
                                _self.onPass(1, function(res_step) {
                                    _self.onTimeout(500, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onUnset(0, function(res_step) {
                                    $scope.setBuy.state_process = false;
                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                });
                            });
                        }
                        return res_state;
                    });
                },
                uiCart: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    _self.UiCartProductAdd(productId, quantityInput, promotionId, customOptions, function(res_data) {
                        if (res_data) {
                            _self.onTimeout(500, function() {
                                _self.onPass(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onCart(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            }
                                        });
                                    });
                                });
                            });
                        } else {
                            _self.onTimeout(500, function() {
                                _self.onError(res_step, function(res_step) {
                                    _self.onTimeout(1000, function() {
                                        _self.onUnset(res_step, function(res_step) {
                                            $scope.setBuy.state_process = false;
                                            $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                            $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                        });
                                    });
                                });
                            });
                        }
                    });
                },
                postApiA: function(productId, quantityInput, promotionId, customOptions, res_step) {
                    var _self = this;
                    var custom_options = {};
                    var dataSend = {
                        'txt_product_id': productId,
                        'txt_amount': quantityInput,
                        'txt_is_clear_cart_before': "0",
                        'txt_custom_options_json': JSON.stringify(custom_options)
                    };
                    _self.dataSend("cart/product_add", dataSend, function(res_api, res_dataSend) {
                        _self.postApi(res_api, res_dataSend, function(res_ok, res_api, state) {
                            if (res_ok) {
                                _self.onTimeout(500, function() {
                                    _self.onPass(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onCart(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[4].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[4].data_background_color;
                                            });
                                        });
                                    });
                                });
                            } else {
                                _self.onTimeout(500, function() {
                                    _self.onError(res_step, function(res_step) {
                                        _self.onTimeout(1000, function() {
                                            _self.onUnset(res_step, function(res_step) {
                                                $scope.setBuy.state_process = false;
                                                $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                            });
                                        });
                                    });
                                });
                            }
                        });
                    });
                },
                onProcess: function(data, productId, quantityInput, promotionId, customOptions) {
                    var _self = this;
                    _self.isLogin(function(res_is_login) {
                        _self.formLogin(res_is_login, function(res_form) {
                            _self.checkStaff(function(res_is_state) {
                                if (!$scope.setBuy.state_process && !res_form && !res_is_state) {
                                    $scope.setBuy.state_process = true;
                                    _self.isSelected(productId, function(res_state) {
                                        if (!res_state) {
                                            _self.onLoad($scope.setBuy.state_step, function(res_step) {
                                                if (data.sum_product_price.price != 0 && data.quantity.quantity_max != 0 && (data.attribute.state == (data.attribute.productId != ''))) {
                                                    /* UiCart */
                                                    _self.uiCart(productId, quantityInput, promotionId, customOptions, res_step);
                                                    /* api post offline */
                                                    /*_self.postApiA(productId, quantityInput, promotionId, customOptions, res_step); */
                                                } else {
                                                    _self.onTimeout(500, function() {
                                                        _self.onError(res_step, function(res_step) {
                                                            _self.onTimeout(1000, function() {
                                                                _self.onUnset(res_step, function(res_step) {
                                                                    $scope.setBuy.state_process = false;
                                                                    $scope.setBuy.state_data_font_color = $scope.setBuy.stepArray[0].data_font_color;
                                                                    $scope.setBuy.state_data_background_color = $scope.setBuy.stepArray[0].data_background_color;
                                                                });
                                                            });
                                                        });
                                                    });
                                                }
                                            });
                                        } else {
                                            $scope.setBuy.state_process = false;
                                            if ($scope._cart == "trumpComponentCarts") {
                                                _self.trumpComponentCarts();
                                            } else if ($scope._cart == "viewcart") {
                                                _self.viewCart($scope._cart);
                                            }
                                        }
                                    });
                                }
                            });
                        });
                    });
                },
                onTimeout: function(time, callback) {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        callback(true)
                    }, time);
                },
                onUnset: function(step, callback) {
                    var _self = this;
                    step = (step == 0) ? 0 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onLoad: function(step, callback) {
                    var _self = this;
                    step = (step == 0 || step == 1) ? 1 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onPass: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 2) ? 2 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onError: function(step, callback) {
                    var _self = this;
                    step = (step == 1 || step == 3) ? 3 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                onCart: function(step, callback) {
                    var _self = this;
                    step = (step == 2 || step == 4) ? 4 : 0;
                    $scope.setBuy.state_step = step;
                    callback(step);
                },
                trumpComponentCarts: function() {
                    var controlCart = share.getTrumpComponentCarts();
                    var component_carts = $('.cover-cards').hasClass('active');
                    if (!component_carts) {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.cart();
                        }
                    } else {
                        var component_icon_cart = $("div").hasClass('cover-icon-carts');
                        if (component_icon_cart) {
                            controlCart.load();
                        }
                    }
                },
                viewCart: function(viewcart) {
                    var _self = this;
                    _self.pageUrl(viewcart);
                },
                locationUrlReplace: function(page) {
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                main: function(callback) {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getDetail = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getDetail: function(api, callback) {
                    var _self = this;
                    var description = api.product_description;
                    var info = api.product_more_info;
                    var specificatio = [];
                    if (api.product_attribute.specification_data != undefined) {
                        specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? api.product_attribute.specification_data.pclass_array : [];
                    }
                    var state_specificatio = false;
                    if (api.product_attribute.specification_data != undefined) {
                        state_specificatio = (api.product_attribute.specification_data.length != 0 && api.product_attribute.specification_data != undefined) ? true : false;
                    }
                    var state_info = (api.product_is_more_info == 1) ? true : false;
                    _self.consoleLog("getDetail : description", description);
                    _self.consoleLog("getDetail : info", info);
                    _self.consoleLog("getDetail : state_info", state_info);
                    _self.consoleLog("getDetail : specificatio", specificatio);
                    _self.consoleLog("getDetail : state_specificatio", state_specificatio);
                    callback(description, info, state_info, specificatio, state_specificatio);
                },
                onClickDetail: function(index) {
                    var _self = this;
                    $scope.data.detail.active = index;
                    _self.consoleLog("onClickDetail : data.detail.active", $scope.data.detail.active);
                }
            }
            return getFunction;
        };
        $scope.pages = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageName: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page_name);
                },
                pageUrl: function(page_name, id, name_url) {
                    var _self = this;
                    var page = page_name + "/" + id + "-" + name_url;
                    _self.locationUrlReplace(page);
                }
            }
            return getFunction;
        };
        $scope.countDown = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getLocation: function(callback) {
                    var _self = this;
                    var res_location = $location;
                    _self.consoleLog("getLocation", "res_location", res_location);
                    callback(res_location);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    _self.consoleLog("getRouteParams", "params", params);
                    callback(params);
                },
                getLocationUrlNameProductDetail: function(callback) {
                    var _self = this;
                    _self.getRouteParams(function(res_params) {
                        _self.getLocation(function(res_location) {
                            var url_page_name = "/product-detail/" + res_params.product_id;
                            var res_url_name_product_detail = (res_location.url() == url_page_name) ? true : false;
                            _self.consoleLog("getLocationUrlNameProductDeal", "res_url_name_product_detail", res_url_name_product_detail);
                            callback(res_url_name_product_detail);
                        });
                    });
                },
                getUnix: function(callback) {
                    var _self = this;
                    var now = moment().unix();
                    _self.consoleLog("getUnix", "now", now);
                    callback(now);
                },
                getCountDown: function(now, product_lifetime, callback) {
                    var _self = this;
                    var countdown_unix = parseInt(product_lifetime.lifetime_end_time) - now;
                    var milliseconds = moment.duration(countdown_unix * 1000, "milliseconds");
                    var res_countdown = ((milliseconds.days() <= 9) ? '0' + milliseconds.days() : milliseconds.days());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.hours() <= 9) ? '0' + milliseconds.hours() : milliseconds.hours());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.minutes() <= 9) ? '0' + milliseconds.minutes() : milliseconds.minutes());
                    res_countdown = res_countdown + ' : ' + ((milliseconds.seconds() <= 9) ? '0' + milliseconds.seconds() : milliseconds.seconds());
                    _self.consoleLog("getCountDown", "res_countdown", res_countdown);
                    callback(res_countdown, countdown_unix);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                locationUrlReplace: function(page) {
                    var _self = this;
                    $location.url(page).replace();
                },
                pageUrl: function(page_name) {
                    var _self = this;
                    var page = page_name;
                    _self.locationUrlReplace(page);
                },
                countDownByProduct: function(now, data_array, callback) {
                    var _self = this;
                    if (data_array.length != 0) {
                        if (data_array.product_lifetime.length != 0) {
                            _self.getCountDown(now, data_array.product_lifetime, function(res_count_down, res_countdown_unix) {
                                data_array.product_lifetime.lifetime_countdown = (res_countdown_unix > 0) ? res_count_down : "";
                                if (data_array.product_lifetime.lifetime_countdown == "") {
                                    _self.getNameUrl(data_array.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", data_array.product_set_array[0].product_id, res_name);
                                    });
                                }
                            });
                        }
                    }
                    _self.consoleLog("countDownByProduct", "data_array", data_array);
                    callback(data_array);
                },
                loop: function() {
                    var _self = this;
                    var load = $timeout(function() {
                        $timeout.cancel(load);
                        _self.getUnix(function(res_now) {
                            _self.countDownByProduct(res_now, $scope.dataApi.product.dataArray, function(data_array) {
                                $scope.dataApi.product.dataArray = data_array;
                                _self.getLocationUrlNameProductDetail(function(res_url_name_product_detail) {
                                    if (res_url_name_product_detail) {
                                        _self.loop();
                                    }
                                });
                            });
                        });
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.getPromotion = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                setPromotionId: function(promotion_id) {
                    var _self = this;
                    _self.consoleLog("setPromotionId", "promotion_id", promotion_id);
                    $scope.data.promotion.promotion_id = promotion_id;
                    _self.consoleLog("setPromotionId", "data.promotion.promotion_id", $scope.data.promotion.promotion_id);
                },
            }
            return getFunction;
        };
        $scope.control = function() {
            var getFunction = {
                popupVideo: function(state, video_link, video_embed_code) {
                    var _self = this;
                    if (video_embed_code != '') {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    } else if (video_link != '') {
                        window.open(video_link, '_blank');
                    } else {
                        $scope.data_control.page_video.popup = state;
                        $scope.data_control.page_video.shop_video_embed_code = video_embed_code;
                    }
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.data_control = {
            page_video: {
                popup: false,
                shop_video_embed_code: ""
            }
        }
        $scope.control_alert = {
            alert: {
                error_id: '',
                index: null,
                state: true,
                error: [{
                    id: '001',
                    title: 'การสั่งซื้อ',
                    messages: 'สามารถสั่งซื้อได้เพียงทีละออเดอร์เท่านั้น'
                }, {
                    id: '002',
                    title: 'การเพิ่มสินค้า',
                    messages: 'ไม่สามารถเพิ่มสินค้าของร้านมากกว่า 1 ร้านค้าได้'
                }, {
                    id: '003',
                    title: 'การสั่งซื้อ',
                    messages: 'ไม่สามารถเพิ่มสินค้า(ไม่มีร้านค้า)'
                }]
            }
        };
        $scope.controlAlert = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getErrorMessages: function(error_id, callback) {
                    var _self = this;
                    var messages = {
                        res_error_id: '',
                        res_index: null
                    }
                    angular.forEach($scope.control_alert.alert.error, function(item, index) {
                        if (item.id == error_id) {
                            messages.res_error_id = item.id;
                            messages.res_index = index;
                        }
                    });
                    callback(messages.res_error_id, messages.res_index);
                },
                alert: function(error_id) {
                    var _self = this;
                    _self.getErrorMessages(error_id, function(res_error_id, res_index) {
                        $scope.control_alert.alert.error_id = res_error_id;
                        $scope.control_alert.alert.index = res_index;
                        $scope.control_alert.alert.state = (!$scope.control.alert && res_error_id != '') ? true : false;
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.countDown().loop();
        /* set carousel  */
        $scope.setCarousel = {
            carousel: 0,
            index: 0
        };
        $scope.getCarousel().getCarousel($scope.setCarousel.carousel, function(res_carousel_id) {
            $scope.setCarousel.carousel = res_carousel_id;
        });
        /* set carousel  */
        /* get product api */
        $scope.dataApi = {
            reward: {
                dataSend: {},
                api: "shop/current",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            staff: {
                dataSend: {
                    txt_staff_id: 0
                },
                api: "staff/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            product: {
                dataSend: {
                    txt_product_id: 0
                },
                api: "product/id",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
            relation: {
                dataSend: {
                    txt_referral_id: 0
                },
                api: "referral/relation",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.data = {
            attribute: {
                state: false,
                productId: "",
                dataArray: []
            },
            attribute_custom: {
                state: false,
                dataArray: []
            },
            reward: {
                quantity_name: 'reward',
                type_id: "0",
                reward_amount: 0,
                reward_percent: 0,
                reward_every_price: 0,
                point_reward: 0
            },
            quantity: {
                quantity_name: 'quantity',
                quantity_min: 1,
                quantity_max: 1,
                quantity_input: 1,
                quantity_select: []
            },
            product_price: {
                price_name: 'product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            product_compare_price: {
                price_name: 'product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_price: {
                price_name: 'sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_price: {
                price_name: 'sum_product_compare_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            sum_product_compare_minus_sum_product_price: {
                price_name: 'sum_product_compare_minus_sum_product_price',
                price: 0,
                price_ecimals: 0,
                total_stock: 0
            },
            detail: {
                active: '0',
                dataArray: [{
                    index: '0',
                    state: true,
                    en: ($scope.description != undefined && $scope.description != "") ? $scope.description : 'Description',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '1',
                    state: true,
                    en: ($scope.info != undefined && $scope.info != "") ? $scope.info : 'Info',
                    th: '',
                    data: '',
                    dataArray: []
                }, {
                    index: '2',
                    state: true,
                    en: ($scope.specification != undefined && $scope.specification != "") ? $scope.specification : 'Specification',
                    th: '',
                    data: '',
                    dataArray: []
                }]
            },
            promotion : {
                promotion_id : '0'
            }
        };
        $scope.setBuy = {
            state_active: false,
            state_process: false,
            state_step: 0,
            state_data_font_color: "",
            state_data_background_color: "",
            stepArray: [{
                step: 0,
                name: "unset",
                icon: $scope._icebuyicon,
                state: $scope._buytext,
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 1,
                name: "load",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 2,
                name: "pass",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 3,
                name: "error",
                icon: "",
                state: "",
                data_font_color: "",
                data_background_color: ""
            }, {
                step: 4,
                name: "cart",
                icon: "",
                state: $scope._viewcarttext,
                data_font_color: "",
                data_background_color: "primary_darkest"
            }]
        };
        /* - get api product/id start - */
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.product.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                $scope.dataApi.product.dataSend.txt_product_id = (res_product_id != false) ? res_product_id : 0;
                $scope.getData().dataSend($scope.dataApi.product.api, $scope.dataApi.product.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_product, res_state) {
                        $scope.dataApi.product.ok = res_ok;
                        if ($scope._imageappcoverchecked) {
                            var images = [];
                            angular.forEach(get_res_api_product.data.product_image,function(image,index_image){
                                if (!image.image_app_cover_checked) {
                                    images.push(image)
                                }
                            });
                            get_res_api_product.data.product_image = images;
                        }
                        angular.element('.load-effect').removeClass('is-active');
                        $scope.dataApi.product.dataArray = get_res_api_product.data;
                        $scope.getData().consoleLog("get_res_api_product", get_res_api_product);
                        $scope.dataApi.product.dataArrayState = res_state;
                        /* -- get api shop/current to reward -- */
                        if (res_ok) {
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.reward.dataArrayState = res_state;
                                $scope.getData().dataSend($scope.dataApi.reward.api, $scope.dataApi.reward.dataSend, function(res_api, res_dataSend) {
                                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                                        $scope.dataApi.reward.ok = res_ok;
                                        $scope.dataApi.reward.dataArray = get_res_api_shop.data;
                                        $scope.dataApi.reward.dataArrayState = res_state;
                                        $scope.getReward().createReward($scope.dataApi.product.dataArray.product_reward, get_res_api_shop.data.shop_point_config, function(res_reward) {
                                            $scope.data.reward.type_id = res_reward.type_id;
                                            $scope.data.reward.reward_amount = res_reward.amount;
                                            $scope.data.reward.reward_percent = res_reward.percent;
                                            $scope.data.reward.reward_every_price = res_reward.every_price;
                                            /* --- Wait product/id ,shop/current --- */
                                            /* ---- get attribute ---- */
                                            $scope.getAttribute().productAttribute(get_res_api_product.data.product_attribute, function(res_attribute) {
                                                $scope.data.attribute.dataArray = res_attribute;
                                                $scope.getAttribute().checkMinPrices(get_res_api_product, res_attribute, function(res_data_price, res_state) {
                                                    $scope.data.attribute.state = res_state;
                                                    $scope.data.product_price = res_data_price.product_price;
                                                    $scope.data.product_compare_price = res_data_price.product_compare_price;
                                                    $scope.data.sum_product_price = res_data_price.sum_product_price;
                                                    $scope.data.sum_product_compare_price = res_data_price.sum_product_compare_price;
                                                    $scope.data.sum_product_compare_minus_sum_product_price = res_data_price.sum_product_compare_minus_sum_product_price;
                                                    $scope.getReward().getCalculator($scope.data.sum_product_price, $scope.data.reward, function(res_point_reward) {
                                                        $scope.data.reward.point_reward = res_point_reward;
                                                    });
                                                    /* ----- stock ----- */
                                                    $scope.data.quantity.quantity_max = res_data_price.product_price.total_stock;
                                                    $scope.data.quantity.quantity_select = [];
                                                    for (var i = 0; i < res_data_price.product_price.total_stock; i++) {
                                                        $scope.data.quantity.quantity_select.push(i + 1);
                                                    }
                                                    /* ----- stock ----- */
                                                });
                                            });
                                            /* ---- get attribute ---- */
                                            /* ---- get attribute custom ---- */
                                            $scope.getAttributeCustom().createArray(get_res_api_product.data.product_custom_templates, function(res_custom_attribute, res_state) {
                                                $scope.data.attribute_custom.state = res_state;
                                                $scope.data.attribute_custom.dataArray = res_custom_attribute;
                                            });
                                            /* ---- get attribute custom ---- */
                                            /* ---- get detail ---- */
                                            $scope.getDetail().getDetail(get_res_api_product.data, function(res_description, res_info, res_state_info, res_specificatio, res_state_specificatio) {
                                                $scope.data.detail.dataArray[0].data = res_description;
                                                $scope.data.detail.dataArray[1].data = res_info;
                                                $scope.data.detail.dataArray[1].state = res_state_info;
                                                $scope.data.detail.dataArray[2].dataArray = res_specificatio;
                                                $scope.data.detail.dataArray[2].state = res_state_specificatio;
                                            });
                                            /* ---- get detail ---- */
                                            /* ---- update state ---- */
                                            $scope.getBuy().updateState($scope.dataApi.product.dataArray.product_id);
                                            /* ---- update state ---- */
                                            /* --- Wait product/id ,shop/current --- */
                                        });
                                    });
                                });
                            });
                            /* -- get api shop/current to reward -- */
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.dataApi.relation.dataArrayState = res_state;
                                $scope.getData().getReferralId(get_res_api_product.data.product_referral_display, function(res_referral_id) {
                                    $scope.dataApi.relation.dataSend.txt_referral_id = res_referral_id;
                                    $scope.getData().dataSend($scope.dataApi.relation.api, $scope.dataApi.relation.dataSend, function(res_api, res_dataSend) {
                                        $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_referral, res_state) {
                                            $scope.dataApi.relation.ok = res_ok;
                                            $scope.dataApi.relation.dataArray = (res_referral_id != 0) ? get_res_api_referral.data : [];
                                            $scope.dataApi.relation.dataArrayState = res_state;
                                        });
                                    });
                                });
                            });
                            /* -- res_referral_id from product/id to txt_referral_id get api referral/relation -- */
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                            $scope.getData().getRouteParams(function(res_params, res_state) {
                                $scope.getData().getStaffId(get_res_api_product.data.product_staff_id, function(res_staff) {
                                    if (res_staff.status) {
                                        $scope.dataApi.staff.dataArrayState = res_state;
                                        $scope.dataApi.staff.dataSend.txt_staff_id = res_staff.staff_id;
                                        $scope.getData().dataSend($scope.dataApi.staff.api, $scope.dataApi.staff.dataSend, function(res_api, res_dataSend) {
                                            $scope.getData().getApi(res_api, res_dataSend, function(res_ok, res, res_state) {
                                                $scope.dataApi.staff.ok = res_ok;
                                                $scope.dataApi.staff.dataArray = res.data;
                                                $scope.getData().getNameUrl(res.data.staff_first_name, function(res_staff_first_name_url) {
                                                    $scope.dataApi.staff.dataArray.staff_first_name_url = res_staff_first_name_url;
                                                    $scope.dataApi.staff.dataArrayState = res_state;
                                                });
                                            });
                                        });
                                    }
                                });
                            });
                            /* -- product_staff_id from product/id to txt_staff_id get api staff/id -- */
                        } else {
                            /* ok = false */
                            if ($scope.dataApi.product.dataArray.length != 0) {
                                /* product deal to product original */
                                if ($scope.dataApi.product.dataArray.product_set_array.length != 0) {
                                    $scope.countDown().getNameUrl($scope.dataApi.product.dataArray.product_set_array[0].product_title, function(res_name) {
                                        $scope.pages().pageUrl("product-detail", $scope.dataApi.product.dataArray.product_set_array[0].product_id, res_name);
                                    });
                                } else {
                                    $scope.pages().pageName("home");
                                }
                            } else {
                                /* product null */
                                $scope.pages().pageName("home");
                            }
                        }
                    });
                });
            });
        });
        /* - get api product/id end - */
        /* get product api */
    };
    return promise;
});_ui_share_app.directive('componentProductDiscount', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductDiscount';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        'feature':'@feature',
        'badgeid':'@badgeid',
        'badgetext':'@badgetext',
        'imgpath':'@imgpath',
        'margin':'@margin',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval) {      
        $scope.use_feature = (typeof $scope.feature !== 'undefined' && $scope.feature == 'true') ? true : false;
        /**
        * Check if object array available for "website application" or "Mobile application" or "Featured"
        * @params object array
        * return true | false (default)
        */
        $scope._showWeb = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 18) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showApp = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 19) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        $scope._showFeature = function (objArray) {
            var r = false;
            for (var i = 0; i < objArray.length; i++) {
                if (objArray[i].badge_id == 16) {
                    r = true;
                    break;
                }
            }
            return r;
        };
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        /*
        * view current routeParams
        * @params (default)
        * @return function
        */
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        /* Dummy */
        $scope.getDummyArray = function(){            
            var r = [];
            var max = 6;
            for(var i = 0; i < max; i++){
                r.push({
                    product_id: '999999',
                    product_title: 'Samsung Galaxy S8',
                    product_price: '45000',
                    product_compare_price: '55000',
                    product_image:[{image_url:'extensions/themes/gae_default301/staticfiles/images/default/490x490.gif'}],
                    product_badge:[{badge_id:18}],
                    callback_array:true
                });
            }
            return r;
        };
        $scope.data = [];
        $scope.data_discount = [];
        $scope.data_done = false;
        /* Get referral data (all)
        * @params none
        * @return array
        */
        $scope.getData = function(badgeId){
            $scope.data = [];
            $scope.data_discount = [];
            $scope.data_discount.discount_price = 0;
            $scope.data_done = false;
            var filterJson = {'badge_id_array':[18]};    
            if($scope.use_feature){
                filterJson.badge_id_array.push(16);
            }        
            var d = {
                'cur_page':1,
                'per_page':8,
                'txt_filter_json':JSON.stringify(filterJson),
            };
            GAEAPI.get('product/lists',d,$scope).then(function(e){               
                if(e.ok == 1){
                    if(e.data.dataList.length > 0){
                        $scope.data = e.data.dataList;
                        for (var i = 0; i < e.data.dataList.length; i++) {
                            console.log("test_discount : ",i,e.data.dataList[i].product_discount.length , e.data.dataList[i].product_discount);
                            
                            if(e.data.dataList[i].product_discount.length == undefined && e.data.dataList[i].product_discount){
                                console.log("test_discount",e.data.dataList[i].product_discount);
                                $scope.data_discount.push(e.data.dataList[i]);
                                if(e.data.dataList[i].product_discount.discount_price != 0){
                                    $scope.data_discount[i].discount_price = (e.data.dataList[i].product_price-e.data.dataList[i].product_discount.discount_price);
                                }else if(e.data.dataList[i].product_discount.discount_price == 0 && e.data.dataList[i].product_discount.discount_percent != 0){
                                     $scope.data_discount[i].discount_price = (e.data.dataList[i].product_price-((e.data.dataList[i].product_price*e.data.dataList[i].product_discount.discount_percent)/100));
                                }
                                console.log("test_discount_price",$scope.data_discount[i].discount_price);
                            }
                        }
                    } else {
                        var dummy = $scope.getDummyArray();
                        $scope.data = dummy;
                    }
                    $scope.buildImageSlider($scope.data);
                    $scope.data_done = true;
                }
            });
        };
        /* Get referral data (by referral_id)
        * @params id = referral_id
        * @return array
        */
        $scope.getDataReferral = function(id){
            $scope.data = [];
            $scope.data_done = false;
            var d = {
                'txt_referral_id':id
            };
            GAEAPI.get('referral/id_map',d,$scope).then(function(e){
                if(e.ok == 1){
                    $scope.data[0] = e.data;
                    $scope.data_done = true;
                    $scope.buildImageSlider($scope.data);
                }
            });
        };
        /*
        * params listener
        * @params newValue
        * @params oldValue
        * @return function
        */
        $scope.$watch('badgeid', function (newValue, oldValue) {
            if (!newValue){
                return;
            }
            $scope.getData(newValue);
        });
        /*
        * check if image array exist or build dummy image array
        * @params arrayObject = object array
        * @return array
        */
        $scope.buildImageSlider = function(){
            var imageArray = function(){
                return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_1.jpg'},
                    /*{'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/gallery_2.jpg'},*/
                ];
            };
            var imageBannerArray = function(){
                return [
                    {'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_1.jpg'},
                    /*{'image_url':'extensions/themes/gae_myhappyphone301/staticfiles/images/default/banner_cat_2.jpg'},*/
                ];
            };
            angular.forEach($scope.data, function(item,key){
                if(typeof item.product_image == 'undefined'){
                    item.product_image = [];
                }
                /*if(typeof item.referral_image_banner == 'undefined'){
                    item.referral_image_banner = [];
                }*/
                if(!item.product_image.length){
                    item.product_image = imageArray();                    
                }
                /*item.referral_image_banner = imageBannerArray();*/
            });
        };
        /* Make Carousel */
        $scope._makeProductToCarousel = function (keyCustom) {
            var elementName = '[data-id="' + keyCustom + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 1,
                slidesToScroll: 1,
                dots: true,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                
            };            
            return sliderProvider(elementName, optionsParmas, "", keyCustom);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(){          
            return  "-" + (($('.row.slick-slider[data-id="'+$scope._uniqueKey+'"]').height() / 2) + 34) + "px";
        };
        /* Carousel Arrow Click */
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        /* Carousel Arrow Click */
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Event Listener when ng-repeat end */
        $rootScope.$on('repeatend', function() {           
            if($('[data-id*="gallery-"]').length){
                $('[data-id*="gallery-"]').not('.slick-initialized').each(function(Key,Object){
                    if($(this).find('.imageItem').length > 0){
                        $scope._makeProductToCarousel($(this).attr('data-id'));
                    }
                });
            }
        });
        /* Check if seo enable */
        $scope.checkSeo = function(){
            return (GURL.isHtml5Mode()) ? true : false;
        };
        $scope.buildTitleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
if (typeof $productTimingRequest == 'undefined') {
    var $productTimingRequest = {
        request: 0,
        data: 0,
        timeMemory: null,
        checkAllDone: function() {
            console.log("checkAllDone", this.data, this.request);
            if (this.data > 0 && this.data >= this.request) {
                $('.all-load').addClass('active');
                $('.all-content').addClass('active');
                this.timeMemory = setTimeout(function() {
                    $('.all-content').addClass('shown');
                    window.clearTimeout(this.timeMemory);
                }, 650);
            }
        },
        instantDisplay: function() {
            console.log("checkAllDone: not match => display");
            $('.all-load').addClass('active');
            $('.all-content').addClass('active');
            $('.all-content').addClass('shown');
            this.timeMemory = null;
        }
    };
}
var _countHide = 0;
_ui_share_app.directive('componentProductLayout', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductLayout';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
        imgcart: '@imgcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.productData = [];
        $scope.productDataload = false;
        $scope.type = $scope.request;
        $scope.done = false;
        /* GET product list in category (feature *any) */
        $scope._get_category_feature = function() {
            $scope.productData = [];
            var dataSendCat = {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'referral_sort_index_asc_name_asc',
                'txt_filter_json': JSON.stringify([{
                    'badge_id_array': [16]
                }])
            };
            /*     badge_sort_index_asc*/
            GAEAPI.get('referral/lists', dataSendCat, $scope).then(function(resultCategory) {
                var ref = [];
                for (var i = 0; i < resultCategory.data.dataList.length; i++) {
                    for (var ii = 0; ii < resultCategory.data.dataList[i].referral_badge.length; ii++) {
                        if (resultCategory.data.dataList[i].referral_badge[ii].badge_id == 16) {
                            ref.push(parseInt(resultCategory.data.dataList[i].referral_id));
                            break;
                        }
                    }
                }
                $scope.productDataload = false;
                var jsonFilter = {
                    'referral_id_array_or': ref,
                    'badge_id_array': [18]
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'txt_sortby': 'root_category_index_asc',
                    'txt_filter_json': JSON.stringify(jsonFilter)
                };
                GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.productData = e.data.dataList;
                        $scope.productDataload = true;
                    }
                });
            });
        };
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        $scope._get_product_by_badge = function(badgeId) {
            $scope.productData = [];
            $scope.productDataload = false;
            var jsonFilter = {
                'badge_id_array': [18, badgeId]
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_sortby': 'root_category_index_asc',
                'txt_filter_json': JSON.stringify(jsonFilter)
            };
            /*product_lastest_create  */
            GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.productData = e.data.dataList;
                    $scope.productDataload = true;
                }
            });
        };
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function(referral_id) {
            $scope.productDataload = false;
            $productTimingRequest.request = $productTimingRequest.request + 1;
            var j = {
                'badge_id_array': [18],
                'referral_id_array': [referral_id]
            };
            var d = {
                'cur_page': 1,
                'per_page': 30,
                'txt_sortby': 'root_category_index_asc',
                'txt_filter_json': JSON.stringify(j)
            };
            /* root_category_index_asc */
            console.log("Fetching 1", $scope.referral);
            GAEAPI.get('product/lists', d, $scope).then(function(e) {
                $scope.productDataload = true;
                $scope.productData = e.data.dataList;
                $productTimingRequest.data = $productTimingRequest.data + 1;
                $productTimingRequest.checkAllDone();
                if (e.data.dataList.length <= 0 && $routeParams.referral_id == referral_id) {
                    /* window.location.href="home";*/
                } else if (e.data.dataList.length <= 0) {
                    $('div[data-id="' + $scope.referral + '"]').hide();
                }
                if (typeof $routeParams.section !== 'undefined') {
                    // alert($routeParams.section);
                    $timeout(function() {
                        $('html, body').animate({
                            scrollTop: $("div[id='" + $routeParams.section + "']").offset().top - 250
                        }, 200);
                    }, 200);
                }
                console.log("Fetching 2", $scope.referral, " : result :", $scope.productData);
            });
        };
        $scope.$watch('type', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            if (newValue == 'category_feature') {
                /* Featured Product */
                /*return $scope._get_category_feature();*/
                return $scope._get_product_by_badge(16);
            }
            if (newValue == 'product_newarrival' || newValue == 'new_arrival') {
                /* New Arrival */
                return $scope._get_product_by_badge(72);
            }
            if (newValue == 'product_bestseller' || newValue == 'best_seller') {
                /* New Arrival */
                return $scope._get_product_by_badge(75);
            }
            if (newValue == 'product_feature' || newValue == 'product_recommend') {
                /* Recommend */
                return $scope._get_product_by_badge(74);
            }
            if (newValue == 'product_list_by_category') {
                return $scope._get_product_list_by_category($scope.referral);
            }
        });
        $scope.shopid = '';
        $scope.getShopid = function() {
            $scope.shopid = CUR_THEME.shop_id();
        };
        $scope.getShopid();
        $scope.initSlider = function() {
            var elementName = '.row-product[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                centerMode: true,
                centerPadding: '0px',
                slidesToShow: 3,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                infinite: true,
                responsive: [{
                    breakpoint: 768,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 2
                    }
                }, {
                    breakpoint: 480,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 2
                    }
                }]
            };
            var extraOptions = {
                animate: false
            };
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(v) {
            return "-" + ($('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2) + v + "px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function(v) {
            return $('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2;
        };
        $rootScope.$on('repeatend', function() {
            if ($scope.use_carousel) {
                var t = $interval(function() {
                    if ($scope._uniqueKey !== "") {
                        $interval.cancel(t);
                        var tt = $timeout(function() {
                            $timeout.cancel(tt);
                            $scope.done = true;
                            $scope.initSlider();
                        }, 300);
                    }
                }, 500);
            }
        });
        $scope.checkHideCondition = function(referral_id) {
            return true;
            if ($location.path() != '/' && $location.path() !== '/home') {
                if (typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id) {
                    return false; /* hide */
                }
                return true;
            }
            return true;
        };
    };
    return promise;
});
var _countHide = 0;
_ui_share_app.directive('componentProductLayoutA', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductLayoutA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
    	'text_first':'?textFirst',
    	'text_second':'?textSecond',
    };
    promise.link = function (scope, element, attr) {};
    promise.controller = function ($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.productData = [];
        $scope.type = $scope.request;
        /* GET product list in category (feature *any) */
        $scope._get_category_feature = function(){
        	$scope.productData = [];
        	
        	var dataSendCat = {
        		'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'referral_sort_index_asc_name_asc',   
                'txt_filter_json': JSON.stringify([{'badge_id_array': [16]}])
        	};
             /*     badge_sort_index_asc*/
        	GAEAPI.get('referral/lists', dataSendCat).then(function(resultCategory){   
	        	var ref = [];    		
        		for(var i = 0; i < resultCategory.data.dataList.length; i++){        			
        			for(var ii = 0; ii < resultCategory.data.dataList[i].referral_badge.length; ii++){
        				if(resultCategory.data.dataList[i].referral_badge[ii].badge_id == 16){
        					ref.push(parseInt(resultCategory.data.dataList[i].referral_id));
        					break;
        				}
        			}        			
        		}
        		var jsonFilter = {
                    'referral_id_array_or': ref,
                    'badge_id_array': [18]
                };
        		var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'txt_sortby': 'product_title_a-z',
                	'txt_filter_json': JSON.stringify(jsonFilter)
                };
                GAEAPI.get('product/lists', dataSend).then(function(e){                	
                	if(e.ok == 1){
                		$scope.productData = e.data.dataList;
                	}
                });     		
        	}); 
        }; 
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        $scope._get_product_by_badge = function(badgeId){
        	$scope.productData = [];
        	var jsonFilter = {
                'badge_id_array': [18,badgeId]
            };
    		var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_sortby': 'badge_sort_index_asc',
            	'txt_filter_json': JSON.stringify(jsonFilter)
            };
            /*product_lastest_create  */
            GAEAPI.get('product/lists', dataSend).then(function(e){
            	if(e.ok == 1){
            		$scope.productData = e.data.dataList;            		
            	}
            });
        };
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function(referral_id){
            var j = {
                'badge_id_array': [18],
                'referral_id_array': [referral_id]
            };
            var d = {
                'cur_page': 1,
                'per_page': 30,
                'txt_sortby':'root_category_index_0-9',
                'txt_filter_json': JSON.stringify(j)
            };
            /* root_category_index_asc */
            console.log("Fetching ", $scope.referral);
            if(CUR_THEME.shop_id() == 500){
                $scope.text_first = 'testtt';
                $http.get('https://missmonribs.getappeasy.com/store/api/v1/product/lists',{params:d}).then(function(res){
                    var e = res.data;
                    $scope.productData = e.data.dataList;
                    console.log("Fetching ", $scope.referral, " : result :", $scope.productData);    
                    if($scope.productData.length <= 0 && $routeParams.referral_id == referral_id){
                        return $location.path("/home");
                    }                               
                });
            } else {
                GAEAPI.get('product/lists',d).then(function(e){
                    $scope.productData =  e.data.dataList;
                    console.log("Fetching ", $scope.referral, " : result :", e);  
                });
            }
        };
        $scope.$watch('type', function(newValue,oldValue){
        	if(!newValue){
        		return;
        	}
        	if(newValue == 'category_feature'){
                /* Featured Product */
	        	/*return $scope._get_category_feature();*/
                return $scope._get_product_by_badge(16);
	        }
            if(newValue == 'product_newarrival' || newValue == 'new_arrival') {
                /* New Arrival */
                return $scope._get_product_by_badge(72);
            }
            if(newValue == 'product_feature' || newValue == 'product_recommend') {
                /* Recommend */
                return $scope._get_product_by_badge(74);
            }
            if(newValue == 'product_list_by_category'){
	        	return $scope._get_product_list_by_category($scope.referral);
	        }
        });        
        $scope._makeProductToCarousel = function () {
            var elementName = '[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 4,
                slidesToScroll: 4,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                responsive: [
                {
                    breakpoint: 769,
                    settings: {
                        slidesToShow: 3,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false
                    }
                }, {
                    breakpoint: 601,
                    settings: {
                        slidesToShow: 2,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false
                    }
                }, {
                    breakpoint: 481,
                    settings: {
                        slidesToShow: 1,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false,
                        dots: false
                    }
                }
                ]
            };            
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(v){         
            return  "-" + ($('[data-id="'+$scope._uniqueKey+'"]').height() / 2) + "."+ v + "px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function(v){        	
        	return  $('[data-id="'+$scope._uniqueKey+'"]').height() / 2;
        };
        $rootScope.$on('repeatend', function() {
            if($('[data-id="'+$scope._uniqueKey+'"]').not('.slick-initialized') && $scope.use_carousel){
                $timeout(function(){
                    $scope._makeProductToCarousel();
                }, 500);                
            }
            
        });
        $scope.checkHideCondition = function(referral_id){
            return true;
            if($location.path() != '/' && $location.path() !== '/home'){
                if(typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id){
                    return false; /* hide */
                }   
                return true;                             
            }
            return true;
        };
    };
    return promise;
});
var _countHide = 0;
_ui_share_app.directive('componentProductLayoutB', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductLayoutB';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
        lesspad: '@lesspad',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
    	'text_first':'?textFirst',
    	'text_second':'?textSecond',
    };
    promise.link = function (scope, element, attr) {};
    promise.controller = function ($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        $scope.use_lesspad = (typeof $scope.lesspad !== 'undefined' && $scope.lesspad == 'true') ? true : false;
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.productData = [];
        $scope.type = $scope.request;
        /* GET product list in category (feature *any) */
        $scope._get_category_feature = function(){
        	$scope.productData = [];
        	
        	var dataSendCat = {
        		'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'referral_sort_index_asc_name_asc',   
                'txt_filter_json': JSON.stringify([{'badge_id_array': [16]}])
        	};
             /*     badge_sort_index_asc*/
        	GAEAPI.get('referral/lists', dataSendCat).then(function(resultCategory){   
	        	var ref = [];    		
        		for(var i = 0; i < resultCategory.data.dataList.length; i++){        			
        			for(var ii = 0; ii < resultCategory.data.dataList[i].referral_badge.length; ii++){
        				if(resultCategory.data.dataList[i].referral_badge[ii].badge_id == 16){
        					ref.push(parseInt(resultCategory.data.dataList[i].referral_id));
        					break;
        				}
        			}        			
        		}
        		var jsonFilter = {
                    'referral_id_array_or': ref,
                    'badge_id_array': [18]
                };
        		var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'txt_sortby': 'product_title_a-z',
                	'txt_filter_json': JSON.stringify(jsonFilter)
                };
                GAEAPI.get('product/lists', dataSend).then(function(e){                	
                	if(e.ok == 1){
                		$scope.productData = e.data.dataList;
                        console.log("tiuuiy111",$scope.productData);   
                	}
                });     		
        	}); 
        }; 
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        $scope._get_product_by_badge = function(badgeId){
        	$scope.productData = [];
        	var jsonFilter = {
                'badge_id_array': [18,badgeId]
            };
    		var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_sortby': 'badge_sort_index_asc',
            	'txt_filter_json': JSON.stringify(jsonFilter)
            };
            /*product_lastest_create  */
            GAEAPI.get('product/lists', dataSend).then(function(e){
            	if(e.ok == 1){
            		$scope.productData = e.data.dataList; 
                    console.log("tiuuiy222",$scope.productData);           		
            	}
            });
        };
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function(referral_id){
            var j = {
                'badge_id_array': [18],
                'referral_id_array': [referral_id]
            };
            var d = {
                'cur_page': 1,
                'per_page': 30,
                'txt_sortby':'root_category_index_0-9',
                'txt_filter_json': JSON.stringify(j)
            };
            /* root_category_index_asc */
            console.log("Fetching ", $scope.referral);
            if(CUR_THEME.shop_id() == 500){
                $scope.text_first = 'testtt';
                $http.get('https://missmonribs.getappeasy.com/store/api/v1/product/lists',{params:d}).then(function(res){
                    var e = res.data;
                    $scope.productData = e.data.dataList;
                    console.log("Fetching ", $scope.referral, " : result :", $scope.productData);    
                    if($scope.productData.length <= 0 && $routeParams.referral_id == referral_id){
                        return $location.path("/home");
                    }                               
                });
            } else {
                GAEAPI.get('product/lists',d).then(function(e){
                    $scope.productData =  e.data.dataList;
                    console.log("Fetching ", $scope.referral, " : result :", e);  
                    console.log("tiuuiy333",$scope.productData);   
                });
            }
        };
        $scope.$watch('type', function(newValue,oldValue){
        	if(!newValue){
        		return;
        	}
        	if(newValue == 'category_feature'){
                /* Featured Product */
	        	/*return $scope._get_category_feature();*/
                return $scope._get_product_by_badge(16);
	        }
            if(newValue == 'product_newarrival' || newValue == 'new_arrival') {
                /* New Arrival */
                return $scope._get_product_by_badge(72);
            }
            if(newValue == 'product_feature' || newValue == 'product_recommend') {
                /* Recommend */
                return $scope._get_product_by_badge(74);
            }
            if(newValue == 'product_list_by_category'){
	        	return $scope._get_product_list_by_category($scope.referral);
	        }
        });        
        $scope._makeProductToCarousel = function () {
            var elementName = '[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 3,
                slidesToScroll: 3,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                responsive: [
                {
                    breakpoint: 769,
                    settings: {
                        slidesToShow: 2,
                        slidesToScroll: 2,
                        variableWidth: false,
                        centerMode: false
                    }
                }, {
                    breakpoint: 601,
                    settings: {
                        slidesToShow: 1,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false
                    }
                }, {
                    breakpoint: 481,
                    settings: {
                        slidesToShow: 1,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false,
                        dots: false
                    }
                }
                ]
            };            
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(v){         
            return  "-" + ($('[data-id="'+$scope._uniqueKey+'"]').height() / 2) + v + "px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function(v){        	
        	return  $('[data-id="'+$scope._uniqueKey+'"]').height() / 2;
        };
        $rootScope.$on('repeatend', function() {
            if($('[data-id="'+$scope._uniqueKey+'"]').not('.slick-initialized') && $scope.use_carousel){
                $timeout(function(){
                    $scope._makeProductToCarousel();
                }, 500);                
            }
            
        });
        $scope.checkHideCondition = function(referral_id){
            return true;
            if($location.path() != '/' && $location.path() !== '/home'){
                if(typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id){
                    return false; /* hide */
                }   
                return true;                             
            }
            return true;
        };
    };
    return promise;
});
var _countHide = 0;
_ui_share_app.directive('componentProductLayoutC', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductLayoutC';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
        imgcart: '@imgcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.productData = [];
        $scope.productDataload = false;
        $scope.type = $scope.request;
        $scope.done = false;
        /* GET product list in category (feature *any) */
        $scope._get_category_feature = function() {
            $scope.productData = [];
            var dataSendCat = {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'referral_sort_index_asc_name_asc',
                'txt_filter_json': JSON.stringify([{
                    'badge_id_array': [16]
                }])
            };
            /*     badge_sort_index_asc*/
            GAEAPI.get('referral/lists', dataSendCat, $scope).then(function(resultCategory) {
                var ref = [];
                for (var i = 0; i < resultCategory.data.dataList.length; i++) {
                    for (var ii = 0; ii < resultCategory.data.dataList[i].referral_badge.length; ii++) {
                        if (resultCategory.data.dataList[i].referral_badge[ii].badge_id == 16) {
                            ref.push(parseInt(resultCategory.data.dataList[i].referral_id));
                            break;
                        }
                    }
                }
                $scope.productDataload = false;
                var jsonFilter = {
                    'referral_id_array_or': ref,
                    'badge_id_array': [18]
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'txt_sortby': 'root_category_index_asc',
                    'txt_filter_json': JSON.stringify(jsonFilter)
                };
                GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.productData = e.data.dataList;
                        $scope.productDataload = true;
                    }
                });
            });
        };
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        $scope._get_product_by_badge = function(badgeId) {
            $scope.productData = [];
            $scope.productDataload = false;
            var jsonFilter = {
                'badge_id_array': [18, badgeId]
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_sortby': 'root_category_index_asc',
                'txt_filter_json': JSON.stringify(jsonFilter)
            };
            /*product_lastest_create  */
            GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.productData = e.data.dataList;
                    $scope.productDataload = true;
                }
            });
        };
        
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function(referral_id) {
            // $scope.productData = [];
            $scope.productDataload = false;
            $productTimingRequest.request = $productTimingRequest.request + 1;
            
           
            var f_first = {
                'txt_referral_id': referral_id
            }
            GAEAPI.get('referral/id_map', f_first, $scope).then(function(e) {
               
                if (e.ok == 1) {
                    if(e.data.referral_sub_array.length > 0){
                         $scope.productDataload = true;
                        $scope.productData = e.data.referral_sub_array;
                        console.log("pop kai sod test 1 :",$scope.productData);
                        $scope.havsub = true;
                    }else{
                        var j = {
                            'badge_id_array': [18],
                            'referral_id_array': [referral_id]
                        };
                        var d = {
                            'cur_page': 1,
                            'per_page': 30,
                            'txt_sortby': 'root_category_index_asc',
                            'txt_filter_json': JSON.stringify(j)
                        };
                        $scope.havsub = false;
                        console.log("Fetching 1", $scope.referral);
                        GAEAPI.get('product/lists', d, $scope).then(function(e) {
                            $scope.productDataload = true;
                            $scope.productData = e.data.dataList;
                            console.log("pop kai sod test 2 :",$scope.productData);
                            $productTimingRequest.data = $productTimingRequest.data + 1;
                            $productTimingRequest.checkAllDone();
                            if (e.data.dataList.length <= 0 && $routeParams.referral_id == referral_id) {
                                /* window.location.href="home";*/
                            } else if (e.data.dataList.length <= 0) {
                                $('div[data-id="' + $scope.referral + '"]').hide();
                            }
                            if (typeof $routeParams.section !== 'undefined') {
                                // alert($routeParams.section);
                                $timeout(function() {
                                    $('html, body').animate({
                                        scrollTop: $("div[id='" + $routeParams.section + "']").offset().top - 250
                                    }, 200);
                                }, 200);
                            }
                            console.log("Fetching 2", $scope.referral, " : result :", $scope.productData);
                        });
                    }
                }
            });
            /* root_category_index_asc */
        };
        $scope.$watch('type', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            if (newValue == 'category_feature') {
                /* Featured Product */
                /*return $scope._get_category_feature();*/
                return $scope._get_product_by_badge(16);
            }
            if (newValue == 'product_newarrival' || newValue == 'new_arrival') {
                /* New Arrival */
                return $scope._get_product_by_badge(72);
            }
            if (newValue == 'product_bestseller' || newValue == 'best_seller') {
                /* New Arrival */
                return $scope._get_product_by_badge(75);
            }
            if (newValue == 'product_feature' || newValue == 'product_recommend') {
                /* Recommend */
                return $scope._get_product_by_badge(74);
            }
            if (newValue == 'product_list_by_category') {
                // $scope.havsub = false;
                return $scope._get_product_list_by_category($scope.referral);
            }
        });
        $scope.shopid = '';
        $scope.getShopid = function() {
            $scope.shopid = CUR_THEME.shop_id();
        };
        $scope.getShopid();
        $scope.initSlider = function() {
            var elementName = '.row-product[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                centerMode: true,
                centerPadding: '0px',
                slidesToShow: 3,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                infinite: true,
                responsive: [{
                    breakpoint: 768,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 2
                    }
                }, {
                    breakpoint: 480,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 2
                    }
                }]
            };
            var extraOptions = {
                animate: false
            };
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(v) {
            return "-" + ($('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2) + v + "px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function(v) {
            return $('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2;
        };
        $rootScope.$on('repeatend', function() {
            if ($scope.use_carousel) {
                var t = $interval(function() {
                    if ($scope._uniqueKey !== "") {
                        $interval.cancel(t);
                        var tt = $timeout(function() {
                            $timeout.cancel(tt);
                            $scope.done = true;
                            $scope.initSlider();
                        }, 300);
                    }
                }, 500);
            }
        });
        $scope.checkHideCondition = function(referral_id) {
            return true;
            if ($location.path() != '/' && $location.path() !== '/home') {
                if (typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id) {
                    return false; /* hide */
                }
                return true;
            }
            return true;
        };
    };
    return promise;
});_ui_share_app.factory('$componentProductLayoutMain', function componentProductLayoutMain($routeParams, $timeout) {
    return
});_ui_share_app.directive('componentProductLayoutMainA', function($rootScope, $routeParams) {
    var templateName = 'componentProductLayoutMainA';
    var componentMain = 'componentProductLayoutMain';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
        stylebutton: '@stylebutton',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope._viewRouteParams = function () {
            return $routeParams || false;
        };
        $scope.productData = [];
        $scope.productDataload = false;
        $scope.type = $scope.request;
        /* GET product list in category (feature *any) */
        $scope._get_category_feature = function() {
            $scope.productData = [];
            var dataSendCat = {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'referral_sort_index_asc_name_asc',
                'txt_filter_json': JSON.stringify([{
                    'badge_id_array': [16]
                }])
            };
            /*     badge_sort_index_asc*/
            GAEAPI.get('referral/lists', dataSendCat, $scope).then(function(resultCategory) {
                var ref = [];
                for (var i = 0; i < resultCategory.data.dataList.length; i++) {
                    for (var ii = 0; ii < resultCategory.data.dataList[i].referral_badge.length; ii++) {
                        if (resultCategory.data.dataList[i].referral_badge[ii].badge_id == 16) {
                            ref.push(parseInt(resultCategory.data.dataList[i].referral_id));
                            break;
                        }
                    }
                }
                $scope.productDataload = false;
                var jsonFilter = {
                    'referral_id_array_or': ref,
                    'badge_id_array': [18]
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'txt_sortby': 'product_title_a-z',
                    'txt_filter_json': JSON.stringify(jsonFilter)
                };
                GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.productData = e.data.dataList;
                        $scope.productDataload = true;
                    }
                });
            });
        };
        $scope.categoryData = [];
        $scope._getCategory = function(badgeId) {
            var dataSend = {
                'txt_referral_type_id': 11
            };
            GAEAPI.get('referral/map', dataSend, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.categoryData = e.data;
                }
            });
        };
        $scope._getCategory();
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        $scope._get_product_by_badge = function(badgeId) {
            $scope.productData = [];
            $scope.productDataload = false;
            var jsonFilter = {
                'badge_id_array': [18, badgeId]
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_sortby': 'badge_sort_index_asc',
                'txt_filter_json': JSON.stringify(jsonFilter)
            };
            /*product_lastest_create  */
            GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.productData = e.data.dataList;
                    $scope.productDataload = true;
                }
            });
        };
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function(referral_id) {
            $scope.productDataload = false;
            $productTimingRequest.request = $productTimingRequest.request + 1;
            var j = {
                'badge_id_array': [18],
                'referral_id_array': [referral_id]
            };
            var d = {
                'cur_page': 1,
                'per_page': 30,
                'txt_sortby': 'root_category_index_asc',
                'txt_filter_json': JSON.stringify(j)
            };
            /* root_category_index_asc */
            console.log("Fetching 1", $scope.referral);
            GAEAPI.get('product/lists', d, $scope).then(function(e) {
                $scope.productDataload = true;
                $scope.productData = e.data.dataList;
                $productTimingRequest.data = $productTimingRequest.data + 1;
                $productTimingRequest.checkAllDone();
                if (e.data.dataList.length <= 0 && $routeParams.referral_id == referral_id) {
                    /* window.location.href="home";*/
                } else if (e.data.dataList.length <= 0) {
                    $('div[data-id="' + $scope.referral + '"]').hide();
                }
                console.log("Fetching 2", $scope.referral, " : result :", $scope.productData);
            });
        };
        $scope.$watch('type', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            if (newValue == 'category_feature') {
                /* Featured Product */
                /*return $scope._get_category_feature();*/
                return $scope._get_product_by_badge(16);
            }
            if (newValue == 'product_newarrival' || newValue == 'new_arrival') {
                /* New Arrival */
                return $scope._get_product_by_badge(72);
            }
            if (newValue == 'product_feature' || newValue == 'product_recommend') {
                /* Recommend */
                return $scope._get_product_by_badge(74);
            }
            if (newValue == 'product_list_by_category') {
                return $scope._get_product_list_by_category($scope.referral);
            }
        });
        $scope._makeProductToCarousel = function() {
            var elementName = '[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 3,
                slidesToScroll: 3,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                responsive: [{
                    breakpoint: 769,
                    settings: {
                        slidesToShow: 2,
                        slidesToScroll: 2,
                        variableWidth: false,
                        centerMode: false
                    }
                }, {
                    breakpoint: 601,
                    settings: {
                        slidesToShow: 1,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false
                    }
                }, {
                    breakpoint: 481,
                    settings: {
                        slidesToShow: 1,
                        slidesToScroll: 1,
                        variableWidth: false,
                        centerMode: false,
                        dots: false
                    }
                }]
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(v) {
            return "-" + ($('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2) + v + "px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function(v) {
            return $('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2;
        };
        $rootScope.$on('repeatend', function() {
            if ($('[data-id="' + $scope._uniqueKey + '"]').not('.slick-initialized') && $scope.use_carousel) {
                $timeout(function() {
                    $scope._makeProductToCarousel();
                }, 500);
            }
        });
        $scope.arrayDataDOno = function(id, indata) {
            var dataSend = 0;
            for (var i = 0; i < indata.length; i++) {
                if (indata[i].product_referral_display.category[0].referral_parent_id == id) {
                    dataSend++;
                }
            }
            return dataSend;
        };
        $scope.arrayDataDTwo = function(id, indata) {
            var dataSend = 0;
            for (var i = 0; i < indata.length; i++) {
                if (indata[i].product_referral_display.category[0].referral_id == id) {
                    dataSend++;
                }
            }
            return dataSend;
        };
        $scope.checkHideCondition = function(referral_id) {
            return true;
            if ($location.path() != '/' && $location.path() !== '/home') {
                if (typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id) {
                    return false; /* hide */
                }
                return true;
            }
            return true;
        };
    };
    return promise;
});
_ui_share_app.directive('componentProductLayoutZ', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductLayoutZ';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
        imgcart: '@imgcart',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.productData = [];
        $scope.productDataload = false;
        $scope.type = $scope.referral;
        $scope.done = false;
        /* GET product list in category (feature *any) */
        $scope._get_category_feature = function() {
            $scope.productData = [];
            var dataSendCat = {
                'txt_referral_type_id': 11,
                'cur_page': 1,
                'per_page': 20,
                'txt_sortby': 'referral_sort_index_asc_name_asc',
                'txt_filter_json': JSON.stringify([{
                    'badge_id_array': [16]
                }])
            };
            /*     badge_sort_index_asc*/
            GAEAPI.get('referral/lists', dataSendCat, $scope).then(function(resultCategory) {
                var ref = [];
                for (var i = 0; i < resultCategory.data.dataList.length; i++) {
                    for (var ii = 0; ii < resultCategory.data.dataList[i].referral_badge.length; ii++) {
                        if (resultCategory.data.dataList[i].referral_badge[ii].badge_id == 16) {
                            ref.push(parseInt(resultCategory.data.dataList[i].referral_id));
                            break;
                        }
                    }
                }
                $scope.productDataload = false;
                var jsonFilter = {
                    'referral_id_array_or': ref,
                    'badge_id_array': [18]
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'txt_sortby': 'root_category_index_asc',
                    'txt_filter_json': JSON.stringify(jsonFilter)
                };
                GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                    if (e.ok == 1) {
                        $scope.productData = e.data.dataList;
                        $scope.productDataload = true;
                    }
                });
            });
        };
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        $scope._get_product_by_badge = function(badgeId) {
            $scope.productData = [];
            $scope.productDataload = false;
            var jsonFilter = {
                'badge_id_array': [18, badgeId]
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_sortby': 'root_category_index_asc',
                'txt_filter_json': JSON.stringify(jsonFilter)
            };
            /*product_lastest_create  */
            GAEAPI.get('product/lists', dataSend, $scope).then(function(e) {
                if (e.ok == 1) {
                    $scope.productData = e.data.dataList;
                    $scope.productDataload = true;
                }
            });
        };
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function(referral_id) {
            $scope.productDataload = false;
            $productTimingRequest.request = $productTimingRequest.request + 1;
            var j = {
                'badge_id_array': [18],
                'referral_id_array': [referral_id]
            };
            var d = {
                'cur_page': 1,
                'per_page': 30,
                'txt_sortby': 'root_category_index_asc',
                'txt_filter_json': JSON.stringify(j)
            };
            /* root_category_index_asc */
            console.log("Fetching 1", $scope.referral);
            GAEAPI.get('product/lists', d, $scope).then(function(e) {
                $scope.productDataload = true;
                $scope.productData = e.data.dataList;
                $productTimingRequest.data = $productTimingRequest.data + 1;
                $productTimingRequest.checkAllDone();
                if (e.data.dataList.length <= 0 && $routeParams.referral_id == referral_id) {
                    /* window.location.href="home";*/
                } else if (e.data.dataList.length <= 0) {
                    $('div[data-id="' + $scope.referral + '"]').hide();
                }
                if (typeof $routeParams.section !== 'undefined') {
                    // alert($routeParams.section);
                    $timeout(function() {
                        $('html, body').animate({
                            scrollTop: $("div[id='" + $routeParams.section + "']").offset().top - 250
                        }, 200);
                    }, 200);
                }
                console.log("Fetching 2", $scope.referral, " : result :", $scope.productData);
            });
        };
        $scope.$watch('type', function(newValue, oldValue) {
            if (!newValue) {
                return;
            }
            if(newValue){
               
                $scope._get_product_list_by_category($scope.referral);
            }
            
        });
        $scope.shopid = '';
        $scope.getShopid = function() {
            $scope.shopid = CUR_THEME.shop_id();
        };
        $scope.getShopid();
        $scope.initSlider = function() {
            var elementName = '.row-product[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                centerMode: true,
                centerPadding: '0px',
                slidesToShow: 3,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                infinite: true,
                responsive: [{
                    breakpoint: 768,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 2
                    }
                }, {
                    breakpoint: 480,
                    settings: {
                        arrows: false,
                        centerMode: true,
                        centerPadding: '0px',
                        slidesToShow: 2
                    }
                }]
            };
            var extraOptions = {
                animate: false
            };
            sliderProvider(elementName, optionsParmas, $scope.type, $scope._key(), extraOptions);
        };
        $scope._slickGoLeft = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function() {
            $timeout(function() {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function(v) {
            return "-" + ($('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2) + v + "px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function(v) {
            return $('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2;
        };
        $rootScope.$on('repeatend', function() {
            if ($scope.use_carousel) {
                var t = $interval(function() {
                    if ($scope._uniqueKey !== "") {
                        $interval.cancel(t);
                        var tt = $timeout(function() {
                            $timeout.cancel(tt);
                            $scope.done = true;
                            $scope.initSlider();
                        }, 300);
                    }
                }, 500);
            }
        });
        $scope.checkHideCondition = function(referral_id) {
            return true;
            if ($location.path() != '/' && $location.path() !== '/home') {
                if (typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id) {
                    return false; /* hide */
                }
                return true;
            }
            return true;
        };
    };
    return promise;
});_ui_share_app.factory('$componentProductListBadge', function componentProductListBadge($routeParams, $timeout) {
    return 
});_ui_share_app.directive('componentProductListBadgeIdA', function($rootScope, $routeParams) {
    var templateName = 'componentProductListBadgeIdA';
    var componentMain = 'componentProductListBadge';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        margin: '@margin',
        stylebutton: '@stylebutton',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {};
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.data_per_page = 15;
        $scope.JsonDATA = {
            result_rows: 0,
            total_rows: 0
        };
        $scope.JsonProductArray = [];
        $scope.JsonProductArrayState = {
            load: false,
            done: false
        };
        $scope.getJsonProductArray = function(page, id) {
            $scope.JsonProductArrayState = $scope.StateData(true, false);
            var dataSend = {
                'cur_page': 1,
                'per_page': page,
                'txt_filter_json': JSON.stringify({
                    'badge_id_array': [18, id]
                })
            };
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    $scope.JsonProductArray = output.data;                    
                }
                $scope.JsonProductArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope.getJsonProductArray($scope.data_per_page, $scope._viewRouteParams().badge_id);
        $scope.loadMore = function() {
            $scope.data_per_page = parseInt($scope.data_per_page) + 8;
            $scope.getJsonProductArray($scope.data_per_page, $scope._viewRouteParams().badge_id);
        };
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});
if (typeof $productTimingRequest == 'undefined') {
    var $productTimingRequest = {
        request: 0,
        data: 0,
        timeMemory: null,
        checkAllDone: function () {
            console.log("checkAllDone", this.data, this.request);
            if (this.data > 0 && this.data >= this.request) {
                $('.all-load').addClass('active');
                $('.all-content').addClass('active');
                this.timeMemory = setTimeout(function () {
                    $('.all-content').addClass('shown');
                    window.clearTimeout(this.timeMemory);
                }, 650);
            }
        },
        instantDisplay: function () {
            console.log("checkAllDone: not match => display");
            $('.all-load').addClass('active');
            $('.all-content').addClass('active');
            $('.all-content').addClass('shown');
            this.timeMemory = null;
        }
    };
}
var _countHide = 0;
_ui_share_app.directive('componentProductRelate', function ($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelate';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        tagname: '@tagname',
        imgpath: '@imgpath',
        request: '@type',
        carousel: '@carousel',
        referral: '@referral',
        datapid:'@datapid',
        
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function (scope, element, attr) {};
    promise.controller = function ($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.forbidden = false;
        $scope._config = [];
        $scope._host = _ui_share_host + templateName + '/';
        $scope.assetsPath = 'extensions/themes/assets/';
        $scope.use_carousel = (typeof $scope.carousel !== 'undefined' && $scope.carousel == 'true') ? true : false;
        console.log("tagname : ",$scope.tagname);
        /* UNIQUE KEY */
        $scope._uniqueKey = '';
        $scope._key = function () {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.productData = [];
        $scope.productDataload = false;
        $scope.type = $scope.request;
        /* GET product list in category (feature *any) */
        /* GET product list by badge id (reccommend,new arriaval, best seller, feature) */
        /* GET product list by each category (1st level) */
        $scope._get_product_list_by_category = function () {
           
             $scope.productDataload = false;
            $productTimingRequest.request = $productTimingRequest.request + 1;
            var j = {
                'badge_id_array': [18],
                'tags': $scope.tagname,
            };
            var d = {
                'cur_page': 1,
                'per_page': 30,
                'txt_filter_json': JSON.stringify(j)
            };
            /* root_category_index_asc */
            console.log("Fetching 1", $scope.tagname);            
            GAEAPI.get('product/lists', d, $scope).then(function (e) {
                $scope.productDataload = true;
                if($scope.datapid != undefined){
                    for (var i = 0; i < e.data.dataList.length; i++) {
                        if(e.data.dataList[i].product_id != datapid){
                            $scope.productData.push(e.data.dataList[i]);
                        }
                    }
                }else{
                    $scope.productData = e.data.dataList;
                }
                $productTimingRequest.data = $productTimingRequest.data + 1;
                $productTimingRequest.checkAllDone();
                if (e.data.dataList.length <= 0 && $routeParams.referral_id == referral_id) {
                    /*window.location.href="home"; */
                } else if (e.data.dataList.length <= 0) {
                    $('div[data-id="' + $scope.referral + '"]').hide();
                }
    
                console.log("Fetching 2", $scope.referral, " : result :", $scope.productData);
            });
            
        };
        $scope.$watch("tagname",function(newValue){
            if(GAEAPI.getValue(newValue,"")!=""){
              $scope._get_product_list_by_category();
            }
            
        });
        $scope._makeProductToCarousel = function () {
            var elementName = '[data-id="' + $scope._uniqueKey + '"]';
            var optionsParmas = {
                autoplay: (window.location.host !== 'localhost') ? true : false,
                slidesToShow: 4,
                slidesToScroll: 1,
                dots: false,
                arrows: false,
                centerMode: false,
                infinite: true,
                variableWidth: false,
                responsive: [
                    {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 3,
                            slidesToScroll: 1,
                            variableWidth: false,
                            centerMode: false
                        }
                    }, {
                        breakpoint: 601,
                        settings: {
                            slidesToShow: 2,
                            slidesToScroll: 1,
                            variableWidth: false,
                            centerMode: false
                        }
                    }, {
                        breakpoint: 481,
                        settings: {
                            slidesToShow: 1,
                            slidesToScroll: 1,
                            variableWidth: false,
                            centerMode: false,
                            dots: false
                        }
                    }
                ]
            };
            return sliderProvider(elementName, optionsParmas, $scope.type, $scope._uniqueKey);
        };
        $scope._slickGoLeft = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickPrev');
            }, 100);
        };
        $scope._slickGoRight = function () {
            $timeout(function () {
                $('[data-id="' + $scope._uniqueKey + '"]').slick('slickNext');
            }, 100);
        };
        /* Calculate Product Block for Arrows */
        $scope.calculateProductBlock = function (v) {
            console.log("eeeeeeeeeeeee",("-"+($('.row-product[data-id="' + $scope._uniqueKey + '"]').height()/2))+"px");
            return  ("-"+(($('.row-product[data-id="' + $scope._uniqueKey + '"]').height()/2)+40))+"px";
        };
        /* Calculate Product mobile for Arrows */
        $scope.calculateProductBlockMobile = function (v) {
            return  $('.row-product[data-id="' + $scope._uniqueKey + '"]').height() / 2;
        };
        $rootScope.$on('repeatend', function () {
            if ($('[data-id="' + $scope._uniqueKey + '"]').not('.slick-initialized') && $scope.use_carousel) {
                $timeout(function () {
                    $scope._makeProductToCarousel();
                }, 500);
            }
        });
        $scope.checkHideCondition = function (referral_id) {
            return true;
            if ($location.path() != '/' && $location.path() !== '/home') {
                if (typeof $routeParams.root_id !== 'undefined' && $routeParams.root_id > 0 && $routeParams.root_id != referral_id) {
                    return false; /* hide */
                }
                return true;
            }
            return true;
        };
    };
    return promise;
});
_ui_share_app.directive('componentProductRelateB', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateB';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        tagname: '@tagname',
        stylebutton: '@stylebutton',
        productid: '@productid',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.slideProductDeal = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.productLists = [];
        $scope.productLists_temp = [];
        $scope.productListsState = {
            load: true,
            done: false
        };
        $scope.getProductLists = function() {
            $scope.productListsState = $scope.StateData(true, false);
            var data = {
                'badge_id_array': [18],
                'tags': $scope.tagname,
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 30,
                'txt_filter_json': JSON.stringify(data)
            };
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    if($scope.productid != undefined){
                        for (var i = 0; i < output.data.dataList.length; i++) {
                            if(output.data.dataList[i].product_id != $scope.productid){
                                $scope.productLists.push(output.data.dataList[i]);
                            }
                        }
                         console.log("product relate is id :", $scope.productid , $scope.productLists);
                        
                    }else{
                        $scope.productLists = output.data.dataList;
                        console.log("product relate is id 2 :", $scope.productid);
                    }
                }
                $scope.productListsState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.getProductLists();
        $scope.showDebug = function() {
            return (typeof $routeParams.debugcontact !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentProductRelateC', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateC';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        tagnameclass: '@tagnameclass',
        stylebutton: '@stylebutton',
        productid: '@productid',
        imgpath : '@imgpath',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        
        $scope.slideProductDeal = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.productLists = [];
        $scope.productLists_temp = [];
        $scope.productListsState = {
            load: true,
            done: false
        };
        $scope.tag_name = [];
        $scope.getProductLists = function(tagname) {
            $scope.productListsState = $scope.StateData(true, false);
            $scope.tag_name = tagname.split(",");
            console.log("product relate is id 0 :",$scope.tag_name[0]);
            if($scope.tag_name.length > 1){
                var data = {
                    'badge_id_array': [18],
                    'tags': ($scope.tagname.split(",").join(",")+""),
                };
            }
            if($scope.tag_name.length == 1){
                var data = {
                    'badge_id_array': [18],
                    'tags': $scope.tag_name[0],
                };
            }
            var dataSend = {
                'cur_page': 1,
                'per_page': 30,
                'txt_filter_json': JSON.stringify(data)
            };
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    if($scope.productid != undefined){
                        for (var i = 0; i < output.data.dataList.length; i++) {
                            if(output.data.dataList[i].product_id != $scope.productid){
                                $scope.productLists.push(output.data.dataList[i]);
                            }
                        }
                         console.log("product relate is id :", $scope.productid , $scope.productLists , $scope.tag_name.length);
                        
                    }else{
                        $scope.productLists = output.data.dataList;
                        console.log("product relate is id 2 :", $scope.productid);
                    }
                }
                $scope.productListsState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.$watch('tagnameclass', function(newValue, oldValue) {
            if(newValue){
               $scope.getProductLists(newValue);
            }
            if (!newValue) return;
        });
        
        $scope.showDebug = function() {
            return (typeof $routeParams.debugcontact !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentProductRelateD', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateD';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        component: '@component',
        referralid: '@referralid',
        stylebutton: '@stylebutton',
        productid: '@productid',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_second': '?textSecond',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.slideProductDeal = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.productLists = [];
        $scope.productLists_temp = [];
        $scope.productListsState = {
            load: true,
            done: false
        };
        $scope.getProductLists = function() {
            $scope.productListsState = $scope.StateData(true, false);
            var data = {
                'referral_id_array_in': $scope.referralid,
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 10,
                'txt_filter_json': JSON.stringify(data)
            };
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    if ($scope.productid != undefined) {
                        for (var i = 0; i < output.data.dataList.length; i++) {
                            if (output.data.dataList[i].product_id != $scope.productid) {
                                $scope.productLists.push(output.data.dataList[i]);
                            }
                        }
                        console.log("product relate is id :", $scope.productid, $scope.productLists);
                    } else {
                        $scope.productLists = output.data.dataList;
                        console.log("product relate is id 2 :", $scope.productid);
                    }
                }
                $scope.productListsState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.getProductLists();
        $scope.showDebug = function() {
            return (typeof $routeParams.debugcontact !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentProductRelateE', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateE';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        component: '@component',
        stylebutton: '@stylebutton',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_end': '?textEnd',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    console.log('componentProductRelateE : ', functionName, ' : ', data);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = params.product_id.split("-", 1).join("");
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.consoleLog("getApi api", api);
                        _self.consoleLog("getApi dataSend", dataSend);
                        _self.consoleLog("getApi res_api", res_api);
                        state = _self.stateData(false, true);
                        callback(res_api, state);
                    });
                },
                carousel: function(coverIn, carouselIn) {
                    $(coverIn).css('height', '0');
                    $(carouselIn).css('opacity', '0');
                    setTimeout(function() {
                        var carousel = $(carouselIn);
                        carousel.not('.slick-initialized').slick({
                            dots: false,
                            arrows: true,
                            autoplay: false,
                            autoplaySpeed: 4000,
                            slidesToShow: 4,
                            slidesToScroll: 1,
                            infinite: true,
                            speed: 600,
                            prevArrow: ' ',
                            nextArrow: '
',
                            nextArrow: ' ',
                            responsive: [{
                                breakpoint: 1330,
                                settings: {
                                    slidesToShow: 4,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    arrows: false,
                                    slidesToShow: 3
                                }
                            }, {
                                breakpoint: 768,
                                settings: {
                                    arrows: false,
                                    slidesToShow: 2
                                }
                            }, {
                                breakpoint: 480,
                                settings: {
                                    arrows: false,
                                    slidesToShow: 1
                                }
                            }]
                        }).closest('section').addClass('active');
                        $(coverIn).css('height', 'auto');
                        $(carouselIn).css('opacity', '1');
                    }, 100);
                },
                getCarousel: function(carousel, callback) {
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                titleUrl: function(str) {
                    var url = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    return url;
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.data = {
            carousel: 0,
            arrayState: {
                load: false,
                done: false
            },
            ok: true,
            array: []
        };
        $scope.getData().getCarousel($scope.data.carousel, function(res_carousel_id) {
            $scope.data.carousel = res_carousel_id;
            $scope.getData().getRouteParams(function(res_params, res_state) {
                $scope.data.arrayState = res_state;
                $scope.getData().getProductId(res_params, function(res_product_id) {
                    var dataSend = {
                        'txt_product_id': res_product_id,
                        'txt_limit': 10,
                        'jso_badge': JSON.stringify([18])
                    };
                    $scope.getData().dataSend('product/related', dataSend, function(res_api, res_dataSend) {
                        $scope.getData().getApi(res_api, res_dataSend, function(res, res_state) {
                            console.log("getApi + + + + + : dataSend :", dataSend);
                            console.log("getApi + + + + + : res :", res);
                            $scope.data.array = res.data.lists;
                            $scope.data.arrayState = res_state;
                        });
                    });
                });
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentProductRelateEa', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateEa';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        productid: '@productid',
        limit: '@limit',
        tagname: '@tagname',
        component: '@component',
        stylebutton: '@stylebutton',
        productid: '@productid',
        margin: '@margin',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_end': '?textEnd',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._idUrl = function(instr) {
            console.log("_idUrl : ", instr);
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.slideProductDeal = function(elem) {
            $('.component-product-relate-e').css('height', '0');
            $('.component-product-relate-e').css('opacity', '0');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
                $('.component-product-relate-e').css('height', 'auto');
                $('.component-product-relate-e').css('opacity', '1');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.consoleLog = function(text, data) {
            console.log(text, ' : ', data);
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getDataArray = function(id, limit) {
            $scope.consoleLog('_getDataArray id', id);
            $scope.consoleLog('_getDataArray limit', limit);
            $scope._dataArrayState = $scope.StateData(true, false);
            var data = {
                'referral_id_array_in': [$scope.referralid],
                'tags': $scope.tagname
            };
            var dataSend = {
                'txt_product_id': id,
                'txt_limit': limit,
            };
            $scope.consoleLog('_getDataArray dataSend', dataSend);
            GAEAPI.get('product/related', dataSend, $scope).then(function(output) {
                $scope.consoleLog('_getDataArray output', output);
                if (output.ok == 1) {
                    $scope._dataArray = output.data.lists;
                    $scope.consoleLog('_getDataArray _dataArray', $scope._dataArray);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope.productid), $scope.limit);
    };
    return promise;
});_ui_share_app.directive('componentProductRelateEb', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateEb';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        referralid: '@referralid',
        tagname: '@tagname',
        component: '@component',
        stylebutton: '@stylebutton',
        productid: '@productid',
        margin: '@margin',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_end': '?textEnd',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.slideProductDeal = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getDataArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var data = {
                'referral_id_array_in': [$scope.referralid],
                'tags': $scope.tagname
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_filter_json': JSON.stringify(data)
            };
            console.log("estsefrdsgdsfgdfsg", dataSend);
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    if ($scope.productid != undefined) {
                        for (var i = 0; i < output.data.dataList.length; i++) {
                            if (output.data.dataList[i].product_id != $scope.productid) {
                                $scope._dataArray.push(output.data.dataList[i]);
                            }
                        }
                    } else {
                        
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        setTimeout(function() {
            $scope._getDataArray();
        }, 2000);
    };
    return promise;
});_ui_share_app.directive('componentProductRelateEg', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateEg';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        productid: '@productid',
        limit: '@limit',
        tagname: '@tagname',
        component: '@component',
        stylebutton: '@stylebutton',
        margin: '@margin',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_end': '?textEnd',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.slideProductDeal = function(elem) {
            $('.component-product-relate-e').css('height', '0');
            $('.component-product-relate-e').css('opacity', '0');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
                $('.component-product-relate-e').css('height', 'auto');
                $('.component-product-relate-e').css('opacity', '1');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.consoleLog = function(text, data) {
            console.log(text, ' : ', data);
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getDataArray = function(id, limit) {
            $scope.consoleLog('_getDataArray id', id);
            $scope.consoleLog('_getDataArray limit', limit);
            $scope._dataArrayState = $scope.StateData(true, false);
            var data = {
                'referral_id_array_in': [$scope.referralid],
                'tags': $scope.tagname
            };
            var dataSend = {
                'txt_product_id': id,
                'txt_limit': limit,
            };
            $scope.consoleLog('_getDataArray dataSend', dataSend);
            GAEAPI.get('product/related', dataSend, $scope).then(function(output) {
                $scope.consoleLog('_getDataArray output', output);
                if (output.ok == 1) {
                    // $scope.$apply(function() {
                        $scope._dataArray = output.data.lists;
                        $scope.consoleLog('_getDataArray _dataArray', $scope._dataArray);
                    // });
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        
        $scope.$watch('productid', function (newValue, oldValue) {
            if (newValue){
               $scope._getDataArray($scope.productid, $scope.limit);
            }else{
                return;
            }
        });
    };
    return promise;
});_ui_share_app.directive('componentProductRelateF', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateF';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        referralid: '@referralid',
        tagname: '@tagname',
        component: '@component',
        stylebutton: '@stylebutton',
        margintopic: '@margintopic',
        margincard: '@margincard',
        limitdata: '@limitdata',
        iconsize: '@iconsize',
        iconnext: '@iconnext',
        iconback: '@iconback',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'topic_top': '?topicTop',
    };
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope.productid = $scope._getPostIdFromURL();
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._component = (typeof $scope.component !== 'undefined' && $scope.component !== '') ? $scope.component : 'null';
        $scope._limitdata = (typeof $scope.limitdata !== 'undefined' && typeof $scope.limitdata !== '') ? $scope.limitdata : 6;
        $scope._stylebutton = (typeof $scope.stylebutton !== 'undefined' && typeof $scope.stylebutton !== '') ? $scope.stylebutton : 'filled_button_round_small';
        $scope.mkCarousel = function(elem) {
            $('.component-product-relate-f').css('height', '0');
            $('.component-product-relate-f').css('opacity', '0');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    prevArrow: '
',
                            responsive: [{
                                breakpoint: 1330,
                                settings: {
                                    slidesToShow: 4,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    arrows: false,
                                    slidesToShow: 3
                                }
                            }, {
                                breakpoint: 768,
                                settings: {
                                    arrows: false,
                                    slidesToShow: 2
                                }
                            }, {
                                breakpoint: 480,
                                settings: {
                                    arrows: false,
                                    slidesToShow: 1
                                }
                            }]
                        }).closest('section').addClass('active');
                        $(coverIn).css('height', 'auto');
                        $(carouselIn).css('opacity', '1');
                    }, 100);
                },
                getCarousel: function(carousel, callback) {
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                titleUrl: function(str) {
                    var url = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    return url;
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.data = {
            carousel: 0,
            arrayState: {
                load: false,
                done: false
            },
            ok: true,
            array: []
        };
        $scope.getData().getCarousel($scope.data.carousel, function(res_carousel_id) {
            $scope.data.carousel = res_carousel_id;
            $scope.getData().getRouteParams(function(res_params, res_state) {
                $scope.data.arrayState = res_state;
                $scope.getData().getProductId(res_params, function(res_product_id) {
                    var dataSend = {
                        'txt_product_id': res_product_id,
                        'txt_limit': 10,
                        'jso_badge': JSON.stringify([18])
                    };
                    $scope.getData().dataSend('product/related', dataSend, function(res_api, res_dataSend) {
                        $scope.getData().getApi(res_api, res_dataSend, function(res, res_state) {
                            console.log("getApi + + + + + : dataSend :", dataSend);
                            console.log("getApi + + + + + : res :", res);
                            $scope.data.array = res.data.lists;
                            $scope.data.arrayState = res_state;
                        });
                    });
                });
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentProductRelateEa', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateEa';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        productid: '@productid',
        limit: '@limit',
        tagname: '@tagname',
        component: '@component',
        stylebutton: '@stylebutton',
        productid: '@productid',
        margin: '@margin',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_end': '?textEnd',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._idUrl = function(instr) {
            console.log("_idUrl : ", instr);
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.slideProductDeal = function(elem) {
            $('.component-product-relate-e').css('height', '0');
            $('.component-product-relate-e').css('opacity', '0');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
                $('.component-product-relate-e').css('height', 'auto');
                $('.component-product-relate-e').css('opacity', '1');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.consoleLog = function(text, data) {
            console.log(text, ' : ', data);
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getDataArray = function(id, limit) {
            $scope.consoleLog('_getDataArray id', id);
            $scope.consoleLog('_getDataArray limit', limit);
            $scope._dataArrayState = $scope.StateData(true, false);
            var data = {
                'referral_id_array_in': [$scope.referralid],
                'tags': $scope.tagname
            };
            var dataSend = {
                'txt_product_id': id,
                'txt_limit': limit,
            };
            $scope.consoleLog('_getDataArray dataSend', dataSend);
            GAEAPI.get('product/related', dataSend, $scope).then(function(output) {
                $scope.consoleLog('_getDataArray output', output);
                if (output.ok == 1) {
                    $scope._dataArray = output.data.lists;
                    $scope.consoleLog('_getDataArray _dataArray', $scope._dataArray);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray($scope._idUrl($scope.productid), $scope.limit);
    };
    return promise;
});_ui_share_app.directive('componentProductRelateEb', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateEb';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        referralid: '@referralid',
        tagname: '@tagname',
        component: '@component',
        stylebutton: '@stylebutton',
        productid: '@productid',
        margin: '@margin',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_end': '?textEnd',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.slideProductDeal = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getDataArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var data = {
                'referral_id_array_in': [$scope.referralid],
                'tags': $scope.tagname
            };
            var dataSend = {
                'cur_page': 1,
                'per_page': 12,
                'txt_filter_json': JSON.stringify(data)
            };
            console.log("estsefrdsgdsfgdfsg", dataSend);
            GAEAPI.get('product/lists', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    if ($scope.productid != undefined) {
                        for (var i = 0; i < output.data.dataList.length; i++) {
                            if (output.data.dataList[i].product_id != $scope.productid) {
                                $scope._dataArray.push(output.data.dataList[i]);
                            }
                        }
                    } else {
                        
                    }
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        setTimeout(function() {
            $scope._getDataArray();
        }, 2000);
    };
    return promise;
});_ui_share_app.directive('componentProductRelateEg', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateEg';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        productid: '@productid',
        limit: '@limit',
        tagname: '@tagname',
        component: '@component',
        stylebutton: '@stylebutton',
        margin: '@margin',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_end': '?textEnd',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.slideProductDeal = function(elem) {
            $('.component-product-relate-e').css('height', '0');
            $('.component-product-relate-e').css('opacity', '0');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
                $('.component-product-relate-e').css('height', 'auto');
                $('.component-product-relate-e').css('opacity', '1');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.consoleLog = function(text, data) {
            console.log(text, ' : ', data);
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getDataArray = function(id, limit) {
            $scope.consoleLog('_getDataArray id', id);
            $scope.consoleLog('_getDataArray limit', limit);
            $scope._dataArrayState = $scope.StateData(true, false);
            var data = {
                'referral_id_array_in': [$scope.referralid],
                'tags': $scope.tagname
            };
            var dataSend = {
                'txt_product_id': id,
                'txt_limit': limit,
            };
            $scope.consoleLog('_getDataArray dataSend', dataSend);
            GAEAPI.get('product/related', dataSend, $scope).then(function(output) {
                $scope.consoleLog('_getDataArray output', output);
                if (output.ok == 1) {
                    // $scope.$apply(function() {
                        $scope._dataArray = output.data.lists;
                        $scope.consoleLog('_getDataArray _dataArray', $scope._dataArray);
                    // });
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        
        $scope.$watch('productid', function (newValue, oldValue) {
            if (newValue){
               $scope._getDataArray($scope.productid, $scope.limit);
            }else{
                return;
            }
        });
    };
    return promise;
});_ui_share_app.directive('componentProductRelateF', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateF';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        referralid: '@referralid',
        tagname: '@tagname',
        component: '@component',
        stylebutton: '@stylebutton',
        margintopic: '@margintopic',
        margincard: '@margincard',
        limitdata: '@limitdata',
        iconsize: '@iconsize',
        iconnext: '@iconnext',
        iconback: '@iconback',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'topic_top': '?topicTop',
    };
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope.productid = $scope._getPostIdFromURL();
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._component = (typeof $scope.component !== 'undefined' && $scope.component !== '') ? $scope.component : 'null';
        $scope._limitdata = (typeof $scope.limitdata !== 'undefined' && typeof $scope.limitdata !== '') ? $scope.limitdata : 6;
        $scope._stylebutton = (typeof $scope.stylebutton !== 'undefined' && typeof $scope.stylebutton !== '') ? $scope.stylebutton : 'filled_button_round_small';
        $scope.mkCarousel = function(elem) {
            $('.component-product-relate-f').css('height', '0');
            $('.component-product-relate-f').css('opacity', '0');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    prevArrow: ' ',
                        nextArrow: '
',
                        nextArrow: ' '
                    };
                    $scope.carousels.push(objectArray);
                    var res_index = ($scope.carousels.length != 0) ? $scope.carousels.length - 1 : 0;
                    callback(res_index);
                },
                setSpeed: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.speed = state;
                    });
                },
                setDots: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.dots = state;
                    });
                },
                setArrows: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.arrows = state;
                    });
                },
                setInfinite: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.infinite = state;
                    });
                },
                setAutoplay: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.autoplay = state;
                    });
                },
                setAdaptiveHeight: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.adaptiveHeight = state;
                    });
                },
                setAutoplaySpeed: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.autoplaySpeed = state;
                    });
                },
                setCenterMode: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.centerMode = state;
                    });
                },
                setCenterPadding: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.centerPadding = state;
                    });
                },
                setFocusOnSelect: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.focusOnSelect = state;
                    });
                },
                setSlidesToScroll: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.slidesToScroll = state;
                    });
                },
                setPrevArrow: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.prevArrow = state;
                    });
                },
                setNextArrow: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.nextArrow = state;
                    });
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carousel: function(cover, carousel, xs, sm, md, lg) {
                    var _self = this;
                    var carousels = $(carousel);
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    var _xs = parseInt(xs);
                    var _sm = parseInt(sm);
                    var _md = parseInt(md);
                    var _lg = parseInt(lg);
                    setTimeout(function() {
                        carousels.not('.slick-initialized').slick({
                            speed: $scope.carousels[0].speed,
                            dots: $scope.carousels[0].dots,
                            arrows: $scope.carousels[0].arrows,
                            infinite: $scope.carousels[0].infinite,
                            autoplay: $scope.carousels[0].autoplay,
                            slidesToScroll: $scope.carousels[0].slidesToScroll,
                            slidesToShow: _lg,
                            autoplaySpeed: $scope.carousels[0].autoplaySpeed,
                            adaptiveHeight: $scope.carousels[0].adaptiveHeight,
                            prevArrow: $scope.carousels[0].prevArrow,
                            nextArrow: $scope.carousels[0].nextArrow,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: _md,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: _sm,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: _xs,
                                }
                            }],
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselIndex: function(index, cover, carousel, xs, sm, md, lg) {
                    var _self = this;
                    var carousels = $(carousel);
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    var _xs = parseInt(xs);
                    var _sm = parseInt(sm);
                    var _md = parseInt(md);
                    var _lg = parseInt(lg);
                    var slick_array = {};
                    slick_array.slidesToShow = _lg;
                    slick_array.arrows = $scope.carousels[index].arrows;
                    if ($scope.carousels[index].dots) {
                        slick_array.dots = $scope.carousels[index].dots;
                    }
                    if ($scope.carousels[index].speed != 0) {
                        slick_array.speed = $scope.carousels[index].speed;
                    }
                    if ($scope.carousels[index].autoplay) {
                        slick_array.arrows = $scope.carousels[index].arrows;
                    }
                    if ($scope.carousels[index].infinite) {
                        slick_array.infinite = $scope.carousels[index].infinite;
                    }
                    if ($scope.carousels[index].prevArrow != '') {
                        slick_array.prevArrow = $scope.carousels[index].prevArrow;
                    }
                    if ($scope.carousels[index].nextArrow != '') {
                        slick_array.nextArrow = $scope.carousels[index].nextArrow;
                    }
                    if ($scope.carousels[index].centerMode) {
                        slick_array.centerMode = $scope.carousels[index].centerMode;
                    }
                    if ($scope.carousels[index].centerPadding != '0' && $scope.carousels[index].centerPadding != '') {
                        slick_array.centerPadding = $scope.carousels[index].centerPadding;
                    }
                    if ($scope.carousels[index].focusOnSelect) {
                        slick_array.focusOnSelect = $scope.carousels[index].focusOnSelect;
                    }
                    if ($scope.carousels[index].autoplaySpeed != 0) {
                        slick_array.autoplaySpeed = $scope.carousels[index].autoplaySpeed;
                    }
                    if ($scope.carousels[index].adaptiveHeight) {
                        slick_array.adaptiveHeight = $scope.carousels[index].adaptiveHeight;
                    }
                    if ($scope.carousels[index].slidesToScroll != 0) {
                        slick_array.slidesToScroll = $scope.carousels[index].slidesToScroll;
                    }
                    slick_array.responsive = [{
                        breakpoint: 1200,
                        settings: {
                            slidesToShow: _md,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: _sm,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: _xs,
                        }
                    }];
                    if ($scope.carousels[index].centerPadding != '0' && $scope.carousels[index].centerPadding != '') {
                        slick_array.centerPadding = $scope.carousels[index].centerPadding;
                        slick_array.responsive[2].settings.centerPadding = '0px'
                    }
                    setTimeout(function() {
                        carousels.not('.slick-initialized').slick(slick_array).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.carousels = [{
            speed: 600,
            dots: false,
            arrows: true,
            infinite: true,
            autoplay: true,
            adaptiveHeight: true,
            autoplaySpeed: 4000,
            slidesToScroll: 1,
            prevArrow: '
'
                    };
                    $scope.carousels.push(objectArray);
                    var res_index = ($scope.carousels.length != 0) ? $scope.carousels.length - 1 : 0;
                    callback(res_index);
                },
                setSpeed: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.speed = state;
                    });
                },
                setDots: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.dots = state;
                    });
                },
                setArrows: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.arrows = state;
                    });
                },
                setInfinite: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.infinite = state;
                    });
                },
                setAutoplay: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.autoplay = state;
                    });
                },
                setAdaptiveHeight: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.adaptiveHeight = state;
                    });
                },
                setAutoplaySpeed: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.autoplaySpeed = state;
                    });
                },
                setCenterMode: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.centerMode = state;
                    });
                },
                setCenterPadding: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.centerPadding = state;
                    });
                },
                setFocusOnSelect: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.focusOnSelect = state;
                    });
                },
                setSlidesToScroll: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.slidesToScroll = state;
                    });
                },
                setPrevArrow: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.prevArrow = state;
                    });
                },
                setNextArrow: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.nextArrow = state;
                    });
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carousel: function(cover, carousel, xs, sm, md, lg) {
                    var _self = this;
                    var carousels = $(carousel);
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    var _xs = parseInt(xs);
                    var _sm = parseInt(sm);
                    var _md = parseInt(md);
                    var _lg = parseInt(lg);
                    setTimeout(function() {
                        carousels.not('.slick-initialized').slick({
                            speed: $scope.carousels[0].speed,
                            dots: $scope.carousels[0].dots,
                            arrows: $scope.carousels[0].arrows,
                            infinite: $scope.carousels[0].infinite,
                            autoplay: $scope.carousels[0].autoplay,
                            slidesToScroll: $scope.carousels[0].slidesToScroll,
                            slidesToShow: _lg,
                            autoplaySpeed: $scope.carousels[0].autoplaySpeed,
                            adaptiveHeight: $scope.carousels[0].adaptiveHeight,
                            prevArrow: $scope.carousels[0].prevArrow,
                            nextArrow: $scope.carousels[0].nextArrow,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: _md,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: _sm,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: _xs,
                                }
                            }],
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselIndex: function(index, cover, carousel, xs, sm, md, lg) {
                    var _self = this;
                    var carousels = $(carousel);
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    var _xs = parseInt(xs);
                    var _sm = parseInt(sm);
                    var _md = parseInt(md);
                    var _lg = parseInt(lg);
                    var slick_array = {};
                    slick_array.slidesToShow = _lg;
                    slick_array.arrows = $scope.carousels[index].arrows;
                    if ($scope.carousels[index].dots) {
                        slick_array.dots = $scope.carousels[index].dots;
                    }
                    if ($scope.carousels[index].speed != 0) {
                        slick_array.speed = $scope.carousels[index].speed;
                    }
                    if ($scope.carousels[index].autoplay) {
                        slick_array.arrows = $scope.carousels[index].arrows;
                    }
                    if ($scope.carousels[index].infinite) {
                        slick_array.infinite = $scope.carousels[index].infinite;
                    }
                    if ($scope.carousels[index].prevArrow != '') {
                        slick_array.prevArrow = $scope.carousels[index].prevArrow;
                    }
                    if ($scope.carousels[index].nextArrow != '') {
                        slick_array.nextArrow = $scope.carousels[index].nextArrow;
                    }
                    if ($scope.carousels[index].centerMode) {
                        slick_array.centerMode = $scope.carousels[index].centerMode;
                    }
                    if ($scope.carousels[index].centerPadding != '0' && $scope.carousels[index].centerPadding != '') {
                        slick_array.centerPadding = $scope.carousels[index].centerPadding;
                    }
                    if ($scope.carousels[index].focusOnSelect) {
                        slick_array.focusOnSelect = $scope.carousels[index].focusOnSelect;
                    }
                    if ($scope.carousels[index].autoplaySpeed != 0) {
                        slick_array.autoplaySpeed = $scope.carousels[index].autoplaySpeed;
                    }
                    if ($scope.carousels[index].adaptiveHeight) {
                        slick_array.adaptiveHeight = $scope.carousels[index].adaptiveHeight;
                    }
                    if ($scope.carousels[index].slidesToScroll != 0) {
                        slick_array.slidesToScroll = $scope.carousels[index].slidesToScroll;
                    }
                    slick_array.responsive = [{
                        breakpoint: 1200,
                        settings: {
                            slidesToShow: _md,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: _sm,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: _xs,
                        }
                    }];
                    if ($scope.carousels[index].centerPadding != '0' && $scope.carousels[index].centerPadding != '') {
                        slick_array.centerPadding = $scope.carousels[index].centerPadding;
                        slick_array.responsive[2].settings.centerPadding = '0px'
                    }
                    setTimeout(function() {
                        carousels.not('.slick-initialized').slick(slick_array).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.carousels = [{
            speed: 600,
            dots: false,
            arrows: true,
            infinite: true,
            autoplay: true,
            adaptiveHeight: true,
            autoplaySpeed: 4000,
            slidesToScroll: 1,
            prevArrow: ' ',
            nextArrow: '
',
            nextArrow: ' '
        }];
        $scope.dataApi = {
            related: {
                dataSend: {},
                api: "product/lists",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.related.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                var filter_json = {
                    'referral_id_array_in': [$scope.referralid],
                    'tags': $scope.tagname
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'jso_badge': JSON.stringify(filter_json)
                };
                $scope.dataApi.related.dataSend = dataSend;
                $scope.getData().dataSend($scope.dataApi.related.api, $scope.dataApi.related.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_related, res_state) {
                        $scope.dataApi.related.ok = res_ok;
                        $scope.dataApi.related.dataArray = get_res_api_related.data.dataList;
                        $scope.getData().consoleLog("get_res_api_big_related", get_res_api_related);
                        $scope.dataApi.related.dataArrayState = res_state;
                    });
                });
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentProductRelateMagic', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateMagic';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {};
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "componentProductRelateMagic";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(_self,params, state);
                },
                formatDataSend: function(data, callback) {
                    var _self = this;
                    _self.consoleLog("formatDataSend", "data", data);
                    callback(data);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = (params.product_id != undefined) ? params.product_id.split("-", 1).join("") : false;
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getReferralId: function(productReferralDisplay, callback) {
                    var _self = this;
                    var referral_id = 0;
                    if (productReferralDisplay.length != 0) {
                        if (productReferralDisplay.category != undefined) {
                            if (productReferralDisplay.category.length != 0) {
                                referral_id = productReferralDisplay.category[0].referral_id
                            }
                        }
                    }
                    callback(referral_id);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getCarousel = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getFunctionCarousel: function(callback) {
                    var _self = this;
                    callback(_self);
                },
                setCarousels: function(carousel, callback) {
                    var _self = this;
                    callback(carousel);
                },
                pushObjectCarousel: function(callback) {
                    var _self = this;
                    var objectArray = {
                        speed: 600,
                        dots: false,
                        arrows: false,
                        infinite: false,
                        autoplay: false,
                        focusOnSelect: false,
                        adaptiveHeight: false,
                        autoplaySpeed: 4000,
                        slidesToScroll: 1,
                        centerMode: false,
                        centerPadding: '0px',
                        prevArrow: '
'
        }];
        $scope.dataApi = {
            related: {
                dataSend: {},
                api: "product/lists",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.related.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                var filter_json = {
                    'referral_id_array_in': [$scope.referralid],
                    'tags': $scope.tagname
                };
                var dataSend = {
                    'cur_page': 1,
                    'per_page': 12,
                    'jso_badge': JSON.stringify(filter_json)
                };
                $scope.dataApi.related.dataSend = dataSend;
                $scope.getData().dataSend($scope.dataApi.related.api, $scope.dataApi.related.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_related, res_state) {
                        $scope.dataApi.related.ok = res_ok;
                        $scope.dataApi.related.dataArray = get_res_api_related.data.dataList;
                        $scope.getData().consoleLog("get_res_api_big_related", get_res_api_related);
                        $scope.dataApi.related.dataArrayState = res_state;
                    });
                });
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentProductRelateMagic', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateMagic';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {};
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "componentProductRelateMagic";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(_self,params, state);
                },
                formatDataSend: function(data, callback) {
                    var _self = this;
                    _self.consoleLog("formatDataSend", "data", data);
                    callback(data);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = (params.product_id != undefined) ? params.product_id.split("-", 1).join("") : false;
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getReferralId: function(productReferralDisplay, callback) {
                    var _self = this;
                    var referral_id = 0;
                    if (productReferralDisplay.length != 0) {
                        if (productReferralDisplay.category != undefined) {
                            if (productReferralDisplay.category.length != 0) {
                                referral_id = productReferralDisplay.category[0].referral_id
                            }
                        }
                    }
                    callback(referral_id);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getCarousel = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getFunctionCarousel: function(callback) {
                    var _self = this;
                    callback(_self);
                },
                setCarousels: function(carousel, callback) {
                    var _self = this;
                    callback(carousel);
                },
                pushObjectCarousel: function(callback) {
                    var _self = this;
                    var objectArray = {
                        speed: 600,
                        dots: false,
                        arrows: false,
                        infinite: false,
                        autoplay: false,
                        focusOnSelect: false,
                        adaptiveHeight: false,
                        autoplaySpeed: 4000,
                        slidesToScroll: 1,
                        centerMode: false,
                        centerPadding: '0px',
                        prevArrow: ' ',
                        nextArrow: '
',
                        nextArrow: ' '
                    };
                    $scope.carousels.push(objectArray);
                    var res_index = ($scope.carousels.length != 0) ? $scope.carousels.length - 1 : 0;
                    callback(res_index);
                },
                setSpeed: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.speed = state;
                    });
                },
                setDots: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.dots = state;
                    });
                },
                setArrows: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.arrows = state;
                    });
                },
                setInfinite: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.infinite = state;
                    });
                },
                setAutoplay: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.autoplay = state;
                    });
                },
                setAdaptiveHeight: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.adaptiveHeight = state;
                    });
                },
                setAutoplaySpeed: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.autoplaySpeed = state;
                    });
                },
                setCenterMode: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.centerMode = state;
                    });
                },
                setCenterPadding: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.centerPadding = state;
                    });
                },
                setFocusOnSelect: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.focusOnSelect = state;
                    });
                },
                setSlidesToScroll: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.slidesToScroll = state;
                    });
                },
                setPrevArrow: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.prevArrow = state;
                    });
                },
                setNextArrow: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.nextArrow = state;
                    });
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carousel: function(cover, carousel, xs, sm, md, lg) {
                    var _self = this;
                    var carousels = $(carousel);
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    var _xs = parseInt(xs);
                    var _sm = parseInt(sm);
                    var _md = parseInt(md);
                    var _lg = parseInt(lg);
                    setTimeout(function() {
                        carousels.not('.slick-initialized').slick({
                            speed: $scope.carousels[0].speed,
                            dots: $scope.carousels[0].dots,
                            arrows: $scope.carousels[0].arrows,
                            infinite: $scope.carousels[0].infinite,
                            autoplay: $scope.carousels[0].autoplay,
                            slidesToScroll: $scope.carousels[0].slidesToScroll,
                            slidesToShow: _lg,
                            autoplaySpeed: $scope.carousels[0].autoplaySpeed,
                            adaptiveHeight: $scope.carousels[0].adaptiveHeight,
                            prevArrow: $scope.carousels[0].prevArrow,
                            nextArrow: $scope.carousels[0].nextArrow,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: _md,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: _sm,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: _xs,
                                }
                            }],
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselIndex: function(index, cover, carousel, xs, sm, md, lg) {
                    var _self = this;
                    var carousels = $(carousel);
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    var _xs = parseInt(xs);
                    var _sm = parseInt(sm);
                    var _md = parseInt(md);
                    var _lg = parseInt(lg);
                    var slick_array = {};
                    slick_array.slidesToShow = _lg;
                    slick_array.arrows = $scope.carousels[index].arrows;
                    if ($scope.carousels[index].dots) {
                        slick_array.dots = $scope.carousels[index].dots;
                    }
                    if ($scope.carousels[index].speed != 0) {
                        slick_array.speed = $scope.carousels[index].speed;
                    }
                    if ($scope.carousels[index].autoplay) {
                        slick_array.arrows = $scope.carousels[index].arrows;
                    }
                    if ($scope.carousels[index].infinite) {
                        slick_array.infinite = $scope.carousels[index].infinite;
                    }
                    if ($scope.carousels[index].prevArrow != '') {
                        slick_array.prevArrow = $scope.carousels[index].prevArrow;
                    }
                    if ($scope.carousels[index].nextArrow != '') {
                        slick_array.nextArrow = $scope.carousels[index].nextArrow;
                    }
                    if ($scope.carousels[index].centerMode) {
                        slick_array.centerMode = $scope.carousels[index].centerMode;
                    }
                    if ($scope.carousels[index].centerPadding != '0' && $scope.carousels[index].centerPadding != '') {
                        slick_array.centerPadding = $scope.carousels[index].centerPadding;
                    }
                    if ($scope.carousels[index].focusOnSelect) {
                        slick_array.focusOnSelect = $scope.carousels[index].focusOnSelect;
                    }
                    if ($scope.carousels[index].autoplaySpeed != 0) {
                        slick_array.autoplaySpeed = $scope.carousels[index].autoplaySpeed;
                    }
                    if ($scope.carousels[index].adaptiveHeight) {
                        slick_array.adaptiveHeight = $scope.carousels[index].adaptiveHeight;
                    }
                    if ($scope.carousels[index].slidesToScroll != 0) {
                        slick_array.slidesToScroll = $scope.carousels[index].slidesToScroll;
                    }
                    slick_array.responsive = [{
                        breakpoint: 1200,
                        settings: {
                            slidesToShow: _md,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: _sm,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: _xs,
                        }
                    }];
                    if ($scope.carousels[index].centerPadding != '0' && $scope.carousels[index].centerPadding != '') {
                        slick_array.centerPadding = $scope.carousels[index].centerPadding;
                        slick_array.responsive[2].settings.centerPadding = '0px'
                    }
                    setTimeout(function() {
                        carousels.not('.slick-initialized').slick(slick_array).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.carousels = [{
            speed: 600,
            dots: false,
            arrows: false,
            infinite: true,
            autoplay: true,
            adaptiveHeight: true,
            autoplaySpeed: 4000,
            slidesToScroll: 1,
            prevArrow: '
'
                    };
                    $scope.carousels.push(objectArray);
                    var res_index = ($scope.carousels.length != 0) ? $scope.carousels.length - 1 : 0;
                    callback(res_index);
                },
                setSpeed: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.speed = state;
                    });
                },
                setDots: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.dots = state;
                    });
                },
                setArrows: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.arrows = state;
                    });
                },
                setInfinite: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.infinite = state;
                    });
                },
                setAutoplay: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.autoplay = state;
                    });
                },
                setAdaptiveHeight: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.adaptiveHeight = state;
                    });
                },
                setAutoplaySpeed: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.autoplaySpeed = state;
                    });
                },
                setCenterMode: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.centerMode = state;
                    });
                },
                setCenterPadding: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.centerPadding = state;
                    });
                },
                setFocusOnSelect: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.focusOnSelect = state;
                    });
                },
                setSlidesToScroll: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.slidesToScroll = state;
                    });
                },
                setPrevArrow: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.prevArrow = state;
                    });
                },
                setNextArrow: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.nextArrow = state;
                    });
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carousel: function(cover, carousel, xs, sm, md, lg) {
                    var _self = this;
                    var carousels = $(carousel);
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    var _xs = parseInt(xs);
                    var _sm = parseInt(sm);
                    var _md = parseInt(md);
                    var _lg = parseInt(lg);
                    setTimeout(function() {
                        carousels.not('.slick-initialized').slick({
                            speed: $scope.carousels[0].speed,
                            dots: $scope.carousels[0].dots,
                            arrows: $scope.carousels[0].arrows,
                            infinite: $scope.carousels[0].infinite,
                            autoplay: $scope.carousels[0].autoplay,
                            slidesToScroll: $scope.carousels[0].slidesToScroll,
                            slidesToShow: _lg,
                            autoplaySpeed: $scope.carousels[0].autoplaySpeed,
                            adaptiveHeight: $scope.carousels[0].adaptiveHeight,
                            prevArrow: $scope.carousels[0].prevArrow,
                            nextArrow: $scope.carousels[0].nextArrow,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: _md,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: _sm,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: _xs,
                                }
                            }],
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselIndex: function(index, cover, carousel, xs, sm, md, lg) {
                    var _self = this;
                    var carousels = $(carousel);
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    var _xs = parseInt(xs);
                    var _sm = parseInt(sm);
                    var _md = parseInt(md);
                    var _lg = parseInt(lg);
                    var slick_array = {};
                    slick_array.slidesToShow = _lg;
                    slick_array.arrows = $scope.carousels[index].arrows;
                    if ($scope.carousels[index].dots) {
                        slick_array.dots = $scope.carousels[index].dots;
                    }
                    if ($scope.carousels[index].speed != 0) {
                        slick_array.speed = $scope.carousels[index].speed;
                    }
                    if ($scope.carousels[index].autoplay) {
                        slick_array.arrows = $scope.carousels[index].arrows;
                    }
                    if ($scope.carousels[index].infinite) {
                        slick_array.infinite = $scope.carousels[index].infinite;
                    }
                    if ($scope.carousels[index].prevArrow != '') {
                        slick_array.prevArrow = $scope.carousels[index].prevArrow;
                    }
                    if ($scope.carousels[index].nextArrow != '') {
                        slick_array.nextArrow = $scope.carousels[index].nextArrow;
                    }
                    if ($scope.carousels[index].centerMode) {
                        slick_array.centerMode = $scope.carousels[index].centerMode;
                    }
                    if ($scope.carousels[index].centerPadding != '0' && $scope.carousels[index].centerPadding != '') {
                        slick_array.centerPadding = $scope.carousels[index].centerPadding;
                    }
                    if ($scope.carousels[index].focusOnSelect) {
                        slick_array.focusOnSelect = $scope.carousels[index].focusOnSelect;
                    }
                    if ($scope.carousels[index].autoplaySpeed != 0) {
                        slick_array.autoplaySpeed = $scope.carousels[index].autoplaySpeed;
                    }
                    if ($scope.carousels[index].adaptiveHeight) {
                        slick_array.adaptiveHeight = $scope.carousels[index].adaptiveHeight;
                    }
                    if ($scope.carousels[index].slidesToScroll != 0) {
                        slick_array.slidesToScroll = $scope.carousels[index].slidesToScroll;
                    }
                    slick_array.responsive = [{
                        breakpoint: 1200,
                        settings: {
                            slidesToShow: _md,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: _sm,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: _xs,
                        }
                    }];
                    if ($scope.carousels[index].centerPadding != '0' && $scope.carousels[index].centerPadding != '') {
                        slick_array.centerPadding = $scope.carousels[index].centerPadding;
                        slick_array.responsive[2].settings.centerPadding = '0px'
                    }
                    setTimeout(function() {
                        carousels.not('.slick-initialized').slick(slick_array).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.carousels = [{
            speed: 600,
            dots: false,
            arrows: false,
            infinite: true,
            autoplay: true,
            adaptiveHeight: true,
            autoplaySpeed: 4000,
            slidesToScroll: 1,
            prevArrow: ' ',
            nextArrow: '
',
            nextArrow: ' '
        }];
        $scope.dataApi = {
            shop_current: {
                data_send: {},
                api: "shop/current",
                ok: false,
                data_array: [],
                data_array_state: {
                    load: false,
                    done: false
                }
            },
            related: {
                dataSend: {},
                api: "product/big_related",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.getData().getRouteParams(function(_self,res_params, res_state) {
            $scope.dataApi.shop_current.data_array_state = res_state;
            _self.formatDataSend($scope.dataApi.shop_current, function(res_data) {
                _self.dataSend(res_data.api, res_data.data_send, function(res_api, res_data_send) {
                    _self.getApi(res_api, res_data_send, function(res_ok, res_api, res_state) {
                        res_data.ok = res_ok;
                        res_data.data_array = res_api.data;
                        res_data.data_array_state = res_state;
                        _self.consoleLog("getApiData", "res_data", res_data);
                    });
                });
            });
            $scope.dataApi.related.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                var filter_json = [18];
                var dataSend = {
                    'txt_product_id': res_product_id,
                    'cur_page': 1,
                    'per_page': 12,
                    'jso_badge': JSON.stringify(filter_json)
                };
                $scope.dataApi.related.dataSend = dataSend;
                $scope.getData().dataSend($scope.dataApi.related.api, $scope.dataApi.related.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_related, res_state) {
                        $scope.dataApi.related.ok = res_ok;
                        /* angular.forEach(get_res_api_related.data.dataList, function(item, index) {
                            $scope.getData().getNameUrl(get_res_api_related.data.dataList[index].product_title, function(res_title) {
                                get_res_api_related.data.dataList[index].product_title_url = res_title;
                            });
                            var images = [];
                            angular.forEach(item.product_image,function(image,index_image){
                                if (image.image_app_cover_checked) {
                                    images.push(image)
                                }
                            });
                            item.product_image = images;
                        }); */
                        $scope.dataApi.related.dataArray = get_res_api_related.data.dataList;
                        $scope.getData().consoleLog("get_res_api_big_related", get_res_api_related);
                    });
                });
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentProductRelateVono', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateVono';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {};
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "componentProductRelateVono";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = (params.product_id != undefined) ? params.product_id.split("-", 1).join("") : false;
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getReferralId: function(productReferralDisplay, callback) {
                    var _self = this;
                    var referral_id = 0;
                    if (productReferralDisplay.length != 0) {
                        if (productReferralDisplay.category != undefined) {
                            if (productReferralDisplay.category.length != 0) {
                                referral_id = productReferralDisplay.category[0].referral_id
                            }
                        }
                    }
                    callback(referral_id);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getCarousel = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getFunctionCarousel: function(callback) {
                    var _self = this;
                    callback(_self);
                },
                setCarousels: function(carousel, callback) {
                    var _self = this;
                    callback(carousel);
                },
                pushObjectCarousel: function(callback) {
                    var _self = this;
                    var objectArray = {
                        speed: 600,
                        dots: false,
                        arrows: false,
                        infinite: false,
                        autoplay: false,
                        focusOnSelect: false,
                        adaptiveHeight: false,
                        autoplaySpeed: 4000,
                        slidesToScroll: 1,
                        centerMode: false,
                        centerPadding: '0px',
                        prevArrow: '
'
        }];
        $scope.dataApi = {
            shop_current: {
                data_send: {},
                api: "shop/current",
                ok: false,
                data_array: [],
                data_array_state: {
                    load: false,
                    done: false
                }
            },
            related: {
                dataSend: {},
                api: "product/big_related",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.getData().getRouteParams(function(_self,res_params, res_state) {
            $scope.dataApi.shop_current.data_array_state = res_state;
            _self.formatDataSend($scope.dataApi.shop_current, function(res_data) {
                _self.dataSend(res_data.api, res_data.data_send, function(res_api, res_data_send) {
                    _self.getApi(res_api, res_data_send, function(res_ok, res_api, res_state) {
                        res_data.ok = res_ok;
                        res_data.data_array = res_api.data;
                        res_data.data_array_state = res_state;
                        _self.consoleLog("getApiData", "res_data", res_data);
                    });
                });
            });
            $scope.dataApi.related.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                var filter_json = [18];
                var dataSend = {
                    'txt_product_id': res_product_id,
                    'cur_page': 1,
                    'per_page': 12,
                    'jso_badge': JSON.stringify(filter_json)
                };
                $scope.dataApi.related.dataSend = dataSend;
                $scope.getData().dataSend($scope.dataApi.related.api, $scope.dataApi.related.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_related, res_state) {
                        $scope.dataApi.related.ok = res_ok;
                        /* angular.forEach(get_res_api_related.data.dataList, function(item, index) {
                            $scope.getData().getNameUrl(get_res_api_related.data.dataList[index].product_title, function(res_title) {
                                get_res_api_related.data.dataList[index].product_title_url = res_title;
                            });
                            var images = [];
                            angular.forEach(item.product_image,function(image,index_image){
                                if (image.image_app_cover_checked) {
                                    images.push(image)
                                }
                            });
                            item.product_image = images;
                        }); */
                        $scope.dataApi.related.dataArray = get_res_api_related.data.dataList;
                        $scope.getData().consoleLog("get_res_api_big_related", get_res_api_related);
                    });
                });
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentProductRelateVono', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductRelateVono';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {};
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "componentProductRelateVono";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                getProductId: function(params, callback) {
                    var _self = this;
                    var product_id = (params.product_id != undefined) ? params.product_id.split("-", 1).join("") : false;
                    _self.consoleLog("getProductId product_id", product_id);
                    callback(product_id);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                getReferralId: function(productReferralDisplay, callback) {
                    var _self = this;
                    var referral_id = 0;
                    if (productReferralDisplay.length != 0) {
                        if (productReferralDisplay.category != undefined) {
                            if (productReferralDisplay.category.length != 0) {
                                referral_id = productReferralDisplay.category[0].referral_id
                            }
                        }
                    }
                    callback(referral_id);
                },
                getNameUrl: function(name, callback) {
                    var _self = this;
                    name = name.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
                    _self.consoleLog("getNameUrl", "name", name);
                    callback(name);
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.getCarousel = function() {
            var getFunction = {
                consoleLog: function(function_name, data_name, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', function_name, ' : ', data_name, ' : ', data);
                    }
                },
                getFunctionCarousel: function(callback) {
                    var _self = this;
                    callback(_self);
                },
                setCarousels: function(carousel, callback) {
                    var _self = this;
                    callback(carousel);
                },
                pushObjectCarousel: function(callback) {
                    var _self = this;
                    var objectArray = {
                        speed: 600,
                        dots: false,
                        arrows: false,
                        infinite: false,
                        autoplay: false,
                        focusOnSelect: false,
                        adaptiveHeight: false,
                        autoplaySpeed: 4000,
                        slidesToScroll: 1,
                        centerMode: false,
                        centerPadding: '0px',
                        prevArrow: ' ',
                        nextArrow: '
',
                        nextArrow: ' '
                    };
                    $scope.carousels.push(objectArray);
                    var res_index = ($scope.carousels.length != 0) ? $scope.carousels.length - 1 : 0;
                    callback(res_index);
                },
                setSpeed: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.speed = state;
                    });
                },
                setDots: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.dots = state;
                    });
                },
                setArrows: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.arrows = state;
                    });
                },
                setInfinite: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.infinite = state;
                    });
                },
                setAutoplay: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.autoplay = state;
                    });
                },
                setAdaptiveHeight: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.adaptiveHeight = state;
                    });
                },
                setAutoplaySpeed: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.autoplaySpeed = state;
                    });
                },
                setCenterMode: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.centerMode = state;
                    });
                },
                setCenterPadding: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.centerPadding = state;
                    });
                },
                setFocusOnSelect: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.focusOnSelect = state;
                    });
                },
                setSlidesToScroll: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.slidesToScroll = state;
                    });
                },
                setPrevArrow: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.prevArrow = state;
                    });
                },
                setNextArrow: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.nextArrow = state;
                    });
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carousel: function(cover, carousel, xs, sm, md, lg) {
                    var _self = this;
                    var carousels = $(carousel);
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    var _xs = parseInt(xs);
                    var _sm = parseInt(sm);
                    var _md = parseInt(md);
                    var _lg = parseInt(lg);
                    setTimeout(function() {
                        carousels.not('.slick-initialized').slick({
                            speed: $scope.carousels[0].speed,
                            dots: $scope.carousels[0].dots,
                            arrows: $scope.carousels[0].arrows,
                            infinite: $scope.carousels[0].infinite,
                            autoplay: $scope.carousels[0].autoplay,
                            slidesToScroll: $scope.carousels[0].slidesToScroll,
                            slidesToShow: _lg,
                            autoplaySpeed: $scope.carousels[0].autoplaySpeed,
                            adaptiveHeight: $scope.carousels[0].adaptiveHeight,
                            prevArrow: $scope.carousels[0].prevArrow,
                            nextArrow: $scope.carousels[0].nextArrow,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: _md,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: _sm,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: _xs,
                                }
                            }],
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselIndex: function(index, cover, carousel, xs, sm, md, lg) {
                    var _self = this;
                    var carousels = $(carousel);
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    var _xs = parseInt(xs);
                    var _sm = parseInt(sm);
                    var _md = parseInt(md);
                    var _lg = parseInt(lg);
                    var slick_array = {};
                    slick_array.slidesToShow = _lg;
                    slick_array.arrows = $scope.carousels[index].arrows;
                    if ($scope.carousels[index].dots) {
                        slick_array.dots = $scope.carousels[index].dots;
                    }
                    if ($scope.carousels[index].speed != 0) {
                        slick_array.speed = $scope.carousels[index].speed;
                    }
                    if ($scope.carousels[index].autoplay) {
                        slick_array.arrows = $scope.carousels[index].arrows;
                    }
                    if ($scope.carousels[index].infinite) {
                        slick_array.infinite = $scope.carousels[index].infinite;
                    }
                    if ($scope.carousels[index].prevArrow != '') {
                        slick_array.prevArrow = $scope.carousels[index].prevArrow;
                    }
                    if ($scope.carousels[index].nextArrow != '') {
                        slick_array.nextArrow = $scope.carousels[index].nextArrow;
                    }
                    if ($scope.carousels[index].centerMode) {
                        slick_array.centerMode = $scope.carousels[index].centerMode;
                    }
                    if ($scope.carousels[index].centerPadding != '0' && $scope.carousels[index].centerPadding != '') {
                        slick_array.centerPadding = $scope.carousels[index].centerPadding;
                    }
                    if ($scope.carousels[index].focusOnSelect) {
                        slick_array.focusOnSelect = $scope.carousels[index].focusOnSelect;
                    }
                    if ($scope.carousels[index].autoplaySpeed != 0) {
                        slick_array.autoplaySpeed = $scope.carousels[index].autoplaySpeed;
                    }
                    if ($scope.carousels[index].adaptiveHeight) {
                        slick_array.adaptiveHeight = $scope.carousels[index].adaptiveHeight;
                    }
                    if ($scope.carousels[index].slidesToScroll != 0) {
                        slick_array.slidesToScroll = $scope.carousels[index].slidesToScroll;
                    }
                    slick_array.responsive = [{
                        breakpoint: 1200,
                        settings: {
                            slidesToShow: _md,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: _sm,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: _xs,
                        }
                    }];
                    if ($scope.carousels[index].centerPadding != '0' && $scope.carousels[index].centerPadding != '') {
                        slick_array.centerPadding = $scope.carousels[index].centerPadding;
                        slick_array.responsive[2].settings.centerPadding = '0px'
                    }
                    setTimeout(function() {
                        carousels.not('.slick-initialized').slick(slick_array).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.carousels = [{
            speed: 600,
            dots: false,
            arrows: false,
            infinite: true,
            autoplay: true,
            adaptiveHeight: true,
            autoplaySpeed: 4000,
            slidesToScroll: 1,
            prevArrow: '
'
                    };
                    $scope.carousels.push(objectArray);
                    var res_index = ($scope.carousels.length != 0) ? $scope.carousels.length - 1 : 0;
                    callback(res_index);
                },
                setSpeed: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.speed = state;
                    });
                },
                setDots: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.dots = state;
                    });
                },
                setArrows: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.arrows = state;
                    });
                },
                setInfinite: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.infinite = state;
                    });
                },
                setAutoplay: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.autoplay = state;
                    });
                },
                setAdaptiveHeight: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.adaptiveHeight = state;
                    });
                },
                setAutoplaySpeed: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.autoplaySpeed = state;
                    });
                },
                setCenterMode: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.centerMode = state;
                    });
                },
                setCenterPadding: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.centerPadding = state;
                    });
                },
                setFocusOnSelect: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.focusOnSelect = state;
                    });
                },
                setSlidesToScroll: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.slidesToScroll = state;
                    });
                },
                setPrevArrow: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.prevArrow = state;
                    });
                },
                setNextArrow: function(index, state) {
                    var _self = this;
                    _self.setCarousels($scope.carousels[index], function(res_carousel) {
                        res_carousel.nextArrow = state;
                    });
                },
                getCarousel: function(carousel, callback) {
                    var _self = this;
                    var carousel_id = 0;
                    if (carousel == 0) {
                        carousel_id = Math.floor((Math.random() * 9999) + 1000);
                    }
                    callback(carousel_id);
                },
                carousel: function(cover, carousel, xs, sm, md, lg) {
                    var _self = this;
                    var carousels = $(carousel);
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    var _xs = parseInt(xs);
                    var _sm = parseInt(sm);
                    var _md = parseInt(md);
                    var _lg = parseInt(lg);
                    setTimeout(function() {
                        carousels.not('.slick-initialized').slick({
                            speed: $scope.carousels[0].speed,
                            dots: $scope.carousels[0].dots,
                            arrows: $scope.carousels[0].arrows,
                            infinite: $scope.carousels[0].infinite,
                            autoplay: $scope.carousels[0].autoplay,
                            slidesToScroll: $scope.carousels[0].slidesToScroll,
                            slidesToShow: _lg,
                            autoplaySpeed: $scope.carousels[0].autoplaySpeed,
                            adaptiveHeight: $scope.carousels[0].adaptiveHeight,
                            prevArrow: $scope.carousels[0].prevArrow,
                            nextArrow: $scope.carousels[0].nextArrow,
                            responsive: [{
                                breakpoint: 1200,
                                settings: {
                                    slidesToShow: _md,
                                }
                            }, {
                                breakpoint: 991,
                                settings: {
                                    slidesToShow: _sm,
                                }
                            }, {
                                breakpoint: 767,
                                settings: {
                                    slidesToShow: _xs,
                                }
                            }],
                        }).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 500);
                },
                carouselIndex: function(index, cover, carousel, xs, sm, md, lg) {
                    var _self = this;
                    var carousels = $(carousel);
                    $(cover).css('height', '0');
                    $(cover).css('opacity', '0');
                    $(carousel).css('opacity', '0');
                    var _xs = parseInt(xs);
                    var _sm = parseInt(sm);
                    var _md = parseInt(md);
                    var _lg = parseInt(lg);
                    var slick_array = {};
                    slick_array.slidesToShow = _lg;
                    slick_array.arrows = $scope.carousels[index].arrows;
                    if ($scope.carousels[index].dots) {
                        slick_array.dots = $scope.carousels[index].dots;
                    }
                    if ($scope.carousels[index].speed != 0) {
                        slick_array.speed = $scope.carousels[index].speed;
                    }
                    if ($scope.carousels[index].autoplay) {
                        slick_array.arrows = $scope.carousels[index].arrows;
                    }
                    if ($scope.carousels[index].infinite) {
                        slick_array.infinite = $scope.carousels[index].infinite;
                    }
                    if ($scope.carousels[index].prevArrow != '') {
                        slick_array.prevArrow = $scope.carousels[index].prevArrow;
                    }
                    if ($scope.carousels[index].nextArrow != '') {
                        slick_array.nextArrow = $scope.carousels[index].nextArrow;
                    }
                    if ($scope.carousels[index].centerMode) {
                        slick_array.centerMode = $scope.carousels[index].centerMode;
                    }
                    if ($scope.carousels[index].centerPadding != '0' && $scope.carousels[index].centerPadding != '') {
                        slick_array.centerPadding = $scope.carousels[index].centerPadding;
                    }
                    if ($scope.carousels[index].focusOnSelect) {
                        slick_array.focusOnSelect = $scope.carousels[index].focusOnSelect;
                    }
                    if ($scope.carousels[index].autoplaySpeed != 0) {
                        slick_array.autoplaySpeed = $scope.carousels[index].autoplaySpeed;
                    }
                    if ($scope.carousels[index].adaptiveHeight) {
                        slick_array.adaptiveHeight = $scope.carousels[index].adaptiveHeight;
                    }
                    if ($scope.carousels[index].slidesToScroll != 0) {
                        slick_array.slidesToScroll = $scope.carousels[index].slidesToScroll;
                    }
                    slick_array.responsive = [{
                        breakpoint: 1200,
                        settings: {
                            slidesToShow: _md,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: _sm,
                        }
                    }, {
                        breakpoint: 767,
                        settings: {
                            slidesToShow: _xs,
                        }
                    }];
                    if ($scope.carousels[index].centerPadding != '0' && $scope.carousels[index].centerPadding != '') {
                        slick_array.centerPadding = $scope.carousels[index].centerPadding;
                        slick_array.responsive[2].settings.centerPadding = '0px'
                    }
                    setTimeout(function() {
                        carousels.not('.slick-initialized').slick(slick_array).closest('section').addClass('active');
                        $(cover).css('height', 'auto');
                        $(cover).css('opacity', '1');
                        $(carousel).css('opacity', '1');
                    }, 1000);
                }
            }
            return getFunction;
        };
        $scope.carousels = [{
            speed: 600,
            dots: false,
            arrows: false,
            infinite: true,
            autoplay: true,
            adaptiveHeight: true,
            autoplaySpeed: 4000,
            slidesToScroll: 1,
            prevArrow: ' ',
            nextArrow: '
',
            nextArrow: ' '
        }];
        $scope.dataApi = {
            related: {
                dataSend: {},
                api: "product/big_related",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.related.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                var filter_json = [18];
                var dataSend = {
                    'txt_product_id': res_product_id,
                    'cur_page': 1,
                    'per_page': 12,
                    'jso_badge': JSON.stringify(filter_json)
                };
                $scope.dataApi.related.dataSend = dataSend;
                $scope.getData().dataSend($scope.dataApi.related.api, $scope.dataApi.related.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_related, res_state) {
                        $scope.dataApi.related.ok = res_ok;
                        angular.forEach(get_res_api_related.data.dataList, function(item, index) {
                            $scope.getData().getNameUrl(get_res_api_related.data.dataList[index].product_title, function(res_title) {
                                get_res_api_related.data.dataList[index].product_title_url = res_title;
                            });
                            var images = [];
                            angular.forEach(item.product_image,function(image,index_image){
                                if (image.image_app_cover_checked) {
                                    images.push(image)
                                }
                            });
                            item.product_image = images;
                        });
                        $scope.dataApi.related.dataArray = get_res_api_related.data.dataList;
                        $scope.getData().consoleLog("get_res_api_big_related", get_res_api_related);
                    });
                });
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentProductReward', function($rootScope, $routeParams, sliderProvider, carouselData) {
    var templateName = 'componentProductReward';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        productid: '@productid',
        qty: '@qty',
        pricesale: '@pricesale',
        imgreward: '@imgreward',
        textright: '@textright',
        textbefore: '@textbefore',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope._dataArray = false;
        $scope.reward = false;
        $scope.qty = $scope.qty || 1;
        $scope.rewardlast = 0;
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope.$watch('productid', function(newValue, oldValue) {
            if (newValue) {
                $scope._getDataArray(newValue);
            } else {
                return;
            }
        });
        $scope.$watch('pricesale', function(newValue, oldValue) {
            if (newValue) {
                if ($scope._dataArray.product_reward != undefined) {
                    if ($scope._dataArray.product_reward.reward_type_id == 103) {
                        if (($scope.qty * newValue) % $scope._dataArray.product_reward.reward_every_price == 0) {
                            $scope.pointmain = ($scope.qty * newValue / $scope._dataArray.product_reward.reward_every_price) * $scope._dataArray.product_reward.reward_amount;
                            $scope.rewardTime($scope._dataArray.product_reward.reward_lifetime.lifetime_start_time, $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time, $scope.pointmain);
                        } else {
                            var price_all = ($scope.qty * newValue) - (($scope.qty * newValue) % $scope._dataArray.product_reward.reward_every_price);
                            $scope.pointmain = (price_all / $scope._dataArray.product_reward.reward_every_price) * $scope._dataArray.product_reward.reward_amount;
                            $scope.rewardTime($scope._dataArray.product_reward.reward_lifetime.lifetime_start_time, $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time, $scope.pointmain);
                        }
                    } else if ($scope._dataArray.product_reward.reward_type_id == 102) {
                        $scope.pointmain = ($scope._dataArray.product_reward.reward_percent / 100) * ($scope.qty * newValue);
                        $scope.rewardTime($scope._dataArray.product_reward.reward_lifetime.lifetime_start_time, $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time, $scope.pointmain);
                    } else {
                        $scope.rewardlast = $scope.getreward($scope.qty);
                    }
                }
            } else {
                $scope.rewardlast = $scope.getreward(1);
            }
        });
        $scope.$watch('qty', function(newValue, oldValue) {
            if (newValue) {
                if ($scope._dataArray.product_reward != undefined) {
                    if ($scope._dataArray.product_reward.reward_type_id == 103) {
                        if (($scope.pricesale * newValue) % $scope._dataArray.product_reward.reward_every_price == 0) {
                            $scope.pointmain = ($scope.pricesale * newValue / $scope._dataArray.product_reward.reward_every_price) * $scope._dataArray.product_reward.reward_amount;
                            $scope.rewardTime($scope._dataArray.product_reward.reward_lifetime.lifetime_start_time, $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time, $scope.pointmain);
                        } else {
                            var price_all = ($scope.pricesale * newValue) - (($scope.pricesale * newValue) % $scope._dataArray.product_reward.reward_every_price);
                            $scope.pointmain = (price_all / $scope._dataArray.product_reward.reward_every_price) * $scope._dataArray.product_reward.reward_amount;
                            $scope.rewardTime($scope._dataArray.product_reward.reward_lifetime.lifetime_start_time, $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time, $scope.pointmain);
                        }
                    } else if ($scope._dataArray.product_reward.reward_type_id == 102) {
                        $scope.pointmain = ($scope._dataArray.product_reward.reward_percent / 100) * ($scope.pricesale * newValue);
                        $scope.rewardTime($scope._dataArray.product_reward.reward_lifetime.lifetime_start_time, $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time, $scope.pointmain);
                    } else {
                        $scope.rewardlast = $scope.getreward(newValue);
                    }
                }
            } else {
                $scope.rewardlast = $scope.getreward(1);
            }
        });
        $scope.pointmain = 0;
        $scope._getDataArray = function(id) {
            $scope.pointmain = 0;
            $scope.reward = false;
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend, $scope).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    if ($scope._dataArray.product_reward.length != 0) {
                        var starttime = $scope._dataArray.product_reward.reward_lifetime.lifetime_start_time;
                        var endtime = $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time;
                        if ($scope._dataArray.product_reward.reward_type_id == 101) {
                            $scope.pointmain = $scope._dataArray.product_reward.reward_amount;
                            $scope.rewardTime(starttime, endtime, $scope.pointmain);
                        }
                        if ($scope._dataArray.product_reward.reward_type_id == 102) {
                            $scope.pointmain = ($scope._dataArray.product_reward.reward_percent / 100) * $scope.pricesale;
                            $scope.rewardTime(starttime, endtime, $scope.pointmain);
                        }
                        if ($scope._dataArray.product_reward.reward_type_id == 103) {
                            $scope.pointmain = ($scope.pricesale * $scope.qty / $scope._dataArray.product_reward.reward_every_price) * $scope._dataArray.product_reward.reward_amount;
                            /* if($scope.pointmain%$scope._dataArray.product_reward.reward_amount == 0){
                             } */
                            if ($scope.pointmain >= $scope._dataArray.product_reward.reward_amount) {
                                /* alert($scope.pointmain); */
                                $scope.rewardTime(starttime, endtime, $scope.pointmain);
                            } else {
                                $scope.popkaisod = true;
                            }
                        }
                    }
                }
            });
        };
        $scope.rewardTime = function(t_start, t_end, reward_point) {
            console.log("rewardTime : reward_point : ", reward_point, " t_start : ", parseInt(t_start), " t_end : ", parseInt(t_end));
            var date_now = new Date();
            var date_start = new Date(t_start * 1000);
            var date_end = new Date(t_end * 1000);
            console.log("rewardTime : date_now : ", date_now, " date_end : ", date_end, " date_start : ", date_start);
            if (parseInt(t_start) <= parseInt(t_end)) {
                if (date_start <= date_now && date_end > date_now) {
                    $scope.reward = reward_point;
                    $scope.rewardlast = $scope.reward;
                }
            } else if (parseInt(t_end) == -1) {
                $scope.reward = reward_point;
                $scope.rewardlast = $scope.reward;
            } else {
                if (parseInt(t_start) <= date_now && parseInt(t_end) > date_now) {
                    $scope.reward = reward_point;
                    $scope.rewardlast = $scope.reward;
                }
            }
            /* var date_end = 0;
            var date_now = new Date();
            var date_start = new Date(t_start * 1000);
            if (t_end != -1) {
                date_end = new Date(t_end * 1000);
                if (t_start <= date_now && t_end > date_now) {
                    $scope.reward = reward_point;
                    $scope.rewardlast = $scope.reward;
                }
            }
            if (t_start <= date_now && t_end == -1) {
                $scope.reward = reward_point;
                $scope.rewardlast = $scope.reward;
                console.log("point_reward 3  :", $scope.reward);
            } */
        };
        $scope.getreward = function(valuer) {
            return $scope.reward * valuer;
        }
    };
    return promise;
});_ui_share_app.factory('$componentProductSetDetail', function componentProductSetDetail($routeParams, $timeout) {
    return
});_ui_share_app.directive('componentProductSetDetailTypeA', function($rootScope, $routeParams) {
    var templateName = 'componentProductSetDetailTypeA';
    var componentMain = 'componentProductSetDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        promotelink: '@promotelink',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.product_sku = "";
        $scope.product_code = "";
        $scope.product_price = 0;
        $scope.product_compare_price = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/set_id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    console.log("_getDataArray _dataArray : ", $scope._dataArray);
                    $scope.dataPreserve = res.data;
                    if (res.data.product_sku != undefined) {
                        $scope.product_sku = res.data.product_sku;
                    }
                    if (res.data.product_code != undefined) {
                        $scope.product_code = res.data.product_code;
                    }
                    $scope.product_price = res.data.product_price;
                    /*$scope.calculate(
                        res.data.product_price, 
                        res.data.product_compare_price, 
                        res.data.product_discount.discount_id, 
                        res.data.product_discount.discount_price, 
                        res.data.product_discount.discount_percent);*/
                    if (res.data.product_tag != undefined) {
                        $scope.dataTag = res.data.product_tags.split(",");
                    }
                    $scope.qtyCurrentSize(0, 20);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.dataRelation = [];
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < parseInt(product_total_stock); i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_qๆid = dataVariants[i].product_id;
                    if (dataVariants[i].sku != "") {
                        $scope.product_sku = dataVariants[i].sku;
                    } else {
                        $scope.product_sku = $scope._dataArray.product_sku;
                    }
                    if (dataVariants[i].sku != "") {
                        $scope.product_code = dataVariants[i].barcode;
                    } else {
                        $scope.product_code = $scope._dataArray.product_code;
                    }
                    $scope.product_price = $scope.calculate(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    $scope.product_price = $scope._dataArray.product_price;
                    $scope.product_compare_price = $scope._dataArray.product_compare_price;
                    $scope.product_sku = $scope._dataArray.product_sku;
                    $scope.product_code = $scope._dataArray.product_code;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope._getDataArray($scope._getIdUrl());
        $scope.returnSizeProductCard = function() {
            var id = $("#productcard");
            var out = $("#productcard_product_title");
            return id.outerHeight();
        };
        $scope.checkHide = function() {
            var start = 8;
            var end = 23;
            var DateHours = (new Date()).getHours();
            return [23, 0, 1, 2, 3, 4, 5, 6, 7].indexOf(DateHours) != -1;
        };
    };
    return promise;
});_ui_share_app.directive('componentProductSetDetailTypeB', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductSetDetailTypeB';
    var componentMain = 'componentProductSetDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.product_id = "";
        $scope.product_sku = "";
        $scope.product_code = "";
        $scope.product_price = 0;
        $scope.product_compare_price = 0;
        // $scope.promotion_list = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        // console.log("promotion_list : ", $scope.promotion_list);
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/set_id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    // if($scope._dataArray.product_is_promotion != 0){
                    //     $scope.promotion_list = $scope._dataArray.product_promotion[0].promotion_id;
                    // }
                    // console.log("promotion_list : ", $scope.promotion_list);
                    console.log("_getDataArray _dataArray : ", $scope._dataArray);
                    $scope.product_id = $scope._dataArray.product_id;
                    $scope.dataPreserve = res.data;
                    if (res.data.product_sku != undefined) {
                        $scope.product_sku = res.data.product_sku;
                    }
                    if (res.data.product_code != undefined) {
                        $scope.product_code = res.data.product_code;
                    }
                    $scope.product_price = $scope.calculate(res.data.product_set_price.original_price,res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_type_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(res.data.product_set_price.original_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    // $scope.dataTag = res.data.product_tags.split(",");
                    $scope.qtyCurrentSize(res.data.product_total_stock);
                    // $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope._stateReward = function(datain) {
            var state = false;
            /* console.log("_stateReward : reward_lifetime : ", datain.reward_lifetime); */
            if (datain.length != 0) {
                state = true;
            }
            return state;
        };
        $scope._getReward = function(datain, product_price, qty) {
            if (datain.length == 0) {
                return 'Data Reward Error';
            }
            console.log("_getReward : product_price : ", product_price, " qty : ", qty);
            var reward = "NULL";
            if (datain.reward_type_id == "101") {} else if (datain.reward_type_id == "102") {} else if (datain.reward_type_id == "103") {
                var reward_every_price = parseInt(datain.reward_every_price);
                var sum_product_price = Math.round(product_price) * qty;
                var reward_amount = parseInt(datain.reward_amount);
                console.log("_getReward : reward_every_price : ", reward_every_price, " sum_product_price : ", sum_product_price, " reward_amount : ", reward_amount);
                if (reward_every_price <= sum_product_price) {
                    var divided = Math.floor(sum_product_price / reward_every_price);
                    var multiplied = divided * reward_amount;
                    console.log("_getReward : divided : ", divided, " multiplied : ", multiplied);
                    reward = multiplied;
                } else {
                    reward = "ZERO";
                }
            } else {
                return 'Data Reward Type Id Error';
            }
            return reward;
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined && discount_percent == 0 && discount_price == 0) {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, product_price, compare_price, discount_type_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_type_id != undefined) {
                if (discount_type_id == "101") {
                    calculate = price - discount_price;
                } else if (discount_type_id == "102") {
                    calculate = price - ((discount_percent / 100) * price);
                } else if (discount_type_id == "103") {
                    calculate = product_price;
                } else {
                    calculate = price;
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : ", "product_total_stock : ", product_total_stock);
            if (product_total_stock > 0) {
                $scope.qty_current_size_state = true;
                $scope.buy_state = true;
                if (product_total_stock >= 20) {
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    for (var i = 0; i < parseInt(product_total_stock); i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_stock <= 0) {
                $scope.qty_current_size_state = false;
                $scope.buy_state = true;
                for (var i = 0; i < 1; i++) {
                    $scope.qty_current_size.push(i + 1);
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    if (dataVariants[i].sku != "") {
                        $scope.product_sku = dataVariants[i].sku;
                    } else {
                        $scope.product_sku = $scope._dataArray.product_sku;
                    }
                    if (dataVariants[i].sku != "") {
                        $scope.product_code = dataVariants[i].barcode;
                    } else {
                        $scope.product_code = $scope._dataArray.product_code;
                    }
                    $scope.product_price = $scope.calculate(dataVariants[i].price, $scope._dataArray.product_price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_type_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    $scope.product_price = $scope._dataArray.product_price;
                    $scope.product_compare_price = $scope._dataArray.product_compare_price;
                    $scope.product_sku = $scope._dataArray.product_sku;
                    $scope.product_code = $scope._dataArray.product_code;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope._getDataArray($scope._getIdUrl());
        // setTimeout(function() {
        //      alert($('input[name=radiogroup]:checked').val());
        //  }, 700);
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});/*_ui_share_app.directive('componentFooter', function($rootScope, $routeParams) {
    var templateName = 'componentFooter';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        id: '=',
        background: '@',
        primary: '@',
        secondary: '@',
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {};
    return promise;
});*/
_ui_share_app.factory('$componentProductSlide', function componentFooter($routeParams, $timeout) {
    return 
});_ui_share_app.directive('componentProductSlideA', function($rootScope, $routeParams) {
    var templateName = 'componentProductSlideA';
    var componentMain = 'componentProductSlide';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        referralid: '@referralid',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {};
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.mkCarouselProduct = function(elem) {
            console.debug('mkCarouselProduct: trigger');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    prevArrow: '',
                    nextArrow: '',
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 1,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._productArray = [];
        $scope._productArrayDone = {
            load: true,
            done: false
        };
        $scope._getProductArray = function(id) {
            $scope._productArrayDone = {
                load: true,
                done: false
            };
            $scope._productArray = [];
            var filter_json = {
                "referral_id_array": [id]
            }
            console.log('filter_json_Product', filter_json);
            var dataSend = {
                'cur_page': 1,
                'per_page': 20,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._productArray = res.data.dataList;
                }
                $scope._productArrayDone = {
                    load: false,
                    done: true
                };
                console.log('productArray', $scope._productArray);
            });
        };
        $scope._getProductArray($scope.referralid);
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.openCity = function(evt, cityName) {
            var i, tabcontent, tablinks;
            tabcontent = document.getElementsByClassName("tabcontent");
            for (i = 0; i < tabcontent.length; i++) {
                tabcontent[i].style.display = "none";
            }
            tablinks = document.getElementsByClassName("tablinks");
            for (i = 0; i < tablinks.length; i++) {
                tablinks[i].className = tablinks[i].className.replace(" active", "");
            }
            document.getElementById(cityName).style.display = "block";
            evt.currentTarget.className += " active";
        }
    };
    return promise;
});_ui_share_app.directive('componentProductTagA', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductTagA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        productid: '@productid',
        referralid : '@referralid',
        tag: '@tag',
        limit: '@limit',
        tagname: '@tagname',
        component: '@component',
        stylebutton: '@stylebutton',
        margin: '@margin',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_end': '?textEnd',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.slideProductDeal = function(elem) {
            $('.component-product-tag-a').css('height', '0');
            $('.component-product-tag-a').css('opacity', '0');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    prevArrow: '
'
        }];
        $scope.dataApi = {
            related: {
                dataSend: {},
                api: "product/big_related",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.related.dataArrayState = res_state;
            $scope.getData().getProductId(res_params, function(res_product_id) {
                var filter_json = [18];
                var dataSend = {
                    'txt_product_id': res_product_id,
                    'cur_page': 1,
                    'per_page': 12,
                    'jso_badge': JSON.stringify(filter_json)
                };
                $scope.dataApi.related.dataSend = dataSend;
                $scope.getData().dataSend($scope.dataApi.related.api, $scope.dataApi.related.dataSend, function(res_api, res_dataSend) {
                    $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_related, res_state) {
                        $scope.dataApi.related.ok = res_ok;
                        angular.forEach(get_res_api_related.data.dataList, function(item, index) {
                            $scope.getData().getNameUrl(get_res_api_related.data.dataList[index].product_title, function(res_title) {
                                get_res_api_related.data.dataList[index].product_title_url = res_title;
                            });
                            var images = [];
                            angular.forEach(item.product_image,function(image,index_image){
                                if (image.image_app_cover_checked) {
                                    images.push(image)
                                }
                            });
                            item.product_image = images;
                        });
                        $scope.dataApi.related.dataArray = get_res_api_related.data.dataList;
                        $scope.getData().consoleLog("get_res_api_big_related", get_res_api_related);
                    });
                });
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentProductReward', function($rootScope, $routeParams, sliderProvider, carouselData) {
    var templateName = 'componentProductReward';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        productid: '@productid',
        qty: '@qty',
        pricesale: '@pricesale',
        imgreward: '@imgreward',
        textright: '@textright',
        textbefore: '@textbefore',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope._dataArray = false;
        $scope.reward = false;
        $scope.qty = $scope.qty || 1;
        $scope.rewardlast = 0;
        $scope._getPostIdFromURL = function() {
            var test = $scope.id;
            var a = $scope.id;
            if (typeof $routeParams.product_id !== 'undefined') {
                test = parseInt($routeParams.product_id);
                a = $routeParams.product_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope.$watch('productid', function(newValue, oldValue) {
            if (newValue) {
                $scope._getDataArray(newValue);
            } else {
                return;
            }
        });
        $scope.$watch('pricesale', function(newValue, oldValue) {
            if (newValue) {
                if ($scope._dataArray.product_reward != undefined) {
                    if ($scope._dataArray.product_reward.reward_type_id == 103) {
                        if (($scope.qty * newValue) % $scope._dataArray.product_reward.reward_every_price == 0) {
                            $scope.pointmain = ($scope.qty * newValue / $scope._dataArray.product_reward.reward_every_price) * $scope._dataArray.product_reward.reward_amount;
                            $scope.rewardTime($scope._dataArray.product_reward.reward_lifetime.lifetime_start_time, $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time, $scope.pointmain);
                        } else {
                            var price_all = ($scope.qty * newValue) - (($scope.qty * newValue) % $scope._dataArray.product_reward.reward_every_price);
                            $scope.pointmain = (price_all / $scope._dataArray.product_reward.reward_every_price) * $scope._dataArray.product_reward.reward_amount;
                            $scope.rewardTime($scope._dataArray.product_reward.reward_lifetime.lifetime_start_time, $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time, $scope.pointmain);
                        }
                    } else if ($scope._dataArray.product_reward.reward_type_id == 102) {
                        $scope.pointmain = ($scope._dataArray.product_reward.reward_percent / 100) * ($scope.qty * newValue);
                        $scope.rewardTime($scope._dataArray.product_reward.reward_lifetime.lifetime_start_time, $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time, $scope.pointmain);
                    } else {
                        $scope.rewardlast = $scope.getreward($scope.qty);
                    }
                }
            } else {
                $scope.rewardlast = $scope.getreward(1);
            }
        });
        $scope.$watch('qty', function(newValue, oldValue) {
            if (newValue) {
                if ($scope._dataArray.product_reward != undefined) {
                    if ($scope._dataArray.product_reward.reward_type_id == 103) {
                        if (($scope.pricesale * newValue) % $scope._dataArray.product_reward.reward_every_price == 0) {
                            $scope.pointmain = ($scope.pricesale * newValue / $scope._dataArray.product_reward.reward_every_price) * $scope._dataArray.product_reward.reward_amount;
                            $scope.rewardTime($scope._dataArray.product_reward.reward_lifetime.lifetime_start_time, $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time, $scope.pointmain);
                        } else {
                            var price_all = ($scope.pricesale * newValue) - (($scope.pricesale * newValue) % $scope._dataArray.product_reward.reward_every_price);
                            $scope.pointmain = (price_all / $scope._dataArray.product_reward.reward_every_price) * $scope._dataArray.product_reward.reward_amount;
                            $scope.rewardTime($scope._dataArray.product_reward.reward_lifetime.lifetime_start_time, $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time, $scope.pointmain);
                        }
                    } else if ($scope._dataArray.product_reward.reward_type_id == 102) {
                        $scope.pointmain = ($scope._dataArray.product_reward.reward_percent / 100) * ($scope.pricesale * newValue);
                        $scope.rewardTime($scope._dataArray.product_reward.reward_lifetime.lifetime_start_time, $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time, $scope.pointmain);
                    } else {
                        $scope.rewardlast = $scope.getreward(newValue);
                    }
                }
            } else {
                $scope.rewardlast = $scope.getreward(1);
            }
        });
        $scope.pointmain = 0;
        $scope._getDataArray = function(id) {
            $scope.pointmain = 0;
            $scope.reward = false;
            var dataSend = {
                'txt_product_id': id
            };
            GAEAPI.get('product/id', dataSend, $scope).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    if ($scope._dataArray.product_reward.length != 0) {
                        var starttime = $scope._dataArray.product_reward.reward_lifetime.lifetime_start_time;
                        var endtime = $scope._dataArray.product_reward.reward_lifetime.lifetime_end_time;
                        if ($scope._dataArray.product_reward.reward_type_id == 101) {
                            $scope.pointmain = $scope._dataArray.product_reward.reward_amount;
                            $scope.rewardTime(starttime, endtime, $scope.pointmain);
                        }
                        if ($scope._dataArray.product_reward.reward_type_id == 102) {
                            $scope.pointmain = ($scope._dataArray.product_reward.reward_percent / 100) * $scope.pricesale;
                            $scope.rewardTime(starttime, endtime, $scope.pointmain);
                        }
                        if ($scope._dataArray.product_reward.reward_type_id == 103) {
                            $scope.pointmain = ($scope.pricesale * $scope.qty / $scope._dataArray.product_reward.reward_every_price) * $scope._dataArray.product_reward.reward_amount;
                            /* if($scope.pointmain%$scope._dataArray.product_reward.reward_amount == 0){
                             } */
                            if ($scope.pointmain >= $scope._dataArray.product_reward.reward_amount) {
                                /* alert($scope.pointmain); */
                                $scope.rewardTime(starttime, endtime, $scope.pointmain);
                            } else {
                                $scope.popkaisod = true;
                            }
                        }
                    }
                }
            });
        };
        $scope.rewardTime = function(t_start, t_end, reward_point) {
            console.log("rewardTime : reward_point : ", reward_point, " t_start : ", parseInt(t_start), " t_end : ", parseInt(t_end));
            var date_now = new Date();
            var date_start = new Date(t_start * 1000);
            var date_end = new Date(t_end * 1000);
            console.log("rewardTime : date_now : ", date_now, " date_end : ", date_end, " date_start : ", date_start);
            if (parseInt(t_start) <= parseInt(t_end)) {
                if (date_start <= date_now && date_end > date_now) {
                    $scope.reward = reward_point;
                    $scope.rewardlast = $scope.reward;
                }
            } else if (parseInt(t_end) == -1) {
                $scope.reward = reward_point;
                $scope.rewardlast = $scope.reward;
            } else {
                if (parseInt(t_start) <= date_now && parseInt(t_end) > date_now) {
                    $scope.reward = reward_point;
                    $scope.rewardlast = $scope.reward;
                }
            }
            /* var date_end = 0;
            var date_now = new Date();
            var date_start = new Date(t_start * 1000);
            if (t_end != -1) {
                date_end = new Date(t_end * 1000);
                if (t_start <= date_now && t_end > date_now) {
                    $scope.reward = reward_point;
                    $scope.rewardlast = $scope.reward;
                }
            }
            if (t_start <= date_now && t_end == -1) {
                $scope.reward = reward_point;
                $scope.rewardlast = $scope.reward;
                console.log("point_reward 3  :", $scope.reward);
            } */
        };
        $scope.getreward = function(valuer) {
            return $scope.reward * valuer;
        }
    };
    return promise;
});_ui_share_app.factory('$componentProductSetDetail', function componentProductSetDetail($routeParams, $timeout) {
    return
});_ui_share_app.directive('componentProductSetDetailTypeA', function($rootScope, $routeParams) {
    var templateName = 'componentProductSetDetailTypeA';
    var componentMain = 'componentProductSetDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        promotelink: '@promotelink',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.product_sku = "";
        $scope.product_code = "";
        $scope.product_price = 0;
        $scope.product_compare_price = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'txt_product_id': id
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/set_id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    console.log("_getDataArray _dataArray : ", $scope._dataArray);
                    $scope.dataPreserve = res.data;
                    if (res.data.product_sku != undefined) {
                        $scope.product_sku = res.data.product_sku;
                    }
                    if (res.data.product_code != undefined) {
                        $scope.product_code = res.data.product_code;
                    }
                    $scope.product_price = res.data.product_price;
                    /*$scope.calculate(
                        res.data.product_price, 
                        res.data.product_compare_price, 
                        res.data.product_discount.discount_id, 
                        res.data.product_discount.discount_price, 
                        res.data.product_discount.discount_percent);*/
                    if (res.data.product_tag != undefined) {
                        $scope.dataTag = res.data.product_tags.split(",");
                    }
                    $scope.qtyCurrentSize(0, 20);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.dataRelation = [];
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined) {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    calculate = price - discount_price;
                } else if (discount_percent != 0 && discount_price == 0) {
                    calculate = price - ((discount_percent / 100) * price);
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_variant, product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : product_total_variant : ", product_total_variant, "product_total_stock : ", product_total_stock);
            if (product_total_variant == 0) {
                if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < parseInt(product_total_stock); i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock < 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock == 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_variant > 0) {
                if (product_total_stock <= 0) {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = true;
                    for (var i = 0; i < 1; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else if (product_total_stock > 0) {
                    $scope.qty_current_size_state = true;
                    $scope.buy_state = true;
                    for (var i = 0; i < product_total_stock; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_qๆid = dataVariants[i].product_id;
                    if (dataVariants[i].sku != "") {
                        $scope.product_sku = dataVariants[i].sku;
                    } else {
                        $scope.product_sku = $scope._dataArray.product_sku;
                    }
                    if (dataVariants[i].sku != "") {
                        $scope.product_code = dataVariants[i].barcode;
                    } else {
                        $scope.product_code = $scope._dataArray.product_code;
                    }
                    $scope.product_price = $scope.calculate(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    $scope.product_price = $scope._dataArray.product_price;
                    $scope.product_compare_price = $scope._dataArray.product_compare_price;
                    $scope.product_sku = $scope._dataArray.product_sku;
                    $scope.product_code = $scope._dataArray.product_code;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope._getDataArray($scope._getIdUrl());
        $scope.returnSizeProductCard = function() {
            var id = $("#productcard");
            var out = $("#productcard_product_title");
            return id.outerHeight();
        };
        $scope.checkHide = function() {
            var start = 8;
            var end = 23;
            var DateHours = (new Date()).getHours();
            return [23, 0, 1, 2, 3, 4, 5, 6, 7].indexOf(DateHours) != -1;
        };
    };
    return promise;
});_ui_share_app.directive('componentProductSetDetailTypeB', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductSetDetailTypeB';
    var componentMain = 'componentProductSetDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'E';
    promise.scope = {
        name: '@name',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.dataTag = false;
        $scope._dataArray = [];
        $scope.product_id = "";
        $scope.product_sku = "";
        $scope.product_code = "";
        $scope.product_price = 0;
        $scope.product_compare_price = 0;
        // $scope.promotion_list = 0;
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        // console.log("promotion_list : ", $scope.promotion_list);
        $scope._getDataArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {}
            var dataSend = {
                'txt_product_id': id,
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/set_id', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data;
                    // if($scope._dataArray.product_is_promotion != 0){
                    //     $scope.promotion_list = $scope._dataArray.product_promotion[0].promotion_id;
                    // }
                    // console.log("promotion_list : ", $scope.promotion_list);
                    console.log("_getDataArray _dataArray : ", $scope._dataArray);
                    $scope.product_id = $scope._dataArray.product_id;
                    $scope.dataPreserve = res.data;
                    if (res.data.product_sku != undefined) {
                        $scope.product_sku = res.data.product_sku;
                    }
                    if (res.data.product_code != undefined) {
                        $scope.product_code = res.data.product_code;
                    }
                    $scope.product_price = $scope.calculate(res.data.product_set_price.original_price,res.data.product_price, res.data.product_compare_price, res.data.product_discount.discount_type_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(res.data.product_set_price.original_price, res.data.product_compare_price, res.data.product_discount.discount_id, res.data.product_discount.discount_price, res.data.product_discount.discount_percent);
                    if ($scope._dataArray.product_referral_display.category != 'undefined' && $scope._dataArray.product_referral_display.category != null) {
                        $scope.getRelation($scope._dataArray.product_referral_display.category[0].referral_id);
                    }
                    // $scope.dataTag = res.data.product_tags.split(",");
                    $scope.qtyCurrentSize(res.data.product_total_stock);
                    // $scope.buildVariantOption(res.data);
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.mkCarousel = function(elem) {
            var carousel = $(elem + '[data-id=' + $scope._key() + ']');
            var is_dark;
            carousel.not('.slick-initialized').slick({
                dots: true,
                arrows: true,
                autoplay: true,
                autoplaySpeed: 4000,
                slidesToShow: 1,
                slidesToScroll: 1,
                infinite: true,
                speed: 600,
                responsive: [{
                    breakpoint: 1200,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 991,
                    settings: {
                        slidesToShow: 1,
                    }
                }, {
                    breakpoint: 767,
                    settings: {
                        slidesToShow: 1,
                    }
                }]
            }).closest('section').addClass('active');
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.dataRelation = [];
        $scope.getRelation = function(referral_id) {
            var dataSend = {
                'txt_referral_id': referral_id
            };
            GAEAPI.get('referral/relation', dataSend, $scope).then(function(res) {
                if (res.ok == 1) {
                    $scope.dataRelation = res.data;
                }
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getIdUrl = function() {
            var getData = [];
            var returnData = '';
            if (typeof $routeParams.product_id !== 'undefined') {
                getData = $routeParams.product_id;
                returnData = getData.split("-");
                return returnData[0];
            }
        };
        $scope._stateReward = function(datain) {
            var state = false;
            /* console.log("_stateReward : reward_lifetime : ", datain.reward_lifetime); */
            if (datain.length != 0) {
                state = true;
            }
            return state;
        };
        $scope._getReward = function(datain, product_price, qty) {
            if (datain.length == 0) {
                return 'Data Reward Error';
            }
            console.log("_getReward : product_price : ", product_price, " qty : ", qty);
            var reward = "NULL";
            if (datain.reward_type_id == "101") {} else if (datain.reward_type_id == "102") {} else if (datain.reward_type_id == "103") {
                var reward_every_price = parseInt(datain.reward_every_price);
                var sum_product_price = Math.round(product_price) * qty;
                var reward_amount = parseInt(datain.reward_amount);
                console.log("_getReward : reward_every_price : ", reward_every_price, " sum_product_price : ", sum_product_price, " reward_amount : ", reward_amount);
                if (reward_every_price <= sum_product_price) {
                    var divided = Math.floor(sum_product_price / reward_every_price);
                    var multiplied = divided * reward_amount;
                    console.log("_getReward : divided : ", divided, " multiplied : ", multiplied);
                    reward = multiplied;
                } else {
                    reward = "ZERO";
                }
            } else {
                return 'Data Reward Type Id Error';
            }
            return reward;
        };
        $scope.viewImg = 0;
        $scope.changeImg = function(i) {
            return $scope.viewImg = i;
        };
        $scope._saleState = {
            discount: 0
        };
        $scope.sale = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var sale = 0;
            if (discount_id != undefined) {
                if (discount_price != 0 && discount_percent == 0) {
                    sale = discount_price;
                    $scope._saleStatres.discount = 'price';
                } else if (discount_percent != 0 && discount_price == 0) {
                    sale = discount_percent;
                    $scope._saleStatres.discount = 'percent';
                }
            }
            return (sale > 0) ? sale : 0;
        }
        $scope._pricefullState = {
            pricefull: 0
        };
        $scope.pricefull = function(price, compare_price, discount_id, discount_price, discount_percent) {
            var pricefull = 0;
            if (discount_id != undefined && discount_percent == 0 && discount_price == 0) {
                if (compare_price > 0 && compare_price != undefined) {
                    pricefull = compare_price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    $scope._pricefullState.pricefull = 'zero';
                }
            } else {
                if (price != undefined && price != 0) {
                    pricefull = price;
                    $scope._pricefullState.pricefull = 'not zero';
                } else {
                    pricefull = 0;
                    $scope._pricefullState.pricefull = 'zero';
                }
            }
            return pricefull;
        }
        $scope._calculateState = {
            calculate: 0
        };
        $scope.calculate = function(price, product_price, compare_price, discount_type_id, discount_price, discount_percent) {
            var calculate = 0;
            if (discount_type_id != undefined) {
                if (discount_type_id == "101") {
                    calculate = price - discount_price;
                } else if (discount_type_id == "102") {
                    calculate = price - ((discount_percent / 100) * price);
                } else if (discount_type_id == "103") {
                    calculate = product_price;
                } else {
                    calculate = price;
                }
            } else {
                calculate = price
            }
            if (calculate != undefined && calculate != 0) {
                $scope._calculateState.calculate = 'not zero';
            } else {
                $scope._calculateState.calculate = 'zero';
            }
            return (calculate > 0) ? calculate : 0;
        }
        $scope.qtyCurrentSize = function(product_total_stock) {
            $scope.qty_current_size = [];
            console.log("qtyCurrentSize : ", "product_total_stock : ", product_total_stock);
            if (product_total_stock > 0) {
                $scope.qty_current_size_state = true;
                $scope.buy_state = true;
                if (product_total_stock >= 20) {
                    for (var i = 0; i < 20; i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                } else {
                    for (var i = 0; i < parseInt(product_total_stock); i++) {
                        $scope.qty_current_size.push(i + 1);
                    }
                }
            } else if (product_total_stock <= 0) {
                $scope.qty_current_size_state = false;
                $scope.buy_state = true;
                for (var i = 0; i < 1; i++) {
                    $scope.qty_current_size.push(i + 1);
                }
            }
            $scope.qtyShow($scope.qty_current_size);
        };
        $scope.htmlSelectTime = 0;
        $scope.qtyShow = function(array) {
            $scope.htmlSelectTime = 0;
            console.log("qtyShow ", array);
            var htmlOPT = "";
            for (var i = 0; i < array.length; i++) {
                htmlOPT += '';
            }
            console.log("qty_current_size htmlOPT", htmlOPT);
            if (htmlOPT != "") {
                $scope.htmlSelectTime = $timeout(function() {
                    $('#qtyselect').html(htmlOPT);
                    $timeout.cancel($scope.htmlSelectTime);
                }, 500);
            }
        }
        $scope.viewQuantity = function() {
            var check_int = 1;
            if ($(".d_qty").val() == undefined) {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
                check_int = 1;
            } else if ($(".d_qty").val() == "? number:1 ?") {
                $(".d_qty").val("1");
                check_int = parseInt($(".d_qty").val());
            } else {
                check_int = parseInt($(".d_qty").val());
                $(".d_qty").val(check_int);
            }
            return check_int;
        };
        $scope.dataOption = [];
        $scope.dataVariants = [];
        $scope.buildVariantOption = function(objectData) {
            if (objectData.product_total_variant <= 0) {
                return;
            }
            $scope.dataOption = objectData.product_attribute.option_data.pclass_array;
            $scope.dataVariants = objectData.product_attribute.option_data.variant_array;
            $scope.makeVariantsClick();
        };
        $scope.dataVariantsPick = [];
        $scope.onSelectVariantItems = function($index, option_id) {
            console.log("onSelectVariantItems option_id:", $index, option_id);
            $scope.dataVariantsPick[$index] = option_id;
            console.log("onSelectVariantItems dataVariantsPick:", $scope.dataVariantsPick);
            if ($scope.dataVariantsPick.length >= $scope.dataOption.length) {
                $scope.findVariantsData($scope.dataVariantsPick);
            }
        };
        $scope.findVariantsData = function(variantsPick) {
            function compareArray(array_a, array) {
                if (!array) return false;
                if (array_a.length != array.length) return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i])) return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            var dataVariants = $scope.dataVariants;
            for (var i = 0; i < dataVariants.length; i++) {
                var optionJson = angular.fromJson(dataVariants[i].option_id_json);
                console.log("dataVariants :", dataVariants);
                if (compareArray(variantsPick, optionJson)) {
                    $scope._dataArray.product_id = dataVariants[i].product_id;
                    if (dataVariants[i].sku != "") {
                        $scope.product_sku = dataVariants[i].sku;
                    } else {
                        $scope.product_sku = $scope._dataArray.product_sku;
                    }
                    if (dataVariants[i].sku != "") {
                        $scope.product_code = dataVariants[i].barcode;
                    } else {
                        $scope.product_code = $scope._dataArray.product_code;
                    }
                    $scope.product_price = $scope.calculate(dataVariants[i].price, $scope._dataArray.product_price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_type_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.product_compare_price = $scope.pricefull(dataVariants[i].price, dataVariants[i].compare_price, $scope._dataArray.product_discount.discount_id, $scope._dataArray.product_discount.discount_price, $scope._dataArray.product_discount.discount_percent);
                    $scope.qtyCurrentSize(dataVariants.length, dataVariants[i].total_stock);
                    break;
                } else {
                    $scope.qty_current_size_state = false;
                    $scope.buy_state = false;
                    $scope.product_price = $scope._dataArray.product_price;
                    $scope.product_compare_price = $scope._dataArray.product_compare_price;
                    $scope.product_sku = $scope._dataArray.product_sku;
                    $scope.product_code = $scope._dataArray.product_code;
                }
            }
        };
        $scope.makeVariantsClick = function() {
            var s = $timeout(function() {
                $scope.buy_state = false;
            }, 100);
        };
        $scope.viewInfo = 1;
        $scope.view = function(input) {
            $scope.viewInfo = input;
        }
        $scope._getDataArray($scope._getIdUrl());
        // setTimeout(function() {
        //      alert($('input[name=radiogroup]:checked').val());
        //  }, 700);
        $scope.clickckvalue = function() {
            var result = 0;
            $scope.promotion_list = $('input[name=radiogroup]:checked').val();
            console.log("promotion_list : ", $scope.promotion_list);
            if ($('input[name=radiogroup]:checked').val() != "" && $('input[name=radiogroup]:checked').val() != undefined) {
                result = $('input[name=radiogroup]:checked').val();
            } else {
                result = 0;
            }
            return result;
        }
    };
    return promise;
});/*_ui_share_app.directive('componentFooter', function($rootScope, $routeParams) {
    var templateName = 'componentFooter';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        id: '=',
        background: '@',
        primary: '@',
        secondary: '@',
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {};
    return promise;
});*/
_ui_share_app.factory('$componentProductSlide', function componentFooter($routeParams, $timeout) {
    return 
});_ui_share_app.directive('componentProductSlideA', function($rootScope, $routeParams) {
    var templateName = 'componentProductSlideA';
    var componentMain = 'componentProductSlide';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        referralid: '@referralid',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {};
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.mkCarouselProduct = function(elem) {
            console.debug('mkCarouselProduct: trigger');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: true,
                    autoplaySpeed: 4000,
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    prevArrow: '',
                    nextArrow: '',
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 1,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: false,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._productArray = [];
        $scope._productArrayDone = {
            load: true,
            done: false
        };
        $scope._getProductArray = function(id) {
            $scope._productArrayDone = {
                load: true,
                done: false
            };
            $scope._productArray = [];
            var filter_json = {
                "referral_id_array": [id]
            }
            console.log('filter_json_Product', filter_json);
            var dataSend = {
                'cur_page': 1,
                'per_page': 20,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            console.log('dataSend_Product', dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._productArray = res.data.dataList;
                }
                $scope._productArrayDone = {
                    load: false,
                    done: true
                };
                console.log('productArray', $scope._productArray);
            });
        };
        $scope._getProductArray($scope.referralid);
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.openCity = function(evt, cityName) {
            var i, tabcontent, tablinks;
            tabcontent = document.getElementsByClassName("tabcontent");
            for (i = 0; i < tabcontent.length; i++) {
                tabcontent[i].style.display = "none";
            }
            tablinks = document.getElementsByClassName("tablinks");
            for (i = 0; i < tablinks.length; i++) {
                tablinks[i].className = tablinks[i].className.replace(" active", "");
            }
            document.getElementById(cityName).style.display = "block";
            evt.currentTarget.className += " active";
        }
    };
    return promise;
});_ui_share_app.directive('componentProductTagA', function($rootScope, $routeParams, sliderProvider) {
    var templateName = 'componentProductTagA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        productid: '@productid',
        referralid : '@referralid',
        tag: '@tag',
        limit: '@limit',
        tagname: '@tagname',
        component: '@component',
        stylebutton: '@stylebutton',
        margin: '@margin',
    };
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'text_first': '?textFirst',
        'text_end': '?textEnd',
    };
    promise.link = function(scope, element, attr) {};
    promise.controller = function($scope, $timeout, $interval, $q, $window, $location, $http) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope.slideProductDeal = function(elem) {
            $('.component-product-tag-a').css('height', '0');
            $('.component-product-tag-a').css('opacity', '0');
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: false,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    slidesToShow: 4,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    prevArrow: ' ',
                    nextArrow: '
',
                    nextArrow: ' ',
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: true,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: true,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: true,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
                $('.component-product-tag-a').css('height', 'auto');
                $('.component-product-tag-a').css('opacity', '1');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.consoleLog = function(text, data) {
            console.log(text, ' : ', data);
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope._getDataArray = function(productid,referralid,tag, limit) {
            $scope.consoleLog('_getDataArray tag', tag);
            $scope.consoleLog('_getDataArray limit', limit);
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {
                "referral_id_array" :[referralid],
                "tags": tag
            }
            var dataSend = {
                'cur_page': 1,
                'per_page': parseInt(limit),
                'txt_filter_json': JSON.stringify(filter_json)
            };
            $scope.consoleLog('_getDataArray  tag dataSend', dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                $scope.consoleLog('_getDataArray output', output);
                if (output.ok == 1) {
                    $scope.$apply(function() {
                        for (var i = 0; i < output.data.dataList.length; i++) {
                            $scope.consoleLog('_getDataArray : for : output.data.dataList : ', output.data.dataList[i]);
                            $scope.consoleLog('_getDataArray : for : productid : ', $scope._viewRouteParams().product_id);
                            if (output.data.dataList[i].product_id != $scope._idUrl($scope._viewRouteParams().product_id)) {
                                $scope._dataArray.push(output.data.dataList[i]);
                            }
                        }
                        /* $scope._dataArray = output.data.dataList; */
                        $scope.consoleLog('_getDataArray _dataArray', $scope._dataArray);
                    });
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.$watch('tag', function(newValue, oldValue) {
            if (newValue) {
                $scope._getDataArray($scope.productid,$scope.referralid,$scope.tag, $scope.limit);
            } else {
                return;
            }
        });
    };
    return promise;
});_ui_share_app.factory('$componentProductsDiscount', function componentProductsDiscount($routeParams, $timeout) {
    return
});_ui_share_app.directive('componentProductsDiscountTypeA', function($rootScope, $routeParams) {
    var templateName = 'componentProductsDiscountTypeA';
    var componentMain = 'componentProductsDiscount';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        productcard: '@productcard',
        stylebutton: '@stylebutton',
        limit: '@limit',
        margin: '@margin',
        col: '@col',
        pre: '@pre',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'topic_top': '?topicTop',
    };
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._productcard = (typeof $scope.productcard !== 'undefined' && typeof $scope.productcard !== '') ? $scope.productcard : 'c';
        $scope._stylebutton = (typeof $scope.stylebutton !== 'undefined' && typeof $scope.stylebutton !== '') ? $scope.stylebutton : 'border_button_small';
        $scope._pre = Boolean((typeof $scope.pre !== 'undefined' && typeof $scope.pre !== '') ? $scope.pre : 'false');
        $scope._limit = parseInt((typeof $scope.limit !== 'undefined' && typeof $scope.limit !== '') ? $scope.limit : 6);
        $scope.$watch('col', function(newValue, oldValue) {
            if (newValue) {
                $scope._col = newValue.toString().split(",");
            }
        });
        $scope.getCol = function(n) {
            return (typeof $scope._col != 'undefined' && $scope._col[n] != '') ? (typeof $scope._col[n] != 'undefined' && $scope._col[n] != '') ? $scope._col[n] : 12 : 12;
        };
        $scope.productArray = false;
        $scope.loadMoreIsLoad = false;
        $scope.productCur = 1;
        $scope.productState = {
            load: false,
            done: false,
            more: false
        };
        $scope.getProductsListsArray = function(cur, per) {
            if (cur == 1) {
                $scope.productArray = false;
                $scope.productState = $scope.stateData(true, false, $scope.productState.more);
            }
            var filter_json = {}
            var dataSend = {
                'txt_cur_page': cur,
                'txt_per_page': per,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            GAEAPI.get('product/discounts', dataSend).then(function(output) {
                console.log("dataSend : ", dataSend, "  output : ", output);
                if (output.ok == 1) {
                    $scope.$apply(function() {
                        var data = $scope.productArray;
                        var dataNew = output.data;
                        $scope.checkMore(data, dataNew);
                    });
                }
                if (cur == 1) {
                    $scope.productState = $scope.stateData(false, true, $scope.productState.more);
                }
            });
        };
        $scope.checkMore = function(data, dataNew) {
            var dataOrigi = data;
            var dataTwo = dataNew.dataList;
            var total = dataNew.total_row;
            if (!data.length) {
                dataOrigi = dataTwo;
                $scope.productArray = dataOrigi;
                $scope.showMoreArray(dataOrigi.length, total);
            } else {
                $scope.productArray = dataOrigi.concat(dataTwo);
                $scope.showMoreArray($scope.productArray.length, total);
                $scope.loadMoreIsLoad = false;
            }
        };
        $scope.showMoreArray = function(dataOrigiTotal, total) {
            console.log("showMoreArray :  dataOrigiTotal : ", dataOrigiTotal, "  total : ", total);
            if (dataOrigiTotal < total) {
                $scope.productState.more = true;
            } else {
                $scope.productState.more = false;
            }
        }
        $scope.stateData = function(_load_in, _done_in, _more_in) {
            var State = {
                load: _load_in,
                done: _done_in,
                more: _more_in
            };
            return State;
        }
        $scope.loadMore = function() {
            $scope.productCur++;
            $scope.loadMoreIsLoad = true;
            $timeout(function() {
                $scope.getProductsListsArray($scope.productCur, $scope._limit);
            }, 300);
        }
        $scope.getProductsListsArray($scope.productCur, $scope._limit);
    };
    return promise;
});_ui_share_app.factory('$componentPromotion', function componentPromotion($routeParams, $timeout) {
    return
});_ui_share_app.directive('componentPromotionListsD', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionListsD';
    var componentMain = 'componentPromotion';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        datanumber: '@datanumber',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.mkCarousel = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 3,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            slidesToShow: 1
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'cur_page': 1,
                'per_page': parseInt($scope.datanumber),
                'txt_badge_id' : 18,
                'txt_sortby': 'promotion_lastest_create',
            };
            GAEAPI.get('promotion/lists', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data.dataList;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray();
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend-promotion .-recommend-promotion[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend-promotion .-recommend-promotion[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.openCity = function(evt, cityName) {
            var i, tabcontent, tablinks;
            tabcontent = document.getElementsByClassName("tabcontent");
            for (i = 0; i < tabcontent.length; i++) {
                tabcontent[i].style.display = "none";
            }
            tablinks = document.getElementsByClassName("tablinks");
            for (i = 0; i < tablinks.length; i++) {
                tablinks[i].className = tablinks[i].className.replace(" active", "");
            }
            document.getElementById(cityName).style.display = "block";
            evt.currentTarget.className += " active";
        }
        $scope.viewDataSize = function() {
            return -($(".item-promotion").height() + 100);
        };
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentPromotionListsE', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionListsE';
    var componentMain = 'componentPromotion';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        datanumber: '@datanumber',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.mkCarousel = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 3,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            slidesToShow: 2
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'cur_page': 1,
                'per_page': parseInt($scope.datanumber),
                'txt_badge_id': 18,
                'txt_sortby': 'promotion_lastest_create',
            };
            GAEAPI.get('promotion/lists', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data.dataList;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray();
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend-promotion .-recommend-promotion[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend-promotion .-recommend-promotion[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.openCity = function(evt, cityName) {
            var i, tabcontent, tablinks;
            tabcontent = document.getElementsByClassName("tabcontent");
            for (i = 0; i < tabcontent.length; i++) {
                tabcontent[i].style.display = "none";
            }
            tablinks = document.getElementsByClassName("tablinks");
            for (i = 0; i < tablinks.length; i++) {
                tablinks[i].className = tablinks[i].className.replace(" active", "");
            }
            document.getElementById(cityName).style.display = "block";
            evt.currentTarget.className += " active";
        }
        $scope.viewDataSize = function() {
            return -($(".item-promotion").height() + 100);
        };
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentPromotionListsF', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionListsF';
    var componentMain = 'componentPromotion';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        datanumber: '@datanumber',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "componentPromotionListsF";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        /* -------------------- */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.dataApi = {
            load_more: {
                load: false,
                cur_page: 1,
                per_page: 12,
                total_rows: 0
            },
            promotion: {
                dataSend: {},
                api: "promotion/lists",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
        };
        $scope.loadMore = function() {
            if (!$scope.dataApi.load_more.load) {
                $scope.dataApi.load_more.cur_page++;
                $scope.dataApi.load_more.load = true;
                $scope.getData().getRouteParams(function(res_params, res_state) {
                    var txt_filter_json = {
                        "type_number": 7
                    };
                    $scope.dataApi.promotion.dataSend = {
                        'cur_page': $scope.dataApi.load_more.cur_page,
                        'per_page': $scope.dataApi.load_more.per_page,
                        'txt_badge_id': 18,
                        'txt_sortby': 'promotion_lastest_create',
                        'txt_filter_json': JSON.stringify(txt_filter_json)
                    }
                    $scope.getData().dataSend($scope.dataApi.promotion.api, $scope.dataApi.promotion.dataSend, function(res_api, res_dataSend) {
                        $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                            $scope.dataApi.promotion.ok = res_ok;
                            if ($scope.dataApi.promotion.dataArray.length < get_res_api_shop.data.total_rows) {
                                var oldData = $scope.dataApi.promotion.dataArray;
                                $scope.dataApi.promotion.dataArray = oldData.concat(get_res_api_shop.data.dataList);
                                $scope.dataApi.load_more.total_rows = get_res_api_shop.data.total_rows;
                            } else {
                                $scope.dataApi.load_more.cur_page--;
                            }
                            $scope.dataApi.load_more.load = false;
                        });
                    });
                });
            }
        }
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.promotion.dataArrayState = res_state;
            var txt_filter_json = {
                "type_number": 7
            };
            $scope.dataApi.promotion.dataSend = {
                'cur_page': $scope.dataApi.load_more.cur_page,
                'per_page': $scope.dataApi.load_more.per_page,
                'txt_badge_id': 18,
                'txt_sortby': 'promotion_lastest_create',
                'txt_filter_json': JSON.stringify(txt_filter_json)
            }
            $scope.getData().dataSend($scope.dataApi.promotion.api, $scope.dataApi.promotion.dataSend, function(res_api, res_dataSend) {
                $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                    $scope.dataApi.promotion.ok = res_ok;
                    $scope.dataApi.promotion.dataArray = get_res_api_shop.data.dataList;
                    $scope.dataApi.promotion.dataArrayState = res_state;
                    $scope.dataApi.load_more.total_rows = get_res_api_shop.data.total_rows;
                });
            });
        });
        /* -------------------- */
    };
    return promise;
});_ui_share_app.directive('componentPromotionListsG', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionListsG';
    var componentMain = 'componentPromotion';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        type: '@type',
        limit: '@limit',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope._component = "componentPromotionListsG";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        $scope._type = ($scope.type != undefined && $scope.type != "") ? parseInt($scope.type) : 5;
        $scope._per_page = ($scope.limit != undefined && $scope.limit != "") ? parseInt($scope.limit) : 6;
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    console.log($scope._component, ' : ', functionName, ' : ', data);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                urlPdf: function(promotionPdf) {
                    var _self = this;
                    _self.consoleLog("link promotionPdf", promotionPdf);
                    if (promotionPdf.length > 0) {
                        window.open(promotionPdf[0].file_url, '_blank');
                    }
                },
                more: function() {
                    var _self = this;
                    if (!$scope.dataApi.promotion.moreDataArrayState.load) {
                        _self.getRouteParams(function(res_params, res_state) {
                            $scope.dataApi.promotion.moreDataArrayState = res_state;
                            $scope.dataApi.promotion.cur_page++;
                            var txt_filter_json = {
                                'type_number': $scope._type
                            }
                            var dataSend = {
                                'cur_page': $scope.dataApi.promotion.cur_page,
                                'per_page': $scope._per_page,
                                'txt_sortby': 'promotion_lastest_create',
                                'txt_badge_id': 18,
                                'txt_filter_json': JSON.stringify(txt_filter_json)
                            };
                            $scope.dataApi.promotion.dataSend = dataSend;
                            _self.dataSend($scope.dataApi.promotion.api, $scope.dataApi.promotion.dataSend, function(res_api, res_dataSend) {
                                _self.getApi(res_api, res_dataSend, function(res_ok, res_api, res_state) {
                                    if ($scope.dataApi.promotion.dataArray.length < res_api.data.total_rows) {
                                        $scope.dataApi.promotion.ok = res_api;
                                        var oldData = $scope.dataApi.promotion.dataArray;
                                        $scope.dataApi.promotion.dataArray = oldData.concat(res_api.data.dataList);
                                        $scope.dataApi.promotion.total_rows = res_api.data.total_rows;
                                        $scope.dataApi.promotion.moreDataArrayState = res_state;
                                    } else {
                                        $scope.dataApi.promotion.cur_page--;
                                    }
                                });
                            });
                        });
                    }
                },
                main: function() {
                    var _self = this;
                    _self.getRouteParams(function(res_params, res_state) {
                        $scope.dataApi.promotion.dataArrayState = res_state;
                        var txt_filter_json = {
                            'type_number': $scope._type
                        }
                        var dataSend = {
                            'cur_page': $scope.dataApi.promotion.cur_page,
                            'per_page': $scope._per_page,
                            'txt_sortby': 'promotion_lastest_create',
                            'txt_badge_id': 18,
                            'txt_filter_json': JSON.stringify(txt_filter_json)
                        };
                        $scope.dataApi.promotion.dataSend = dataSend;
                        _self.dataSend($scope.dataApi.promotion.api, $scope.dataApi.promotion.dataSend, function(res_api, res_dataSend) {
                            _self.getApi(res_api, res_dataSend, function(res_ok, res_api, res_state) {
                                $scope.dataApi.promotion.ok = res_api;
                                $scope.dataApi.promotion.dataArray = res_api.data.dataList;
                                $scope.dataApi.promotion.total_rows = res_api.data.total_rows;
                                $scope.dataApi.promotion.dataArrayState = res_state;
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.dataApi = {
            promotion: {
                dataSend: {},
                api: "promotion/lists",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                },
                total_rows: 0,
                cur_page: 1,
                moreDataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.getData().main();
    };
    return promise;
});
_ui_share_app.directive('componentPromotionA', function ($rootScope, $routeParams) {
    var templateName = 'componentPromotionA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        background: '@background',
        type:'@type'
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
    	'text_1':'?textFirst',
    	'text_2':'?textSecond',
    };
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	$scope.dataArray = [];
    	$scope.getData = function(){
    		var jsonFilter = JSON.stringify({'type_number':$scope.type});
    		var d = {
    			'cur_page':1,
    			'per_page':20,
    			'txt_sortby':'promotion_lastest_create',
    			'txt_json_filter':jsonFilter
    		};
    		GAEAPI.get('promotion/lists',d,$scope).then(function(e){
    			if(e.ok === 1){
    				$scope.dataArray = e.data.dataList;
    			}
    		});
    	};
    	$scope.getData();
    	/* Badge */
        $scope._showWeb = function (item) {
            var r = false;
            if (item.length <= 0) {
                return false;
            } else {
                for (var i = 0; i < item.length; i++) {
                    if (item[i].badge_id == 18) {
                        r = true;
                        break;
                    }
                }
            }
            return r;
        };
        $scope._showApp = function (item) {
            var r = false;
            if (item.length <= 0) {
                return false;
            } else {
                for (var i = 0; i < item.length; i++) {
                    if (item[i].badge_id == 19) {
                        r = true;
                        break;
                    }
                }
            }
            return r;
        };
    };
    return promise;
});
_ui_share_app.directive('componentPromotionB', function ($rootScope, $routeParams) {
    var templateName = 'componentPromotionB';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        background: '@background',
        name:'@name',
        type:'@type'
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
    	'text_1':'?textFirst',
    	'text_2':'?textSecond',
    };
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	$scope.dataArray = [];
    	$scope.getData = function(){
    		var jsonFilter = JSON.stringify({'type_number':$scope.type});
    		var d = {
    			'cur_page':1,
    			'per_page':20,
    			'txt_sortby':'promotion_lastest_create',
    			'txt_json_filter':jsonFilter
    		};
    		GAEAPI.get('promotion/lists',d,$scope).then(function(e){
    			if(e.ok === 1){
    				$scope.dataArray = e.data.dataList;
    			}
    		});
    	};
    	$scope.getData();
    	/* Badge */
        $scope._showWeb = function (item) {
            var r = false;
            if (item.length <= 0) {
                return false;
            } else {
                for (var i = 0; i < item.length; i++) {
                    if (item[i].badge_id == 18) {
                        r = true;
                        break;
                    }
                }
            }
            return r;
        };
        $scope._showApp = function (item) {
            var r = false;
            if (item.length <= 0) {
                return false;
            } else {
                for (var i = 0; i < item.length; i++) {
                    if (item[i].badge_id == 19) {
                        r = true;
                        break;
                    }
                }
            }
            return r;
        };
    };
    return promise;
});
_ui_share_app.directive('componentPromotionC', function ($rootScope, $routeParams) {
    var templateName = 'componentPromotionC';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        item:'=item',
        imgpath:'@imgpath',
        promoname:'@promoname'
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
        $scope.data = [];
        $scope.data_discount = [];
        $scope.data_done = false;
        $scope.dataArray = [];
        $scope.getData = function(n_data){
            $scope.data = [];
            $scope.data_discount = [];
            $scope.data_discount.discount_price = 0;
            $scope.data_done = false;
            var jsonFilter = {
                'referral_id_array':[n_data]
            };
            var d = {
                'cur_page':1,
                'per_page':8,
                'txt_filter_json':JSON.stringify(jsonFilter)
            };
            GAEAPI.get('product/lists',d,$scope).then(function(e){
                if(e.ok === 1){                   
                    if(e.data.dataList.length > 0){
                        $scope.data = e.data.dataList;
                        for (var i = 0; i < e.data.dataList.length; i++) {
                            console.log("test_discount : ",i,e.data.dataList[i].product_discount.length , e.data.dataList[i].product_discount);
                            if(e.data.dataList[i].product_discount.length == undefined && e.data.dataList[i].product_discount){
                                console.log("test_discount",e.data.dataList[i].product_discount);
                                $scope.data_discount.push(e.data.dataList[i]);
                                if(e.data.dataList[i].product_discount.discount_price != 0){
                                    $scope.data_discount[i].discount_price = (e.data.dataList[i].product_price-e.data.dataList[i].product_discount.discount_price);
                                }else if(e.data.dataList[i].product_discount.discount_price == 0 && e.data.dataList[i].product_discount.discount_percent != 0){
                                     $scope.data_discount[i].discount_price = (e.data.dataList[i].product_price-((e.data.dataList[i].product_price*e.data.dataList[i].product_discount.discount_percent)/100));
                                }
                                console.log("test_discount_price",$scope.data_discount[i].discount_price);
                            }                            
                            
                        }
                    }
                }
            });
        };
        $scope.getData($scope.item.referral_id);
    	/* Badge */
        $scope._showWeb = function (item) {
            var r = false;
            if (item.length <= 0) {
                return false;
            } else {
                for (var i = 0; i < item.length; i++) {
                    if (item[i].badge_id == 18) {
                        r = true;
                        break;
                    }
                }
            }
            return r;
        };
        $scope._showApp = function (item) {
            var r = false;
            if (item.length <= 0) {
                return false;
            } else {
                for (var i = 0; i < item.length; i++) {
                    if (item[i].badge_id == 19) {
                        r = true;
                        break;
                    }
                }
            }
            return r;
        };
        $scope.buildTitleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentPromotionD', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionD';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        datain: '@datashow',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope.dataArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var d = {
                'cur_page': 1,
                'per_page': 8,
                'txt_badge_id': 18,
            };
            GAEAPI.get('promotion/lists', d, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope._dataArray = e.data.dataList;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.dataArray();
        $scope.buildTitleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
    };
    return promise;
});_ui_share_app.directive('componentPromotionDb', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionDb';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        datain: '@datashow',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope.dataArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var d = {
                'cur_page': 1,
                'per_page': 8,
                'txt_badge_id': 18,
            };
            GAEAPI.get('promotion/lists', d, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope._dataArray = e.data.dataList;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.dataArray();
        $scope.buildTitleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
    };
    return promise;
});_ui_share_app.factory('$componentPromotionDetail', function componentPromotionDetail($routeParams, $timeout) {
    return
});_ui_share_app.directive('componentPromotionDetailTypeA', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionDetailTypeA';
    var componentMain = 'componentPromotionDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        navigation: '@navigation',
        navigationhref: '@navigationhref',
        navigationname: '@navigationname',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigation = (typeof $scope.navigation !== 'undefined' && typeof $scope.navigation !== '') ? Boolean($scope.navigation) : false;
        $scope.getRouteParams = function(callback) {
            var routeParams = $routeParams || false;
            callback(routeParams);
        };
        $scope.dataPromotionId = [];
        $scope.promotion_create_time = "";
        $scope.dataPromotionIdState = {
            load: false,
            done: false
        };
        $scope.promotionId = function(params, callback) {
            var promotion_id = (params.promotion_id != undefined) ? params.promotion_id.split("-", 1).join("") : false;
            callback(promotion_id);
        };
        $scope.getPromotionId = function(txt_promotion_id,callback) {
            $scope.dataPromotionIdState = $scope.StateData(true, false);
            var dataSend = {
                'txt_promotion_id': txt_promotion_id
            };
            GAEAPI.get('promotion/id', dataSend, $scope).then(function(output) {
                $scope.dataPromotionIdState = $scope.StateData(false, true);
                callback(output);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.getRouteParams(function(params){
            $scope.promotionId(params,function(promotion_id){
                console.log('promotion_id : ',promotion_id);
                $scope.getPromotionId(promotion_id,function(output){
                    if (output.ok === 1) {
                        $scope.dataPromotionId = output.data;
                        $scope.promotion_create_time = moment(parseInt(output.data.promotion_create_time) * 1000).format('LL');
                    }
                });
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentPromotionDetailTypeB', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionDetailTypeB';
    var componentMain = 'componentPromotionDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        navigation: '@navigation',
        navigationhref: '@navigationhref',
        navigationname: '@navigationname',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigation = (typeof $scope.navigation !== 'undefined' && typeof $scope.navigation !== '') ? Boolean($scope.navigation) : false;
        $scope.getRouteParams = function() {
            return $routeParams || false;
        };
        $scope.dataPromotionId = [];
        $scope.promotion_create_time = "";
        $scope.dataPromotionIdState = {
            load: false,
            done: false
        };
        $scope.getPromotionId = function(txt_promotion_id) {
            $scope.dataPromotionIdState = $scope.StateData(true, false);
            var dataSend = {
                'txt_promotion_id': txt_promotion_id
            };
            GAEAPI.get('promotion/id', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    $scope.dataPromotionId = output.data;
                    $scope.promotion_create_time = moment(parseInt(output.data.promotion_create_time) * 1000).format('LL');
                }
                $scope.dataPromotionIdState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.getPromotionId($scope.getRouteParams().promotion_id);
    };
    return promise;
});_ui_share_app.directive('componentPromotionDetailA', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionDetailA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        id: '@id',
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            $scope.data_done = false;
            var d = {
                'txt_promotion_id': id
            };
            GAEAPI.get('promotion/id', d, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope._dataArray = e.data;
                }
                $scope._dataArrayState = $scope.StateData(true, false);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getPostIdFromURL = function() {
            var a = $scope.id;
            if (typeof $routeParams.promotion_id !== 'undefined') {
                test = parseInt($routeParams.promotion_id);
                a = $routeParams.promotion_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope._getArray($scope._getPostIdFromURL());
        $scope.buildTitleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
    };
    return promise;
});_ui_share_app.directive('componentPromotionDetailB', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionDetailB';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            $scope.data_done = false;
            var d = {
                'txt_promotion_id': $scope._getPostIdFromURL()
            };
            GAEAPI.get('promotion/id', d, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope._dataArray = e.data;
                }
                $scope._dataArrayState = $scope.StateData(true, false);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getPostIdFromURL = function() {
            var a = $scope.id;
            if (typeof $routeParams.promotion_id !== 'undefined') {
                test = parseInt($routeParams.promotion_id);
                a = $routeParams.promotion_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope._getArray($scope._getPostIdFromURL());
        $scope.buildTitleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentQuickAttribute', function ($rootScope) {
    var templateName = 'componentQuickAttribute';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        productid:'@productid',
        card:'@card',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window, $http) {
        var api_host = GURL.base_api_url();
        $scope.data = false;
        $scope.productOptionLevelArray = [];
        $scope.product_original_id = $scope.productid;
        $scope.getData = function(id){
            var d = {'txt_product_id':id};
            $http.get(api_host+'product/id',{params:d}).then(function(result){
                var e = result.data;
                if(e.ok == 1){
                    $scope.data = e.data;
                    $scope._data_product_id = e.data;
                    if (typeof $scope._data_product_id.product_attribute.option_data !== 'undefined' && $scope._data_product_id.product_total_variant > 0) {
                        if (typeof $scope._data_product_id.product_attribute.option_data.pclass_array !== 'undefined' && $scope._data_product_id.product_attribute.option_data.pclass_array.length) {
                            /*$scope.buildMultipleQuantity(e.data);*/
                            for (var op = 0; op < $scope._data_product_id.product_attribute.option_data.pclass_array.length; op++) {
                                $scope.productOptionLevelArray.push({
                                    level_index: op,
                                    level_id: $scope._data_product_id.product_attribute.option_data.pclass_array[op].pclass_id,
                                    level_label: $scope._data_product_id.product_attribute.option_data.pclass_array[op].pclass_name,
                                    level_data: 0
                                });
                            }
                            if (!$scope._data_product_id.product_attribute.option_data.variant_array.length) {
                                $scope.optionToCalculateNext = true;
                            }
                        } else {
                            $scope.optionToCalculateNext = true;
                        }
                    } else {
                        $scope.optionToCalculateNext = true;
                    }
                    
                } 
                if($scope.productOptionLevelArray.length){
                    $timeout(function(){
                        $('[quick-buy="'+$scope._data_product_id.product_id+'"]').hide();
                    },100);                      
                } else {
                    /*$('[quick-buy="'+id+'"]').data("hide-test","true").hide();*/
                }
            });
        };
        $scope.getData($scope.productid);   
        /* Varaint */
        $scope.selectedOptionTextJson = '';
        $scope.productOptionLevelArray = [];
        $scope.optionToCalculateNext = false;
        $scope._chageProductByOptionId = function ($event, masterIndex, optionId) {
            function compareArray(array_a, array) {
                if (!array)
                    return false;
                if (array_a.length != array.length)
                    return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i]))
                            return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            $scope.productOptionLevelArray[masterIndex].level_data = optionId;
            console.log('$scope.productOptionLevelArray: clicked!', $scope.productOptionLevelArray);
            var optionSelectedArray = [];
            for (var i = 0; i < $scope.productOptionLevelArray.length; i++) {
                if ($scope.productOptionLevelArray[i].level_data != 0) {
                    optionSelectedArray.push($scope.productOptionLevelArray[i].level_data);
                }
            }
            if (optionSelectedArray.length === $scope._data_product_id.product_attribute.option_data.pclass_array.length) {
                $scope.optionToCalculateNext = true;
            }
            if (!$scope.optionToCalculateNext) {
                return;
            }
            for (var i = 0; i < $scope._data_product_id.product_attribute.option_data.variant_array.length; i++) {
                var _self = $scope._data_product_id.product_attribute.option_data.variant_array[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                if (compareArray(optionSelectedArray, _self_option)) {
                    $scope._data_product_id.product_id = _self.product_id;
                    $scope._data_product_id.product_price = _self.price;
                    $scope._data_product_id.product_sku = _self.sku;
                    /*$scope._data_product_id.product_compare_price = _self.compare_price;*/
                    $scope._data_product_id.product_variant_compare_price = _self.compare_price;
                    console.log("selectedOptionTextJson: option", _self);
                    $scope.selectedOptionTextJson = _self.option_id_json;
                    console.log('selectedOptionTextJson: Key', '-' + optionSelectedArray.join('-') + '-');
                    /* Switch Quantity Input */
                    /* $scope.switchQuantityByKey('-' + optionSelectedArray.join('-') + '-');*/
                    /* Find Image Variant */
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope._data_product_id.product_image.length; im++) {
                            if ($scope._data_product_id.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        /*$timeout(function () {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope._slickGoto('sliderDetailView', rightImagePosition);
                            } else {
                                angular.element('.d_gallery .item[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);*/
                    }
                    break;
                }
            }
            $scope.checkIfFullySelect($scope.product_original_id);
        };
        $scope.buttonChangeState = function(t, varaint_id){
            var b = $('.quick-buy-btn[varaint-product-id="'+varaint_id+'"]');
            console.log("buttonChangeState",t);
            switch(t){
                case 'wait':
                    b.removeAttr("data-background-color");
                    b.html("Waiting..");
                break;
                case 'finish':
                    b.html("In Cart");
                    b.attr("data-background-color","primary_darkest");
                break;
                default:
                    b.removeAttr("data-background-color");
                    b.html('  Buy Now');
                break;
            }
        };
        $scope.buyProcess = function(product_id, quantity){
            var requireLogin = ($scope.requirelogin == 1 || $scope.requirelogin == true || $scope.requirelogin == 'true') ? true : false;
            if (!UiCustomerBox.delegate.get.isLogin() && requireLogin) {
                return UiCustomerBox.delegate.modal.openLoginForm();
            }            
            if (!UiCart.delegate.product.isSelected(product_id)) {                
                if (!UiCart.delegate.product.isProgress(product_id)) {
                    $scope.buttonChangeState("wait", product_id);
                    console.log("adding", product_id, quantity);
                    UiCart.delegate.product.add(product_id, quantity);
                    /* Pixel */
                    $pixelScript.event('AddToCart');   
                    $timeout(function(){
                        $scope.buttonChangeState("finish", product_id);
                    }, 1000); 
                    return;
                } else {
                    return UiCart.delegate.modal.open();
                }
            }
            return UiCart.delegate.modal.open();             
        };
        $scope.showBuyOption = function(id){
            console.log("checkIfFullySelect: full",id);
            if(!$('[quick-buy]').length){
                return;
            }
            var original_id = id;
            var varaint_id = $scope._data_product_id.product_id;
           
            $(function(){
                $('[quick-buy="'+original_id+'"]').html('
',
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 4,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            arrows: true,
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            arrows: true,
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            arrows: true,
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
                $('.component-product-tag-a').css('height', 'auto');
                $('.component-product-tag-a').css('opacity', '1');
            }, 1000);
        };
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend .-recommend[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.consoleLog = function(text, data) {
            console.log(text, ' : ', data);
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope._idUrl = function(instr) {
            var outstr = instr.split("-", 1).join("");
            return outstr;
        };
        $scope._getDataArray = function(productid,referralid,tag, limit) {
            $scope.consoleLog('_getDataArray tag', tag);
            $scope.consoleLog('_getDataArray limit', limit);
            $scope._dataArrayState = $scope.StateData(true, false);
            var filter_json = {
                "referral_id_array" :[referralid],
                "tags": tag
            }
            var dataSend = {
                'cur_page': 1,
                'per_page': parseInt(limit),
                'txt_filter_json': JSON.stringify(filter_json)
            };
            $scope.consoleLog('_getDataArray  tag dataSend', dataSend);
            GAEAPI.get('product/lists', dataSend).then(function(output) {
                $scope.consoleLog('_getDataArray output', output);
                if (output.ok == 1) {
                    $scope.$apply(function() {
                        for (var i = 0; i < output.data.dataList.length; i++) {
                            $scope.consoleLog('_getDataArray : for : output.data.dataList : ', output.data.dataList[i]);
                            $scope.consoleLog('_getDataArray : for : productid : ', $scope._viewRouteParams().product_id);
                            if (output.data.dataList[i].product_id != $scope._idUrl($scope._viewRouteParams().product_id)) {
                                $scope._dataArray.push(output.data.dataList[i]);
                            }
                        }
                        /* $scope._dataArray = output.data.dataList; */
                        $scope.consoleLog('_getDataArray _dataArray', $scope._dataArray);
                    });
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.$watch('tag', function(newValue, oldValue) {
            if (newValue) {
                $scope._getDataArray($scope.productid,$scope.referralid,$scope.tag, $scope.limit);
            } else {
                return;
            }
        });
    };
    return promise;
});_ui_share_app.factory('$componentProductsDiscount', function componentProductsDiscount($routeParams, $timeout) {
    return
});_ui_share_app.directive('componentProductsDiscountTypeA', function($rootScope, $routeParams) {
    var templateName = 'componentProductsDiscountTypeA';
    var componentMain = 'componentProductsDiscount';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        productcard: '@productcard',
        stylebutton: '@stylebutton',
        limit: '@limit',
        margin: '@margin',
        col: '@col',
        pre: '@pre',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
        'topic_top': '?topicTop',
    };
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.imgPath = CUR_THEME.file_url() + 'images/';
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._productcard = (typeof $scope.productcard !== 'undefined' && typeof $scope.productcard !== '') ? $scope.productcard : 'c';
        $scope._stylebutton = (typeof $scope.stylebutton !== 'undefined' && typeof $scope.stylebutton !== '') ? $scope.stylebutton : 'border_button_small';
        $scope._pre = Boolean((typeof $scope.pre !== 'undefined' && typeof $scope.pre !== '') ? $scope.pre : 'false');
        $scope._limit = parseInt((typeof $scope.limit !== 'undefined' && typeof $scope.limit !== '') ? $scope.limit : 6);
        $scope.$watch('col', function(newValue, oldValue) {
            if (newValue) {
                $scope._col = newValue.toString().split(",");
            }
        });
        $scope.getCol = function(n) {
            return (typeof $scope._col != 'undefined' && $scope._col[n] != '') ? (typeof $scope._col[n] != 'undefined' && $scope._col[n] != '') ? $scope._col[n] : 12 : 12;
        };
        $scope.productArray = false;
        $scope.loadMoreIsLoad = false;
        $scope.productCur = 1;
        $scope.productState = {
            load: false,
            done: false,
            more: false
        };
        $scope.getProductsListsArray = function(cur, per) {
            if (cur == 1) {
                $scope.productArray = false;
                $scope.productState = $scope.stateData(true, false, $scope.productState.more);
            }
            var filter_json = {}
            var dataSend = {
                'txt_cur_page': cur,
                'txt_per_page': per,
                'txt_filter_json': JSON.stringify(filter_json)
            };
            GAEAPI.get('product/discounts', dataSend).then(function(output) {
                console.log("dataSend : ", dataSend, "  output : ", output);
                if (output.ok == 1) {
                    $scope.$apply(function() {
                        var data = $scope.productArray;
                        var dataNew = output.data;
                        $scope.checkMore(data, dataNew);
                    });
                }
                if (cur == 1) {
                    $scope.productState = $scope.stateData(false, true, $scope.productState.more);
                }
            });
        };
        $scope.checkMore = function(data, dataNew) {
            var dataOrigi = data;
            var dataTwo = dataNew.dataList;
            var total = dataNew.total_row;
            if (!data.length) {
                dataOrigi = dataTwo;
                $scope.productArray = dataOrigi;
                $scope.showMoreArray(dataOrigi.length, total);
            } else {
                $scope.productArray = dataOrigi.concat(dataTwo);
                $scope.showMoreArray($scope.productArray.length, total);
                $scope.loadMoreIsLoad = false;
            }
        };
        $scope.showMoreArray = function(dataOrigiTotal, total) {
            console.log("showMoreArray :  dataOrigiTotal : ", dataOrigiTotal, "  total : ", total);
            if (dataOrigiTotal < total) {
                $scope.productState.more = true;
            } else {
                $scope.productState.more = false;
            }
        }
        $scope.stateData = function(_load_in, _done_in, _more_in) {
            var State = {
                load: _load_in,
                done: _done_in,
                more: _more_in
            };
            return State;
        }
        $scope.loadMore = function() {
            $scope.productCur++;
            $scope.loadMoreIsLoad = true;
            $timeout(function() {
                $scope.getProductsListsArray($scope.productCur, $scope._limit);
            }, 300);
        }
        $scope.getProductsListsArray($scope.productCur, $scope._limit);
    };
    return promise;
});_ui_share_app.factory('$componentPromotion', function componentPromotion($routeParams, $timeout) {
    return
});_ui_share_app.directive('componentPromotionListsD', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionListsD';
    var componentMain = 'componentPromotion';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        datanumber: '@datanumber',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.mkCarousel = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 3,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            slidesToShow: 1
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            slidesToShow: 1
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'cur_page': 1,
                'per_page': parseInt($scope.datanumber),
                'txt_badge_id' : 18,
                'txt_sortby': 'promotion_lastest_create',
            };
            GAEAPI.get('promotion/lists', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data.dataList;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray();
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend-promotion .-recommend-promotion[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend-promotion .-recommend-promotion[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.openCity = function(evt, cityName) {
            var i, tabcontent, tablinks;
            tabcontent = document.getElementsByClassName("tabcontent");
            for (i = 0; i < tabcontent.length; i++) {
                tabcontent[i].style.display = "none";
            }
            tablinks = document.getElementsByClassName("tablinks");
            for (i = 0; i < tablinks.length; i++) {
                tablinks[i].className = tablinks[i].className.replace(" active", "");
            }
            document.getElementById(cityName).style.display = "block";
            evt.currentTarget.className += " active";
        }
        $scope.viewDataSize = function() {
            return -($(".item-promotion").height() + 100);
        };
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentPromotionListsE', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionListsE';
    var componentMain = 'componentPromotion';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        datanumber: '@datanumber',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.mkCarousel = function(elem) {
            setTimeout(function() {
                var carousel = $(elem + '[data-id=' + $scope._key() + ']');
                var is_dark;
                carousel.not('.slick-initialized').slick({
                    dots: true,
                    arrows: true,
                    autoplay: false,
                    autoplaySpeed: 4000,
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    infinite: true,
                    speed: 600,
                    responsive: [{
                        breakpoint: 1330,
                        settings: {
                            slidesToShow: 3,
                        }
                    }, {
                        breakpoint: 991,
                        settings: {
                            slidesToShow: 3
                        }
                    }, {
                        breakpoint: 768,
                        settings: {
                            slidesToShow: 2
                        }
                    }, {
                        breakpoint: 480,
                        settings: {
                            slidesToShow: 2
                        }
                    }]
                }).closest('section').addClass('active');
            }, 1000);
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getDataArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var dataSend = {
                'cur_page': 1,
                'per_page': parseInt($scope.datanumber),
                'txt_badge_id': 18,
                'txt_sortby': 'promotion_lastest_create',
            };
            GAEAPI.get('promotion/lists', dataSend).then(function(res) {
                if (res.ok === 1) {
                    $scope._dataArray = res.data.dataList;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope._getDataArray();
        $scope._uniqueKey = '';
        $scope._key = function() {
            if ($scope._uniqueKey === '') {
                $scope._uniqueKey = Math.floor((Math.random() * 9999) + 1000);
                return $scope._uniqueKey;
            } else {
                return $scope._uniqueKey;
            }
        };
        $scope.slickGoLeft = function() {
            setTimeout(function() {
                $('.recommend-promotion .-recommend-promotion[data-id="' + $scope._key() + '"]').slick('slickPrev');
            }, 100);
        };
        $scope.slickGoRight = function() {
            setTimeout(function() {
                $('.recommend-promotion .-recommend-promotion[data-id="' + $scope._key() + '"]').slick('slickNext');
            }, 100);
        };
        $scope.openCity = function(evt, cityName) {
            var i, tabcontent, tablinks;
            tabcontent = document.getElementsByClassName("tabcontent");
            for (i = 0; i < tabcontent.length; i++) {
                tabcontent[i].style.display = "none";
            }
            tablinks = document.getElementsByClassName("tablinks");
            for (i = 0; i < tablinks.length; i++) {
                tablinks[i].className = tablinks[i].className.replace(" active", "");
            }
            document.getElementById(cityName).style.display = "block";
            evt.currentTarget.className += " active";
        }
        $scope.viewDataSize = function() {
            return -($(".item-promotion").height() + 100);
        };
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.showDebug = function() {
            return (typeof $routeParams.debug !== 'undefined') ? true : false;
        };
    };
    return promise;
});_ui_share_app.directive('componentPromotionListsF', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionListsF';
    var componentMain = 'componentPromotion';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        datanumber: '@datanumber',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope._console = (window.location.hostname == "localhost") ? true : false;
        $scope._component = "componentPromotionListsF";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        /* -------------------- */
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    if ($scope._console) {
                        console.log($scope._component, ' : ', functionName, ' : ', data);
                    }
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                main: function() {
                    var _self = this;
                }
            }
            return getFunction;
        };
        $scope.dataApi = {
            load_more: {
                load: false,
                cur_page: 1,
                per_page: 12,
                total_rows: 0
            },
            promotion: {
                dataSend: {},
                api: "promotion/lists",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                }
            },
        };
        $scope.loadMore = function() {
            if (!$scope.dataApi.load_more.load) {
                $scope.dataApi.load_more.cur_page++;
                $scope.dataApi.load_more.load = true;
                $scope.getData().getRouteParams(function(res_params, res_state) {
                    var txt_filter_json = {
                        "type_number": 7
                    };
                    $scope.dataApi.promotion.dataSend = {
                        'cur_page': $scope.dataApi.load_more.cur_page,
                        'per_page': $scope.dataApi.load_more.per_page,
                        'txt_badge_id': 18,
                        'txt_sortby': 'promotion_lastest_create',
                        'txt_filter_json': JSON.stringify(txt_filter_json)
                    }
                    $scope.getData().dataSend($scope.dataApi.promotion.api, $scope.dataApi.promotion.dataSend, function(res_api, res_dataSend) {
                        $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                            $scope.dataApi.promotion.ok = res_ok;
                            if ($scope.dataApi.promotion.dataArray.length < get_res_api_shop.data.total_rows) {
                                var oldData = $scope.dataApi.promotion.dataArray;
                                $scope.dataApi.promotion.dataArray = oldData.concat(get_res_api_shop.data.dataList);
                                $scope.dataApi.load_more.total_rows = get_res_api_shop.data.total_rows;
                            } else {
                                $scope.dataApi.load_more.cur_page--;
                            }
                            $scope.dataApi.load_more.load = false;
                        });
                    });
                });
            }
        }
        $scope.getData().getRouteParams(function(res_params, res_state) {
            $scope.dataApi.promotion.dataArrayState = res_state;
            var txt_filter_json = {
                "type_number": 7
            };
            $scope.dataApi.promotion.dataSend = {
                'cur_page': $scope.dataApi.load_more.cur_page,
                'per_page': $scope.dataApi.load_more.per_page,
                'txt_badge_id': 18,
                'txt_sortby': 'promotion_lastest_create',
                'txt_filter_json': JSON.stringify(txt_filter_json)
            }
            $scope.getData().dataSend($scope.dataApi.promotion.api, $scope.dataApi.promotion.dataSend, function(res_api, res_dataSend) {
                $scope.getData().getApi(res_api, res_dataSend, function(res_ok, get_res_api_shop, res_state) {
                    $scope.dataApi.promotion.ok = res_ok;
                    $scope.dataApi.promotion.dataArray = get_res_api_shop.data.dataList;
                    $scope.dataApi.promotion.dataArrayState = res_state;
                    $scope.dataApi.load_more.total_rows = get_res_api_shop.data.total_rows;
                });
            });
        });
        /* -------------------- */
    };
    return promise;
});_ui_share_app.directive('componentPromotionListsG', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionListsG';
    var componentMain = 'componentPromotion';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        type: '@type',
        limit: '@limit',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope._component = "componentPromotionListsG";
        $scope._imgPath = CUR_THEME.file_url() + "images/";
        $scope._icnPath = CUR_THEME.file_url() + "../../assets/";
        $scope._type = ($scope.type != undefined && $scope.type != "") ? parseInt($scope.type) : 5;
        $scope._per_page = ($scope.limit != undefined && $scope.limit != "") ? parseInt($scope.limit) : 6;
        $scope.getData = function() {
            var getFunction = {
                consoleLog: function(functionName, data) {
                    console.log($scope._component, ' : ', functionName, ' : ', data);
                },
                getRouteParams: function(callback) {
                    var _self = this;
                    var params = $routeParams;
                    var state = _self.stateData(true, false);
                    _self.consoleLog("getRouteParams params", params);
                    callback(params, state);
                },
                stateData: function(load, done) {
                    var _self = this;
                    var state = {
                        load: load,
                        done: done
                    };
                    _self.consoleLog("stateData state", state);
                    return state;
                },
                dataSend: function(api, dataSend, callback) {
                    var _self = this;
                    _self.consoleLog("dataSend api", api);
                    _self.consoleLog("dataSend dataSend", dataSend);
                    callback(api, dataSend);
                },
                checkGetApi: function(resApi, callback) {
                    var _self = this;
                    var ok = false;
                    if (resApi.ok == 1) {
                        ok = true;
                    }
                    _self.consoleLog("checkGetApi ok", ok);
                    callback(ok);
                },
                getApi: function(api, dataSend, callback) {
                    var _self = this;
                    var state = _self.stateData(true, false);
                    GAEAPI.get(api, dataSend, $scope).then(function(res_api) {
                        _self.checkGetApi(res_api, function(res_ok) {
                            _self.consoleLog("getApi api", api);
                            _self.consoleLog("getApi dataSend", dataSend);
                            _self.consoleLog("getApi res_api", res_api);
                            state = _self.stateData(false, true);
                            callback(res_ok, res_api, state);
                        })
                    });
                },
                urlPdf: function(promotionPdf) {
                    var _self = this;
                    _self.consoleLog("link promotionPdf", promotionPdf);
                    if (promotionPdf.length > 0) {
                        window.open(promotionPdf[0].file_url, '_blank');
                    }
                },
                more: function() {
                    var _self = this;
                    if (!$scope.dataApi.promotion.moreDataArrayState.load) {
                        _self.getRouteParams(function(res_params, res_state) {
                            $scope.dataApi.promotion.moreDataArrayState = res_state;
                            $scope.dataApi.promotion.cur_page++;
                            var txt_filter_json = {
                                'type_number': $scope._type
                            }
                            var dataSend = {
                                'cur_page': $scope.dataApi.promotion.cur_page,
                                'per_page': $scope._per_page,
                                'txt_sortby': 'promotion_lastest_create',
                                'txt_badge_id': 18,
                                'txt_filter_json': JSON.stringify(txt_filter_json)
                            };
                            $scope.dataApi.promotion.dataSend = dataSend;
                            _self.dataSend($scope.dataApi.promotion.api, $scope.dataApi.promotion.dataSend, function(res_api, res_dataSend) {
                                _self.getApi(res_api, res_dataSend, function(res_ok, res_api, res_state) {
                                    if ($scope.dataApi.promotion.dataArray.length < res_api.data.total_rows) {
                                        $scope.dataApi.promotion.ok = res_api;
                                        var oldData = $scope.dataApi.promotion.dataArray;
                                        $scope.dataApi.promotion.dataArray = oldData.concat(res_api.data.dataList);
                                        $scope.dataApi.promotion.total_rows = res_api.data.total_rows;
                                        $scope.dataApi.promotion.moreDataArrayState = res_state;
                                    } else {
                                        $scope.dataApi.promotion.cur_page--;
                                    }
                                });
                            });
                        });
                    }
                },
                main: function() {
                    var _self = this;
                    _self.getRouteParams(function(res_params, res_state) {
                        $scope.dataApi.promotion.dataArrayState = res_state;
                        var txt_filter_json = {
                            'type_number': $scope._type
                        }
                        var dataSend = {
                            'cur_page': $scope.dataApi.promotion.cur_page,
                            'per_page': $scope._per_page,
                            'txt_sortby': 'promotion_lastest_create',
                            'txt_badge_id': 18,
                            'txt_filter_json': JSON.stringify(txt_filter_json)
                        };
                        $scope.dataApi.promotion.dataSend = dataSend;
                        _self.dataSend($scope.dataApi.promotion.api, $scope.dataApi.promotion.dataSend, function(res_api, res_dataSend) {
                            _self.getApi(res_api, res_dataSend, function(res_ok, res_api, res_state) {
                                $scope.dataApi.promotion.ok = res_api;
                                $scope.dataApi.promotion.dataArray = res_api.data.dataList;
                                $scope.dataApi.promotion.total_rows = res_api.data.total_rows;
                                $scope.dataApi.promotion.dataArrayState = res_state;
                            });
                        });
                    });
                }
            }
            return getFunction;
        };
        $scope.dataApi = {
            promotion: {
                dataSend: {},
                api: "promotion/lists",
                ok: false,
                dataArray: [],
                dataArrayState: {
                    load: false,
                    done: false
                },
                total_rows: 0,
                cur_page: 1,
                moreDataArrayState: {
                    load: false,
                    done: false
                }
            }
        };
        $scope.getData().main();
    };
    return promise;
});
_ui_share_app.directive('componentPromotionA', function ($rootScope, $routeParams) {
    var templateName = 'componentPromotionA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        background: '@background',
        type:'@type'
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
    	'text_1':'?textFirst',
    	'text_2':'?textSecond',
    };
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	$scope.dataArray = [];
    	$scope.getData = function(){
    		var jsonFilter = JSON.stringify({'type_number':$scope.type});
    		var d = {
    			'cur_page':1,
    			'per_page':20,
    			'txt_sortby':'promotion_lastest_create',
    			'txt_json_filter':jsonFilter
    		};
    		GAEAPI.get('promotion/lists',d,$scope).then(function(e){
    			if(e.ok === 1){
    				$scope.dataArray = e.data.dataList;
    			}
    		});
    	};
    	$scope.getData();
    	/* Badge */
        $scope._showWeb = function (item) {
            var r = false;
            if (item.length <= 0) {
                return false;
            } else {
                for (var i = 0; i < item.length; i++) {
                    if (item[i].badge_id == 18) {
                        r = true;
                        break;
                    }
                }
            }
            return r;
        };
        $scope._showApp = function (item) {
            var r = false;
            if (item.length <= 0) {
                return false;
            } else {
                for (var i = 0; i < item.length; i++) {
                    if (item[i].badge_id == 19) {
                        r = true;
                        break;
                    }
                }
            }
            return r;
        };
    };
    return promise;
});
_ui_share_app.directive('componentPromotionB', function ($rootScope, $routeParams) {
    var templateName = 'componentPromotionB';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        background: '@background',
        name:'@name',
        type:'@type'
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = {
    	'text_1':'?textFirst',
    	'text_2':'?textSecond',
    };
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
    	$scope.dataArray = [];
    	$scope.getData = function(){
    		var jsonFilter = JSON.stringify({'type_number':$scope.type});
    		var d = {
    			'cur_page':1,
    			'per_page':20,
    			'txt_sortby':'promotion_lastest_create',
    			'txt_json_filter':jsonFilter
    		};
    		GAEAPI.get('promotion/lists',d,$scope).then(function(e){
    			if(e.ok === 1){
    				$scope.dataArray = e.data.dataList;
    			}
    		});
    	};
    	$scope.getData();
    	/* Badge */
        $scope._showWeb = function (item) {
            var r = false;
            if (item.length <= 0) {
                return false;
            } else {
                for (var i = 0; i < item.length; i++) {
                    if (item[i].badge_id == 18) {
                        r = true;
                        break;
                    }
                }
            }
            return r;
        };
        $scope._showApp = function (item) {
            var r = false;
            if (item.length <= 0) {
                return false;
            } else {
                for (var i = 0; i < item.length; i++) {
                    if (item[i].badge_id == 19) {
                        r = true;
                        break;
                    }
                }
            }
            return r;
        };
    };
    return promise;
});
_ui_share_app.directive('componentPromotionC', function ($rootScope, $routeParams) {
    var templateName = 'componentPromotionC';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        item:'=item',
        imgpath:'@imgpath',
        promoname:'@promoname'
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window) {
        $scope.data = [];
        $scope.data_discount = [];
        $scope.data_done = false;
        $scope.dataArray = [];
        $scope.getData = function(n_data){
            $scope.data = [];
            $scope.data_discount = [];
            $scope.data_discount.discount_price = 0;
            $scope.data_done = false;
            var jsonFilter = {
                'referral_id_array':[n_data]
            };
            var d = {
                'cur_page':1,
                'per_page':8,
                'txt_filter_json':JSON.stringify(jsonFilter)
            };
            GAEAPI.get('product/lists',d,$scope).then(function(e){
                if(e.ok === 1){                   
                    if(e.data.dataList.length > 0){
                        $scope.data = e.data.dataList;
                        for (var i = 0; i < e.data.dataList.length; i++) {
                            console.log("test_discount : ",i,e.data.dataList[i].product_discount.length , e.data.dataList[i].product_discount);
                            if(e.data.dataList[i].product_discount.length == undefined && e.data.dataList[i].product_discount){
                                console.log("test_discount",e.data.dataList[i].product_discount);
                                $scope.data_discount.push(e.data.dataList[i]);
                                if(e.data.dataList[i].product_discount.discount_price != 0){
                                    $scope.data_discount[i].discount_price = (e.data.dataList[i].product_price-e.data.dataList[i].product_discount.discount_price);
                                }else if(e.data.dataList[i].product_discount.discount_price == 0 && e.data.dataList[i].product_discount.discount_percent != 0){
                                     $scope.data_discount[i].discount_price = (e.data.dataList[i].product_price-((e.data.dataList[i].product_price*e.data.dataList[i].product_discount.discount_percent)/100));
                                }
                                console.log("test_discount_price",$scope.data_discount[i].discount_price);
                            }                            
                            
                        }
                    }
                }
            });
        };
        $scope.getData($scope.item.referral_id);
    	/* Badge */
        $scope._showWeb = function (item) {
            var r = false;
            if (item.length <= 0) {
                return false;
            } else {
                for (var i = 0; i < item.length; i++) {
                    if (item[i].badge_id == 18) {
                        r = true;
                        break;
                    }
                }
            }
            return r;
        };
        $scope._showApp = function (item) {
            var r = false;
            if (item.length <= 0) {
                return false;
            } else {
                for (var i = 0; i < item.length; i++) {
                    if (item[i].badge_id == 19) {
                        r = true;
                        break;
                    }
                }
            }
            return r;
        };
        $scope.buildTitleUrl = function(str){           
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--","-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentPromotionD', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionD';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        datain: '@datashow',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope.dataArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var d = {
                'cur_page': 1,
                'per_page': 8,
                'txt_badge_id': 18,
            };
            GAEAPI.get('promotion/lists', d, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope._dataArray = e.data.dataList;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.dataArray();
        $scope.buildTitleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
    };
    return promise;
});_ui_share_app.directive('componentPromotionDb', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionDb';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        datain: '@datashow',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: true,
            done: false
        };
        $scope.dataArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            var d = {
                'cur_page': 1,
                'per_page': 8,
                'txt_badge_id': 18,
            };
            GAEAPI.get('promotion/lists', d, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope._dataArray = e.data.dataList;
                }
                $scope._dataArrayState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope.displayImage = function(image_url, prefix) {
            return (typeof image_url !== 'undefined') ? GAEAPI.getGaeImageUrl(image_url, prefix) : '';
        }
        $scope.dataArray();
        $scope.buildTitleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
    };
    return promise;
});_ui_share_app.factory('$componentPromotionDetail', function componentPromotionDetail($routeParams, $timeout) {
    return
});_ui_share_app.directive('componentPromotionDetailTypeA', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionDetailTypeA';
    var componentMain = 'componentPromotionDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        navigation: '@navigation',
        navigationhref: '@navigationhref',
        navigationname: '@navigationname',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigation = (typeof $scope.navigation !== 'undefined' && typeof $scope.navigation !== '') ? Boolean($scope.navigation) : false;
        $scope.getRouteParams = function(callback) {
            var routeParams = $routeParams || false;
            callback(routeParams);
        };
        $scope.dataPromotionId = [];
        $scope.promotion_create_time = "";
        $scope.dataPromotionIdState = {
            load: false,
            done: false
        };
        $scope.promotionId = function(params, callback) {
            var promotion_id = (params.promotion_id != undefined) ? params.promotion_id.split("-", 1).join("") : false;
            callback(promotion_id);
        };
        $scope.getPromotionId = function(txt_promotion_id,callback) {
            $scope.dataPromotionIdState = $scope.StateData(true, false);
            var dataSend = {
                'txt_promotion_id': txt_promotion_id
            };
            GAEAPI.get('promotion/id', dataSend, $scope).then(function(output) {
                $scope.dataPromotionIdState = $scope.StateData(false, true);
                callback(output);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.getRouteParams(function(params){
            $scope.promotionId(params,function(promotion_id){
                console.log('promotion_id : ',promotion_id);
                $scope.getPromotionId(promotion_id,function(output){
                    if (output.ok === 1) {
                        $scope.dataPromotionId = output.data;
                        $scope.promotion_create_time = moment(parseInt(output.data.promotion_create_time) * 1000).format('LL');
                    }
                });
            });
        });
    };
    return promise;
});_ui_share_app.directive('componentPromotionDetailTypeB', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionDetailTypeB';
    var componentMain = 'componentPromotionDetail';
    var templatePathUrl = _ui_share_host + componentMain + '/expansions/' + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
        navigation: '@navigation',
        navigationhref: '@navigationhref',
        navigationname: '@navigationname',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.navigation = (typeof $scope.navigation !== 'undefined' && typeof $scope.navigation !== '') ? Boolean($scope.navigation) : false;
        $scope.getRouteParams = function() {
            return $routeParams || false;
        };
        $scope.dataPromotionId = [];
        $scope.promotion_create_time = "";
        $scope.dataPromotionIdState = {
            load: false,
            done: false
        };
        $scope.getPromotionId = function(txt_promotion_id) {
            $scope.dataPromotionIdState = $scope.StateData(true, false);
            var dataSend = {
                'txt_promotion_id': txt_promotion_id
            };
            GAEAPI.get('promotion/id', dataSend, $scope).then(function(output) {
                if (output.ok == 1) {
                    $scope.dataPromotionId = output.data;
                    $scope.promotion_create_time = moment(parseInt(output.data.promotion_create_time) * 1000).format('LL');
                }
                $scope.dataPromotionIdState = $scope.StateData(false, true);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        }
        $scope.getPromotionId($scope.getRouteParams().promotion_id);
    };
    return promise;
});_ui_share_app.directive('componentPromotionDetailA', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionDetailA';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        id: '@id',
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getArray = function(id) {
            $scope._dataArrayState = $scope.StateData(true, false);
            $scope.data_done = false;
            var d = {
                'txt_promotion_id': id
            };
            GAEAPI.get('promotion/id', d, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope._dataArray = e.data;
                }
                $scope._dataArrayState = $scope.StateData(true, false);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getPostIdFromURL = function() {
            var a = $scope.id;
            if (typeof $routeParams.promotion_id !== 'undefined') {
                test = parseInt($routeParams.promotion_id);
                a = $routeParams.promotion_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope._getArray($scope._getPostIdFromURL());
        $scope.buildTitleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
    };
    return promise;
});_ui_share_app.directive('componentPromotionDetailB', function($rootScope, $routeParams) {
    var templateName = 'componentPromotionDetailB';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        name: '@name',
    };
    promise.link = function(scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function($scope, $timeout, $interval, $q, $window) {
        $scope.icnPath = CUR_THEME.file_url() + '../../assets/';
        $scope.viewRouteParams = function() {
            return $routeParams || false;
        };
        $scope._dataArray = [];
        $scope._dataArrayState = {
            load: false,
            done: false
        };
        $scope._getArray = function() {
            $scope._dataArrayState = $scope.StateData(true, false);
            $scope.data_done = false;
            var d = {
                'txt_promotion_id': $scope._getPostIdFromURL()
            };
            GAEAPI.get('promotion/id', d, $scope).then(function(e) {
                if (e.ok === 1) {
                    $scope._dataArray = e.data;
                }
                $scope._dataArrayState = $scope.StateData(true, false);
            });
        };
        $scope.StateData = function(_load_in, _done_in) {
            var State = {
                load: _load_in,
                done: _done_in
            };
            return State;
        };
        $scope._getPostIdFromURL = function() {
            var a = $scope.id;
            if (typeof $routeParams.promotion_id !== 'undefined') {
                test = parseInt($routeParams.promotion_id);
                a = $routeParams.promotion_id;
            }
            if (typeof test === 'number' && test > 0) {
                return test;
            } else {
                var b = a.split("-");
                return b[0];
            }
        };
        $scope._getArray($scope._getPostIdFromURL());
        $scope.buildTitleUrl = function(str) {
            var s = str.replace(/[^a-zA-Zก-๙0-9 ]/g, "").split(" ").join("-").replace("--", "-");
            return s;
        };
    };
    return promise;
});
_ui_share_app.directive('componentQuickAttribute', function ($rootScope) {
    var templateName = 'componentQuickAttribute';
    var templatePathUrl = _ui_share_host + templateName + '/' + templateName + '.html';
    var promise = {};
    promise.restrict = 'AE';
    promise.scope = {
        productid:'@productid',
        card:'@card',
    };
    promise.link = function (scope, element, attr) {};
    promise.templateUrl = templatePathUrl;
    promise.transclude = true;
    promise.controller = function ($scope, $timeout, $interval, $q, $window, $http) {
        var api_host = GURL.base_api_url();
        $scope.data = false;
        $scope.productOptionLevelArray = [];
        $scope.product_original_id = $scope.productid;
        $scope.getData = function(id){
            var d = {'txt_product_id':id};
            $http.get(api_host+'product/id',{params:d}).then(function(result){
                var e = result.data;
                if(e.ok == 1){
                    $scope.data = e.data;
                    $scope._data_product_id = e.data;
                    if (typeof $scope._data_product_id.product_attribute.option_data !== 'undefined' && $scope._data_product_id.product_total_variant > 0) {
                        if (typeof $scope._data_product_id.product_attribute.option_data.pclass_array !== 'undefined' && $scope._data_product_id.product_attribute.option_data.pclass_array.length) {
                            /*$scope.buildMultipleQuantity(e.data);*/
                            for (var op = 0; op < $scope._data_product_id.product_attribute.option_data.pclass_array.length; op++) {
                                $scope.productOptionLevelArray.push({
                                    level_index: op,
                                    level_id: $scope._data_product_id.product_attribute.option_data.pclass_array[op].pclass_id,
                                    level_label: $scope._data_product_id.product_attribute.option_data.pclass_array[op].pclass_name,
                                    level_data: 0
                                });
                            }
                            if (!$scope._data_product_id.product_attribute.option_data.variant_array.length) {
                                $scope.optionToCalculateNext = true;
                            }
                        } else {
                            $scope.optionToCalculateNext = true;
                        }
                    } else {
                        $scope.optionToCalculateNext = true;
                    }
                    
                } 
                if($scope.productOptionLevelArray.length){
                    $timeout(function(){
                        $('[quick-buy="'+$scope._data_product_id.product_id+'"]').hide();
                    },100);                      
                } else {
                    /*$('[quick-buy="'+id+'"]').data("hide-test","true").hide();*/
                }
            });
        };
        $scope.getData($scope.productid);   
        /* Varaint */
        $scope.selectedOptionTextJson = '';
        $scope.productOptionLevelArray = [];
        $scope.optionToCalculateNext = false;
        $scope._chageProductByOptionId = function ($event, masterIndex, optionId) {
            function compareArray(array_a, array) {
                if (!array)
                    return false;
                if (array_a.length != array.length)
                    return false;
                for (var i = 0, l = array_a.length; i < l; i++) {
                    if (array_a[i] instanceof Array && array[i] instanceof Array) {
                        if (!compareArray(array_a[i], array[i]))
                            return false;
                    } else if (array_a[i] != array[i]) {
                        return false;
                    }
                }
                return true;
            }
            $scope.productOptionLevelArray[masterIndex].level_data = optionId;
            console.log('$scope.productOptionLevelArray: clicked!', $scope.productOptionLevelArray);
            var optionSelectedArray = [];
            for (var i = 0; i < $scope.productOptionLevelArray.length; i++) {
                if ($scope.productOptionLevelArray[i].level_data != 0) {
                    optionSelectedArray.push($scope.productOptionLevelArray[i].level_data);
                }
            }
            if (optionSelectedArray.length === $scope._data_product_id.product_attribute.option_data.pclass_array.length) {
                $scope.optionToCalculateNext = true;
            }
            if (!$scope.optionToCalculateNext) {
                return;
            }
            for (var i = 0; i < $scope._data_product_id.product_attribute.option_data.variant_array.length; i++) {
                var _self = $scope._data_product_id.product_attribute.option_data.variant_array[i];
                var _self_option = angular.fromJson(_self.option_id_json);
                if (compareArray(optionSelectedArray, _self_option)) {
                    $scope._data_product_id.product_id = _self.product_id;
                    $scope._data_product_id.product_price = _self.price;
                    $scope._data_product_id.product_sku = _self.sku;
                    /*$scope._data_product_id.product_compare_price = _self.compare_price;*/
                    $scope._data_product_id.product_variant_compare_price = _self.compare_price;
                    console.log("selectedOptionTextJson: option", _self);
                    $scope.selectedOptionTextJson = _self.option_id_json;
                    console.log('selectedOptionTextJson: Key', '-' + optionSelectedArray.join('-') + '-');
                    /* Switch Quantity Input */
                    /* $scope.switchQuantityByKey('-' + optionSelectedArray.join('-') + '-');*/
                    /* Find Image Variant */
                    if (_self.variant_image.length) {
                        var rightImagePosition = 0;
                        for (var im = 0; im < $scope._data_product_id.product_image.length; im++) {
                            if ($scope._data_product_id.product_image[im].image_id == _self.variant_image[0].image_id) {
                                rightImagePosition = im;
                                break;
                            }
                        }
                        /*$timeout(function () {
                            console.log("Found Varaint Image", _self.variant_image[0].image_id);
                            if ($(window).width <= 991) {
                                $scope._slickGoto('sliderDetailView', rightImagePosition);
                            } else {
                                angular.element('.d_gallery .item[data-image-id="' + _self.variant_image[0].image_id + '"]').click();
                            }
                        }, 300);*/
                    }
                    break;
                }
            }
            $scope.checkIfFullySelect($scope.product_original_id);
        };
        $scope.buttonChangeState = function(t, varaint_id){
            var b = $('.quick-buy-btn[varaint-product-id="'+varaint_id+'"]');
            console.log("buttonChangeState",t);
            switch(t){
                case 'wait':
                    b.removeAttr("data-background-color");
                    b.html("Waiting..");
                break;
                case 'finish':
                    b.html("In Cart");
                    b.attr("data-background-color","primary_darkest");
                break;
                default:
                    b.removeAttr("data-background-color");
                    b.html('  Buy Now');
                break;
            }
        };
        $scope.buyProcess = function(product_id, quantity){
            var requireLogin = ($scope.requirelogin == 1 || $scope.requirelogin == true || $scope.requirelogin == 'true') ? true : false;
            if (!UiCustomerBox.delegate.get.isLogin() && requireLogin) {
                return UiCustomerBox.delegate.modal.openLoginForm();
            }            
            if (!UiCart.delegate.product.isSelected(product_id)) {                
                if (!UiCart.delegate.product.isProgress(product_id)) {
                    $scope.buttonChangeState("wait", product_id);
                    console.log("adding", product_id, quantity);
                    UiCart.delegate.product.add(product_id, quantity);
                    /* Pixel */
                    $pixelScript.event('AddToCart');   
                    $timeout(function(){
                        $scope.buttonChangeState("finish", product_id);
                    }, 1000); 
                    return;
                } else {
                    return UiCart.delegate.modal.open();
                }
            }
            return UiCart.delegate.modal.open();             
        };
        $scope.showBuyOption = function(id){
            console.log("checkIfFullySelect: full",id);
            if(!$('[quick-buy]').length){
                return;
            }
            var original_id = id;
            var varaint_id = $scope._data_product_id.product_id;
           
            $(function(){
                $('[quick-buy="'+original_id+'"]').html('