var HEADER_MORE_MENU = function(){
var uniq_id = '';
var $menu_wrap;
var $menu_grid;
var $menu;
var $menu_obj_clone, $menu_obj_clone_temp;
var more_width;
var width_adj = 1;
var prev_more_width = 60;
var $more_menu;
var $col_group;
var use_mega_dropdown = false;
var resize_time = {};
var more_menu_html = '
';
var widget_code = ''; // optional
var $inline_menu_container;
var getAdjWidth = function(){
return width_adj;
};
var resetAdjWidth = function(){
width_adj = 1;
};
var init = function($_obj,_use_mega_dropdown,callback){
uniq_id = makeUniq();
$menu_wrap = $_obj;
use_mega_dropdown = _use_mega_dropdown;
$menu = $menu_wrap.find('._main_menu');
$menu_wrap.css({'visibility' : 'hidden'});
$menu_obj_clone = $menu.clone(true);
$menu_obj_clone.removeClass('_main_menu');
$menu_obj_clone.addClass('_main_clone_menu main_clone_menu');
$menu_wrap.find('._main_clone_menu').remove();
$menu_wrap.append($('').css({
position : 'absolute',
top : -9999,
left : -9999
}).append($menu_obj_clone));
$menu_obj_clone_temp = $menu.clone(true);
$menu_obj_clone_temp.empty();
$menu_obj_clone_temp.removeClass('_main_menu');
$menu_obj_clone_temp.addClass('main_clone_menu');
$more_menu = $(more_menu_html);
$inline_menu_container = $('#inline_header_normal *[data-type=col-group]:has(*[data-widget-type=inline_menu])');
setTimeout(function() {
$menu_obj_clone_temp.append($more_menu);
$menu_wrap.append($('').css({
position : 'absolute',
top : -9999,
left : -9999
}).append($menu_obj_clone_temp));
more_width = Math.ceil($more_menu.outerWidth())+width_adj;
calculateMenuWidth(callback);
}, 500);
$(window).off('resize.'+uniq_id).on('resize.'+uniq_id,function(){
if(resize_time) {
clearTimeout(resize_time);
}
resize_time = setTimeout(function() {
$(this).trigger('resizeEnd.'+uniq_id);
}, 500);
});
$(window).off('resizeEnd.'+uniq_id).on('resizeEnd.'+uniq_id,function(){
calculateMenuWidth(callback);
});
$('body').on('section_change.'+uniq_id,function(e,event_section_code){
var $section = $menu.closest('div[data-type=section]');
var section_code = $section.attr('section-code');
if(section_code != event_section_code)
return false;
calculateMenuWidth(callback);
});
};
var setWidgetCode = function(widgetCode) {
widget_code = widgetCode;
}
var allowDropdownHover = function(){
if($(window).width() > 991){
$menu_wrap.find('._header_dropdown').dropdownHover();
}
};
var calculateMenuWidth = function(callback){
const main_clone_menu_wrap = $menu_wrap[0].querySelector('._main_clone_menu_wrap');
main_clone_menu_wrap.style.display = 'block';
resetAdjWidth();
$col_group = $menu_wrap.closest('div[data-type=col-group]');
$menu_grid = $menu_wrap.closest('div[data-type=grid]');
$col_group.css('visibility', 'hidden');
var menu_cnt = 0;
$menu.children("li").filter(function(){
return $(this).css('display') != 'none';
}).each(function(index){
$(this).data('width', Math.ceil($(this).outerWidth(true)));
menu_cnt++;
});
prev_more_width = more_width;
more_width = Math.ceil($more_menu.outerWidth())+getAdjWidth();
if(more_width <= 50)
more_width = prev_more_width;
var col_group_width = Math.floor($col_group.width());
var menu_width = 0;
var $menu_grid_siblings = $menu_grid.siblings().not('div[data-type=line-guide]');
$menu_grid_siblings.each(function(){
var _s_width = Math.ceil($(this).outerWidth(true));
menu_width += _s_width;
});
var is_split = false;
var calc_list = [];
$menu_obj_clone.children("li").filter(function(){
return $(this).css('display') != 'none';
}).each(function(index){
var _width_adj = getAdjWidth();
var _width_data = {'obj':$(this), 'width' : Math.ceil($(this).outerWidth())+_width_adj};
calc_list.unshift(_width_data);
menu_width += Math.ceil($(this).outerWidth(true));
menu_width += _width_adj;
if(menu_width >= col_group_width){
is_split = true;
return false;
}
});
if(is_split){
$.each(calc_list, function(e, _calc_data){
menu_width = menu_width - _calc_data.width;
var more_contain_width = menu_width + more_width+40;
if(more_contain_width >= col_group_width){
if(calc_list.length == 1){
splitMoreMenu(_calc_data.obj, callback);
return false;
}
return true;
}else{
splitMoreMenu(_calc_data.obj, callback);
return false;
}
});
}else{
splitMoreMenu(false, callback);
}
main_clone_menu_wrap.style.display = 'none';
window.setTimeout(() => {
// Browser resize 시 상단 메뉴를 다시 그리기 때문에 이벤트를 다시 등록해야함
attachWheelEventOnDropdownElements();
const isExistInlineMenuContainer = Boolean($inline_menu_container.length);
if (isExistInlineMenuContainer) {
handleInlineMenuLastDropdown();
}
}, 0);
};
var splitMoreMenu = function($split_item, callback){
if(!$split_item){
$menu.empty();
$menu_obj_clone.children("li").each(function(index){
$menu.append($(this).clone(true));
});
}else{
var $menu_items = $split_item.prevAll();
$menu.empty();
$menu_items.each(function(){
$menu.prepend($(this).clone(true));
});
var $more_items = $split_item.nextAll();
$more_menu = $(more_menu_html);
$menu.append($more_menu);
if(!use_mega_dropdown){
$more_menu.find('._more_list').append($split_item.clone(true).removeClass('dropdown').addClass('dropdown-submenu'));
$more_items.each(function(){
var $_clone_item = $(this).clone(true);
$_clone_item.removeClass('dropdown').addClass('dropdown-submenu');
$more_menu.find('._more_list').append($_clone_item);
});
}
}
if(!use_mega_dropdown){
$menu.find("li.dropdown").each(function(index){
$(this).find("li.dropdown-submenu").each(function(index){
if(!$(this).hasClass('pulldown-hide')){
if($(this).find(".dropdown-menu > li").length > 0) $(this).addClass("sub-active");
}else{
$(this).find('ul').removeClass('dropdown-menu');
$(this).find('ul li').hide();
}
});
});
$more_menu.find("li").each(function(index){
$(this).find("li.dropdown-submenu").each(function(index){
if(!$(this).hasClass('pulldown-hide')){
if($(this).find(".dropdown-menu > li").length > 0) $(this).addClass("sub-active");
}else{
$(this).find('ul').removeClass('dropdown-menu');
$(this).find('ul li').hide();
}
});
});
}
$menu_wrap.css('visibility', 'visible');
$col_group.css('visibility', 'visible');
allowDropdownHover();
if(typeof callback == 'function'){
callback();
}
$menu_wrap.trigger('more_menu_complete');
};
/**
* 상단 메뉴가 viewport 높이보다 큰 경우 마우스로 상단 메뉴를 스크롤링 하기 위함
* @description 디자인모드가 아니며, 서브메뉴의 타입이 mega dropdown이 아니며, 상단메뉴가 고정인 경우 이벤트 추가
*/
const attachWheelEventOnDropdownElements = () => {
// PC 헤더(#inline_header_normal)만 적용되도록 처리
const $root = $("._new_org_header #inline_header_normal ._fixed_header_section");
const isDesignMode = window.location.pathname.includes('admin/design');
const shouldAttachWheelEvent = !isDesignMode && !use_mega_dropdown && Boolean($root.length);
if (!shouldAttachWheelEvent) {
return;
}
const $targetDropdowns = $root.find('._inline_menu_container ._main_menu > .dropdown > .dropdown-menu');
const $targetHeaderDropdowns = $targetDropdowns.parent().find('> ._header_dropdown');
initDropdowns($targetDropdowns);
$targetDropdowns.on('wheel.dropdown', handleWheelDropdown);
// bootstrap-hover-dropdown lib에서 dropdownHover함수를 호출한 요소에 이벤트를 실행시킴
$targetHeaderDropdowns.on('hide.bs.dropdown', handleHideDropdown);
}
const initDropdowns = ($dropdowns) => {
resetDropdowns($dropdowns);
}
const resetDropdowns = ($dropdowns) => {
$dropdowns.data('currentY', 0);
$dropdowns.data('initHoverGuard', false);
$dropdowns.css('transform', 'translateY(0)');
$dropdowns.removeClass('init-hover-guard');
}
const handleWheelDropdown = function(e) {
const $element = $(this);
const innerHeight = window.innerHeight;
const elementScrollHeight = $element.prop('scrollHeight');
const isOverflow = innerHeight < elementScrollHeight;
// 브라우저 높이가 dropdown의 높이보다 작을경우 처리하지 않음
if (!isOverflow) {
return;
}
const event = e.originalEvent;
const initHoverGuard = $element.data('initHoverGuard');
const acc = { min: 20, max: 30 };
const deltaY = event.deltaY;
const accValue = Math.floor(Math.min(acc.max, Math.max(acc.min, Math.abs(deltaY * 0.1))));
const currentY = $element.data('currentY') || 0;
const threshold = Math.floor(innerHeight / 3);
const position = deltaY > 0 ? -1 : 1;
const sumAccValue = Math.min(0, currentY + accValue * position);
const maxAccValue = currentY;
const nextY = elementScrollHeight - Math.abs(sumAccValue) < threshold ? maxAccValue : sumAccValue;
$element.css('transform', `translateY(${nextY}px)`);
$element.data('currentY', nextY);
if (!initHoverGuard) {
$element.addClass('init-hover-guard');
$element.data('initHoverGuard', true);
}
// 바깥 스크롤 방지
event.preventDefault();
}
const handleHideDropdown = function() {
const $dropdown = $(this).parent().find('> .dropdown-menu');
resetDropdowns($dropdown);
}
const handleInlineMenuLastDropdown = function() {
// 기존에 추가된 클래스로 인해 pos 계산이 부정확할 수 있으므로 제거
$inline_menu_container.removeClass('overflow-last-dropdown');
const $lastDropdown = $inline_menu_container.find(`#${widget_code} ._main_menu li.dropdown:last-of-type > ul.dropdown-menu`);
const hasLastDropdown = Boolean($lastDropdown.length);
if (!hasLastDropdown) {
return;
}
const viewportWidth = document.documentElement.clientWidth || document.body.clientWidth || window.innerWidth;
const lastDropdownRect = $lastDropdown.get(0).getBoundingClientRect();
const remainRightSpace = viewportWidth - lastDropdownRect.left;
const isOverflowDropdown = lastDropdownRect.width > remainRightSpace;
if (isOverflowDropdown) {
$inline_menu_container.addClass('overflow-last-dropdown');
}
}
return {
'init' : function($obj,callback){
init($obj,callback);
},
'setWidgetCode': function(widgetCode) {
setWidgetCode(widgetCode);
},
'calculateMenuWidth' : function(callback){
calculateMenuWidth(callback);
}
}
};