diff --git a/.gitignore b/.gitignore index 2ac415747..6be4686a4 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,15 @@ sirgle/ test.php *.key *.sh +log +g5_tree cheditor5.*/ -ckeditor*/ +!ckeditor*/ log/ g5_tree/ +.vscode/ naver*.html +initests01/ +SIRsoft000/ +config.php +pma/ diff --git a/_common.php b/_common.php index e29eb0bc1..dff21494c 100644 --- a/_common.php +++ b/_common.php @@ -1,2 +1,10 @@ 쇼핑몰 설치 후 이용해 주십시오.

'); + + define('_SHOP_', true); +} \ No newline at end of file diff --git a/adm/admin.head.php b/adm/admin.head.php index 0f91ddbd1..ec35ab825 100644 --- a/adm/admin.head.php +++ b/adm/admin.head.php @@ -111,6 +111,9 @@ function imageview(id, w, h)
+ + + + + + + + +
+

관련이벤트

+ + +
+
+

등록된 전체이벤트 목록

+
+ '; + ?> +
  • + +
    +
    +
  • + 0) + echo ''; + else + echo '

    등록된 이벤트가 없습니다.

    '; + ?> +
    + +
    + +
    +

    선택된 관련이벤트 목록

    +
    + '; + ?> +
  • + +
    +
    +
  • + 0) + echo ''; + else + echo '

    선택된 이벤트가 없습니다.

    '; + ?> +
    + +
    +
    + +
    + + +
    +

    상세설명설정

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    상세설명설정
    상품상단내용 + + + + +
    상품하단내용 + + + + +
    모바일 상품상단내용 + + + + +
    모바일 상품하단내용 + + + + +
    +
    +
    + + +
    +

    여분필드 설정

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    여분필드 + + + + + + + + + +
    입력일시 + + +
    수정일시 + + +
    +
    +
    + +
    + 목록 + 상품보기 + +
    + + + + + +상품의 분류를 선택하시거나 상품명을 입력하신 후 검색하여 주십시오.

    '); + +$sql = " select ca_id, it_id, it_name, it_price + from {$g5['g5_shop_item_table']} + where it_id <> '$it_id' "; +if($ca_id) + $sql .= " and ( ca_id like '$ca_id%' or ca_id2 like '$ca_id%' or ca_id3 like '$ca_id%' ) "; + +if($it_name) + $sql .= " and it_name like '%$it_name%' "; + +$sql .= " order by ca_id, it_name "; +$result = sql_query($sql); + +$list = ''; + +for($i=0;$row=sql_fetch_array($result);$i++) { + $sql2 = " select count(*) as cnt from {$g5['g5_shop_item_relation_table']} where it_id = '$it_id' and it_id2 = '{$row['it_id']}' "; + $row2 = sql_fetch($sql2); + if ($row2['cnt']) + continue; + + $it_name = get_it_image($row['it_id'], 50, 50).' '.$row['it_name']; + + $list .= '
  • '; + $list .= ''; + $list .= '
    '.$it_name.'
    '; + $list .= '
    '; + $list .= '
  • '.PHP_EOL; +} + +if($list) + $list = ''; +else + $list = '

    등록된 상품이 없습니다.'; + +echo $list; \ No newline at end of file diff --git a/adm/shop_admin/itemformupdate.php b/adm/shop_admin/itemformupdate.php new file mode 100644 index 000000000..73e4c790a --- /dev/null +++ b/adm/shop_admin/itemformupdate.php @@ -0,0 +1,655 @@ + 99)) + alert("포인트 비율을 0과 99 사이의 값으로 입력해 주십시오."); + +// 관련상품을 우선 삭제함 +sql_query(" delete from {$g5['g5_shop_item_relation_table']} where it_id = '$it_id' "); + +// 관련상품의 반대도 삭제 +sql_query(" delete from {$g5['g5_shop_item_relation_table']} where it_id2 = '$it_id' "); + +// 이벤트상품을 우선 삭제함 +sql_query(" delete from {$g5['g5_shop_event_item_table']} where it_id = '$it_id' "); + +// 선택옵션 +sql_query(" delete from {$g5['g5_shop_item_option_table']} where io_type = '0' and it_id = '$it_id' "); // 기존선택옵션삭제 + +$option_count = (isset($_POST['opt_id']) && is_array($_POST['opt_id'])) ? count($_POST['opt_id']) : array(); +$it_option_subject = ''; +$it_supply_subject = ''; + +if($option_count) { + // 옵션명 + $opt1_cnt = $opt2_cnt = $opt3_cnt = 0; + for($i=0; $i<$option_count; $i++) { + $post_opt_id = isset($_POST['opt_id'][$i]) ? preg_replace(G5_OPTION_ID_FILTER, '', strip_tags($_POST['opt_id'][$i])) : ''; + + $opt_val = explode(chr(30), $post_opt_id); + if(isset($opt_val[0]) && $opt_val[0]) + $opt1_cnt++; + if(isset($opt_val[1]) && $opt_val[1]) + $opt2_cnt++; + if(isset($opt_val[2]) && $opt_val[2]) + $opt3_cnt++; + } + + if($opt1_subject && $opt1_cnt) { + $it_option_subject = $opt1_subject; + if($opt2_subject && $opt2_cnt) + $it_option_subject .= ','.$opt2_subject; + if($opt3_subject && $opt3_cnt) + $it_option_subject .= ','.$opt3_subject; + } +} + +// 추가옵션 +sql_query(" delete from {$g5['g5_shop_item_option_table']} where io_type = '1' and it_id = '$it_id' "); // 기존추가옵션삭제 + +$supply_count = (isset($_POST['spl_id']) && is_array($_POST['spl_id'])) ? count($_POST['spl_id']) : array(); +if($supply_count) { + // 추가옵션명 + $arr_spl = array(); + for($i=0; $i<$supply_count; $i++) { + $post_spl_id = isset($_POST['spl_id'][$i]) ? preg_replace(G5_OPTION_ID_FILTER, '', strip_tags($_POST['spl_id'][$i])) : ''; + + $spl_val = explode(chr(30), $post_spl_id); + if(!in_array($spl_val[0], $arr_spl)) + $arr_spl[] = $spl_val[0]; + } + + $it_supply_subject = implode(',', $arr_spl); +} + +// 상품요약정보 +$value_array = array(); +$count_ii_article = (isset($_POST['ii_article']) && is_array($_POST['ii_article'])) ? count($_POST['ii_article']) : 0; +for($i=0; $i<$count_ii_article; $i++) { + $key = isset($_POST['ii_article'][$i]) ? strip_tags($_POST['ii_article'][$i], '
    ') : ''; + $val = isset($_POST['ii_value'][$i]) ? strip_tags($_POST['ii_value'][$i], '
    ') : ''; + $value_array[$key] = $val; +} +$it_info_value = addslashes(serialize($value_array)); + +$it_name = isset($_POST['it_name']) ? strip_tags(clean_xss_attributes(trim($_POST['it_name']))) : ''; + +// KVE-2019-0708 +$check_sanitize_keys = array( +'it_order', // 출력순서 +'it_maker', // 제조사 +'it_origin', // 원산지 +'it_brand', // 브랜드 +'it_model', // 모델 +'it_tel_inq', // 전화문의 +'it_use', // 판매가능 +'it_nocoupon', // 쿠폰적용안함 +'ec_mall_pid', // 네이버쇼핑 상품ID +'it_sell_email', // 판매자 e-mail +'it_price', // 판매가격 +'it_cust_price', // 시중가격 +'it_point_type', // 포인트 유형 +'it_point', // 포인트 +'it_supply_point', // 추가옵션상품 포인트 +'it_soldout', // 상품품절 +'it_stock_sms', // 재입고SMS 알림 +'it_stock_qty', // 재고수량 +'it_noti_qty', // 재고 통보수량 +'it_buy_min_qty', // 최소구매수량 +'it_notax', // 상품과세 유형 +'it_sc_type', // 배송비 유형 +'it_sc_method', // 배송비 결제 +'it_sc_price', // 기본배송비 +'it_sc_minimum', // 배송비 상세조건 +'it_type1', // 상품유형(히트) +'it_type2', // 상품유형(추천) +'it_type3', // 상품유형(신상품) +'it_type4', // 상품유형(인기) +'it_type5', // 상품유형(할인) +); + +foreach( $check_sanitize_keys as $key ){ + $$key = isset($_POST[$key]) ? strip_tags(clean_xss_attributes($_POST[$key])) : ''; +} + +$it_basic = preg_replace('#(.*?)<\/script>#is', '', $it_basic); +$it_explan = isset($_POST['it_explan']) ? $_POST['it_explan'] : ''; + +if ($it_name == "") + alert("상품명을 입력해 주십시오."); + +$sql_common = " ca_id = '$ca_id', + ca_id2 = '$ca_id2', + ca_id3 = '$ca_id3', + it_skin = '$it_skin', + it_mobile_skin = '$it_mobile_skin', + it_name = '$it_name', + it_maker = '$it_maker', + it_origin = '$it_origin', + it_brand = '$it_brand', + it_model = '$it_model', + it_option_subject = '$it_option_subject', + it_supply_subject = '$it_supply_subject', + it_type1 = '$it_type1', + it_type2 = '$it_type2', + it_type3 = '$it_type3', + it_type4 = '$it_type4', + it_type5 = '$it_type5', + it_basic = '$it_basic', + it_explan = '$it_explan', + it_explan2 = '".strip_tags(trim(clean_xss_attributes($it_explan)))."', + it_mobile_explan = '$it_mobile_explan', + it_cust_price = '$it_cust_price', + it_price = '$it_price', + it_point = '$it_point', + it_point_type = '$it_point_type', + it_supply_point = '$it_supply_point', + it_notax = '$it_notax', + it_sell_email = '$it_sell_email', + it_use = '$it_use', + it_nocoupon = '$it_nocoupon', + it_soldout = '$it_soldout', + it_stock_qty = '$it_stock_qty', + it_stock_sms = '$it_stock_sms', + it_noti_qty = '$it_noti_qty', + it_sc_type = '$it_sc_type', + it_sc_method = '$it_sc_method', + it_sc_price = '$it_sc_price', + it_sc_minimum = '$it_sc_minimum', + it_sc_qty = '$it_sc_qty', + it_buy_min_qty = '$it_buy_min_qty', + it_buy_max_qty = '$it_buy_max_qty', + it_head_html = '$it_head_html', + it_tail_html = '$it_tail_html', + it_mobile_head_html = '$it_mobile_head_html', + it_mobile_tail_html = '$it_mobile_tail_html', + it_ip = '{$_SERVER['REMOTE_ADDR']}', + it_order = '$it_order', + it_tel_inq = '$it_tel_inq', + it_info_gubun = '$it_info_gubun', + it_info_value = '$it_info_value', + it_shop_memo = '$it_shop_memo', + ec_mall_pid = '$ec_mall_pid', + it_img1 = '$it_img1', + it_img2 = '$it_img2', + it_img3 = '$it_img3', + it_img4 = '$it_img4', + it_img5 = '$it_img5', + it_img6 = '$it_img6', + it_img7 = '$it_img7', + it_img8 = '$it_img8', + it_img9 = '$it_img9', + it_img10 = '$it_img10', + it_1_subj = '$it_1_subj', + it_2_subj = '$it_2_subj', + it_3_subj = '$it_3_subj', + it_4_subj = '$it_4_subj', + it_5_subj = '$it_5_subj', + it_6_subj = '$it_6_subj', + it_7_subj = '$it_7_subj', + it_8_subj = '$it_8_subj', + it_9_subj = '$it_9_subj', + it_10_subj = '$it_10_subj', + it_1 = '$it_1', + it_2 = '$it_2', + it_3 = '$it_3', + it_4 = '$it_4', + it_5 = '$it_5', + it_6 = '$it_6', + it_7 = '$it_7', + it_8 = '$it_8', + it_9 = '$it_9', + it_10 = '$it_10' + "; + +if ($w == "") +{ + $it_id = isset($_POST['it_id']) ? $_POST['it_id'] : ''; + + if (!trim($it_id)) { + alert('상품 코드가 없으므로 상품을 추가하실 수 없습니다.'); + } + + $t_it_id = preg_replace("/[A-Za-z0-9\-_]/", "", $it_id); + if($t_it_id) + alert('상품 코드는 영문자, 숫자, -, _ 만 사용할 수 있습니다.'); + + $sql_common .= " , it_time = '".G5_TIME_YMDHIS."' "; + $sql_common .= " , it_update_time = '".G5_TIME_YMDHIS."' "; + $sql = " insert {$g5['g5_shop_item_table']} + set it_id = '$it_id', + $sql_common "; + sql_query($sql); +} +else if ($w == "u") +{ + $sql_common .= " , it_update_time = '".G5_TIME_YMDHIS."' "; + $sql = " update {$g5['g5_shop_item_table']} + set $sql_common + where it_id = '$it_id' "; + sql_query($sql); +} +/* +else if ($w == "d") +{ + if ($is_admin != 'super') + { + $sql = " select it_id from {$g5['g5_shop_item_table']} a, {$g5['g5_shop_category_table']} b + where a.it_id = '$it_id' + and a.ca_id = b.ca_id + and b.ca_mb_id = '{$member['mb_id']}' "; + $row = sql_fetch($sql); + if (!$row['it_id']) + alert("\'{$member['mb_id']}\' 님께서 삭제 할 권한이 없는 상품입니다."); + } + + itemdelete($it_id); +} +*/ + +if ($w == "" || $w == "u") +{ + // 관련상품 등록 + $it_id2 = explode(",", $it_list); + for ($i=0; $i"; +?> + diff --git a/adm/shop_admin/iteminfo.php b/adm/shop_admin/iteminfo.php new file mode 100644 index 000000000..ea84c9458 --- /dev/null +++ b/adm/shop_admin/iteminfo.php @@ -0,0 +1,73 @@ + + +

    + + + + + + + + + $value) { + $el_name = $key; + $el_title = $value[0]; + $el_example = $value[1]; + $el_value = '상품페이지 참고'; + + if($gubun == $it_info_gubun && isset($info_value[$key])) + $el_value = $info_value[$key]; + ?> + + + + + + + + + + +
    상품요약정보 입력
    + + + + + + + + +
    +
    \ No newline at end of file diff --git a/adm/shop_admin/itemlist.php b/adm/shop_admin/itemlist.php new file mode 100644 index 000000000..288b1a18f --- /dev/null +++ b/adm/shop_admin/itemlist.php @@ -0,0 +1,299 @@ +선택'.PHP_EOL; +$sql = " select * from {$g5['g5_shop_category_table']} "; +if ($is_admin != 'super') + $sql .= " where ca_mb_id = '{$member['mb_id']}' "; +$sql .= " order by ca_order, ca_id "; +$result = sql_query($sql); +for ($i=0; $row=sql_fetch_array($result); $i++) +{ + $len = strlen($row['ca_id']) / 2 - 1; + $nbsp = ''; + for ($i=0; $i<$len; $i++) { + $nbsp .= '   '; + } + $ca_list .= ''.PHP_EOL; +} + +$where = " and "; +$sql_search = ""; +if ($stx != "") { + if ($sfl != "") { + $sql_search .= " $where $sfl like '%$stx%' "; + $where = " and "; + } + if ($save_stx != $stx) + $page = 1; +} + +if ($sca != "") { + $sql_search .= " $where (a.ca_id like '$sca%' or a.ca_id2 like '$sca%' or a.ca_id3 like '$sca%') "; +} + +if ($sfl == "") $sfl = "it_name"; + +$sql_common = " from {$g5['g5_shop_item_table']} a , + {$g5['g5_shop_category_table']} b + where (a.ca_id = b.ca_id"; +if ($is_admin != 'super') + $sql_common .= " and b.ca_mb_id = '{$member['mb_id']}'"; +$sql_common .= ") "; +$sql_common .= $sql_search; + +// 테이블의 전체 레코드수만 얻음 +$sql = " select count(*) as cnt " . $sql_common; +$row = sql_fetch($sql); +$total_count = $row['cnt']; + +$rows = $config['cf_page_rows']; +$total_page = ceil($total_count / $rows); // 전체 페이지 계산 +if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지) +$from_record = ($page - 1) * $rows; // 시작 열을 구함 + +if (!$sst) { + $sst = "it_id"; + $sod = "desc"; +} +$sql_order = "order by $sst $sod"; + + +$sql = " select * + $sql_common + $sql_order + limit $from_record, $rows "; +$result = sql_query($sql); + +//$qstr = $qstr.'&sca='.$sca.'&page='.$page; +$qstr = $qstr.'&sca='.$sca.'&page='.$page.'&save_stx='.$stx; + +$listall = '전체목록'; +?> + +
    + + 등록된 상품 +
    + +
    + + + + + + + + + + + + +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '; + ?> + +
    목록
    + + + 상품코드분류순서판매품절조회관리
    이미지상품명판매가격시중가격PC스킨
    포인트재고모바일스킨
    + + + + + + + + + + + + + + + + + + value="1" id="use_"> + + + value="1" id="soldout_"> + + 수정 + 복사 + 보기 +
    + + " id="name_" required class="tbl_input required" size="30"> + + + + + + + + + +
    + + + + + +
    자료가 한건도 없습니다.
    +
    + + + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    옵션 목록
    + + + 옵션추가금액재고수량통보수량사용여부
    + + + + > '.$opt_2; if ($opt_3_len) echo ' > '.$opt_3; ?> + + + + + + + + + + + +
    + + + + > '.$opt_2; if ($opt_3_len) echo ' > '.$opt_3; ?> + + + + + + + + + + + +
    +
    + +
    + +
    + +
    + 옵션 일괄 적용 + + + + + + + + + + + + + + +
    + + +
    + + + + + + + + + +
    +

    상품에 대한 문의에 답변하실 수 있습니다. 상품 문의 내용의 수정도 가능합니다.

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    수정
    이름
    이메일
    휴대폰
    +
    + +
    + 목록 + +
    +
    + + + +SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting); + + $strDest = array(); + $strDest[] = $recv_number; + $strCallBack = $send_number; + $strCaller = iconv_euckr(trim($default['de_admin_company_name'])); + $strSubject = ''; + $strURL = ''; + $strData = iconv_euckr($sms_content); + $strDate = ''; + $nCount = count($strDest); + + $res = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount); + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } else { + include_once(G5_LIB_PATH.'/icode.sms.lib.php'); + + $SMS = new SMS; // SMS 연결 + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + $SMS->Add($recv_number, $send_number, $config['cf_icode_id'], iconv_euckr(stripslashes($sms_content)), ""); + $SMS->Send(); + } + } + } + + // 답변 이메일전송 + if(trim($row['iq_email'])) { + include_once(G5_LIB_PATH.'/mailer.lib.php'); + + $subject = $config['cf_title'].' '.$row['it_name'].' 상품문의 답변 알림 메일'; + $content = conv_content($iq_answer, 1); + + mailer($config['cf_title'], $config['cf_admin_email'], $row['iq_email'], $subject, $content, 1); + } + } + + goto_url("./itemqaform.php?w=$w&iq_id=$iq_id&sca=$sca&$qstr"); +} +else { + alert(); +} \ No newline at end of file diff --git a/adm/shop_admin/itemqalist.php b/adm/shop_admin/itemqalist.php new file mode 100644 index 000000000..d1d14cfbb --- /dev/null +++ b/adm/shop_admin/itemqalist.php @@ -0,0 +1,207 @@ +전체목록'; +?> + +
    + + 전체 문의내역 +
    + +
    + + + + + + + + + + + + + +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + '; + } + ?> + +
    목록
    + + + 상품명질문이름답변관리
    + + + + + 열기 + + + 수정 +
    자료가 없습니다.
    +
    + +
    + +
    +
    + + + + + +전체목록'; +?> + +
    + + 등록상품 +
    + +
    + + + + + + + + +기간설정 + + 에서 + + 까지 + + +
    + +
    +

    판매량을 합산하여 상품판매순위를 집계합니다.

    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '; + } + ?> + +
    목록
    순위상품명">쇼핑">주문">입금">준비">배송">완료">취소">반품">품절">합계
    자료가 없습니다.
    +
    + + + + + +전체목록'; +?> + +
    + + 전체 상품 +
    + +
    + + + + + + + + + + + + + + + +
    + +
    +

    재고수정의 수치를 수정하시면 창고재고의 수치가 변경됩니다.

    +
    + + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + 재고부족 '; + } + + $bg = 'bg'.($i%2); + + ?> + + + + + + + + + + + + + + '; + ?> + +
    목록
    ">상품코드">상품명">창고재고주문대기가재고재고수정통보수량">판매">품절">재입고알림관리
    + + + + + + + + + + + > + + + > + + + > + 수정
    자료가 없습니다.
    +
    + + +
    + + + +dbconfig.php 파일에 $g5[\'g5_shop_item_stocksms_table\'] = G5_SHOP_TABLE_PREFIX.\'item_stocksms\'; 를 추가해 주세요.'); + +if(!sql_query(" select ss_id from {$g5['g5_shop_item_stocksms_table']} limit 1", false)) { + sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['g5_shop_item_stocksms_table']}` ( + `ss_id` int(11) NOT NULL AUTO_INCREMENT, + `it_id` varchar(20) NOT NULL DEFAULT '', + `ss_hp` varchar(255) NOT NULL DEFAULT '', + `ss_send` tinyint(4) NOT NULL DEFAULT '0', + `ss_send_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `ss_datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `ss_ip` varchar(25) NOT NULL DEFAULT '', + PRIMARY KEY (`ss_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ", true); +} + +$doc = isset($_GET['doc']) ? clean_xss_tags($_GET['doc'], 1, 1) : ''; +$sort1 = (isset($_GET['sort1']) && in_array($_GET['sort1'], array('it_id', 'ss_hp', 'ss_send', 'ss_send_time', 'ss_datetime'))) ? $_GET['sort1'] : 'ss_send'; +$sort2 = (isset($_GET['sort2']) && in_array($_GET['sort2'], array('desc', 'asc'))) ? $_GET['sort2'] : 'asc'; +$sel_field = (isset($_GET['sel_field']) && in_array($_GET['sel_field'], array('it_id', 'ss_hp', 'ss_send')) ) ? $_GET['sel_field'] : 'it_id'; +$search = isset($_GET['search']) ? get_search_string($_GET['search']) : ''; + +$sql_search = " where 1 "; +if ($search != "") { + if ($sel_field != "") { + $sql_search .= " and $sel_field like '%$search%' "; + } +} + +$sql_common = " from {$g5['g5_shop_item_stocksms_table']} "; + +// 미전송 건수 +$sql = " select count(*) as cnt " . $sql_common . " where ss_send = '0' "; +$row = sql_fetch($sql); +$unsend_count = $row['cnt']; + +// 테이블의 전체 레코드수만 얻음 +$sql = " select count(*) as cnt " . $sql_common; +$row = sql_fetch($sql); +$total_count = $row['cnt']; + +$rows = $config['cf_page_rows']; +$total_page = ceil($total_count / $rows); // 전체 페이지 계산 +if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지) +$from_record = ($page - 1) * $rows; // 시작 열을 구함 + +$sql = " select * + $sql_common + $sql_search + order by $sort1 $sort2 + limit $from_record, $rows "; +$result = sql_query($sql); + +$qstr1 = 'sel_field='.$sel_field.'&search='.$search; +$qstr = $qstr1.'&sort1='.$sort1.'&sort2='.$sort2.'&page='.$page; + +$listall = '전체목록'; +?> + +
    + + 전체 + 미전송 +
    + +
    + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + '; + ?> + +
    목록
    + + + 상품명휴대폰번호SMS전송SMS전송일시등록일시
    + + + +
    자료가 없습니다.
    +
    + + +
    + + + + +
    +
    + + + + + + $receive_number, 'send' => $send_number, 'cont' => $sms_contents); + } + + // SMS 전송으로 변경함 + $sql = " update {$g5['g5_shop_item_stocksms_table']} + set ss_send = '1', + ss_send_time = '".G5_TIME_YMDHIS."' + where ss_id = '{$ss_id}' "; + sql_query($sql); + } + + // SMS + $sms_count = count($sms_messages); + if($sms_count > 0) { + if($config['cf_sms_type'] == 'LMS') { + include_once(G5_LIB_PATH.'/icode.lms.lib.php'); + + $port_setting = get_icode_port_type($config['cf_icode_id'], $config['cf_icode_pw']); + + // SMS 모듈 클래스 생성 + if($port_setting !== false) { + $SMS = new LMS; + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting); + + for($s=0; $s<$sms_count; $s++) { + $strDest = array(); + $strDest[] = $sms_messages[$s]['recv']; + $strCallBack = $sms_messages[$s]['send']; + $strCaller = iconv_euckr(trim($default['de_admin_company_name'])); + $strSubject = ''; + $strURL = ''; + $strData = iconv_euckr($sms_messages[$s]['cont']); + $strDate = ''; + $nCount = count($strDest); + + $res = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount); + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } + } else { + include_once(G5_LIB_PATH.'/icode.sms.lib.php'); + + $SMS = new SMS; // SMS 연결 + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + + for($s=0; $s<$sms_count; $s++) { + $recv_number = $sms_messages[$s]['recv']; + $send_number = $sms_messages[$s]['send']; + $sms_content = iconv_euckr($sms_messages[$s]['cont']); + + $SMS->Add($recv_number, $send_number, $config['cf_icode_id'], $sms_content, ""); + } + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } +} else if ($_POST['act_button'] == "선택삭제") { + + if ($is_admin != 'super') + alert('자료의 삭제는 최고관리자만 가능합니다.'); + + auth_check_menu($auth, $sub_menu, 'd'); + + for ($i=0; $i<$count_post_chk; $i++) { + // 실제 번호를 넘김 + $k = isset($_POST['chk'][$i]) ? (int) $_POST['chk'][$i] : 0; + $ss_id = isset($_POST['ss_id'][$k]) ? (int) $_POST['ss_id'][$k] : 0; + + $sql = " delete from {$g5['g5_shop_item_stocksms_table']} where ss_id = '{$ss_id}' "; + sql_query($sql); + } +} + + +$qstr1 = 'sel_field='.$sel_field.'&search='.$search; +$qstr = $qstr1.'&sort1='.$sort1.'&sort2='.$sort2.'&page='.$page; + +goto_url('./itemstocksms.php?'.$qstr); \ No newline at end of file diff --git a/adm/shop_admin/itemsupply.php b/adm/shop_admin/itemsupply.php new file mode 100644 index 000000000..7abd56334 --- /dev/null +++ b/adm/shop_admin/itemsupply.php @@ -0,0 +1,180 @@ + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    추가옵션 목록
    + + + 옵션명옵션항목상품금액재고수량통보수량사용여부
    + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + +
    + +
    + +
    + + + + + + + + + + + + + + +
    +전체목록'; +?> + +
    + + 전체 상품 +
    + +
    + + + + + + + + + + + + + +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + '; + ?> + +
    목록
    상품코드상품명히트
    상품
    추천
    상품
    신규
    상품
    인기
    상품
    할인
    상품
    관리
    + + + + + > + + + > + + + > + + + > + + + > + + 수정 +
    자료가 없습니다.
    +
    + +
    + +
    +
    + + + + + +
    + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    수정
    상품명
    이름
    평점 (점)
    내용
    답변 내용
    확인 + > + + > + +
    +
    + +
    + 목록 + +
    +
    + + + +전체목록'; +?> + +
    + + 전체 후기내역 +
    + +
    + + + + + + + + + + + + + +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + '; + } + ?> + +
    목록
    + + + 상품명이름제목평점확인관리
    + + + + + + 열기 + + + + + + + value="1" id="confirm_"> + + 수정 +
    자료가 없습니다.
    +
    + +
    + + +
    +
    + + + + + +전체목록'; +?> + +
    + + 전체 옵션 +
    + +
    + + + + + + + + + + + + + + + +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + '; + } + } + } + + $type = '선택옵션'; + if($row['io_type']) + $type = '추가옵션'; + + // 통보수량보다 재고수량이 작을 때 + $io_stock_qty = number_format($row['io_stock_qty']); + $io_stock_qty_st = ''; // 스타일 정의 + if($row['io_stock_qty'] <= $row['io_noti_qty']) { + $io_stock_qty_st = ' sit_stock_qty_alert'; + $io_stock_qty = ''.$io_stock_qty.' ! 재고부족 '; + } + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + + + + + '; + ?> + +
    목록
    ">상품명옵션항목옵션타입">창고재고주문대기가재고재고수정통보수량">판매관리
    + + + + + + + + + + + + + > + 수정
    자료가 없습니다.
    +
    + + + +
    + +
    +

    + 재고수정의 수치를 수정하시면 창고재고의 수치가 변경됩니다.
    + 창고재고가 부족한 경우 재고수량 뒤에 ! 혹은 재고부족으로 표시됩니다. +

    +
    + + + + + +
    +

    + +
    +

    + 엑셀파일을 이용하여 배송정보를 일괄등록할 수 있습니다.
    + 형식은 배송처리용 엑셀파일을 다운로드하여 배송 정보를 입력하시면 됩니다.
    + 수정 완료 후 엑셀파일을 업로드하시면 배송정보가 일괄등록됩니다.
    + 엑셀파일을 저장하실 때는 Excel 97 - 2003 통합문서 (*.xls) 로 저장하셔야 합니다.
    + 주문상태가 준비이고 미수금이 0인 주문에 한해 엑셀파일이 생성됩니다. +

    + +

    + 배송정보 일괄등록용 엑셀파일 다운로드 +

    +
    + +
    + +
    + + +
    + +
    + + + + + + +
    + +
    + + +
    + +
    + +
    + += '5.2.0') { + include_once(G5_LIB_PATH.'/PHPExcel.php'); + + $headers = array('주문번호', '주문자명', '주문자전화1', '주문자전화2', '배송자명', '배송지전화1', '배송지전화2', '배송지주소', '배송회사', '운송장번호'); + $widths = array(18, 15, 15, 15, 15, 15, 15, 50, 20, 20); + $header_bgcolor = 'FFABCDEF'; + $last_char = column_char(count($headers) - 1); + $rows = array(); + + for($i=1; $row=sql_fetch_array($result); $i++) { + $rows[] = + array(' '.$row['od_id'], + $row['od_name'], + ' '.$row['od_tel'], + ' '.$row['od_hp'], + $row['od_b_name'], + ' '.$row['od_b_tel'], + ' '.$row['od_b_hp'], + print_address($row['od_b_addr1'], $row['od_b_addr2'], $row['od_b_addr3'], $row['od_b_addr_jibeon']), + $row['od_delivery_company'], + $row['od_invoice']); + } + + $data = array_merge(array($headers), $rows); + + $excel = new PHPExcel(); + $excel->setActiveSheetIndex(0)->getStyle( "A1:${last_char}1" )->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB($header_bgcolor); + $excel->setActiveSheetIndex(0)->getStyle( "A:$last_char" )->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)->setWrapText(true); + foreach($widths as $i => $w) $excel->setActiveSheetIndex(0)->getColumnDimension( column_char($i) )->setWidth($w); + $excel->getActiveSheet()->fromArray($data,NULL,'A1'); + + header("Content-Type: application/octet-stream"); + header("Content-Disposition: attachment; filename=\"deliverylist-".date("ymd", time()).".xls\""); + header("Cache-Control: max-age=0"); + + $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5'); + $writer->save('php://output'); +} else { + /*================================================================================ + php_writeexcel http://www.bettina-attack.de/jonny/view.php/projects/php_writeexcel/ + =================================================================================*/ + + include_once(G5_LIB_PATH.'/Excel/php_writeexcel/class.writeexcel_workbook.inc.php'); + include_once(G5_LIB_PATH.'/Excel/php_writeexcel/class.writeexcel_worksheet.inc.php'); + + $fname = tempnam(G5_DATA_PATH, "tmp-deliverylist.xls"); + $workbook = new writeexcel_workbook($fname); + $worksheet = $workbook->addworksheet(); + + // Put Excel data + $data = array('주문번호', '주문자명', '주문자전화1', '주문자전화2', '배송자명', '배송지전화1', '배송지전화2', '배송지주소', '배송회사', '운송장번호'); + $data = array_map('iconv_euckr', $data); + + $col = 0; + foreach($data as $cell) { + $worksheet->write(0, $col++, $cell); + } + + for($i=1; $row=sql_fetch_array($result); $i++) { + $row = array_map('iconv_euckr', $row); + + $worksheet->write($i, 0, ' '.$row['od_id']); + $worksheet->write($i, 1, $row['od_name']); + $worksheet->write($i, 2, ' '.$row['od_tel']); + $worksheet->write($i, 3, ' '.$row['od_hp']); + $worksheet->write($i, 4, $row['od_b_name']); + $worksheet->write($i, 5, ' '.$row['od_b_tel']); + $worksheet->write($i, 6, ' '.$row['od_b_hp']); + $worksheet->write($i, 7, print_address($row['od_b_addr1'], $row['od_b_addr2'], $row['od_b_addr3'], $row['od_b_addr_jibeon'])); + $worksheet->write($i, 8, $row['od_delivery_company']); + $worksheet->write($i, 9, $row['od_invoice']); + } + + $workbook->close(); + + header("Content-Type: application/x-msexcel; name=\"deliverylist-".date("ymd", time()).".xls\""); + header("Content-Disposition: inline; filename=\"deliverylist-".date("ymd", time()).".xls\""); + $fh=fopen($fname, "rb"); + fpassthru($fh); + unlink($fname); +} \ No newline at end of file diff --git a/adm/shop_admin/orderdeliveryupdate.php b/adm/shop_admin/orderdeliveryupdate.php new file mode 100644 index 000000000..3030de506 --- /dev/null +++ b/adm/shop_admin/orderdeliveryupdate.php @@ -0,0 +1,184 @@ +getSheet(0); + + $num_rows = $sheet->getHighestRow(); + $highestColumn = $sheet->getHighestColumn(); + + $fail_od_id = array(); + $total_count = 0; + $fail_count = 0; + $succ_count = 0; + + // $i 사용시 ordermail.inc.php의 $i 때문에 무한루프에 빠짐 + for ($k = 2; $k <= $num_rows; $k++) { + $total_count++; + + $rowData = $sheet->rangeToArray('A' . $k . ':' . $highestColumn . $k, + NULL, + TRUE, + FALSE); + + $od_id = isset($rowData[0][0]) ? addslashes(trim($rowData[0][0])) : ''; + $od_delivery_company = isset($rowData[0][8]) ? addslashes($rowData[0][8]) : ''; + $od_invoice = isset($rowData[0][9]) ? addslashes($rowData[0][9]) : ''; + + if(!$od_id || !$od_delivery_company || !$od_invoice) { + $fail_count++; + $fail_od_id[] = $od_id; + continue; + } + + // 주문정보 + $od = sql_fetch(" select * from {$g5['g5_shop_order_table']} where od_id = '$od_id' "); + if (!$od) { + $fail_count++; + $fail_od_id[] = $od_id; + continue; + } + + if($od['od_status'] != '준비') { + $fail_count++; + $fail_od_id[] = $od_id; + continue; + } + + $delivery['invoice'] = $od_invoice; + $delivery['invoice_time'] = G5_TIME_YMDHIS; + $delivery['delivery_company'] = $od_delivery_company; + + // 주문정보 업데이트 + order_update_delivery($od_id, $od['mb_id'], '배송', $delivery); + change_status($od_id, '준비', '배송'); + + $succ_count++; + + $send_sms = isset($_POST['send_sms']) ? clean_xss_tags($_POST['send_sms'], 1, 1) : ''; + $od_send_mail = isset($_POST['od_send_mail']) ? clean_xss_tags($_POST['od_send_mail'], 1, 1) : ''; + $send_escrow = isset($_POST['send_escrow']) ? clean_xss_tags($_POST['send_escrow'], 1, 1) : ''; + + // SMS + if($config['cf_sms_use'] == 'icode' && $send_sms && $default['de_sms_use5']) { + $sms_contents = conv_sms_contents($od_id, $default['de_sms_cont5']); + if($sms_contents) { + $receive_number = preg_replace("/[^0-9]/", "", $od['od_hp']); // 수신자번호 + $send_number = preg_replace("/[^0-9]/", "", $default['de_admin_company_tel']); // 발신자번호 + + if($receive_number) + $sms_messages[] = array('recv' => $receive_number, 'send' => $send_number, 'cont' => $sms_contents); + } + } + + // 메일 + if($config['cf_email_use'] && $od_send_mail) + include './ordermail.inc.php'; + + // 에스크로 배송 + if($send_escrow && $od['od_tno'] && $od['od_escrow']) { + $escrow_tno = $od['od_tno']; + $escrow_numb = $od_invoice; + $escrow_corp = $od_delivery_company; + + include(G5_SHOP_PATH.'/'.$od['od_pg'].'/escrow.register.php'); + } + } +} + +// SMS +$sms_count = count($sms_messages); +if($sms_count > 0) { + if($config['cf_sms_type'] == 'LMS') { + include_once(G5_LIB_PATH.'/icode.lms.lib.php'); + + $port_setting = get_icode_port_type($config['cf_icode_id'], $config['cf_icode_pw']); + + // SMS 모듈 클래스 생성 + if($port_setting !== false) { + $SMS = new LMS; + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting); + + for($s=0; $s<$sms_count; $s++) { + $strDest = array(); + $strDest[] = $sms_messages[$s]['recv']; + $strCallBack = $sms_messages[$s]['send']; + $strCaller = iconv_euckr(trim($default['de_admin_company_name'])); + $strSubject = ''; + $strURL = ''; + $strData = iconv_euckr($sms_messages[$s]['cont']); + $strDate = ''; + $nCount = count($strDest); + + $res = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount); + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } + } else { + include_once(G5_LIB_PATH.'/icode.sms.lib.php'); + + $SMS = new SMS; // SMS 연결 + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + + for($s=0; $s<$sms_count; $s++) { + $recv_number = $sms_messages[$s]['recv']; + $send_number = $sms_messages[$s]['send']; + $sms_content = iconv_euckr($sms_messages[$s]['cont']); + + $SMS->Add($recv_number, $send_number, $config['cf_icode_id'], $sms_content, ""); + } + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } +} + +$g5['title'] = '엑셀 배송일괄처리 결과'; +include_once(G5_PATH.'/head.sub.php'); +?> + +
    +

    + +
    +

    배송일괄처리를 완료했습니다.

    +
    + +
    +
    총배송건수
    +
    +
    완료건수
    +
    +
    실패건수
    +
    + 0) { ?> +
    실패주문코드
    +
    + +
    + +
    + +
    + +
    + + +
  • 주문상품 목록
  • +
  • 주문결제 내역
  • +
  • 결제상세정보 확인
  • +
  • 결제상세정보 수정
  • +
  • 상점메모
  • +
  • 주문하신 분
  • +
  • 받으시는 분
  • +'; + +$html_receipt_chk = ' +
    '; + +$qstr1 = "od_status=".urlencode($od_status)."&od_settle_case=".urlencode($od_settle_case)."&od_misu=$od_misu&od_cancel_price=$od_cancel_price&od_refund_price=$od_refund_price&od_receipt_point=$od_receipt_point&od_coupon=$od_coupon&fr_date=$fr_date&to_date=$to_date&sel_field=$sel_field&search=$search&save_search=$search"; +if($default['de_escrow_use']) + $qstr1 .= "&od_escrow=$od_escrow"; +$qstr = "$qstr1&sort1=$sort1&sort2=$sort2&page=$page"; + +// 상품목록 +$sql = " select it_id, + it_name, + cp_price, + ct_notax, + ct_send_cost, + it_sc_type + from {$g5['g5_shop_cart_table']} + where od_id = '{$od['od_id']}' + group by it_id + order by ct_id "; +$result = sql_query($sql); + +// 주소 참고항목 필드추가 +if(!isset($od['od_addr3'])) { + sql_query(" ALTER TABLE `{$g5['g5_shop_order_table']}` + ADD `od_addr3` varchar(255) NOT NULL DEFAULT '' AFTER `od_addr2`, + ADD `od_b_addr3` varchar(255) NOT NULL DEFAULT '' AFTER `od_b_addr2` ", true); +} + +// 배송목록에 참고항목 필드추가 +if(!sql_query(" select ad_addr3 from {$g5['g5_shop_order_address_table']} limit 1", false)) { + sql_query(" ALTER TABLE `{$g5['g5_shop_order_address_table']}` + ADD `ad_addr3` varchar(255) NOT NULL DEFAULT '' AFTER `ad_addr2` ", true); +} + +// 결제 PG 필드 추가 +if(!sql_query(" select od_pg from {$g5['g5_shop_order_table']} limit 1 ", false)) { + sql_query(" ALTER TABLE `{$g5['g5_shop_order_table']}` + ADD `od_pg` varchar(255) NOT NULL DEFAULT '' AFTER `od_mobile`, + ADD `od_casseqno` varchar(255) NOT NULL DEFAULT '' AFTER `od_escrow` ", true); + + // 주문 결제 PG kcp로 설정 + sql_query(" update {$g5['g5_shop_order_table']} set od_pg = 'kcp' "); +} + +// LG 현금영수증 JS +if($od['od_pg'] == 'lg') { + if($default['de_card_test']) { + echo ''.PHP_EOL; + } else { + echo ''.PHP_EOL; + } +} + +// add_javascript('js 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 +add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js +?> + +
    +

    주문상품 목록

    + +
    +

    + 현재 주문상태 + | + 주문일시 () + | + 주문총액 원 +

    +

    희망배송일은 () 입니다.

    + +

    모바일 쇼핑몰의 주문입니다.

    + +
    + +
    + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    주문 상품 목록
    상품명 + + + 옵션항목상태수량판매가소계쿠폰포인트배송비포인트반영재고반영
    + + + + + + + + + + + + + +
    +
    + +
    +

    + + 주문 및 장바구니 상태 변경 + + + + + + + + +

    +
    + +
    +

    주문, 입금, 준비, 배송, 완료는 장바구니와 주문서 상태를 모두 변경하지만, 취소, 반품, 품절은 장바구니의 상태만 변경하며, 주문서 상태는 변경하지 않습니다.

    +

    개별적인(이곳에서의) 상태 변경은 모든 작업을 수동으로 처리합니다. 예를 들어 주문에서 입금으로 상태 변경시 입금액(결제금액)을 포함한 모든 정보는 수동 입력으로 처리하셔야 합니다.

    +
    + +
    + + +
    +

    주문 수량변경 및 주문 전체취소 처리 내역

    +
    + +
    +
    + + +
    + + +
    주의) 이 주문은 테스트용으로 실제 결제가 이루어지지 않았으므로 절대 배송하시면 안됩니다.
    + + +
    주의) 이 주문은 결제취소된 내역이 있습니다. 이니시스 관리자 상점에서 반드시 재확인을 해 주세요.
    + + +
    +

    주문결제 내역

    + + + 0) + $s_receipt_way .= "+포인트"; + ?> + +
    + 미수금 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    주문결제 내역
    주문번호결제방법주문총액배송비포인트결제총결제액쿠폰주문취소
    +
    +
    + +
    +

    결제상세정보

    + + +
    + + + + + + + + + + + + +
    + +
    +

    결제상세정보 확인

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    결제상세정보
    계좌번호
    입금액
    입금자
    입금확인일시 + 입금 확인일시를 체크해 주세요. + () + +
    휴대폰번호
    결제액
    결제 확인일시 + 결제 확인일시를 체크해 주세요. + () + +
    신용카드 결제금액 + 0원 + + +
    카드 승인일시 + 신용카드 결제 일시 정보가 없습니다. + + +
    KAKOPAY 결제금액 + 0원 + + +
    KAKAOPAY 승인일시 + 신용카드 결제 일시 정보가 없습니다. + + +
    결제금액 + 0원 + + +
    승인일시 + 결제 일시 정보가 없습니다. + + +
    결제대행사 링크 + {$pg_test}바로가기
    "; + } + //------------------------------------------------------------------------------ + ?> +
    과세공급가액
    과세부가세액
    비과세공급가액
    주문금액할인
    포인트
    결제취소/환불액
    배송회사
    운송장번호
    배송일시
    + 원 +
    배송비할인
    + 원 +
    현금영수증 + + 현금영수증 확인 + + 현금영수증 발급 + +
    +
    +
    + +
    +

    결제상세정보 수정

    + +
    + + + + + + + + + '.PHP_EOL; + $bank_account .= ''.PHP_EOL; + for ($i=0; $i'.$str[$i].''.PHP_EOL; + } + $bank_account .= ' '; + } + else if ($od['od_settle_case'] == '가상계좌') + $bank_account = $od['od_bank_account'].''; + else if ($od['od_settle_case'] == '계좌이체') + $bank_account = $od['od_settle_case']; + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    결제상세정보 수정
    + + 원 +
    + + + +
    + + +
    + " onclick="if (this.checked == true) this.form.od_receipt_time.value=this.form.od_bank_chk.value; else this.form.od_receipt_time.value = this.form.od_receipt_time.defaultValue;"> +
    + " id="od_receipt_time" class="frm_input" maxlength="19"> +
    휴대폰번호
    + + 원 +
    + " onclick="if (this.checked == true) this.form.od_receipt_time.value=this.form.od_hp_chk.value; else this.form.od_receipt_time.value = this.form.od_receipt_time.defaultValue;"> +
    + " id="op_receipt_time" class="frm_input" size="19" maxlength="19"> +
    + + 원 +
    + " onclick="if (this.checked == true) this.form.od_receipt_time.value=this.form.od_card_chk.value; else this.form.od_receipt_time.value = this.form.od_receipt_time.defaultValue;"> +
    + " id="od_receipt_time" class="frm_input" size="19" maxlength="19"> +
    + + 원 +
    + " onclick="if (this.checked == true) this.form.od_receipt_time.value=this.form.od_card_chk.value; else this.form.od_receipt_time.value = this.form.od_receipt_time.defaultValue;"> +
    + " id="od_receipt_time" class="frm_input" size="19" maxlength="19"> +
    + + 원 +
    + " onclick="if (this.checked == true) this.form.od_receipt_time.value=this.form.od_card_chk.value; else this.form.od_receipt_time.value = this.form.od_receipt_time.defaultValue;"> +
    + " id="od_receipt_time" class="frm_input" size="19" maxlength="19"> +
    + 원 +
    + + + +
    + + +
    + +
    + +
    + " onclick="chk_invoice_time()"> +
    + " class="frm_input" maxlength="19"> +
    + + 메일발송 +
    +
    +
    + +
    + +
    + + 0) { ?> + 개인결제추가 + + 0 && ($od['od_settle_case'] == '신용카드' || $od['od_settle_case'] == '계좌이체' || $od['od_settle_case'] == 'KAKAOPAY')) { ?> + 부분취소 + + 목록 +
    +
    +
    + +
    +

    상점메모

    + +
    +

    + 현재 열람 중인 주문에 대한 내용을 메모하는곳입니다.
    + 입금, 배송 내역을 메일로 발송할 경우 함께 기록됩니다. +

    +
    + +
    + + + + + + + + +
    + + +
    + +
    + +
    + +
    +
    + +
    +

    주문자/배송지 정보

    + + +
    + + + + + + + + +
    + +
    +

    주문하신 분

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    주문자/배송지 정보
    주문하시는 분 주소 + + +
    + + +
    + + +
    + + +
    +
    주문하신 분 IP Address
    +
    +
    + +
    +

    받으시는 분

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    받으시는 분 정보
    받으시는 분 주소 + + +
    + + + + + + +
    +
    + () +
    전달 메세지
    +
    +
    + +
    + +
    + + 목록 +
    + +
    +
    + + + + '.$ct_qty."\n"; + } + + // 재고를 이미 사용했다면 (재고에서 이미 뺐다면) + $stock_use = $ct['ct_stock_use']; + if ($ct['ct_stock_use']) + { + if ($ct_status == '주문' || $ct_status == '취소' || $ct_status == '반품' || $ct_status == '품절') + { + $stock_use = 0; + // 재고에 다시 더한다. + if($ct['io_id']) { + $sql = " update {$g5['g5_shop_item_option_table']} + set io_stock_qty = io_stock_qty + '{$ct['ct_qty']}' + where it_id = '{$ct['it_id']}' + and io_id = '{$ct['io_id']}' + and io_type = '{$ct['io_type']}' "; + } else { + $sql = " update {$g5['g5_shop_item_table']} + set it_stock_qty = it_stock_qty + '{$ct['ct_qty']}' + where it_id = '{$ct['it_id']}' "; + } + + sql_query($sql); + } + } + else + { + // 재고 오류로 인한 수정 + if ($ct_status == '배송' || $ct_status == '완료') + { + $stock_use = 1; + // 재고에서 뺀다. + if($ct['io_id']) { + $sql = " update {$g5['g5_shop_item_option_table']} + set io_stock_qty = io_stock_qty - '{$ct['ct_qty']}' + where it_id = '{$ct['it_id']}' + and io_id = '{$ct['io_id']}' + and io_type = '{$ct['io_type']}' "; + } else { + $sql = " update {$g5['g5_shop_item_table']} + set it_stock_qty = it_stock_qty - '{$ct['ct_qty']}' + where it_id = '{$ct['it_id']}' "; + } + + sql_query($sql); + } + /* 주문 수정에서 "품절" 선택시 해당 상품 자동 품절 처리하기 + else if ($ct_status == '품절') { + $stock_use = 1; + // 재고에서 뺀다. + $sql =" update {$g5['g5_shop_item_table']} set it_stock_qty = 0 where it_id = '{$ct['it_id']}' "; + sql_query($sql); + } */ + } + + $point_use = $ct['ct_point_use']; + // 회원이면서 포인트가 0보다 크면 + // 이미 포인트를 부여했다면 뺀다. + if ($mb_id && $ct['ct_point'] && $ct['ct_point_use']) + { + $point_use = 0; + //insert_point($mb_id, (-1) * ($ct[ct_point] * $ct[ct_qty]), "주문번호 $od_id ($ct_id) 취소"); + delete_point($mb_id, "@delivery", $mb_id, "$od_id,$ct_id"); + } + + // 히스토리에 남김 + // 히스토리에 남길때는 작업|아이디|시간|IP|그리고 나머지 자료 + $now = G5_TIME_YMDHIS; + $ct_history="\n$ct_status|{$member['mb_id']}|$now|$REMOTE_ADDR"; + + $sql = " update {$g5['g5_shop_cart_table']} + set ct_point_use = '$point_use', + ct_stock_use = '$stock_use', + ct_status = '$ct_status', + ct_history = CONCAT(ct_history,'$ct_history') + where od_id = '$od_id' + and ct_id = '$ct_id' "; + sql_query($sql); + + // it_id를 배열에 저장 + if($ct_status == '주문' || $ct_status == '취소' || $ct_status == '반품' || $ct_status == '품절' || $ct_status == '완료') + $arr_it_id[] = $ct['it_id']; +} + +// 상품 판매수량 반영 +if(is_array($arr_it_id) && !empty($arr_it_id)) { + $unq_it_id = array_unique($arr_it_id); + + foreach($unq_it_id as $it_id) { + $sql2 = " select sum(ct_qty) as sum_qty from {$g5['g5_shop_cart_table']} where it_id = '$it_id' and ct_status = '완료' "; + $row2 = sql_fetch($sql2); + + $sql3 = " update {$g5['g5_shop_item_table']} set it_sum_qty = '{$row2['sum_qty']}' where it_id = '$it_id' "; + sql_query($sql3); + } +} + +// 장바구니 상품 모두 취소일 경우 주문상태 변경 +$cancel_change = false; +if (in_array($_POST['ct_status'], $status_cancel)) { + $sql = " select count(*) as od_count1, + SUM(IF(ct_status = '취소' OR ct_status = '반품' OR ct_status = '품절', 1, 0)) as od_count2 + from {$g5['g5_shop_cart_table']} + where od_id = '$od_id' "; + $row = sql_fetch($sql); + + if($row['od_count1'] == $row['od_count2']) { + $cancel_change = true; + + $pg_res_cd = ''; + $pg_res_msg = ''; + $pg_cancel_log = ''; + + // PG 신용카드 결제 취소일 때 + if($pg_cancel == 1) { + $sql = " select * from {$g5['g5_shop_order_table']} where od_id = '$od_id' "; + $od = sql_fetch($sql); + + if($od['od_tno'] && ($od['od_settle_case'] == '신용카드' || $od['od_settle_case'] == '간편결제' || $od['od_settle_case'] == 'KAKAOPAY') || ($od['od_pg'] == 'inicis' && is_inicis_order_pay($od['od_settle_case']) )) { + switch($od['od_pg']) { + case 'lg': + include_once(G5_SHOP_PATH.'/settle_lg.inc.php'); + + $LGD_TID = $od['od_tno']; + + $xpay = new XPay($configPath, $CST_PLATFORM); + + // Mert Key 설정 + $xpay->set_config_value('t'.$LGD_MID, $config['cf_lg_mert_key']); + $xpay->set_config_value($LGD_MID, $config['cf_lg_mert_key']); + + $xpay->Init_TX($LGD_MID); + + $xpay->Set('LGD_TXNAME', 'Cancel'); + $xpay->Set('LGD_TID', $LGD_TID); + + if ($xpay->TX()) { + $res_cd = $xpay->Response_Code(); + if($res_cd != '0000' && $res_cd != 'AV11') { + $pg_res_cd = $res_cd; + $pg_res_msg = $xpay->Response_Msg(); + } + } else { + $pg_res_cd = $xpay->Response_Code(); + $pg_res_msg = $xpay->Response_Msg(); + } + break; + case 'inicis': + include_once(G5_SHOP_PATH.'/settle_inicis.inc.php'); + $cancel_msg = iconv_euckr('쇼핑몰 운영자 승인 취소'); + + /********************* + * 3. 취소 정보 설정 * + *********************/ + $inipay->SetField("type", "cancel"); // 고정 (절대 수정 불가) + $inipay->SetField("mid", $default['de_inicis_mid']); // 상점아이디 + /************************************************************************************************** + * admin 은 키패스워드 변수명입니다. 수정하시면 안됩니다. 1111의 부분만 수정해서 사용하시기 바랍니다. + * 키패스워드는 상점관리자 페이지(https://iniweb.inicis.com)의 비밀번호가 아닙니다. 주의해 주시기 바랍니다. + * 키패스워드는 숫자 4자리로만 구성됩니다. 이 값은 키파일 발급시 결정됩니다. + * 키패스워드 값을 확인하시려면 상점측에 발급된 키파일 안의 readme.txt 파일을 참조해 주십시오. + **************************************************************************************************/ + $inipay->SetField("admin", $default['de_inicis_admin_key']); //비대칭 사용키 키패스워드 + $inipay->SetField("tid", $od['od_tno']); // 취소할 거래의 거래아이디 + $inipay->SetField("cancelmsg", $cancel_msg); // 취소사유 + + /**************** + * 4. 취소 요청 * + ****************/ + $inipay->startAction(); + + /**************************************************************** + * 5. 취소 결과 * + * * + * 결과코드 : $inipay->getResult('ResultCode') ("00"이면 취소 성공) * + * 결과내용 : $inipay->getResult('ResultMsg') (취소결과에 대한 설명) * + * 취소날짜 : $inipay->getResult('CancelDate') (YYYYMMDD) * + * 취소시각 : $inipay->getResult('CancelTime') (HHMMSS) * + * 현금영수증 취소 승인번호 : $inipay->getResult('CSHR_CancelNum') * + * (현금영수증 발급 취소시에만 리턴됨) * + ****************************************************************/ + + $res_cd = $inipay->getResult('ResultCode'); + $res_msg = $inipay->getResult('ResultMsg'); + + if($res_cd != '00') { + $pg_res_cd = $res_cd; + $pg_res_msg = iconv_utf8($res_msg); + } + break; + case 'KAKAOPAY': + include_once(G5_SHOP_PATH.'/settle_kakaopay.inc.php'); + $_REQUEST['TID'] = $od['od_tno']; + $_REQUEST['Amt'] = $od['od_receipt_price']; + $_REQUEST['CancelMsg'] = '쇼핑몰 운영자 승인 취소'; + $_REQUEST['PartialCancelCode'] = 0; + include G5_SHOP_PATH.'/kakaopay/kakaopay_cancel.php'; + break; + default: + include_once(G5_SHOP_PATH.'/settle_kcp.inc.php'); + require_once(G5_SHOP_PATH.'/kcp/pp_ax_hub_lib.php'); + + // locale ko_KR.euc-kr 로 설정 + setlocale(LC_CTYPE, 'ko_KR.euc-kr'); + + $c_PayPlus = new C_PP_CLI_T; + + $c_PayPlus->mf_clear(); + + $ordr_idxx = $od['od_id']; + $tno = $od['od_tno']; + $tran_cd = '00200000'; + $cancel_msg = iconv_euckr('쇼핑몰 운영자 승인 취소'); + $cust_ip = $_SERVER['REMOTE_ADDR']; + $bSucc_mod_type = "STSC"; + + $c_PayPlus->mf_set_modx_data( "tno", $tno ); // KCP 원거래 거래번호 + $c_PayPlus->mf_set_modx_data( "mod_type", $bSucc_mod_type ); // 원거래 변경 요청 종류 + $c_PayPlus->mf_set_modx_data( "mod_ip", $cust_ip ); // 변경 요청자 IP + $c_PayPlus->mf_set_modx_data( "mod_desc", $cancel_msg ); // 변경 사유 + + $c_PayPlus->mf_do_tx( $tno, $g_conf_home_dir, $g_conf_site_cd, + $g_conf_site_key, $tran_cd, "", + $g_conf_gw_url, $g_conf_gw_port, "payplus_cli_slib", + $ordr_idxx, $cust_ip, "3" , + 0, 0, $g_conf_key_dir, $g_conf_log_dir); + + $res_cd = $c_PayPlus->m_res_cd; + $res_msg = $c_PayPlus->m_res_msg; + + if($res_cd != '0000') { + $pg_res_cd = $res_cd; + $pg_res_msg = iconv_utf8($res_msg); + } + + // locale 설정 초기화 + setlocale(LC_CTYPE, ''); + break; + } + + // PG 취소요청 성공했으면 + if($pg_res_cd == '') { + $pg_cancel_log = ' PG 신용카드 승인취소 처리'; + $sql = " update {$g5['g5_shop_order_table']} + set od_refund_price = '{$od['od_receipt_price']}' + where od_id = '$od_id' "; + sql_query($sql); + } + } + } + + // 관리자 주문취소 로그 + $mod_history .= G5_TIME_YMDHIS.' '.$member['mb_id'].' 주문'.$_POST['ct_status'].' 처리'.$pg_cancel_log."\n"; + } +} + +// 미수금 등의 정보 +$info = get_order_info($od_id); + +if(!$info) + alert('주문자료가 존재하지 않습니다.'); + +$sql = " update {$g5['g5_shop_order_table']} + set od_cart_price = '{$info['od_cart_price']}', + od_cart_coupon = '{$info['od_cart_coupon']}', + od_coupon = '{$info['od_coupon']}', + od_send_coupon = '{$info['od_send_coupon']}', + od_cancel_price = '{$info['od_cancel_price']}', + od_send_cost = '{$info['od_send_cost']}', + od_misu = '{$info['od_misu']}', + od_tax_mny = '{$info['od_tax_mny']}', + od_vat_mny = '{$info['od_vat_mny']}', + od_free_mny = '{$info['od_free_mny']}' "; +if ($mod_history) { // 주문변경 히스토리 기록 + $sql .= " , od_mod_history = CONCAT(od_mod_history,'$mod_history') "; +} + +if($cancel_change) { + $sql .= " , od_status = '취소' "; // 주문상품 모두 취소, 반품, 품절이면 주문 취소 +} else { + if (isset($_POST['ct_status']) && in_array($_POST['ct_status'], $status_normal)) { // 정상인 주문상태만 기록 + $sql .= " , od_status = '{$_POST['ct_status']}' "; + } +} + +$sql .= " where od_id = '$od_id' "; +sql_query($sql); + +$qstr = "sort1=$sort1&sort2=$sort2&sel_field=$sel_field&search=$search&page=$page"; + +$url = "./orderform.php?od_id=$od_id&$qstr"; + +// 신용카드 취소 때 오류가 있으면 알림 +if($pg_cancel == 1 && $pg_res_cd && $pg_res_msg) { + alert('오류코드 : '.$pg_res_cd.' 오류내용 : '.$pg_res_msg, $url); +} else { + // 1.06.06 + $od = sql_fetch(" select od_receipt_point from {$g5['g5_shop_order_table']} where od_id = '$od_id' "); + if ($od['od_receipt_point']) + alert("포인트로 결제한 주문은,\\n\\n주문상태 변경으로 인해 포인트의 가감이 발생하는 경우\\n\\n회원관리 > 포인트관리에서 수작업으로 포인트를 맞추어 주셔야 합니다.", $url); + else + goto_url($url); +} \ No newline at end of file diff --git a/adm/shop_admin/orderformreceiptupdate.php b/adm/shop_admin/orderformreceiptupdate.php new file mode 100644 index 000000000..7bfb6b787 --- /dev/null +++ b/adm/shop_admin/orderformreceiptupdate.php @@ -0,0 +1,178 @@ + 0 "; + break; + default: + $where[] = " od_status = '$od_status' "; + break; + } + + switch ($od_status) { + case '주문' : + $sort1 = "od_id"; + $sort2 = "desc"; + break; + case '입금' : // 결제완료 + $sort1 = "od_receipt_time"; + $sort2 = "desc"; + break; + case '배송' : // 배송중 + $sort1 = "od_invoice_time"; + $sort2 = "desc"; + break; + } +} + +if ($od_settle_case) { + if( $od_settle_case === '간편결제' ) { + $where[] = " od_settle_case in ('간편결제', '삼성페이', 'lpay', 'inicis_kakaopay') "; + } else { + $where[] = " od_settle_case = '$od_settle_case' "; + } +} + +if ($od_misu) { + $where[] = " od_misu != 0 "; +} + +if ($od_cancel_price) { + $where[] = " od_cancel_price != 0 "; +} + +if ($od_refund_price) { + $where[] = " od_refund_price != 0 "; +} + +if ($od_receipt_point) { + $where[] = " od_receipt_point != 0 "; +} + +if ($od_coupon) { + $where[] = " ( od_cart_coupon > 0 or od_coupon > 0 or od_send_coupon > 0 ) "; +} + +if ($od_escrow) { + $where[] = " od_escrow = 1 "; +} + +if ($fr_date && $to_date) { + $where[] = " od_time between '$fr_date 00:00:00' and '$to_date 23:59:59' "; +} + +if ($where) { + $sql_search = ' where '.implode(' and ', $where); +} + +if ($sel_field == "") $sel_field = "od_id"; +if ($sort1 == "") $sort1 = "od_id"; +if ($sort2 == "") $sort2 = "desc"; + +$sql_common = " from {$g5['g5_shop_order_table']} $sql_search "; + +$sql = " select count(od_id) as cnt " . $sql_common; +$row = sql_fetch($sql); +$total_count = $row['cnt']; + +$rows = $config['cf_page_rows']; +$total_page = ceil($total_count / $rows); // 전체 페이지 계산 +if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지) +$from_record = ($page - 1) * $rows; // 시작 열을 구함 + +$sql = " select *, + (od_cart_coupon + od_coupon + od_send_coupon) as couponprice + $sql_common + order by $sort1 $sort2 + limit $from_record, $rows "; +$result = sql_query($sql); + +$qstr1 = "od_status=".urlencode($od_status)."&od_settle_case=".urlencode($od_settle_case)."&od_misu=$od_misu&od_cancel_price=$od_cancel_price&od_refund_price=$od_refund_price&od_receipt_point=$od_receipt_point&od_coupon=$od_coupon&fr_date=$fr_date&to_date=$to_date&sel_field=$sel_field&search=$search&save_search=$search"; +if($default['de_escrow_use']) + $qstr1 .= "&od_escrow=$od_escrow"; +$qstr = "$qstr1&sort1=$sort1&sort2=$sort2&page=$page"; + +$listall = '전체목록'; + +// 주문삭제 히스토리 테이블 필드 추가 +if(!sql_query(" select mb_id from {$g5['g5_shop_order_delete_table']} limit 1 ", false)) { + sql_query(" ALTER TABLE `{$g5['g5_shop_order_delete_table']}` + ADD `mb_id` varchar(20) NOT NULL DEFAULT '' AFTER `de_data`, + ADD `de_ip` varchar(255) NOT NULL DEFAULT '' AFTER `mb_id`, + ADD `de_datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `de_ip` ", true); +} + +if( function_exists('pg_setting_check') ){ + pg_setting_check(true); +} +?> + +
    + + 전체 주문내역 + 0) { ?> + 엑셀배송처리 + +
    + +
    + + + + + + + + + + + + + +
    + +
    +
    + 주문상태 + > + + > + + > + + > + + > + + > + + > + + > + +
    + +
    + 결제수단 + > + + > + + > + + > + + > + + > + + > + + > + +
    + +
    + 기타선택 + > + + > + + > + + > + + > + + + > + + +
    + +
    + 주문일자 + ~ + + + + + + + + + +
    +
    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '; + } + else + { + $s_receipt_way = '결제수단없음'; + $s_br = '
    '; + } + + if ($row['od_receipt_point'] > 0) + $s_receipt_way .= $s_br."포인트"; + + $mb_nick = get_sideview($row['mb_id'], get_text($row['od_name']), $row['od_email'], ''); + + $od_cnt = 0; + if ($row['mb_id']) + { + $sql2 = " select count(*) as cnt from {$g5['g5_shop_order_table']} where mb_id = '{$row['mb_id']}' "; + $row2 = sql_fetch($sql2); + $od_cnt = $row2['cnt']; + } + + // 주문 번호에 device 표시 + $od_mobile = ''; + if($row['od_mobile']) + $od_mobile = '(M)'; + + // 주문번호에 - 추가 + switch(strlen($row['od_id'])) { + case 16: + $disp_od_id = substr($row['od_id'],0,8).'-'.substr($row['od_id'],8); + break; + default: + $disp_od_id = substr($row['od_id'],0,6).'-'.substr($row['od_id'],6); + break; + } + + // 주문 번호에 에스크로 표시 + $od_paytype = ''; + if($row['od_test']) + $od_paytype .= '테스트'; + + if($default['de_escrow_use'] && $row['od_escrow']) + $od_paytype .= '에스크로'; + + $uid = md5($row['od_id'].$row['od_time'].$row['od_ip']); + + $invoice_time = is_null_time($row['od_invoice_time']) ? G5_TIME_YMDHIS : $row['od_invoice_time']; + $delivery_company = $row['od_delivery_company'] ? $row['od_delivery_company'] : $default['de_delivery_company']; + + $bg = 'bg'.($i%2); + $td_color = 0; + if($row['od_cancel_price'] > 0) { + $bg .= 'cancel'; + $td_color = 1; + } + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + '; + ?> + + + + + + + + + + + + + + + +
    주문 내역 목록
    + + + ">주문번호주문자주문자전화받는분주문합계
    선불배송비포함
    입금합계주문취소쿠폰미수금보기
    회원ID주문상품수누적주문수
    주문상태결제수단운송장번호배송회사배송일시
    + + + + + + + + + 보기 +
    + + + + 비회원 + +
    + + + + + + + + + + + + + + + + + +
    자료가 없습니다.
      합 계
    +
    + +
    + + + + + + + + + + + + + + + + + 주문상태에서만 삭제가 가능합니다. +
    + +
    +

    + <무통장>인 경우에만 <주문>에서 <입금>으로 변경됩니다. 가상계좌는 입금시 자동으로 <입금>처리됩니다.
    + <준비>에서 <배송>으로 변경시 <에스크로배송등록>을 체크하시면 에스크로 주문에 한해 PG사에 배송정보가 자동 등록됩니다.
    + 주의! 주문번호를 클릭하여 나오는 주문상세내역의 주소를 외부에서 조회가 가능한곳에 올리지 마십시오. +

    +
    + +
    + + + + + + + +"; + + $current_status = $od['od_status']; + $change_status = isset($_POST['od_status']) ? clean_xss_tags($_POST['od_status'], 1, 1) : ''; + + switch ($current_status) + { + case '주문' : + if ($change_status != '입금') continue 2; + if ($od['od_settle_case'] != '무통장') continue 2; + change_status($od_id, '주문', '입금'); + order_update_receipt($od_id); + + // SMS + if($config['cf_sms_use'] == 'icode' && $send_sms && $default['de_sms_use4']) { + $sms_contents = conv_sms_contents($od_id, $default['de_sms_cont4']); + if($sms_contents) { + $receive_number = preg_replace("/[^0-9]/", "", $od['od_hp']); // 수신자번호 + $send_number = preg_replace("/[^0-9]/", "", $default['de_admin_company_tel']); // 발신자번호 + + if($receive_number) + $sms_messages[] = array('recv' => $receive_number, 'send' => $send_number, 'cont' => $sms_contents); + } + } + + // 메일 + if($config['cf_email_use'] && $od_send_mail) + include './ordermail.inc.php'; + + break; + + case '입금' : + if ($change_status != '준비') continue 2; + change_status($od_id, '입금', '준비'); + break; + + case '준비' : + if ($change_status != '배송') continue 2; + + $delivery['invoice'] = $invoice; + $delivery['invoice_time'] = $invoice_time; + $delivery['delivery_company'] = $delivery_company; + + order_update_delivery($od_id, $od['mb_id'], $change_status, $delivery); + change_status($od_id, '준비', '배송'); + + // SMS + if($config['cf_sms_use'] == 'icode' && $send_sms && $default['de_sms_use5']) { + $sms_contents = conv_sms_contents($od_id, $default['de_sms_cont5']); + if($sms_contents) { + $receive_number = preg_replace("/[^0-9]/", "", $od['od_hp']); // 수신자번호 + $send_number = preg_replace("/[^0-9]/", "", $default['de_admin_company_tel']); // 발신자번호 + + if($receive_number) + $sms_messages[] = array('recv' => $receive_number, 'send' => $send_number, 'cont' => $sms_contents); + } + } + + // 메일 + if($config['cf_email_use'] && $od_send_mail) + include './ordermail.inc.php'; + + // 에스크로 배송 + if($send_escrow && $od['od_tno'] && $od['od_escrow']) { + $escrow_tno = $od['od_tno']; + $escrow_numb = $invoice; + $escrow_corp = $delivery_company; + + include(G5_SHOP_PATH.'/'.$od['od_pg'].'/escrow.register.php'); + } + + break; + + case '배송' : + if ($change_status != '완료') continue 2; + change_status($od_id, '배송', '완료'); + + // 완료인 경우에만 상품구입 합계수량을 상품테이블에 저장한다. + $sql2 = " select it_id from {$g5['g5_shop_cart_table']} where od_id = '$od_id' and ct_status = '완료' group by it_id "; + $result2 = sql_query($sql2); + for ($k=0; $row2=sql_fetch_array($result2); $k++) { + $sql3 = " select sum(ct_qty) as sum_qty from {$g5['g5_shop_cart_table']} where it_id = '{$row2['it_id']}' and ct_status = '완료' "; + $row3 = sql_fetch($sql3); + + $sql4 = " update {$g5['g5_shop_item_table']} set it_sum_qty = '{$row3['sum_qty']}' where it_id = '{$row2['it_id']}' "; + sql_query($sql4); + } + /* + $sql2 = " select it_id, sum(ct_qty) as sum_qty from {$g5['g5_shop_cart_table']} where od_id = '$od_id' and ct_status = '완료' group by it_id "; + $result2 = sql_query($sql2); + for ($k=0; $row2=sql_fetch_array($result2); $k++) { + $sql3 = " update {$g5['g5_shop_item_table']} set it_sum_qty = it_sum_qty + '{$row2['sum_qty']}' where it_id = '{$row2['it_id']}' "; + sql_query($sql3); + } + */ + break; + + } // switch end + + + // 주문정보 + $info = get_order_info($od_id); + if(!$info) continue; + + $sql = " update {$g5['g5_shop_order_table']} + set od_misu = '{$info['od_misu']}', + od_tax_mny = '{$info['od_tax_mny']}', + od_vat_mny = '{$info['od_vat_mny']}', + od_free_mny = '{$info['od_free_mny']}', + od_send_cost = '{$info['od_send_cost']}' + where od_id = '$od_id' "; + sql_query($sql, true); + +} + +// SMS +$sms_count = count($sms_messages); +if($sms_count > 0) { + if($config['cf_sms_type'] == 'LMS') { + include_once(G5_LIB_PATH.'/icode.lms.lib.php'); + + $port_setting = get_icode_port_type($config['cf_icode_id'], $config['cf_icode_pw']); + + // SMS 모듈 클래스 생성 + if($port_setting !== false) { + $SMS = new LMS; + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting); + + for($s=0; $s<$sms_count; $s++) { + $strDest = array(); + $strDest[] = $sms_messages[$s]['recv']; + $strCallBack = $sms_messages[$s]['send']; + $strCaller = iconv_euckr(trim($default['de_admin_company_name'])); + $strSubject = ''; + $strURL = ''; + $strData = iconv_euckr($sms_messages[$s]['cont']); + $strDate = ''; + $nCount = count($strDest); + + $res = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount); + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } + } else { + include_once(G5_LIB_PATH.'/icode.sms.lib.php'); + + $SMS = new SMS; // SMS 연결 + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + + for($s=0; $s<$sms_count; $s++) { + $recv_number = $sms_messages[$s]['recv']; + $send_number = $sms_messages[$s]['send']; + $sms_content = iconv_euckr($sms_messages[$s]['cont']); + + $SMS->Add($recv_number, $send_number, $config['cf_icode_id'], $sms_content, ""); + } + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } +} + +$qstr = "sort1=$sort1&sort2=$sort2&sel_field=$sel_field&search=$search"; +$qstr .= "&od_status=$od_status"; +$qstr .= "&od_settle_case=$od_settle_case"; +$qstr .= "&od_misu=$od_misu"; +$qstr .= "&od_cancel_price=$od_cancel_price"; +$qstr .= "&od_receipt_price=$od_receipt_price"; +$qstr .= "&od_receipt_point=$od_receipt_point"; +$qstr .= "&od_receipt_coupon=$od_receipt_coupon"; +//$qstr .= "&page=$page"; + +//exit; + +goto_url("./orderlist.php?$qstr"); \ No newline at end of file diff --git a/adm/shop_admin/ordermail.inc.php b/adm/shop_admin/ordermail.inc.php new file mode 100644 index 000000000..9e3bccd3e --- /dev/null +++ b/adm/shop_admin/ordermail.inc.php @@ -0,0 +1,108 @@ + 0 && $od['od_settle_case'] == '신용카드') { + $card_list['od_receipt_time'] = $od['od_receipt_time']; + $card_list['od_receipt_price'] = display_price($od['od_receipt_price']); + + $is_receipt = true; + } + + // 무통장 입금 + if ($od['od_receipt_price'] > 0 && $od['od_settle_case'] == '무통장') { + $bank_list['od_receipt_time'] = $od['od_receipt_time']; + $bank_list['od_receipt_price'] = display_price($od['od_receipt_price']); + $bank_list['od_deposit_name'] = $od['od_deposit_name']; + + $is_receipt = true; + } + + // 포인트 입금 + if ($od['od_receipt_point'] > 0) { + $point_list['od_time'] = $od['od_time']; + $point_list['od_receipt_point'] = display_point($od['od_receipt_point']); + + $is_receipt = true; + } + + // 배송정보 + $is_delivery = false; + if ($od['od_delivery_company'] && $od['od_invoice']) { + $delivery_list['dl_company'] = $od['od_delivery_company']; + $delivery_list['od_invoice'] = $od['od_invoice']; + $delivery_list['od_invoice_time'] = $od['od_invoice_time']; + $delivery_list['dl_inquiry'] = get_delivery_inquiry($od['od_delivery_company'], $od['od_invoice'], 'dvr_link'); + + $is_delivery = true; + } + + // 입금 또는 배송내역이 있다면 메일 발송 + if ($is_receipt || $is_delivery) + { + ob_start(); + include G5_SHOP_PATH.'/mail/ordermail.mail.php'; + $content = ob_get_contents(); + ob_end_clean(); + + $title = $config['cf_title'].' - '.$od['od_name'].'님 주문 처리 내역 안내'; + $email = $od['od_email']; + + // 메일 보낸 내역 상점메모에 update + $od_shop_memo = G5_TIME_YMDHIS.' - 결제/배송내역 메일발송\n' . $od['od_shop_memo']; + /* 1.00.06 + ** 주석처리 - 처리하지 않음 + if ($receipt_check) + $od_shop_memo .= ", 입금확인"; + if ($invoice_check) + $od_shop_memo .= ", 송장번호"; + */ + + sql_query(" update {$g5['g5_shop_order_table']} set od_shop_memo = '$od_shop_memo' where od_id = '$od_id' "); + + mailer($config['cf_admin_email_name'], $config['cf_admin_email'], $email, $title, $content, 1); + } +} \ No newline at end of file diff --git a/adm/shop_admin/orderpartcancel.php b/adm/shop_admin/orderpartcancel.php new file mode 100644 index 000000000..089482f95 --- /dev/null +++ b/adm/shop_admin/orderpartcancel.php @@ -0,0 +1,107 @@ += G5_TIME_YMD) + alert_close('실시간 계좌이체건의 부분취소 요청은 결제일 익일에 가능합니다.'); + +if($od['od_receipt_price'] - $od['od_refund_price'] <= 0) + alert_close('부분취소 처리할 금액이 없습니다.'); + +$g5['title'] = $od['od_settle_case'].' 부분취소'; +include_once(G5_PATH.'/head.sub.php'); + +// 취소가능금액 +$od_misu = abs($od['od_misu']); +?> + +
    + + +
    +

    부분취소

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    입력
    취소가능 금액
    +
    + +
    + + +
    +
    +
    + + + += G5_TIME_YMD) + alert_close('실시간 계좌이체건의 부분취소 요청은 결제일 익일에 가능합니다.'); + +// 금액비교 +$od_misu = abs($od['od_misu']); + +if(($tax_mny && $free_mny) && ($tax_mny + $free_mny) > $od_misu) + alert('과세, 비과세 취소금액의 합을 '.display_price($od_misu).' 이하로 입력해 주십시오.'); + +if($tax_mny && $tax_mny > $od_misu) + alert('과세 취소금액을 '.display_price($od_misu).' 이하로 입력해 주십시오.'); + +if($free_mny && $free_mny > $od_misu) + alert('비과세 취소금액을 '.display_price($od_misu).' 이하로 입력해 주십시오.'); + +// PG사별 부분취소 실행 +include_once(G5_SHOP_PATH.'/'.strtolower($od['od_pg']).'/orderpartcancel.inc.php'); + +include_once(G5_PATH.'/head.sub.php'); +?> + + + + + +
    + +
    +
    + + + 기간별 출력 + + + + + + + + " id="fr_date" required class="required frm_input" size="10" maxlength="8"> + ~ + + " id="to_date" required class="required frm_input" size="10" maxlength="8"> + + +
    +
    + +
    + +
    + + 주문번호구간별 출력 + + + + + + + + + + ~ + + + + +
    +
    + +
    + + + +
    +

    기간별 혹은 주문번호구간별 주문내역을 새창으로 출력할 수 있습니다.

    +
    + + + += '5.2.0') { + include_once(G5_LIB_PATH.'/PHPExcel.php'); + + $headers = array('우편번호', '주소', '이름', '전화1', '전화2', '상품명', '수량', '선택사항', '배송비', '상품코드', '주문번호', '운송장번호', '전하실말씀'); + $widths = array(10, 30, 10, 15, 15, 15, 10, 10, 20, 15, 20, 20, 50); + $header_bgcolor = 'FFABCDEF'; + $last_char = column_char(count($headers) - 1); + + for($i=1; $row=sql_fetch_array($result); $i++) { + + $pull_address = print_address($row['od_b_addr1'], $row['od_b_addr2'], $row['od_b_addr3'], $row['od_b_addr_jibeon']); + + $save_it_id = ''; + $ct_send_cost = ''; + if($save_it_id != $row['it_id']) { + // 합계금액 계산 + $sql = " select SUM(IF(io_type = 1, (io_price * ct_qty), ((ct_price + io_price) * ct_qty))) as price, + SUM(ct_qty) as qty + from {$g5['g5_shop_cart_table']} + where it_id = '{$row['it_id']}' + and od_id = '{$row['od_id']}' "; + $sum = sql_fetch($sql); + + switch($row['ct_send_cost']) + { + case 1: + $ct_send_cost = '착불'; + break; + case 2: + $ct_send_cost = '무료'; + break; + default: + $ct_send_cost = '선불'; + break; + } + + // 조건부무료 + if($row['it_sc_type'] == 2) { + $sendcost = get_item_sendcost($row['it_id'], $sum['price'], $sum['qty'], $row['od_id']); + + if($sendcost == 0) + $ct_send_cost = '무료'; + } + + $save_it_id = $row['it_id']; + + $ct_send_cost = $ct_send_cost; + } + + $rows[] = array(' '.$row['od_b_zip1'].$row['od_b_zip2'], + $pull_address, + $row['od_b_name'], + ' '.conv_telno($row['od_b_tel']), + ' '.conv_telno($row['od_b_hp']), + preg_replace("/\"/", """, $row['it_name']), + ' '.$row['ct_qty'], + $row['ct_option'], + $ct_send_cost, + ' '.$row['it_id'], + ' '.$row['od_id'], + ' '.$row['od_invoice'], + preg_replace("/\"/", """, $row['od_memo'])); + } + + $data = array_merge(array($headers), $rows); + + $excel = new PHPExcel(); + $excel->setActiveSheetIndex(0)->getStyle( "A1:${last_char}1" )->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB($header_bgcolor); + $excel->setActiveSheetIndex(0)->getStyle( "A:$last_char" )->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)->setWrapText(true); + foreach($widths as $i => $w) $excel->setActiveSheetIndex(0)->getColumnDimension( column_char($i) )->setWidth($w); + $excel->getActiveSheet()->fromArray($data,NULL,'A1'); + + header("Content-Type: application/octet-stream"); + header("Content-Disposition: attachment; filename=\"orderlist-".date("ymd", time()).".xls\""); + header("Cache-Control: max-age=0"); + + $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5'); + $writer->save('php://output'); + + } else { + /*================================================================================ + php_writeexcel http://www.bettina-attack.de/jonny/view.php/projects/php_writeexcel/ + =================================================================================*/ + + include_once(G5_LIB_PATH.'/Excel/php_writeexcel/class.writeexcel_workbook.inc.php'); + include_once(G5_LIB_PATH.'/Excel/php_writeexcel/class.writeexcel_worksheet.inc.php'); + + $fname = tempnam(G5_DATA_PATH, "tmp-orderlist.xls"); + $workbook = new writeexcel_workbook($fname); + $worksheet = $workbook->addworksheet(); + + // Put Excel data + $data = array('우편번호', '주소', '이름', '전화1', '전화2', '상품명', '수량', '선택사항', '배송비', '상품코드', '주문번호', '운송장번호', '전하실말씀'); + $data = array_map('iconv_euckr', $data); + + $col = 0; + foreach($data as $cell) { + $worksheet->write(0, $col++, $cell); + } + + $save_it_id = ''; + for($i=1; $row=sql_fetch_array($result); $i++) + { + if($save_it_id != $row['it_id']) { + // 합계금액 계산 + $sql = " select SUM(IF(io_type = 1, (io_price * ct_qty), ((ct_price + io_price) * ct_qty))) as price, + SUM(ct_qty) as qty + from {$g5['g5_shop_cart_table']} + where it_id = '{$row['it_id']}' + and od_id = '{$row['od_id']}' "; + $sum = sql_fetch($sql); + + switch($row['ct_send_cost']) + { + case 1: + $ct_send_cost = '착불'; + break; + case 2: + $ct_send_cost = '무료'; + break; + default: + $ct_send_cost = '선불'; + break; + } + + // 조건부무료 + if($row['it_sc_type'] == 2) { + $sendcost = get_item_sendcost($row['it_id'], $sum['price'], $sum['qty'], $row['od_id']); + + if($sendcost == 0) + $ct_send_cost = '무료'; + } + + $save_it_id = $row['it_id']; + + $ct_send_cost = iconv_euckr($ct_send_cost); + } + + $pull_address = iconv('UTF-8', 'UHC', print_address($row['od_b_addr1'], $row['od_b_addr2'], $row['od_b_addr3'], $row['od_b_addr_jibeon'])); + + $row = array_map('iconv_euckr', $row); + + $worksheet->write($i, 0, ' '.$row['od_b_zip1'].$row['od_b_zip2']); + $worksheet->write($i, 1, $pull_address); + $worksheet->write($i, 2, $row['od_b_name']); + $worksheet->write($i, 3, ' '.$row['od_b_tel']); + $worksheet->write($i, 4, ' '.$row['od_b_hp']); + $worksheet->write($i, 5, $row['it_name']); + $worksheet->write($i, 6, $row['ct_qty']); + $worksheet->write($i, 7, $row['ct_option']); + $worksheet->write($i, 8, $ct_send_cost); + $worksheet->write($i, 9, ' '.$row['it_id']); + $worksheet->write($i, 10, ' '.$row['od_id']); + $worksheet->write($i, 11, $row['od_invoice']); + $worksheet->write($i, 12, $row['od_memo']); + } + + $workbook->close(); + + header("Content-Type: application/x-msexcel; name=\"orderlist-".date("ymd", time()).".xls\""); + header("Content-Disposition: inline; filename=\"orderlist-".date("ymd", time()).".xls\""); + $fh=fopen($fname, "rb"); + fpassthru($fh); + unlink($fname); + + exit; + } //end if php 5.2.0 +} + + +function get_order($od_id) +{ + global $g5; + + $sql = " select * from {$g5['g5_shop_order_table']} where od_id = '$od_id' "; + return sql_fetch($sql); +} + +$g5['title'] = "주문내역"; +include_once(G5_PATH.'/head.sub.php'); + +if ($case == 1) +{ + $fr_date = date_conv($fr_date); + $to_date = date_conv($to_date); + $sql = " SELECT DISTINCT a.od_id FROM {$g5['g5_shop_order_table']} a, {$g5['g5_shop_cart_table']} b + where a.od_id = b.od_id + and a.od_time between '$fr_date 00:00:00' and '$to_date 23:59:59' "; +} +else +{ + $sql = " SELECT DISTINCT a.od_id FROM {$g5['g5_shop_order_table']} a, {$g5['g5_shop_cart_table']} b + where a.od_id = b.od_id + and a.od_id between '$fr_od_id' and '$to_od_id' "; +} +if ($ct_status) + $sql .= " and b.ct_status = '$ct_status' "; +$sql .= " order by a.od_id "; + +$result = sql_query($sql); +if (sql_num_rows($result) == 0) +{ + echo ""; + exit; +} +?> + +
    +

    + +

    + + + +
    +

    주문번호

    +

    보내는 사람 :

    + +
    +
    주소
    +
    +
    휴대폰
    +
    +
    전화번호
    +
    +
    + +

    보내는 사람과 받는 사람이 동일합니다.

    + +

    받는 사람 :

    +
    +
    주소
    +
    +
    휴대폰
    +
    +
    전화번호
    +
    +
    + + +

    주문 목록

    +
    + + + + + + + + + + + + + = 0) + $price_plus = '+'; + + $it_name = "$it_name ({$row2['ct_option']} ".$price_plus.display_price($row2['io_price']).")"; + + if($save_it_id != $row2['it_id']) { + switch($row2['ct_send_cost']) + { + case 1: + $ct_send_cost = '착불'; + break; + case 2: + $ct_send_cost = '무료'; + break; + default: + $ct_send_cost = '선불'; + break; + } + + // 합계금액 계산 + $sql = " select SUM(IF(io_type = 1, (io_price * ct_qty), ((ct_price + io_price) * ct_qty))) as price, + SUM(ct_qty) as qty + from {$g5['g5_shop_cart_table']} + where it_id = '{$row2['it_id']}' + and od_id = '{$row2['od_id']}' "; + $sum = sql_fetch($sql); + + // 조건부무료 + if($row2['it_sc_type'] == 2) { + $sendcost = get_item_sendcost($row2['it_id'], $sum['price'], $sum['qty'], $row['od_id']); + + if($sendcost == 0) + $ct_send_cost = '무료'; + } + + $save_it_id = $row2['it_id']; + } + + $fontqty1 = $fontqty2 = ""; + if ($row2['ct_qty'] >= 2) + { + $fontqty1 = ""; + $fontqty2 = ""; + } + + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    주문 목록
    상품명(선택사항)판매가수량소계배송비
    배송비1
    추가 배송비1
    합계
    +
    + 비고 $od_memo

    "; + if ($od_shop_memo) $od_shop_memo = "

    상점메모 $od_shop_memo

    "; + + echo " + $od_memo + $od_shop_memo + "; + ?> +
    + + + +
    + + 전체 + 개 + 원 + + <출력 끝> +
    + +
    + + + + \ No newline at end of file diff --git a/adm/shop_admin/ordersms.inc.php b/adm/shop_admin/ordersms.inc.php new file mode 100644 index 000000000..b6c57c1c3 --- /dev/null +++ b/adm/shop_admin/ordersms.inc.php @@ -0,0 +1,90 @@ + $receive_number, 'send' => $send_number, 'cont' => $sms_contents); + } + } + + if ($od_sms_baesong_check && $default['de_sms_use5']) + { + if ($od_delivery_company && $od_invoice) + { + $sms_contents = $default['de_sms_cont5']; + $sms_contents = str_replace("{이름}", $od_name, $sms_contents); + $sms_contents = str_replace("{택배회사}", $od_delivery_company, $sms_contents); + $sms_contents = str_replace("{운송장번호}", $od_invoice, $sms_contents); + $sms_contents = str_replace("{주문번호}", $od_id, $sms_contents); + $sms_contents = str_replace("{회사명}", $default['de_admin_company_name'], $sms_contents); + + if($receive_number) + $sms_messages[] = array('recv' => $receive_number, 'send' => $send_number, 'cont' => $sms_contents); + } + } + + $sms_count = count($sms_messages); + + if($sms_count > 0) { + if($config['cf_sms_type'] == 'LMS') { + include_once(G5_LIB_PATH.'/icode.lms.lib.php'); + + $port_setting = get_icode_port_type($config['cf_icode_id'], $config['cf_icode_pw']); + + // SMS 모듈 클래스 생성 + if($port_setting !== false) { + $SMS = new LMS; + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting); + + for($s=0; $s<$sms_count; $s++) { + $strDest = array(); + $strDest[] = $sms_messages[$s]['recv']; + $strCallBack = $sms_messages[$s]['send']; + $strCaller = iconv_euckr(trim($default['de_admin_company_name'])); + $strSubject = ''; + $strURL = ''; + $strData = iconv_euckr($sms_messages[$s]['cont']); + $strDate = ''; + $nCount = count($strDest); + + $res = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount); + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } + } else { + include_once(G5_LIB_PATH.'/icode.sms.lib.php'); + + $SMS = new SMS; // SMS 연결 + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + + for($s=0; $s<$sms_count; $s++) { + $recv_number = $sms_messages[$s]['recv']; + $send_number = $sms_messages[$s]['send']; + $sms_content = iconv_euckr($sms_messages[$s]['cont']); + + $SMS->Add($recv_number, $send_number, $config['cf_icode_id'], $sms_content, ""); + } + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } +} \ No newline at end of file diff --git a/adm/shop_admin/personalpaycopy.php b/adm/shop_admin/personalpaycopy.php new file mode 100644 index 000000000..09ef7d0e9 --- /dev/null +++ b/adm/shop_admin/personalpaycopy.php @@ -0,0 +1,67 @@ + + +
    +

    개인결제 복사

    + +
    + + +
    + + + + + + + + + + + + + + + + +
    +
    + +
    + + +
    + +
    + +
    + + + + + + + +'', 'pp_price'=>0, 'od_id'=>'', 'pp_content'=>'', 'pp_settle_case'=>'', 'pp_receipt_time'=>'', 'pp_receipt_price'=>0, 'pp_shop_memo'=>''); + +if ($w == 'u') { + $html_title = '개인결제 수정'; + + $sql = " select * from {$g5['g5_shop_personalpay_table']} where pp_id = '$pp_id' "; + $pp = sql_fetch($sql); + if (!$pp['pp_id']) alert('등록된 자료가 없습니다.'); +} +else +{ + $html_title = '개인결제 입력'; + $pp['pp_use'] = 1; +} + +$wrp_tag_st = ''; +$wrp_tag_end = ''; +if($popup == 'yes') { // 팝업창일 때 + include_once(G5_PATH.'/head.sub.php'); + $pp['od_id'] = $od_id; + $sql = " select od_id, od_name, od_misu + from {$g5['g5_shop_order_table']} + where od_id = '$od_id' "; + $od = sql_fetch($sql); + + if(!$od['od_id']) + alert_close('주문정보가 존재하지 않습니다.'); + + $pp['pp_name'] = $od['od_name']; + + if($od['od_misu'] > 0) + $pp['pp_price'] = $od['od_misu']; + $wrp_tag_st = '
    '.PHP_EOL.'

    '.$html_title.'

    '; + $wrp_tag_end = '
    '; +} +else { // 현재페이지일 때 + include_once (G5_ADMIN_PATH.'/admin.head.php'); +} +$pg_anchor = ''; + +// pg 설정 필드 추가 +if(!sql_query(" select pp_pg from {$g5['g5_shop_personalpay_table']} limit 1 ", false)) { + sql_query(" ALTER TABLE `{$g5['g5_shop_personalpay_table']}` + ADD `pp_pg` varchar(255) NOT NULL DEFAULT '' AFTER `pp_price` ", true); + + // 개인결제 PG kcp로 설정 + sql_query(" update {$g5['g5_shop_personalpay_table']} set pp_pg = 'kcp' "); +} + +// 현금영수증 필드 추가 +if(!sql_query(" select pp_cash from {$g5['g5_shop_personalpay_table']} limit 1 ", false)) { + sql_query(" ALTER TABLE `{$g5['g5_shop_personalpay_table']}` + ADD `pp_cash` tinyint(4) NOT NULL DEFAULT '0' AFTER `pp_shop_memo`, + ADD `pp_cash_no` varchar(255) NOT NULL DEFAULT '' AFTER `pp_cash`, + ADD `pp_cash_info` text NOT NULL AFTER `pp_cash_no`, + ADD `pp_email` varchar(255) NOT NULL DEFAULT '' AFTER `pp_name`, + ADD `pp_hp` varchar(255) NOT NULL DEFAULT '' AFTER `pp_email`, + ADD `pp_casseqno` varchar(255) NOT NULL DEFAULT '' AFTER `pp_app_no` ", true); +} +?> + +
    + + + + + + + + + + + + + + +
    +

    주문 정보

    + +
    +

    주문 관련 기본 정보입니다.

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    주문 정보 목록
    +
    +
    + + + + +
    +

    결제 정보

    + +
    +

    결제 관련 정보입니다.

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + 0) + $is_cash_receipt = false; + } + + if ($is_cash_receipt && ($pp['pp_price'] - $pp['pp_receipt_price']) == 0) { + if ($pp['pp_receipt_price'] && ($pp['pp_settle_case'] == '무통장' || $pp['pp_settle_case'] == '가상계좌' || $pp['pp_settle_case'] == '계좌이체')) { + ?> + + + + + + + + + + + + + + + +
    결제 정보 목록
    + +
    + " onclick="if (this.checked == true) this.form.pp_receipt_time.value=this.form.pp_receipt_chk.value; else this.form.pp_receipt_time.value = this.form.pp_receipt_time.defaultValue;"> +
    + " id="pp_receipt_time" class="frm_input" maxlength="19"> +
    현금영수증 + + 현금영수증 확인 + + 현금영수증 발급 + +
    + +
    +
    +
    + + + +
    + + + + + 목록 + + + 삭제 + +
    + + +
    + + + +'.PHP_EOL; + include_once(G5_PATH.'/tail.sub.php'); +} else { + include_once (G5_ADMIN_PATH.'/admin.tail.php'); +} \ No newline at end of file diff --git a/adm/shop_admin/personalpayformupdate.php b/adm/shop_admin/personalpayformupdate.php new file mode 100644 index 000000000..6cac54d61 --- /dev/null +++ b/adm/shop_admin/personalpayformupdate.php @@ -0,0 +1,82 @@ + + +
    + 전체 +
    + +
    + + + + +
    + + + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + '.$row['od_id'].''; + else + $od_id = ' '; + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + + + + + + + '; + ?> + +
    목록
    + + + 제목주문번호주문금액입금금액미수금액입금방법입금일사용관리
    + + + + 수정 + 복사 +
    자료가 없습니다.
    +
    + + + +
    + + + + + + +
  • 가격비교사이트 연동 안내
  • +
  • 사이트별 엔진페이지 URL
  • +'; +?> + +
    +

    가격비교사이트 연동 안내

    + + +
    +
      +
    1. 가격비교사이트는 네이버 지식쇼핑, 다음 쇼핑하우 등이 있습니다.
    2. +
    3. 앞서 나열한 가격비교사이트 중 희망하시는 사이트에 입점합니다.
    4. +
    5. 사이트별 엔진페이지 URL을 참고하여 해당 엔진페이지 URL 을 입점하신 사이트에 알려주시면 됩니다.
    6. +
    +
    +
    + +
    +

    사이트별 엔진페이지 URL

    + + +
    +

    사이트 명을 클릭하시면 해당 사이트로 이동합니다.

    + +
    +
    네이버쇼핑
    +
    + +
    + +
    구글 쇼핑
    +
    + +
    +
    Feed 설명
    +
    +
      +
    • 판매국가 대한민국, 언어 한국어 설정 기준입니다.
    • +
    • 기본 피드 이름 : 쇼핑몰피드
    • +
    • 상품 설명 : it_basic (상품기본설명을 필수 입력해주세요. HTML 태그는 자동 제거됩니다.)
    • +
    +
    + +
    다음 쇼핑하우
    +
    + +
    +
    +
    +
    + + + +
    + +
    +
    + 일일 매출 + " id="date" required class="required frm_input" size="8" maxlength="8"> + + +
    +
    + +
    +
    + 일간 매출 + " id="fr_date" required class="required frm_input" size="8" maxlength="8"> + + " id="to_date" required class="required frm_input" size="8" maxlength="8"> + + +
    +
    + +
    +
    + 월간 매출 + " id="fr_month" required class="required frm_input" size="6" maxlength="6"> + + " id="to_month" required class="required frm_input" size="6" maxlength="6"> + + +
    +
    + +
    +
    + 연간 매출 + " id="fr_year" required class="required frm_input" size="4" maxlength="4"> + + " id="to_year" required class="required frm_input" size="4" maxlength="4"> + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + 0, 'orderprice'=>0, 'ordercancel'=>0, 'ordercoupon'=>0, 'receiptbank'=>0, 'receiptvbank'=>0, 'receiptiche'=>0, 'receipthp'=>0, 'receiptcard'=>0, 'receiptpoint'=>0, 'misu'=>0, 'receipteasy'=>0); + $tot = array('ordercount'=>0, 'orderprice'=>0, 'ordercancel'=>0, 'ordercoupon'=>0, 'receiptbank'=>0, 'receiptvbank'=>0, 'receiptiche'=>0, 'receipthp'=>0, 'receiptcard'=>0, 'receiptpoint'=>0, 'misu'=>0, 'receipteasy'=>0); + + for ($i=0; $row=sql_fetch_array($result); $i++) + { + if ($i == 0) + $save['od_date'] = $row['od_date']; + + if ($save['od_date'] != $row['od_date']) { + print_line($save); + $save = array('ordercount'=>0, 'orderprice'=>0, 'ordercancel'=>0, 'ordercoupon'=>0, 'receiptbank'=>0, 'receiptvbank'=>0, 'receiptiche'=>0, 'receipthp'=>0, 'receiptcard'=>0, 'receiptpoint'=>0, 'misu'=>0, 'receipteasy'=>0); + $save['od_date'] = $row['od_date']; + } + + $save['ordercount']++; + $save['orderprice'] += $row['orderprice']; + $save['ordercancel'] += $row['od_cancel_price']; + $save['ordercoupon'] += $row['couponprice']; + if($row['od_settle_case'] == '무통장') + $save['receiptbank'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '가상계좌') + $save['receiptvbank'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '계좌이체') + $save['receiptiche'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '휴대폰') + $save['receipthp'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '신용카드') + $save['receiptcard'] += $row['od_receipt_price']; + $save['receiptpoint'] += $row['od_receipt_point']; + $save['misu'] += $row['od_misu']; + + $tot['ordercount']++; + $tot['orderprice'] += $row['orderprice']; + $tot['ordercancel'] += $row['od_cancel_price']; + $tot['ordercoupon'] += $row['couponprice']; + if($row['od_settle_case'] == '무통장') + $tot['receiptbank'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '가상계좌') + $tot['receiptvbank'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '계좌이체') + $tot['receiptiche'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '휴대폰') + $tot['receipthp'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '신용카드') + $tot['receiptcard'] += $row['od_receipt_price']; + $tot['receiptpoint'] += $row['od_receipt_point']; + $tot['misu'] += $row['od_misu']; + + if(in_array($row['od_settle_case'], array('간편결제', 'KAKAOPAY', 'lpay', 'inicis_payco', 'inicis_kakaopay', '삼성페이'))) { + $save['receipteasy'] += $row['od_receipt_price']; + $tot['receipteasy'] += $row['od_receipt_price']; + } + } + + if ($i == 0) { + echo ''; + } else { + print_line($save); + } + ?> + + + + + + + + + + + + + + + + + + +
    주문일주문수주문합계쿠폰무통장가상계좌계좌이체카드입금간편결제휴대폰포인트입금주문취소미수금
    자료가 없습니다.
    합계
    +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + 0, 'orderprice'=>0, 'ordercancel'=>0, 'ordercoupon'=>0, 'receiptbank'=>0, 'receiptvbank'=>0, 'receiptiche'=>0, 'receipthp'=>0, 'receiptcard'=>0, 'receiptpoint'=>0, 'misu'=>0, 'receipteasy'=>0); + $tot = array('ordercount'=>0, 'orderprice'=>0, 'ordercancel'=>0, 'ordercoupon'=>0, 'receiptbank'=>0, 'receiptvbank'=>0, 'receiptiche'=>0, 'receipthp'=>0, 'receiptcard'=>0, 'receiptpoint'=>0, 'misu'=>0, 'receipteasy'=>0); + + for ($i=0; $row=sql_fetch_array($result); $i++) + { + if ($i == 0) + $save['od_date'] = $row['od_date']; + + if ($save['od_date'] != $row['od_date']) { + print_line($save); + $save = array('ordercount'=>0, 'orderprice'=>0, 'ordercancel'=>0, 'ordercoupon'=>0, 'receiptbank'=>0, 'receiptvbank'=>0, 'receiptiche'=>0, 'receipthp'=>0, 'receiptcard'=>0, 'receiptpoint'=>0, 'misu'=>0, 'receipteasy'=>0); + $save['od_date'] = $row['od_date']; + } + + $save['ordercount']++; + $save['orderprice'] += $row['orderprice']; + $save['ordercancel'] += $row['od_cancel_price']; + $save['ordercoupon'] += $row['couponprice']; + if($row['od_settle_case'] == '무통장') + $save['receiptbank'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '가상계좌') + $save['receiptvbank'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '계좌이체') + $save['receiptiche'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '휴대폰') + $save['receipthp'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '신용카드') + $save['receiptcard'] += $row['od_receipt_price']; + $save['receiptpoint'] += $row['od_receipt_point']; + $save['misu'] += $row['od_misu']; + + $tot['ordercount']++; + $tot['orderprice'] += $row['orderprice']; + $tot['ordercancel'] += $row['od_cancel_price']; + $tot['ordercoupon'] += $row['couponprice']; + if($row['od_settle_case'] == '무통장') + $tot['receiptbank'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '가상계좌') + $tot['receiptvbank'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '계좌이체') + $tot['receiptiche'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '휴대폰') + $tot['receipthp'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '신용카드') + $tot['receiptcard'] += $row['od_receipt_price']; + $tot['receiptpoint'] += $row['od_receipt_point']; + $tot['misu'] += $row['od_misu']; + + if(in_array($row['od_settle_case'], array('간편결제', 'KAKAOPAY', 'lpay', 'inicis_payco', 'inicis_kakaopay', '삼성페이'))) { + $save['receipteasy'] += $row['od_receipt_price']; + $tot['receipteasy'] += $row['od_receipt_price']; + } + } + + if ($i == 0) { + echo ''; + } else { + print_line($save); + } + ?> + + + + + + + + + + + + + + + + + + +
    주문월주문수주문합계쿠폰무통장가상계좌계좌이체카드입금간편결제휴대폰포인트입금주문취소미수금
    자료가 없습니다.
    합 계
    +
    + + +0, +'coupon'=>0, +'receipt_bank'=>0, +'receipt_vbank'=>0, +'receipt_iche'=>0, +'receipt_card'=>0, +'receipt_easy'=>0, +'receipt_hp'=>0, +'receipt_point'=>0, +'ordercancel'=>0, +'misu'=>0, +); +$date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "\\1-\\2-\\3", $date); + +$g5['title'] = "$date 일 매출현황"; +include_once (G5_ADMIN_PATH.'/admin.head.php'); + +$sql = " select od_id, + mb_id, + od_name, + od_settle_case, + od_cart_price, + od_receipt_price, + od_receipt_point, + od_cancel_price, + od_misu, + (od_cart_price + od_send_cost + od_send_cost2) as orderprice, + (od_cart_coupon + od_coupon + od_send_coupon) as couponprice + from {$g5['g5_shop_order_table']} + where SUBSTRING(od_time,1,10) = '$date' + order by od_id desc "; +$result = sql_query($sql); +?> + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + 0, 'orderprice'=>0, 'ordercancel'=>0, 'ordercoupon'=>0, 'receiptbank'=>0, 'receiptvbank'=>0, 'receiptiche'=>0, 'receipthp'=>0, 'receiptcard'=>0, 'receiptpoint'=>0, 'misu'=>0, 'receipteasy'=>0); + $tot = array('ordercount'=>0, 'orderprice'=>0, 'ordercancel'=>0, 'ordercoupon'=>0, 'receiptbank'=>0, 'receiptvbank'=>0, 'receiptiche'=>0, 'receipthp'=>0, 'receiptcard'=>0, 'receiptpoint'=>0, 'misu'=>0, 'receipteasy'=>0); + + for ($i=0; $row=sql_fetch_array($result); $i++) + { + if ($i == 0) + $save['od_date'] = $row['od_date']; + + if ($save['od_date'] != $row['od_date']) { + print_line($save); + $save = array('ordercount'=>0, 'orderprice'=>0, 'ordercancel'=>0, 'ordercoupon'=>0, 'receiptbank'=>0, 'receiptvbank'=>0, 'receiptiche'=>0, 'receipthp'=>0, 'receiptcard'=>0, 'receiptpoint'=>0, 'misu'=>0, 'receipteasy'=>0); + $save['od_date'] = $row['od_date']; + } + + $save['ordercount']++; + $save['orderprice'] += $row['orderprice']; + $save['ordercancel'] += $row['od_cancel_price']; + $save['ordercoupon'] += $row['couponprice']; + if($row['od_settle_case'] == '무통장') + $save['receiptbank'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '가상계좌') + $save['receiptvbank'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '계좌이체') + $save['receiptiche'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '휴대폰') + $save['receipthp'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '신용카드') + $save['receiptcard'] += $row['od_receipt_price']; + $save['receiptpoint'] += $row['od_receipt_point']; + $save['misu'] += $row['od_misu']; + + $tot['ordercount']++; + $tot['orderprice'] += $row['orderprice']; + $tot['ordercancel'] += $row['od_cancel_price']; + $tot['ordercoupon'] += $row['couponprice']; + if($row['od_settle_case'] == '무통장') + $tot['receiptbank'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '가상계좌') + $tot['receiptvbank'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '계좌이체') + $tot['receiptiche'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '휴대폰') + $tot['receipthp'] += $row['od_receipt_price']; + if($row['od_settle_case'] == '신용카드') + $tot['receiptcard'] += $row['od_receipt_price']; + $tot['receiptpoint'] += $row['od_receipt_point']; + $tot['misu'] += $row['od_misu']; + + if(in_array($row['od_settle_case'], array('간편결제', 'KAKAOPAY', 'lpay', 'inicis_payco', 'inicis_kakaopay', '삼성페이'))) { + $save['receipteasy'] += $row['od_receipt_price']; + $tot['receipteasy'] += $row['od_receipt_price']; + } + } + + if ($i == 0) { + echo ''; + } else { + print_line($save); + } + ?> + + + + + + + + + + + + + + + + + + +
    주문년도주문수주문합계쿠폰무통장가상계좌계좌이체카드입금간편결제휴대폰포인트입금주문취소미수금
    자료가 없습니다.
    합 계
    +
    + + + +
    +

    추가배송비 내역

    + +
    + + + +
    + + + + + + + + + + + + + + + + + + + '; + ?> + +
    추가배송비 내역
    + + + 지역명우편번호추가배송비
    + + +
    자료가 없습니다.
    +
    + +
    + +
    + +
    +
    + + + +
    +

    추가배송비 등록

    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    추가배송비 등록
    + (입력 예 : 01234) +
    + (입력 예 : 01234) +
    +
    + +
    + +
    + +
    + +
    + + + +전체목록'; +?> + +
    + + 전체 +
    + +
    + + + + + + + + +~ + + + + +
    + +
    + + + + + + + + + + + + + + + + + '; + } + ?> + +
    순위상품평건수
    + +
    자료가 없습니다.
    +
    + + + +
    +

    고객님들이 보관함에 가장 많이 넣은 순으로 순위를 출력합니다.

    +
    + + + +'', 'coin'=>''); + if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) { $userinfo = get_icode_userinfo($config['cf_icode_id'], $config['cf_icode_pw']); diff --git a/adm/sms_admin/install.php b/adm/sms_admin/install.php index c5405c3d2..afd88fb83 100644 --- a/adm/sms_admin/install.php +++ b/adm/sms_admin/install.php @@ -61,11 +61,6 @@ for ($i=0; $idocument.getElementById('sms5_job_01').innerHTML='전체 테이블 생성 완료';"; flush(); usleep(50000); -$read_point = -1; -$write_point = 5; -$comment_point = 1; -$download_point = -20; - //------------------------------------------------------------------------------------------------- // config 테이블 설정 $sql = " insert into {$g5['sms5_book_group_table']} set bg_name='미분류'"; diff --git a/adm/sms_admin/num_book.php b/adm/sms_admin/num_book.php index 4e89db11f..270882031 100644 --- a/adm/sms_admin/num_book.php +++ b/adm/sms_admin/num_book.php @@ -178,7 +178,8 @@ function no_hp_click(val) } $line = 0; $qry = sql_query("select * from {$g5['sms5_book_table']} where 1 $sql_group $sql_search $sql_korean $sql_no_hp order by bk_no desc limit $page_start, $page_size"); - while($res = sql_fetch_array($qry)) + // while($res = sql_fetch_array($qry)) + for ($i=0; $res = sql_fetch_array($qry); $i++) { $bg = 'bg'.($line++%2); diff --git a/adm/sms_admin/num_group_update.php b/adm/sms_admin/num_group_update.php index abd3407b0..b168271f6 100644 --- a/adm/sms_admin/num_group_update.php +++ b/adm/sms_admin/num_group_update.php @@ -65,7 +65,7 @@ else if ($w == 'em') // 비우기 } else // 등록 { - $bg_name = isset($_POST['bg_name']) ? strip_tags(clean_xss_attributes($_POST['bg_name'])) : ''; + $bg_name = isset($_REQUEST['bg_name']) ? strip_tags(clean_xss_attributes($_REQUEST['bg_name'])) : ''; if (!strlen(trim($bg_name))) alert('그룹명을 입력해주세요'); diff --git a/adm/theme.js b/adm/theme.js index d20c53a60..c0d4f0fb5 100644 --- a/adm/theme.js +++ b/adm/theme.js @@ -8,7 +8,7 @@ $(function() { var set_default_skin = 0; if($(this).data("set_default_skin") == true) { - if(confirm("기본환경설정, 1:1문의 스킨을 테마에서 설정된 스킨으로 변경하시겠습니까?\n\n변경을 선택하시면 테마에서 지정된 스킨으로 회원스킨 등이 변경됩니다.")) + if(confirm("기본환경설정, 1:1문의, 쇼핑몰 스킨을 테마에서 설정된 스킨으로 변경하시겠습니까?\n\n변경을 선택하시면 테마에서 지정된 스킨으로 회원스킨 등이 변경됩니다.")) set_default_skin = 1; } diff --git a/adm/theme_config_load.php b/adm/theme_config_load.php index 24c807bed..074b93354 100644 --- a/adm/theme_config_load.php +++ b/adm/theme_config_load.php @@ -22,7 +22,7 @@ if(!in_array($config['cf_theme'], $theme_dir)) { } $type = $_POST['type']; -$arr_type = array('board', 'conf_skin', 'conf_member'); +$arr_type = array('board', 'conf_skin', 'conf_member', 'shop_skin', 'shop_pc_index', 'shop_mobile_index', 'shop_etc', 'shop_event', 'shop_category'); if(!in_array($type, $arr_type)) { $data['error'] = '올바른 방법으로 이용해 주십시오.'; die(json_encode($data)); @@ -72,6 +72,114 @@ if($type == 'board') { if($i == 0) $data['error'] = '적용할 기본환경 회원스킨 설정이 없습니다.'; +} else if($type == 'shop_skin') { + $keys = run_replace('theme_config_load_keys', array('de_shop_skin', 'de_shop_mobile_skin'), $type); + + $tconfig = get_theme_config_value($config['cf_theme'], implode(',', $keys)); + + $i = 0; + foreach($keys as $val) { + if($tconfig[$val]) { + $data[$val] = preg_match('#^theme/.+$#', $tconfig[$val]) ? $tconfig[$val] : 'theme/'.$tconfig[$val]; + $i++; + } + } + + if($i == 0) + $data['error'] = '적용할 쇼핑몰 스킨 설정이 없습니다.'; +} else if($type == 'shop_pc_index') { + $keys = array(); + for($i=1; $i<=5; $i++) { + $keys[] = 'de_type'.$i.'_list_use'; + $keys[] = 'de_type'.$i.'_list_skin'; + $keys[] = 'de_type'.$i.'_list_mod'; + $keys[] = 'de_type'.$i.'_list_row'; + $keys[] = 'de_type'.$i.'_img_width'; + $keys[] = 'de_type'.$i.'_img_height'; + } + + $keys = run_replace('theme_config_load_keys', $keys, $type); + $tconfig = get_theme_config_value($config['cf_theme'], implode(',', $keys)); + + $i = 0; + foreach($keys as $val) { + if(strlen($tconfig[$val])) { + $data[$val] = trim($tconfig[$val]); + $i++; + } + } + + if($i == 0) + $data['error'] = '적용할 테마 설정이 없습니다.'; +} else if($type == 'shop_mobile_index') { + $keys = array(); + for($i=1; $i<=5; $i++) { + $keys[] = 'de_mobile_type'.$i.'_list_use'; + $keys[] = 'de_mobile_type'.$i.'_list_skin'; + $keys[] = 'de_mobile_type'.$i.'_list_mod'; + $keys[] = 'de_mobile_type'.$i.'_list_row'; + $keys[] = 'de_mobile_type'.$i.'_img_width'; + $keys[] = 'de_mobile_type'.$i.'_img_height'; + } + + $keys = run_replace('theme_config_load_keys', $keys, $type); + $tconfig = get_theme_config_value($config['cf_theme'], implode(',', $keys)); + + $i = 0; + foreach($keys as $val) { + if(strlen($tconfig[$val])) { + $data[$val] = trim($tconfig[$val]); + $i++; + } + } + + if($i == 0) + $data['error'] = '적용할 테마 설정이 없습니다.'; +} else if($type == 'shop_etc') { + $keys = run_replace('theme_config_load_keys', array('de_rel_list_use', 'de_rel_list_skin', 'de_rel_list_mod', 'de_rel_img_width', 'de_rel_img_height', 'de_mobile_rel_list_use', 'de_mobile_rel_list_skin', 'de_mobile_rel_list_mod', 'de_mobile_rel_img_width', 'de_mobile_rel_img_height', 'de_search_list_skin', 'de_search_list_mod', 'de_search_list_row', 'de_search_img_width', 'de_search_img_height', 'de_mobile_search_list_skin', 'de_mobile_search_list_mod', 'de_mobile_search_list_row', 'de_mobile_search_img_width', 'de_mobile_search_img_height', 'de_mimg_width', 'de_mimg_height', 'de_listtype_list_mod', 'de_listtype_list_row', 'de_mobile_listtype_list_mod', 'de_mobile_listtype_list_row'), $type); + + $tconfig = get_theme_config_value($config['cf_theme'], implode(',', $keys)); + + $i = 0; + foreach($keys as $val) { + if(strlen($tconfig[$val])) { + $data[$val] = trim($tconfig[$val]); + $i++; + } + } + + if($i == 0) + $data['error'] = '적용할 테마 설정이 없습니다.'; +} else if($type == 'shop_event') { + $keys = run_replace('theme_config_load_keys', array('ev_skin', 'ev_img_width', 'ev_img_height', 'ev_list_mod', 'ev_list_row', 'ev_mobile_skin', 'ev_mobile_img_width', 'ev_mobile_img_height', 'ev_mobile_list_mod', 'ev_mobile_list_row'), $type); + + $tconfig = get_theme_config_value($config['cf_theme'], implode(',', $keys)); + + $i = 0; + foreach($keys as $val) { + if(strlen($tconfig[$val])) { + $data[$val] = trim($tconfig[$val]); + $i++; + } + } + + if($i == 0) + $data['error'] = '적용할 테마 설정이 없습니다.'; +} else if($type == 'shop_category') { + $keys = run_replace('theme_config_load_keys', array('ca_skin', 'ca_img_width', 'ca_img_height', 'ca_list_mod', 'ca_list_row', 'ca_mobile_skin', 'ca_mobile_img_width', 'ca_mobile_img_height', 'ca_mobile_list_mod', 'ca_mobile_list_row'), $type); + + $tconfig = get_theme_config_value($config['cf_theme'], implode(',', $keys)); + + $i = 0; + foreach($keys as $val) { + if(strlen($tconfig[$val])) { + $data[$val] = trim($tconfig[$val]); + $i++; + } + } + + if($i == 0) + $data['error'] = '적용할 테마 설정이 없습니다.'; } die(json_encode($data)); \ No newline at end of file diff --git a/adm/theme_preview.php b/adm/theme_preview.php index e281009fa..031ecd09f 100644 --- a/adm/theme_preview.php +++ b/adm/theme_preview.php @@ -10,24 +10,31 @@ if(!$theme || !in_array($theme, $theme_dir)) $info = get_theme_info($theme); -$arr_mode = array('index', 'list', 'view'); +$arr_mode = array('index', 'list', 'view', 'shop', 'ca_list', 'item'); $mode = isset($_GET['mode']) ? substr(strip_tags($_GET['mode']), 0, 20) : ''; + if(!in_array($mode, $arr_mode)) $mode = 'index'; -$qstr_index = '&mode=index'; -$qstr_list = '&mode=list'; -$qstr_view = '&mode=view'; -$qstr_device = '&mode='.$mode.'&device='.(G5_IS_MOBILE ? 'pc' : 'mobile'); +if((defined('G5_COMMUNITY_USE') && G5_COMMUNITY_USE === false) || $mode == 'shop' || $mode == 'ca_list' || $mode == 'item') + define('_SHOP_', true); + +$qstr_index = '&mode=index'; +$qstr_list = '&mode=list'; +$qstr_view = '&mode=view'; +$qstr_shop = '&mode=shop'; +$qstr_ca_list = '&mode=ca_list'; +$qstr_item = '&mode=item'; +$qstr_device = '&mode='.$mode.'&device='.(G5_IS_MOBILE ? 'pc' : 'mobile'); $sql = " select bo_table, wr_parent from {$g5['board_new_table']} order by bn_id desc limit 1 "; $row = sql_fetch($sql); $bo_table = $row['bo_table']; -$board = sql_fetch(" select * from {$g5['board_table']} where bo_table = '$bo_table' "); +$board = sql_fetch(" select * from {$g5['board_table']} where bo_table = '{$bo_table}' "); $write_table = $g5['write_prefix'] . $bo_table; // theme.config.php 미리보기 게시판 스킨이 설정돼 있다면 -$tconfig = get_theme_config_value($theme, 'set_default_skin, preview_board_skin, preview_mobile_board_skin'); +$tconfig = get_theme_config_value($theme); if($mode == 'list' || $mode == 'view') { if($tconfig['preview_board_skin']) $board['bo_skin'] = preg_match('#^theme/.+$#', $tconfig['preview_board_skin']) ? $tconfig['preview_board_skin'] : 'theme/'.$tconfig['preview_board_skin']; @@ -65,6 +72,61 @@ if (G5_IS_MOBILE) { $faq_skin_url = get_skin_url('faq', $config['cf_faq_skin']); } +// 쇼핑몰 스킨 재설정 +if($tconfig['de_shop_skin']) + $default['de_shop_skin'] = preg_match('#^theme/.+$#', $tconfig['de_shop_skin']) ? $tconfig['de_shop_skin'] : 'theme/'.$tconfig['de_shop_skin']; + +if($tconfig['de_shop_mobile_skin']) + $default['de_shop_mobile_skin'] = preg_match('#^theme/.+$#', $tconfig['de_shop_mobile_skin']) ? $tconfig['de_shop_mobile_skin'] : 'theme/'.$tconfig['de_shop_mobile_skin']; + +// 쇼핑몰초기화면 변수 재설정 +for($i=1; $i<=5; $i++) { + $default['de_type'.$i.'_list_use'] = (isset($tconfig['de_type'.$i.'_list_use']) && $tconfig['de_type'.$i.'_list_use']) ? $tconfig['de_type'.$i.'_list_use'] : $default['de_type'.$i.'_list_use']; + $default['de_type'.$i.'_list_skin'] = (isset($tconfig['de_type'.$i.'_list_skin']) && $tconfig['de_type'.$i.'_list_skin']) ? $tconfig['de_type'.$i.'_list_skin'] : $default['de_type'.$i.'_list_skin']; + $default['de_type'.$i.'_list_mod'] = (isset($tconfig['de_type'.$i.'_list_mod']) && $tconfig['de_type'.$i.'_list_mod']) ? $tconfig['de_type'.$i.'_list_mod'] : $default['de_type'.$i.'_list_mod']; + $default['de_type'.$i.'_list_row'] = (isset($tconfig['de_type'.$i.'_list_row']) && $tconfig['de_type'.$i.'_list_row']) ? $tconfig['de_type'.$i.'_list_row'] : $default['de_type'.$i.'_list_row']; + $default['de_type'.$i.'_img_width'] = (isset($tconfig['de_type'.$i.'_img_width']) && $tconfig['de_type'.$i.'_img_width']) ? $tconfig['de_type'.$i.'_img_width'] : $default['de_type'.$i.'_img_width']; + $default['de_type'.$i.'_img_height'] = (isset($tconfig['de_type'.$i.'_img_height']) && $tconfig['de_type'.$i.'_img_height']) ? $tconfig['de_type'.$i.'_img_height'] : $default['de_type'.$i.'_img_height']; + + $default['de_mobile_type'.$i.'_list_use'] = (isset($tconfig['de_mobile_type'.$i.'_list_use']) && $tconfig['de_mobile_type'.$i.'_list_use']) ? $tconfig['de_mobile_type'.$i.'_list_use'] : $default['de_mobile_type'.$i.'_list_use']; + $default['de_mobile_type'.$i.'_list_skin'] = (isset($tconfig['de_mobile_type'.$i.'_list_skin']) && $tconfig['de_mobile_type'.$i.'_list_skin']) ? $tconfig['de_mobile_type'.$i.'_list_skin'] : $default['de_mobile_type'.$i.'_list_skin']; + $default['de_mobile_type'.$i.'_list_mod'] = (isset($tconfig['de_mobile_type'.$i.'_list_mod']) && $tconfig['de_mobile_type'.$i.'_list_mod']) ? $tconfig['de_mobile_type'.$i.'_list_mod'] : $default['de_mobile_type'.$i.'_list_mod']; + $default['de_mobile_type'.$i.'_list_row'] = (isset($tconfig['de_mobile_type'.$i.'_list_row']) && $tconfig['de_mobile_type'.$i.'_list_row']) ? $tconfig['de_mobile_type'.$i.'_list_row'] : $default['de_mobile_type'.$i.'_list_row']; + $default['de_mobile_type'.$i.'_img_width'] = (isset($tconfig['de_mobile_type'.$i.'_img_width']) && $tconfig['de_mobile_type'.$i.'_img_width']) ? $tconfig['de_mobile_type'.$i.'_img_width'] : $default['de_mobile_type'.$i.'_img_width']; + $default['de_mobile_type'.$i.'_img_height'] = (isset($tconfig['de_mobile_type'.$i.'_img_height']) && $tconfig['de_mobile_type'.$i.'_img_height']) ? $tconfig['de_mobile_type'.$i.'_img_height'] : $default['de_mobile_type'.$i.'_img_height']; +} + +// 상품상세 이미지 사이즈 재설정 +$default['de_mimg_width'] = (isset($tconfig['de_mimg_width']) && $tconfig['de_mimg_width']) ? $tconfig['de_mimg_width'] : $default['de_mimg_width']; +$default['de_mimg_height'] = (isset($tconfig['de_mimg_height']) && $tconfig['de_mimg_height']) ? $tconfig['de_mimg_height'] : $default['de_mimg_height']; + +if (defined('G5_USE_SHOP') && G5_USE_SHOP) { + // 테마 경로 설정 + if(defined('G5_THEME_PATH')) { + define('G5_THEME_SHOP_PATH', G5_THEME_PATH.'/'.G5_SHOP_DIR); + define('G5_THEME_SHOP_URL', G5_THEME_URL.'/'.G5_SHOP_DIR); + define('G5_THEME_MSHOP_PATH', G5_THEME_PATH.'/'.G5_MOBILE_DIR.'/'.G5_SHOP_DIR); + define('G5_THEME_MSHOP_URL', G5_THEME_URL.'/'.G5_MOBILE_DIR.'/'.G5_SHOP_DIR); + } + + // 스킨 경로 설정 + if(preg_match('#^theme/(.+)$#', $default['de_shop_skin'], $match)) { + define('G5_SHOP_SKIN_PATH', G5_THEME_PATH.'/'.G5_SKIN_DIR.'/'.G5_SHOP_DIR.'/'.$match[1]); + define('G5_SHOP_SKIN_URL', G5_THEME_URL .'/'.G5_SKIN_DIR.'/'.G5_SHOP_DIR.'/'.$match[1]); + } else { + define('G5_SHOP_SKIN_PATH', G5_PATH.'/'.G5_SKIN_DIR.'/'.G5_SHOP_DIR.'/'.$default['de_shop_skin']); + define('G5_SHOP_SKIN_URL', G5_URL .'/'.G5_SKIN_DIR.'/'.G5_SHOP_DIR.'/'.$default['de_shop_skin']); + } + + if(preg_match('#^theme/(.+)$#', $default['de_shop_mobile_skin'], $match)) { + define('G5_MSHOP_SKIN_PATH', G5_THEME_MOBILE_PATH.'/'.G5_SKIN_DIR.'/'.G5_SHOP_DIR.'/'.$match[1]); + define('G5_MSHOP_SKIN_URL', G5_THEME_URL .'/'.G5_MOBILE_DIR.'/'.G5_SKIN_DIR.'/'.G5_SHOP_DIR.'/'.$match[1]); + } else { + define('G5_MSHOP_SKIN_PATH', G5_MOBILE_PATH.'/'.G5_SKIN_DIR.'/'.G5_SHOP_DIR.'/'.$default['de_shop_mobile_skin']); + define('G5_MSHOP_SKIN_URL', G5_MOBILE_URL .'/'.G5_SKIN_DIR.'/'.G5_SHOP_DIR.'/'.$default['de_shop_mobile_skin']); + } +} + $conf = sql_fetch(" select cf_theme from {$g5['config_table']} "); $name = get_text($info['theme_name']); if($conf['cf_theme'] != $theme) { @@ -90,6 +152,13 @@ require_once(G5_PATH.'/head.sub.php');
  • 인덱스 화면
  • 게시글 리스트
  • 게시글 보기
  • + + +
  • 쇼핑몰
  • + +
  • 상품리스트
  • +
  • 상품상세
  • +
  • @@ -103,9 +172,24 @@ require_once(G5_PATH.'/head.sub.php'); break; case 'view': $wr_id = $row['wr_parent']; - $write = sql_fetch(" select * from $write_table where wr_id = '$wr_id' "); + $write = sql_fetch(" select * from {$write_table} where wr_id = '{$wr_id}' "); include(G5_BBS_PATH.'/board.php'); break; + case 'shop': + include(G5_SHOP_PATH.'/index.php'); + break; + case 'ca_list': + $sql = " select ca_id from {$g5['g5_shop_category_table']} where ca_use = '1' order by ca_id limit 1 "; + $tmp = sql_fetch($sql); + $ca_id = $tmp['ca_id']; + include(G5_SHOP_PATH.'/list.php'); + break; + case 'item': + $sql = " select it_id from {$g5['g5_shop_item_table']} where it_use = '1' order by it_id desc limit 1 "; + $tmp = sql_fetch($sql); + $_GET['it_id'] = $tmp['it_id']; + include(G5_SHOP_PATH.'/item.php'); + break; default: include(G5_PATH.'/index.php'); break; diff --git a/adm/theme_update.php b/adm/theme_update.php index 8804a9f9d..b866f5603 100644 --- a/adm/theme_update.php +++ b/adm/theme_update.php @@ -28,13 +28,14 @@ sql_query($sql); // 테마 설정 스킨 적용 if($post_set_default_skin == 1) { - $keys = 'set_default_skin, cf_member_skin, cf_mobile_member_skin, cf_new_skin, cf_mobile_new_skin, cf_search_skin, cf_mobile_search_skin, cf_connect_skin, cf_mobile_connect_skin, cf_faq_skin, cf_mobile_faq_skin, qa_skin, qa_mobile_skin'; + $keys = 'set_default_skin, cf_member_skin, cf_mobile_member_skin, cf_new_skin, cf_mobile_new_skin, cf_search_skin, cf_mobile_search_skin, cf_connect_skin, cf_mobile_connect_skin, cf_faq_skin, cf_mobile_faq_skin, qa_skin, qa_mobile_skin, de_shop_skin, de_shop_mobile_skin'; $tconfig = get_theme_config_value($theme, $keys); if($tconfig['set_default_skin']) { $sql_common = array(); $qa_sql_common = array(); + $de_sql_common = array(); foreach($tconfig as $key => $val) { if(preg_match('#^qa_.+$#', $key)) { @@ -48,6 +49,20 @@ if($post_set_default_skin == 1) { continue; } + if(preg_match('#^de_.+$#', $key)) { + if(!isset($default[$key])) + continue; + + if($val) { + if(!preg_match('#^theme/.+$#', $val)) + $val = 'theme/'.$val; + + $de_sql_common[] = " $key = '$val' "; + } + + continue; + } + if(!isset($config[$key])) continue; @@ -68,6 +83,11 @@ if($post_set_default_skin == 1) { $sql = " update {$g5['qa_config_table']} set " . implode(', ', $qa_sql_common); sql_query($sql); } + + if(!empty($de_sql_common)) { + $sql = " update {$g5['g5_shop_default_table']} set " . implode(', ', $de_sql_common); + sql_query($sql); + } } } diff --git a/adm/thumbnail_file_delete.php b/adm/thumbnail_file_delete.php index edbb7a610..5ffc56644 100644 --- a/adm/thumbnail_file_delete.php +++ b/adm/thumbnail_file_delete.php @@ -19,7 +19,7 @@ include_once('./admin.head.php'); $directory = array(); $dl = array('file', 'editor'); -if( defined('G5_YOUNGCART_VER') ){ +if (defined('G5_USE_SHOP') && G5_USE_SHOP) { $dl[] = 'item'; } diff --git a/adm/visit_delete.php b/adm/visit_delete.php index 16390c3ee..24d4436df 100644 --- a/adm/visit_delete.php +++ b/adm/visit_delete.php @@ -13,6 +13,9 @@ $row = sql_fetch($sql); $min_year = (int)substr($row['min_date'], 0, 4); $now_year = (int)substr(G5_TIME_YMD, 0, 4); +if (!$min_year) { + $min_year = $now_year; +} ?>
    diff --git a/adm/visit_search.php b/adm/visit_search.php index 21b803d4e..9c99af20d 100644 --- a/adm/visit_search.php +++ b/adm/visit_search.php @@ -1,7 +1,7 @@ 쇼핑몰 설치 후 이용해 주십시오.

    '); + + define('_SHOP_', true); +} \ No newline at end of file diff --git a/bbs/ajax.filter.php b/bbs/ajax.filter.php index 05d7bc4c6..f0b414061 100644 --- a/bbs/ajax.filter.php +++ b/bbs/ajax.filter.php @@ -11,7 +11,7 @@ for ($i=0; $i내용 수정
    '; + echo ''; ?> = $min_spt) { $qstr1 = preg_replace($patterns, '', $qstr); $prev_part_href = get_pretty_url($bo_table,0,$qstr1.'&spt='.$prev_spt.'&page=1'); - $write_pages = page_insertbefore($write_pages, '이전검색'); + $write_pages = page_insertbefore($write_pages, '이전검색'); } $next_spt = $spt + $config['cf_search_part']; if ($next_spt < 0) { $qstr1 = preg_replace($patterns, '', $qstr); $next_part_href = get_pretty_url($bo_table,0,$qstr1.'&spt='.$next_spt.'&page=1'); - $write_pages = page_insertafter($write_pages, '다음검색'); + $write_pages = page_insertafter($write_pages, '다음검색'); } } diff --git a/bbs/login.php b/bbs/login.php index a743f9e2b..43a5b24e5 100644 --- a/bbs/login.php +++ b/bbs/login.php @@ -9,6 +9,7 @@ $g5['title'] = '로그인'; include_once('./_head.sub.php'); $url = isset($_GET['url']) ? strip_tags($_GET['url']) : ''; +$od_id = isset($_POST['od_id']) ? safe_replace_regex($_POST['od_id'], 'od_id') : ''; // url 체크 check_url_host($url); diff --git a/bbs/login_check.php b/bbs/login_check.php index 0d57fea65..38b216542 100644 --- a/bbs/login_check.php +++ b/bbs/login_check.php @@ -127,6 +127,19 @@ if(function_exists('social_login_success_after')){ social_login_session_clear(1); } +//영카트 회원 장바구니 처리 +if(function_exists('set_cart_id')){ + $member = $mb; + + // 보관기간이 지난 상품 삭제 + cart_item_clean(); + set_cart_id(''); + $s_cart_id = get_session('ss_cart_id'); + // 선택필드 초기화 + $sql = " update {$g5['g5_shop_cart_table']} set ct_select = '0' where od_id = '$s_cart_id' "; + sql_query($sql); +} + run_event('member_login_check', $mb, $link, $is_social_login); // 관리자로 로그인시 DATA 폴더의 쓰기 권한이 있는지 체크합니다. 쓰기 권한이 없으면 로그인을 못합니다. diff --git a/bbs/logout.php b/bbs/logout.php index 2b39de70a..52fd71f09 100644 --- a/bbs/logout.php +++ b/bbs/logout.php @@ -1,4 +1,5 @@ '{$member['mb_id']}' and mb_dupinfo = '".get_session('ss_cert_dupinfo')."' "; + $row = sql_fetch($sql); + if (!empty($row['mb_id'])) { + alert("입력하신 본인확인 정보로 가입된 내역이 존재합니다."); + } +} + +$sql = ''; +$sql_certify = ''; +$md5_cert_no = get_session('ss_cert_no'); +$cert_type = get_session('ss_cert_type'); +if ($config['cf_cert_use'] && $cert_type && $md5_cert_no) { + // 해시값이 같은 경우에만 본인확인 값을 저장한다. + if ($cert_type == 'ipin' && get_session('ss_cert_hash') == md5($mb_name.$cert_type.get_session('ss_cert_birth').$md5_cert_no)) { // 아이핀일때 hash 값 체크 hp미포함 + $sql_certify .= " mb_hp = '{$mb_hp}' "; + $sql_certify .= " , mb_certify = '{$cert_type}' "; + $sql_certify .= " , mb_adult = '".get_session('ss_cert_adult')."' "; + $sql_certify .= " , mb_birth = '".get_session('ss_cert_birth')."' "; + $sql_certify .= " , mb_sex = '".get_session('ss_cert_sex')."' "; + $sql_certify .= " , mb_dupinfo = '".get_session('ss_cert_dupinfo')."' "; + $sql_certify .= " , mb_name = '{$mb_name}' "; + } else if($cert_type != 'ipin' && get_session('ss_cert_hash') == md5($mb_name.$cert_type.get_session('ss_cert_birth').$mb_hp.$md5_cert_no)) { // 간편인증, 휴대폰일때 hash 값 체크 hp포함 + $sql_certify .= " mb_hp = '{$mb_hp}' "; + $sql_certify .= " , mb_certify = '{$cert_type}' "; + $sql_certify .= " , mb_adult = '".get_session('ss_cert_adult')."' "; + $sql_certify .= " , mb_birth = '".get_session('ss_cert_birth')."' "; + $sql_certify .= " , mb_sex = '".get_session('ss_cert_sex')."' "; + $sql_certify .= " , mb_dupinfo = '".get_session('ss_cert_dupinfo')."' "; + $sql_certify .= " , mb_name = '{$mb_name}' "; + }else { + alert('본인인증된 정보와 입력된 회원정보가 일치하지않습니다. 다시시도 해주세요'); + } +} else { + if (get_session("ss_reg_mb_name") != $mb_name || get_session("ss_reg_mb_hp") != $mb_hp) { + $sql_certify .= " mb_hp = '{$mb_hp}' "; + $sql_certify .= " , mb_certify = '' "; + $sql_certify .= " , mb_adult = 0 "; + $sql_certify .= " , mb_birth = '' "; + $sql_certify .= " , mb_sex = '' "; + } +} + +$sql = "update {$g5['member_table']} set {$sql_certify} where mb_id = '{$mb_id}'"; +$result = sql_query($sql, false); + +if($result){ + if($cert_type == 'ipin' && get_session('ss_cert_hash') == md5($mb_name.$cert_type.get_session('ss_cert_birth').$md5_cert_no)) { // 아이핀일때 hash 값 체크 hp미포함) + insert_member_cert_history($mb_id, $mb_name, $mb_hp, get_session('ss_cert_birth'), get_session('ss_cert_type') ); // 본인인증 후 정보 수정 시 내역 기록 + }else if($cert_type != 'ipin' && get_session('ss_cert_hash') == md5($mb_name.$cert_type.get_session('ss_cert_birth').$mb_hp.$md5_cert_no)) { // 간편인증, 휴대폰일때 hash 값 체크 hp포함 + insert_member_cert_history($mb_id, $mb_name, $mb_hp, get_session('ss_cert_birth'), get_session('ss_cert_type') ); // 본인인증 후 정보 수정 시 내역 기록 + } +} + +//=============================================================== + +(empty($url))? goto_url(G5_URL) : goto_url($url); \ No newline at end of file diff --git a/bbs/member_confirm.php b/bbs/member_confirm.php index 4c2f104a1..c2c07af1c 100644 --- a/bbs/member_confirm.php +++ b/bbs/member_confirm.php @@ -4,15 +4,14 @@ include_once('./_common.php'); if ($is_guest) alert('로그인 한 회원만 접근하실 수 있습니다.', G5_BBS_URL.'/login.php'); -/* -if ($url) - $urlencode = urlencode($url); -else - $urlencode = urlencode($_SERVER[REQUEST_URI]); -*/ - $url = isset($_GET['url']) ? clean_xss_tags($_GET['url']) : ''; +while (1) { + $tmp = preg_replace('/&#[^;]+;/', '', $url); + if ($tmp == $url) break; + $url = $tmp; +} + //소셜 로그인 한 경우 if( function_exists('social_member_comfirm_redirect') && (! $url || $url === 'register_form.php' || (function_exists('social_is_edit_page') && social_is_edit_page($url) ) ) ){ social_member_comfirm_redirect(); diff --git a/bbs/member_leave.php b/bbs/member_leave.php index bda999408..4763b408b 100644 --- a/bbs/member_leave.php +++ b/bbs/member_leave.php @@ -14,7 +14,7 @@ if (!($post_mb_password && check_password($post_mb_password, $member['mb_passwor // 회원탈퇴일을 저장 $date = date("Ymd"); -$sql = " update {$g5['member_table']} set mb_leave_date = '{$date}' where mb_id = '{$member['mb_id']}' "; +$sql = " update {$g5['member_table']} set mb_leave_date = '{$date}', mb_memo = '".date('Ymd', G5_SERVER_TIME)." 탈퇴함\n".sql_real_escape_string($mb['mb_memo'])."', mb_certify = '', mb_adult = 0, mb_dupinfo = '' where mb_id = '{$member['mb_id']}' "; sql_query($sql); // 3.09 수정 (로그아웃) diff --git a/bbs/memo.php b/bbs/memo.php index 8dc446c13..f7cd044e7 100644 --- a/bbs/memo.php +++ b/bbs/memo.php @@ -15,8 +15,9 @@ if ($kind == 'recv') $unkind = 'send'; else if ($kind == 'send') $unkind = 'recv'; -else - alert(''.$kind .'값을 넘겨주세요.'); +else { + alert("kind 변수 값이 올바르지 않습니다."); +} if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지) diff --git a/bbs/memo_form.php b/bbs/memo_form.php index 7c46e98bc..0033301d5 100644 --- a/bbs/memo_form.php +++ b/bbs/memo_form.php @@ -9,7 +9,8 @@ if (!$member['mb_open'] && $is_admin != 'super' && $member['mb_id'] != $mb_id) alert_close("자신의 정보를 공개하지 않으면 다른분에게 쪽지를 보낼 수 없습니다. 정보공개 설정은 회원정보수정에서 하실 수 있습니다."); $content = ""; -$me_recv_mb_id = isset($_GET['me_recv_mb_id']) ? clean_xss_tags($_GET['me_recv_mb_id'], 1, 1) : ''; +$me_recv_mb_id = isset($_REQUEST['me_recv_mb_id']) ? clean_xss_tags($_REQUEST['me_recv_mb_id'], 1, 1) : ''; +$me_id = isset($_REQUEST['me_id']) ? clean_xss_tags($_REQUEST['me_id'], 1, 1) : ''; // 탈퇴한 회원에게 쪽지 보낼 수 없음 if ($me_recv_mb_id) @@ -23,7 +24,7 @@ if ($me_recv_mb_id) // 4.00.15 $row = sql_fetch(" select me_memo from {$g5['memo_table']} where me_id = '{$me_id}' and (me_recv_mb_id = '{$member['mb_id']}' or me_send_mb_id = '{$member['mb_id']}') "); - if ($row['me_memo']) + if (isset($row['me_memo']) && $row['me_memo']) { $content = "\n\n\n".' >' ."\n".' >' diff --git a/bbs/move.php b/bbs/move.php index 9fbc97d51..70d13cfdb 100644 --- a/bbs/move.php +++ b/bbs/move.php @@ -41,6 +41,9 @@ else if ($is_admin == 'board') $sql .= " and a.bo_admin = '{$member['mb_id']}' "; $sql .= " order by a.gr_id, a.bo_order, a.bo_table "; $result = sql_query($sql); + +$list = array(); + for ($i=0; $row=sql_fetch_array($result); $i++) { $list[$i] = $row; diff --git a/bbs/move_update.php b/bbs/move_update.php index 097af6863..99265fb8c 100644 --- a/bbs/move_update.php +++ b/bbs/move_update.php @@ -247,7 +247,24 @@ if ($sw == 'move') sql_query(" delete from {$g5['board_new_table']} where bo_table = '$bo_table' and wr_id = '{$save[$i]['wr_id']}' "); sql_query(" delete from {$g5['board_file_table']} where bo_table = '$bo_table' and wr_id = '{$save[$i]['wr_id']}' "); } - sql_query(" update {$g5['board_table']} set bo_count_write = bo_count_write - '$save_count_write', bo_count_comment = bo_count_comment - '$save_count_comment' where bo_table = '$bo_table' "); + + // 공지사항이 이동되는 경우의 처리 begin + $arr = array(); + $sql = " select bo_notice from {$g5['board_table']} where bo_table = '{$bo_table}' "; + $row = sql_fetch($sql); + $arr_notice = explode(',', $row['bo_notice']); + for ($i=0; $i @@ -26,7 +32,7 @@ for ($i=0; $nw=sql_fetch_array($result); $i++) 0 or INSTR(LOWER(qa_content), LOWER('$stx')) > 0 )"; - else - $sql_search .= " and ( INSTR(qa_subject, '$stx') > 0 or INSTR(qa_content, '$stx') > 0 ) "; + $sfl = trim($sfl); + if ($sfl) { + switch ($sfl) { + case "qa_subject" : + case "qa_content" : + case "qa_name" : + case "mb_id" : + break; + default : + $sfl = "qa_subject"; + } + } else { + $sfl = "qa_subject"; + } + $sql_search .= " and (`{$sfl}` like '%{$stx}%') "; } + // $stx = trim($stx); + // if($stx) { + // if (preg_match("/[a-zA-Z]/", $stx)) + // $sql_search .= " and ( INSTR(LOWER(qa_subject), LOWER('$stx')) > 0 or INSTR(LOWER(qa_content), LOWER('$stx')) > 0 )"; + // else + // $sql_search .= " and ( INSTR(qa_subject, '$stx') > 0 or INSTR(qa_content, '$stx') > 0 ) "; + // } $sql_order = " order by qa_num "; - $sql = " select count(*) as cnt + $sql = " select count(*) as cnt $sql_common $sql_search "; $row = sql_fetch($sql); diff --git a/bbs/qaview.php b/bbs/qaview.php index 59543188f..e415aa272 100644 --- a/bbs/qaview.php +++ b/bbs/qaview.php @@ -12,6 +12,7 @@ $content = ''; $token = _token(); set_session('ss_qa_delete_token', $token); +set_session('ss_qa_write_token', $token); $g5['title'] = $qaconfig['qa_title']; include_once('./qahead.php'); diff --git a/bbs/qawrite.php b/bbs/qawrite.php index fb041e0ad..8a032aa6b 100644 --- a/bbs/qawrite.php +++ b/bbs/qawrite.php @@ -79,7 +79,8 @@ if(is_file($skin_file)) { else $content = "\n\n\n\n====== 이전 답변내용 =======\n"; - $content .= get_text($write['qa_content'], 0); + // KISA 취약점 권고사항 Stored XSS (210624) + $content .= get_text(html_purifier($write['qa_content']), 0); } else { //$content = get_text($write['qa_content'], 0); @@ -95,6 +96,7 @@ if(is_file($skin_file)) { $upload_max_filesize = number_format($qaconfig['qa_upload_size']) . ' 바이트'; $html_value = ''; + $html_checked = ''; if (isset($write['qa_html']) && $write['qa_html']) { $html_checked = 'checked'; $html_value = $write['qa_html']; diff --git a/bbs/qawrite_update.php b/bbs/qawrite_update.php index ab0b9b3a7..d973e3c8e 100644 --- a/bbs/qawrite_update.php +++ b/bbs/qawrite_update.php @@ -197,7 +197,8 @@ for ($i=1; $i<=$upload_count; $i++) { // image type if ( preg_match("/\.({$config['cf_image_extension']})$/i", $filename) || preg_match("/\.({$config['cf_flash_extension']})$/i", $filename) ) { - if ($timg['2'] < 1 || $timg['2'] > 16) + // webp 파일의 type 이 18 이므로 업로드가 가능하도록 수정 + if ($timg['2'] < 1 || $timg['2'] > 18) continue; } //================================================================= @@ -216,13 +217,13 @@ for ($i=1; $i<=$upload_count; $i++) { $upload[$i]['filesize'] = $filesize; // 아래의 문자열이 들어간 파일은 -x 를 붙여서 웹경로를 알더라도 실행을 하지 못하도록 함 - $filename = preg_replace("/\.(php|pht|phtm|htm|cgi|pl|exe|jsp|asp|inc)/i", "$0-x", $filename); + $filename = preg_replace("/\.(php|pht|phtm|htm|cgi|pl|exe|jsp|asp|inc|phar)/i", "$0-x", $filename); shuffle($chars_array); $shuffle = implode('', $chars_array); // 첨부파일 첨부시 첨부파일명에 공백이 포함되어 있으면 일부 PC에서 보이지 않거나 다운로드 되지 않는 현상이 있습니다. (길상여의 님 090925) - $upload[$i]['file'] = abs(ip2long($_SERVER['REMOTE_ADDR'])).'_'.substr($shuffle,0,8).'_'.replace_filename($filename); + $upload[$i]['file'] = md5(sha1($_SERVER['REMOTE_ADDR'])).'_'.substr($shuffle,0,8).'_'.replace_filename($filename); $dest_file = G5_DATA_PATH.'/qa/'.$upload[$i]['file']; diff --git a/bbs/register_form.php b/bbs/register_form.php index c79046575..df6c1c8dc 100644 --- a/bbs/register_form.php +++ b/bbs/register_form.php @@ -39,7 +39,7 @@ if ($w == "") { } if (!isset($_POST['agree2']) || !$_POST['agree2']) { - alert('개인정보처리방침안내의 내용에 동의하셔야 회원가입 하실 수 있습니다.', G5_BBS_URL.'/register.php'); + alert('개인정보 수집 및 이용의 내용에 동의하셔야 회원가입 하실 수 있습니다.', G5_BBS_URL.'/register.php'); } $agree = preg_replace('#[^0-9]#', '', $_POST['agree']); @@ -62,7 +62,7 @@ if ($w == "") { } else if ($w == 'u') { - if ($is_admin) + if ($is_admin == 'super') alert('관리자의 회원정보는 관리자 화면에서 수정해 주십시오.', G5_URL); if (!$is_member) @@ -143,6 +143,9 @@ $register_action_url = G5_HTTPS_BBS_URL.'/register_form_update.php'; $req_nick = !isset($member['mb_nick_date']) || (isset($member['mb_nick_date']) && $member['mb_nick_date'] <= date("Y-m-d", G5_SERVER_TIME - ($config['cf_nick_modify'] * 86400))); $required = ($w=='') ? 'required' : ''; $readonly = ($w=='u') ? 'readonly' : ''; +$name_readonly = ($w=='u' || ($config['cf_cert_use'] && $config['cf_cert_req']))? 'readonly' : ''; +$hp_required = ($config['cf_req_hp'] || (($config['cf_cert_use'] && $config['cf_cert_req']) && ($config['cf_cert_hp'] || $config['cf_cert_simple']) && $member['mb_certify'] != "ipin")) ? 'required':''; +$hp_readonly = (($config['cf_cert_use'] && $config['cf_cert_req']) && ($config['cf_cert_hp'] || $config['cf_cert_simple']) && $member['mb_certify'] != "ipin") ? 'readonly':''; $agree = isset($_REQUEST['agree']) ? preg_replace('#[^0-9]#', '', $_REQUEST['agree']) : ''; $agree2 = isset($_REQUEST['agree2']) ? preg_replace('#[^0-9]#', '', $_REQUEST['agree2']) : ''; diff --git a/bbs/register_form_update.php b/bbs/register_form_update.php index 9cafded03..4374c6566 100644 --- a/bbs/register_form_update.php +++ b/bbs/register_form_update.php @@ -110,7 +110,7 @@ if ($w == '' || $w == 'u') { if ($msg = prohibit_mb_email($mb_email))alert($msg, "", true, true); // 휴대폰 필수입력일 경우 휴대폰번호 유효성 체크 - if (($config['cf_use_hp'] || $config['cf_cert_hp']) && $config['cf_req_hp']) { + if ($config['cf_use_hp'] || ($config['cf_cert_hp'] || $config['cf_cert_simple']) && $config['cf_req_hp']) { if ($msg = valid_mb_hp($mb_hp)) alert($msg, "", true, true); } @@ -166,8 +166,8 @@ if($config['cf_cert_use'] && get_session('ss_cert_type') && get_session('ss_cert // 중복체크 $sql = " select mb_id from {$g5['member_table']} where mb_id <> '{$member['mb_id']}' and mb_dupinfo = '".get_session('ss_cert_dupinfo')."' "; $row = sql_fetch($sql); - if ($row['mb_id']) { - alert("입력하신 본인확인 정보로 가입된 내역이 존재합니다.\\n회원아이디 : ".$row['mb_id']); + if (!empty($row['mb_id'])) { + alert("입력하신 본인확인 정보로 가입된 내역이 존재합니다."); } } @@ -176,7 +176,7 @@ $md5_cert_no = get_session('ss_cert_no'); $cert_type = get_session('ss_cert_type'); if ($config['cf_cert_use'] && $cert_type && $md5_cert_no) { // 해시값이 같은 경우에만 본인확인 값을 저장한다. - if (get_session('ss_cert_hash') == md5($mb_name.$cert_type.get_session('ss_cert_birth').$md5_cert_no)) { + if ($cert_type == 'ipin' && get_session('ss_cert_hash') == md5($mb_name.$cert_type.get_session('ss_cert_birth').$md5_cert_no)) { // 아이핀일때 hash 값 체크 hp미포함 $sql_certify .= " , mb_hp = '{$mb_hp}' "; $sql_certify .= " , mb_certify = '{$cert_type}' "; $sql_certify .= " , mb_adult = '".get_session('ss_cert_adult')."' "; @@ -185,12 +185,17 @@ if ($config['cf_cert_use'] && $cert_type && $md5_cert_no) { $sql_certify .= " , mb_dupinfo = '".get_session('ss_cert_dupinfo')."' "; if($w == 'u') $sql_certify .= " , mb_name = '{$mb_name}' "; - } else { + } else if($cert_type != 'ipin' && get_session('ss_cert_hash') == md5($mb_name.$cert_type.get_session('ss_cert_birth').$mb_hp.$md5_cert_no)) { // 간편인증, 휴대폰일때 hash 값 체크 hp포함 $sql_certify .= " , mb_hp = '{$mb_hp}' "; - $sql_certify .= " , mb_certify = '' "; - $sql_certify .= " , mb_adult = 0 "; - $sql_certify .= " , mb_birth = '' "; - $sql_certify .= " , mb_sex = '' "; + $sql_certify .= " , mb_certify = '{$cert_type}' "; + $sql_certify .= " , mb_adult = '".get_session('ss_cert_adult')."' "; + $sql_certify .= " , mb_birth = '".get_session('ss_cert_birth')."' "; + $sql_certify .= " , mb_sex = '".get_session('ss_cert_sex')."' "; + $sql_certify .= " , mb_dupinfo = '".get_session('ss_cert_dupinfo')."' "; + if($w == 'u') + $sql_certify .= " , mb_name = '{$mb_name}' "; + }else { + alert('본인인증된 정보와 입력된 회원정보가 일치하지않습니다. 다시시도 해주세요'); } } else { if (get_session("ss_reg_mb_name") != $mb_name || get_session("ss_reg_mb_hp") != $mb_hp) { @@ -202,7 +207,6 @@ if ($config['cf_cert_use'] && $cert_type && $md5_cert_no) { } } //=============================================================== - if ($w == '') { $sql = " insert into {$g5['member_table']} set mb_id = '{$mb_id}', @@ -304,6 +308,12 @@ if ($w == '') { set_session('ss_mb_reg', $mb_id); + if($cert_type == 'ipin' && get_session('ss_cert_hash') == md5($mb_name.$cert_type.get_session('ss_cert_birth').$md5_cert_no)) { // 아이핀일때 hash 값 체크 hp미포함) + insert_member_cert_history($mb_id, $mb_name, $mb_hp, get_session('ss_cert_birth'), get_session('ss_cert_type') ); // 본인인증 후 정보 수정 시 내역 기록 + }else if($cert_type != 'ipin' && get_session('ss_cert_hash') == md5($mb_name.$cert_type.get_session('ss_cert_birth').$mb_hp.$md5_cert_no)) { // 간편인증, 휴대폰일때 hash 값 체크 hp포함 + insert_member_cert_history($mb_id, $mb_name, $mb_hp, get_session('ss_cert_birth'), get_session('ss_cert_type') ); // 본인인증 후 정보 수정 시 내역 기록 + } + } else if ($w == 'u') { if (!trim(get_session('ss_mb_id'))) alert('로그인 되어 있지 않습니다.'); @@ -361,6 +371,12 @@ if ($w == '') { {$sql_certify} where mb_id = '$mb_id' "; sql_query($sql); + + if($cert_type == 'ipin' && get_session('ss_cert_hash') == md5($mb_name.$cert_type.get_session('ss_cert_birth').$md5_cert_no)) { // 아이핀일때 hash 값 체크 hp미포함) + insert_member_cert_history($mb_id, $mb_name, $mb_hp, get_session('ss_cert_birth'), get_session('ss_cert_type') ); // 본인인증 후 정보 수정 시 내역 기록 + }else if($cert_type != 'ipin' && get_session('ss_cert_hash') == md5($mb_name.$cert_type.get_session('ss_cert_birth').$mb_hp.$md5_cert_no)) { // 간편인증, 휴대폰일때 hash 값 체크 hp포함 + insert_member_cert_history($mb_id, $mb_name, $mb_hp, get_session('ss_cert_birth'), get_session('ss_cert_type') ); // 본인인증 후 정보 수정 시 내역 기록 + } } @@ -506,6 +522,51 @@ if ($config['cf_use_email_certify'] && $old_email != $mb_email) { } +// 신규회원 쿠폰발생 +if($w == '' && $default['de_member_reg_coupon_use'] && $default['de_member_reg_coupon_term'] > 0 && $default['de_member_reg_coupon_price'] > 0) { + $j = 0; + $create_coupon = false; + + do { + $cp_id = get_coupon_id(); + + $sql3 = " select count(*) as cnt from {$g5['g5_shop_coupon_table']} where cp_id = '$cp_id' "; + $row3 = sql_fetch($sql3); + + if(!$row3['cnt']) { + $create_coupon = true; + break; + } else { + if($j > 20) + break; + } + } while(1); + + if($create_coupon) { + $cp_subject = '신규 회원가입 축하 쿠폰'; + $cp_method = 2; + $cp_target = ''; + $cp_start = G5_TIME_YMD; + $cp_end = date("Y-m-d", (G5_SERVER_TIME + (86400 * ((int)$default['de_member_reg_coupon_term'] - 1)))); + $cp_type = 0; + $cp_price = $default['de_member_reg_coupon_price']; + $cp_trunc = 1; + $cp_minimum = $default['de_member_reg_coupon_minimum']; + $cp_maximum = 0; + + $sql = " INSERT INTO {$g5['g5_shop_coupon_table']} + ( cp_id, cp_subject, cp_method, cp_target, mb_id, cp_start, cp_end, cp_type, cp_price, cp_trunc, cp_minimum, cp_maximum, cp_datetime ) + VALUES + ( '$cp_id', '$cp_subject', '$cp_method', '$cp_target', '$mb_id', '$cp_start', '$cp_end', '$cp_type', '$cp_price', '$cp_trunc', '$cp_minimum', '$cp_maximum', '".G5_TIME_YMDHIS."' ) "; + + $res = sql_query($sql, false); + + if($res) + set_session('ss_member_reg_coupon', 1); + } +} + + // 사용자 코드 실행 @include_once ($member_skin_path.'/register_form_update.tail.skin.php'); diff --git a/bbs/view_image.php b/bbs/view_image.php index 6be5aedd0..85c8d0afc 100644 --- a/bbs/view_image.php +++ b/bbs/view_image.php @@ -12,7 +12,7 @@ if(function_exists('clean_relative_paths')){ $extension = pathinfo($filename, PATHINFO_EXTENSION); -if ( ! preg_match('/(jpg|jpeg|png|gif|bmp)$/i', $extension) ){ +if ( ! preg_match('/(jpg|jpeg|png|gif|bmp|webp)$/i', $extension) ){ alert_close('이미지 확장자가 아닙니다.'); } @@ -104,6 +104,12 @@ $.fn.imgLoad = function(callback) { } } + if(win_w < screen.width) { + if(window.outerWidth){ + win_w = win_w + (window.outerWidth - (document.documentElement.clientWidth || window.innerWidth)); + } + } + window.moveTo(win_l, win_t); window.resizeTo(win_w, win_h); }); diff --git a/bbs/visit_insert.inc.php b/bbs/visit_insert.inc.php index 4aa235bd3..28232b330 100644 --- a/bbs/visit_insert.inc.php +++ b/bbs/visit_insert.inc.php @@ -14,7 +14,9 @@ if (get_cookie('ck_visit_ip') != $_SERVER['REMOTE_ADDR']) $referer = ""; if (isset($_SERVER['HTTP_REFERER'])) $referer = escape_trim(clean_xss_tags(strip_tags($_SERVER['HTTP_REFERER']))); - $user_agent = escape_trim(clean_xss_tags(strip_tags($_SERVER['HTTP_USER_AGENT']))); + $user_agent = ''; + if (isset($_SERVER['HTTP_USER_AGENT'])) + $user_agent = escape_trim(clean_xss_tags(strip_tags($_SERVER['HTTP_USER_AGENT']))); $vi_browser = ''; $vi_os = ''; $vi_device = ''; diff --git a/bbs/write.php b/bbs/write.php index e9c253cbb..f547d4789 100644 --- a/bbs/write.php +++ b/bbs/write.php @@ -29,6 +29,11 @@ if ($w == 'u' || $w == 'r') { } else { alert("글이 존재하지 않습니다.\\n삭제되었거나 이동된 경우입니다.", G5_URL); } +} else if ($w == '') { // 게시글 입력시에도 $wr_1 ~ $wr_10 변수 사용시 오류 나오지 않도록 가변변수 생성 (다온테마님,210806) + for ($i=1; $i<=10; $i++) { + $vvar = "wr_".$i; + $$vvar = ''; + } } run_event('bbs_write', $board, $wr_id, $w); @@ -182,26 +187,22 @@ if (!empty($group['gr_use_access'])) { } // 본인확인을 사용한다면 -if ($config['cf_cert_use'] && !$is_admin) { +if ($board['bo_use_cert'] != '' && $config['cf_cert_use'] && !$is_admin) { // 인증된 회원만 가능 - if ($board['bo_use_cert'] != '' && $is_guest) { - alert('이 게시판은 본인확인 하신 회원님만 글쓰기가 가능합니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.', 'login.php?'.$qstr.'&url='.urlencode($_SERVER['SCRIPT_NAME'].'?bo_table='.$bo_table)); + if ($is_guest) { + alert('이 게시판은 본인확인 하신 회원님만 글쓰기가 가능합니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.', G5_BBS_URL.'/login.php?wr_id='.$wr_id.$qstr.'&url='.urlencode(get_pretty_url($bo_table, $wr_id, $qstr))); } - if ($board['bo_use_cert'] == 'cert' && !$member['mb_certify']) { + if (strlen($member['mb_dupinfo']) == 64 && $member['mb_certify']) { // 본인 인증 된 계정 중에서 di로 저장 되었을 경우에만 + goto_url(G5_BBS_URL."/member_cert_refresh.php?url=".urlencode(get_pretty_url($bo_table, $wr_id, $qstr))); + } + + if ($board['bo_use_cert'] == 'cert' && !$member['mb_certify']) { alert('이 게시판은 본인확인 하신 회원님만 글쓰기가 가능합니다.\\n\\n회원정보 수정에서 본인확인을 해주시기 바랍니다.', G5_URL); } if ($board['bo_use_cert'] == 'adult' && !$member['mb_adult']) { - alert('이 게시판은 본인확인으로 성인인증 된 회원님만 글쓰기가 가능합니다.\\n\\n성인인데 글쓰기가 안된다면 회원정보 수정에서 본인확인을 다시 해주시기 바랍니다.', G5_URL); - } - - if ($board['bo_use_cert'] == 'hp-cert' && $member['mb_certify'] != 'hp') { - alert('이 게시판은 휴대폰 본인확인 하신 회원님만 글읽기가 가능합니다.\\n\\n회원정보 수정에서 휴대폰 본인확인을 해주시기 바랍니다.', G5_URL); - } - - if ($board['bo_use_cert'] == 'hp-adult' && (!$member['mb_adult'] || $member['mb_certify'] != 'hp')) { - alert('이 게시판은 휴대폰 본인확인으로 성인인증 된 회원님만 글읽기가 가능합니다.\\n\\n현재 성인인데 글읽기가 안된다면 회원정보 수정에서 휴대폰 본인확인을 다시 해주시기 바랍니다.', G5_URL); + alert('이 게시판은 본인확인으로 성인인증 된 회원님만 글읽기가 가능합니다.\\n\\n현재 성인인데 글읽기가 안된다면 회원정보 수정에서 본인확인을 다시 해주시기 바랍니다.', G5_URL); } } diff --git a/bbs/write_comment_update.php b/bbs/write_comment_update.php index 71e7c5c50..ed1984251 100644 --- a/bbs/write_comment_update.php +++ b/bbs/write_comment_update.php @@ -324,9 +324,7 @@ else if ($w == 'cu') // 댓글 수정 if (!$is_admin) $sql_ip = " , wr_ip = '{$_SERVER['REMOTE_ADDR']}' "; - $sql_secret = ""; - if ($wr_secret) - $sql_secret = " , wr_option = '$wr_secret' "; + $sql_secret = " , wr_option = '$wr_secret' "; $sql = " update $write_table set wr_subject = '$wr_subject', diff --git a/bbs/write_update.php b/bbs/write_update.php index 8e01109a8..08a568193 100644 --- a/bbs/write_update.php +++ b/bbs/write_update.php @@ -221,6 +221,9 @@ if (!isset($_POST['wr_subject']) || !trim($_POST['wr_subject'])) $wr_seo_title = exist_seo_title_recursive('bbs', generate_seo_title($wr_subject), $write_table, $wr_id); +$options = array($html,$secret,$mail); +$wr_option = implode(',', array_filter($options, function($v) { return trim($v); })); + if ($w == '' || $w == 'r') { if ($member['mb_id']) { @@ -258,7 +261,7 @@ if ($w == '' || $w == 'r') { wr_reply = '$wr_reply', wr_comment = 0, ca_name = '$ca_name', - wr_option = '$html,$secret,$mail', + wr_option = '$wr_option', wr_subject = '$wr_subject', wr_content = '$wr_content', wr_seo_title = '$wr_seo_title', @@ -380,7 +383,7 @@ if ($w == '' || $w == 'r') { $sql = " update {$write_table} set ca_name = '{$ca_name}', - wr_option = '{$html},{$secret},{$mail}', + wr_option = '{$wr_option}', wr_subject = '{$wr_subject}', wr_content = '{$wr_content}', wr_seo_title = '$wr_seo_title', @@ -532,7 +535,7 @@ if(isset($_FILES['bf_file']['name']) && is_array($_FILES['bf_file']['name'])) { // image type if ( preg_match("/\.({$config['cf_image_extension']})$/i", $filename) || preg_match("/\.({$config['cf_flash_extension']})$/i", $filename) ) { - if ($timg['2'] < 1 || $timg['2'] > 16) + if ($timg['2'] < 1 || $timg['2'] > 18) continue; } //================================================================= @@ -561,13 +564,13 @@ if(isset($_FILES['bf_file']['name']) && is_array($_FILES['bf_file']['name'])) { $upload[$i]['filesize'] = $filesize; // 아래의 문자열이 들어간 파일은 -x 를 붙여서 웹경로를 알더라도 실행을 하지 못하도록 함 - $filename = preg_replace("/\.(php|pht|phtm|htm|cgi|pl|exe|jsp|asp|inc)/i", "$0-x", $filename); + $filename = preg_replace("/\.(php|pht|phtm|htm|cgi|pl|exe|jsp|asp|inc|phar)/i", "$0-x", $filename); shuffle($chars_array); $shuffle = implode('', $chars_array); // 첨부파일 첨부시 첨부파일명에 공백이 포함되어 있으면 일부 PC에서 보이지 않거나 다운로드 되지 않는 현상이 있습니다. (길상여의 님 090925) - $upload[$i]['file'] = abs(ip2long($_SERVER['REMOTE_ADDR'])).'_'.substr($shuffle,0,8).'_'.replace_filename($filename); + $upload[$i]['file'] = md5(sha1($_SERVER['REMOTE_ADDR'])).'_'.substr($shuffle,0,8).'_'.replace_filename($filename); $dest_file = G5_DATA_PATH.'/file/'.$bo_table.'/'.$upload[$i]['file']; @@ -658,7 +661,7 @@ for ($i=(int)$row['max_bf_no']; $i>=0; $i--) $row2 = sql_fetch(" select bf_file from {$g5['board_file_table']} where bo_table = '{$bo_table}' and wr_id = '{$wr_id}' and bf_no = '{$i}' "); // 정보가 있다면 빠집니다. - if ($row2['bf_file']) break; + if (isset($row2['bf_file']) && $row2['bf_file']) break; // 그렇지 않다면 정보를 삭제합니다. sql_query(" delete from {$g5['board_file_table']} where bo_table = '{$bo_table}' and wr_id = '{$wr_id}' and bf_no = '{$i}' "); @@ -725,8 +728,10 @@ if (!($w == 'u' || $w == 'cu') && $config['cf_email_use'] && $board['bo_use_emai } // 옵션에 메일받기가 체크되어 있고, 게시자의 메일이 있다면 - if (strstr($wr['wr_option'], 'mail') && $wr['wr_email']) - $array_email[] = $wr['wr_email']; + if (isset($wr['wr_option']) && isset($wr['wr_email'])) { + if (strstr($wr['wr_option'], 'mail') && $wr['wr_email']) + $array_email[] = $wr['wr_email']; + } // 중복된 메일 주소는 제거 $unique_email = array_unique($array_email); diff --git a/common.php b/common.php index 0e35dd7b1..dd4c2e1af 100644 --- a/common.php +++ b/common.php @@ -102,11 +102,13 @@ function sql_escape_string($str) // SQL Injection 등으로 부터 보호를 위해 sql_escape_string() 적용 //------------------------------------------------------------------------------ // magic_quotes_gpc 에 의한 backslashes 제거 -if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { - $_POST = array_map_deep('stripslashes', $_POST); - $_GET = array_map_deep('stripslashes', $_GET); - $_COOKIE = array_map_deep('stripslashes', $_COOKIE); - $_REQUEST = array_map_deep('stripslashes', $_REQUEST); +if (7.0 > (float)phpversion()) { + if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { + $_POST = array_map_deep('stripslashes', $_POST); + $_GET = array_map_deep('stripslashes', $_GET); + $_COOKIE = array_map_deep('stripslashes', $_COOKIE); + $_REQUEST = array_map_deep('stripslashes', $_REQUEST); + } } // sql_escape_string 적용 @@ -221,6 +223,107 @@ ini_set("session.gc_divisor", 100); // session.gc_divisor는 session.gc_probabil session_set_cookie_params(0, '/'); ini_set("session.cookie_domain", G5_COOKIE_DOMAIN); +function chrome_domain_session_name(){ + // 크롬90버전대부터 아래 도메인을 포함된 주소로 접속시 특정조건에서 세션이 생성 안되는 문제가 있을수 있다. + $domain_array=array( + '.cafe24.com', // 카페24호스팅 + '.dothome.co.kr', // 닷홈호스팅 + '.phps.kr', // 스쿨호스팅 + '.maru.net', // 마루호스팅 + ); + + if(isset($_SERVER['HTTP_HOST']) && preg_match('/('.implode('|', $domain_array).')/i', $_SERVER['HTTP_HOST'])){ // 위의 도메인주소를 포함한 url접속시 기본세션이름을 변경한다. + if(! defined('G5_SESSION_NAME')) define('G5_SESSION_NAME', 'G5PHPSESSID'); + @session_name(G5_SESSION_NAME); + } +} + +chrome_domain_session_name(); + +if( ! class_exists('XenoPostToForm') ){ + class XenoPostToForm + { + public static function check() { + $cookie_session_name = (defined('G5_SESSION_NAME') && G5_SESSION_NAME) ? G5_SESSION_NAME : 'PHPSESSID'; + + return !isset($_COOKIE[$cookie_session_name]) && count($_POST) && ((isset($_SERVER['HTTP_REFERER']) && !preg_match('~^https://'.preg_quote($_SERVER['HTTP_HOST'], '~').'/~', $_SERVER['HTTP_REFERER']) || ! isset($_SERVER['HTTP_REFERER']) )); + } + + public static function submit($posts) { + echo ''; + echo '
    '; + echo self::makeInputArray($posts); + echo '
    '; + echo ''; + exit; + } + + public static function makeInputArray($posts) { + $res = array(); + foreach($posts as $k => $v) { + $res[] = self::makeInputArray_($k, $v); + } + return implode('', $res); + } + + private static function makeInputArray_($k, $v) { + if(is_array($v)) { + $res = array(); + foreach($v as $i => $j) { + $res[] = self::makeInputArray_($k.'['.htmlspecialchars($i).']', $j); + } + return implode('', $res); + } + return ''; + } + } +} + +if( !function_exists('shop_check_is_pay_page') ){ + function shop_check_is_pay_page(){ + $shop_dir = 'shop'; + $plugin_dir = 'plugin'; + $mobile_dir = G5_MOBILE_DIR; + + + // PG 결제사의 리턴페이지 목록들 + $pg_checks_pages = array( + $shop_dir.'/inicis/INIStdPayReturn.php', // 영카트 5.2.9.5 이하에서 사용됨, 그 이상버전에서는 파일 삭제됨 + $shop_dir.'/inicis/inistdpay_return.php', // 영카트 5.2.9.6 이상에서 사용됨 + $mobile_dir.'/'.$shop_dir.'/inicis/pay_return.php', + $mobile_dir.'/'.$shop_dir.'/inicis/pay_approval.php', + $shop_dir.'/lg/returnurl.php', + $mobile_dir.'/'.$shop_dir.'/lg/returnurl.php', + $mobile_dir.'/'.$shop_dir.'/lg/xpay_approval.php', + $mobile_dir.'/'.$shop_dir.'/kcp/order_approval_form.php', + $shop_dir.'/kakaopay/inicis_kk_return.php', // 이니시스 카카오페이 (SIRK 로 시작하는 아이디 전용) + $plugin_dir."/inicert/ini_result.php", // 이니시스 간편인증 모듈 2021-09-10 http <-> https 간 세션 공유 문제로 인해 추가 + $plugin_dir."/inicert/ini_find_result.php", // 이니시스 간편인증 모듈 2021-09-10 http <-> https 간 세션 공유 문제로 인해 추가 + ); + + $server_script_name = str_replace('\\', '/', $_SERVER['SCRIPT_NAME']); + + // PG 결제사의 리턴페이지이면 + foreach( $pg_checks_pages as $pg_page ){ + if( preg_match('~'.preg_quote($pg_page).'$~i', $server_script_name) ){ + return true; + } + } + + return false; + } +} + +// PG 결제시에 세션이 없으면 내 호출페이지를 다시 호출하여 쿠키 PHPSESSID를 살려내어 세션값을 정상적으로 불러오게 합니다. +// 위와 같이 코드를 전부 한페이지에 넣은 이유는 이전 버전 사용자들이 패치시 어려울수 있으므로 한페이지에 코드를 다 넣었습니다. +if(XenoPostToForm::check()) { + if ( shop_check_is_pay_page() ){ // PG 결제 리턴페이지에서만 사용 + XenoPostToForm::submit($_POST); // session_start(); 하기 전에 + } +} + //============================================================================== // 공용 변수 //------------------------------------------------------------------------------ @@ -240,8 +343,10 @@ if( $config['cf_cert_use'] || (defined('G5_YOUNGCART_VER') && G5_YOUNGCART_VER) $res = @session_start($options); // IE 브라우저 또는 엣지브라우저 또는 IOS 모바일과 http환경에서는 secure; SameSite=None을 설정하지 않습니다. - if( preg_match('/Edge/i', $_SERVER['HTTP_USER_AGENT']) || preg_match('/(iPhone|iPod|iPad).*AppleWebKit.*Safari/i', $_SERVER['HTTP_USER_AGENT']) || preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT']) || preg_match('~Trident/7.0(; Touch)?; rv:11.0~',$_SERVER['HTTP_USER_AGENT']) || ! (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') ){ - return $res; + if (isset($_SERVER['HTTP_USER_AGENT'])) { + if( preg_match('/Edge/i', $_SERVER['HTTP_USER_AGENT']) || preg_match('/(iPhone|iPod|iPad).*AppleWebKit.*Safari/i', $_SERVER['HTTP_USER_AGENT']) || preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT']) || preg_match('~Trident/7.0(; Touch)?; rv:11.0~',$_SERVER['HTTP_USER_AGENT']) || ! (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') ){ + return $res; + } } $headers = headers_list(); @@ -556,6 +661,11 @@ if(isset($config['cf_theme']) && trim($config['cf_theme'])) { if(defined('G5_THEME_PATH') && is_file(G5_THEME_PATH.'/theme.config.php')) include_once(G5_THEME_PATH.'/theme.config.php'); + +// 쇼핑몰 설정 +if (defined('G5_USE_SHOP') && G5_USE_SHOP) + include_once(G5_PATH.'/shop.config.php'); + //===================================================================================== // 사용기기 설정 // 테마의 G5_THEME_DEVICE 설정에 따라 사용자 화면 제한됨 @@ -685,6 +795,12 @@ if(!empty($extend_file) && is_array($extend_file)) { } unset($extend_file); +if($is_member && !$is_admin && (!defined("G5_CERT_IN_PROG") || !G5_CERT_IN_PROG) && $config['cf_cert_use'] <> 0 && $config['cf_cert_req']) { // 본인인증이 필수일때 + if ((empty($member['mb_certify']) || (!empty($member['mb_certify']) && strlen($member['mb_dupinfo']) == 64))) { // di로 인증되어 있거나 본인인증이 안된 계정일때 + goto_url(G5_BBS_URL."/member_cert_refresh.php"); + } +} + ob_start(); // 자바스크립트에서 go(-1) 함수를 쓰면 폼값이 사라질때 해당 폼의 상단에 사용하면 diff --git a/config.php b/config.php index 95a9bc288..d8d72a5c3 100644 --- a/config.php +++ b/config.php @@ -4,12 +4,11 @@ 상수 선언 ********************/ -define('G5_VERSION', '그누보드5'); -define('G5_GNUBOARD_VER', '5.4.5.2'); - // 이 상수가 정의되지 않으면 각각의 개별 페이지는 별도로 실행될 수 없음 define('_GNUBOARD_', true); +include_once($g5_path['path'].'/version.php'); // 설정 파일 + // 기본 시간대 설정 date_default_timezone_set("Asia/Seoul"); @@ -27,7 +26,7 @@ date_default_timezone_set("Asia/Seoul"); define('G5_DOMAIN', ''); define('G5_HTTPS_DOMAIN', ''); -// 디버깅 상수, 실제 서버운영시 false 로 설정해 주제요. +// 디버깅 상수, 실제 서버운영시 false 로 설정해 주세요. define('G5_DEBUG', false); // Set Databse table default engine is Databse default_storage_engine, If you want to use MyISAM or InnoDB, change to MyISAM or InnoDB. @@ -60,6 +59,7 @@ define('G5_MOBILE_DIR', 'mobile'); define('G5_OKNAME_DIR', 'okname'); define('G5_KCPCERT_DIR', 'kcpcert'); +define('G5_INICERT_DIR', 'inicert'); define('G5_LGXPAY_DIR', 'lgxpay'); define('G5_SNS_DIR', 'sns'); @@ -98,6 +98,7 @@ define('G5_PLUGIN_URL', G5_URL.'/'.G5_PLUGIN_DIR); define('G5_EDITOR_URL', G5_PLUGIN_URL.'/'.G5_EDITOR_DIR); define('G5_OKNAME_URL', G5_PLUGIN_URL.'/'.G5_OKNAME_DIR); define('G5_KCPCERT_URL', G5_PLUGIN_URL.'/'.G5_KCPCERT_DIR); +define('G5_INICERT_URL', G5_PLUGIN_URL.'/'.G5_INICERT_DIR); define('G5_LGXPAY_URL', G5_PLUGIN_URL.'/'.G5_LGXPAY_DIR); define('G5_SNS_URL', G5_PLUGIN_URL.'/'.G5_SNS_DIR); define('G5_SYNDI_URL', G5_PLUGIN_URL.'/'.G5_SYNDI_DIR); @@ -117,6 +118,7 @@ define('G5_EDITOR_PATH', G5_PLUGIN_PATH.'/'.G5_EDITOR_DIR); define('G5_OKNAME_PATH', G5_PLUGIN_PATH.'/'.G5_OKNAME_DIR); define('G5_KCPCERT_PATH', G5_PLUGIN_PATH.'/'.G5_KCPCERT_DIR); +define('G5_INICERT_PATH', G5_PLUGIN_PATH.'/'.G5_INICERT_DIR); define('G5_LGXPAY_PATH', G5_PLUGIN_PATH.'/'.G5_LGXPAY_DIR); define('G5_SNS_PATH', G5_PLUGIN_PATH.'/'.G5_SNS_DIR); @@ -159,7 +161,7 @@ define('G5_SPACE', 32); // 공백 define('G5_SPECIAL', 64); // 특수문자 // SEO TITLE 문단 길이 -define('G5_SEO_TITEL_WORD_CUT', 8); // SEO TITLE 문단 길이 +define('G5_SEO_TITLE_WORD_CUT', 8); // SEO TITLE 문단 길이 // 퍼미션 define('G5_DIR_PERMISSION', 0755); // 디렉토리 생성시 퍼미션 @@ -227,8 +229,9 @@ define('G5_VISIT_BROWSCAP_USE', false); */ define('G5_IP_DISPLAY', '\\1.♡.\\3.\\4'); -if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') { //https 통신일때 daum 주소 js +if ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') || + (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO']==='https')) { //https 통신일때 daum 주소 js define('G5_POSTCODE_JS', ''); } else { //http 통신일때 daum 주소 js define('G5_POSTCODE_JS', ''); -} \ No newline at end of file +} diff --git a/css/default.css b/css/default.css index d70724799..b32a453e0 100644 --- a/css/default.css +++ b/css/default.css @@ -86,6 +86,13 @@ border:1px solid #558ab7 !important; #hd_sch #sch_stx {float:left;width:385px;height:45px;padding-left:10px;border-radius:30px 0 0 30px;background:#2c2c2c;border:0;border-right:0;font-size:1.25em;color:#fff} #hd_sch #sch_submit {float:left;width:60px;height:45px;border:0;background:#2c2c2c;color:#fff;border-radius:0 30px 30px 0;cursor:pointer;font-size:16px} +#hd_define {float:left} +#hd_define:after {display:block;visibility:hidden;clear:both;content:""} +#hd_define li {float:left;font-size:1.083em;line-height:14px;border-right:1px solid #4a4a4a;position:relative;text-align:center;margin:15px 10px 15px 0;padding-right:10px} +#hd_define li:last-child {padding-right:0;margin-right:0;border-right:0} +#hd_define li a {display:inline-block;color:#919191} +#hd_define li.active a {color:#fff} + #hd_qnb {float:right;text-align:right} #hd_qnb:after {display:block;visibility:hidden;clear:both;content:""} #hd_qnb li {float:left;font-size:1.083em;line-height:14px;border-right:1px solid #4a4a4a;position:relative;text-align:center;margin:15px 10px 15px 0;padding-right:10px} @@ -158,7 +165,7 @@ box-shadow:0 2px 5px rgba(0,0,0,0.2)} /* 중간 레이아웃 */ #wrapper {} #container_wr:after {display:block;visibility:hidden;clear:both;content:""} -#container_wr {margin:0 auto;height:100%;zoom:1} +#container_wr {margin:0 auto;zoom:1} #aside {float:right;width:235px;padding:0;height:100%;margin:20px 0 20px 20px} #container {position:relative;float:left;min-height:500px;height:auto !important;margin:20px 0;height:500px;font-size:1em;width:930px;zoom:1} @@ -395,7 +402,8 @@ box-shadow:0 1px 10px rgba(0,0,0,.1)} .new_win .new_win_con2 {margin:20px 0} .new_win .btn_confirm:after {display:block;visibility:hidden;clear:both;content:""} .new_win .win_btn {text-align:center} -.new_win .btn_close {height:45px;width:60px;overflow:hidden;cursor:pointer} +.new_win .cert_btn {margin-bottom:30px;text-align:center} +.new_win .btn_close {padding:0 20px;height:45px;overflow:hidden;cursor:pointer} .new_win .btn_submit {padding:0 20px;height:45px;font-weight:bold;font-size:1.083em} /* 검색결과 색상 */ diff --git a/css/default_shop.css b/css/default_shop.css new file mode 100644 index 000000000..6e7663e9e --- /dev/null +++ b/css/default_shop.css @@ -0,0 +1,1275 @@ +@charset "utf-8"; + +/* 초기화 */ +html {overflow-y:scroll} +body {margin:0;padding:0;font-size:0.75em;font-family:'Malgun Gothic', dotum, sans-serif} +html, h1, h2, h3, h4, h5, h6, form, fieldset, img {margin:0;padding:0;border:0} +h1, h2, h3, h4, h5, h6 {font-size:1em;font-family:'Malgun Gothic', dotum, sans-serif} +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {display:block} +ul {margin:0;padding:0;list-style:none} +ol,li,dl,dt,dd {margin:0;padding:0} +legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} +label, input, button, select, img {vertical-align:middle} +input, button {margin:0;padding:0;font-family:'Malgun Gothic', dotum, sans-serif;font-size:1em} +button {cursor:pointer} +textarea, select {font-family:'Malgun Gothic', dotum, sans-serif;font-size:1em} +select {margin:0} +p {margin:0;padding:0;word-break:break-all} +hr {display:none} +pre {overflow-x:scroll;font-size:1.1em} +a {color:#000;text-decoration:none} + +*, :after, :before { +-webkit-box-sizing:border-box; +-moz-box-sizing:border-box; +box-sizing:border-box; +} + +input[type=text],input[type=password], textarea { +-webkit-transition:all 0.30s ease-in-out; +-moz-transition:all 0.30s ease-in-out; +-ms-transition:all 0.30s ease-in-out; +-o-transition:all 0.30s ease-in-out; +outline:none; +} + +input[type=text]:focus,input[type=password]:focus, textarea:focus,select:focus { +-webkit-box-shadow:0 0 5px #9ed4ff; +-moz-box-shadow:0 0 5px #9ed4ff; +box-shadow:0 0 5px #9ed4ff; +border:1px solid #558ab7 !important; +} + +.placeholdersjs {color:#aaa !important} +#hd, #wrapper, #ft {min-width:1200px} + +#hd_pop, +#hd_wrapper, +#tnb .inner, + +#gnb .gnb_wrap, +#container_wr, +#ft_wr {width:1200px} + +/* 팝업레이어 */ +#hd_pop {z-index:1000;position:relative;margin:0 auto;width:1200px;height:0} +#hd_pop h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.hd_pops {position:absolute;border:1px solid #e9e9e9;background:#fff} +.hd_pops img {max-width:100%} +.hd_pops_con {} +.hd_pops_footer {padding:0;background:#000;color:#fff;text-align:left;position:relative} +.hd_pops_footer:after {display:block;visibility:hidden;clear:both;content:""} +.hd_pops_footer button {padding:10px;border:0;color:#fff} +.hd_pops_footer .hd_pops_reject {background:#000;text-align:left} +.hd_pops_footer .hd_pops_close {background:#393939;position:absolute;top:0;right:0} + +/* 상단 레이아웃 */ +#hd {background:#212020} +#hd_h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#hd_wrapper {position:relative;margin:0 auto} +#hd_wrapper:after {display:block;visibility:hidden;clear:both;content:""} + +#logo {float:left;padding:30px 0 0} +.hd_sch_wr {float:left;padding:30px 0;width:445px;margin-left:65px} +#hd_sch h3 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#hd_sch {border-radius:30px;overflow:hidden} +#hd_sch #sch_str {float:left;width:385px;height:45px;padding-left:15px;border-radius:30px 0 0 30px;background:#2c2c2c;border:0;border-right:0;font-size:1.2em;color:#fff} +#hd_sch #sch_submit {float:left;width:60px;height:45px;border:0;background:#2c2c2c;color:#fff;border-radius:0 30px 30px 0;cursor:pointer;font-size:16px} + +#tnb {border-bottom:1px solid #383838;margin:0 auto} +#tnb:after {display:block;visibility:hidden;clear:both;content:""} +#tnb .inner {margin:0 auto} + +#hd_define {float:left} +#hd_define:after {display:block;visibility:hidden;clear:both;content:""} +#hd_define li {float:left;font-size:1.083em;line-height:14px;border-right:1px solid #4a4a4a;position:relative;text-align:center;margin:15px 10px 15px 0;padding-right:10px} +#hd_define li:last-child {padding-right:0;margin-right:0;border-right:0} +#hd_define li a {display:inline-block;color:#919191} +#hd_define li.active a {color:#fff} + +#hd_qnb {float:right;text-align:right} +#hd_qnb:after {display:block;visibility:hidden;clear:both;content:""} +#hd_qnb li {float:left;font-size:1.083em;line-height:14px;border-right:1px solid #4a4a4a;position:relative;text-align:center;margin:15px 10px 15px 0;padding-right:10px} +#hd_qnb li:last-child {padding-right:0;margin-right:0;border-right:0} +#hd_qnb li a {display:inline-block;color:#919191} + +.hd_login {position:absolute;right:0;top:45px} +.hd_login>li {float:left;position:relative;margin:0 5px} +.hd_login>li.login a {color:#3a8afd;padding:10px;border-radius:3px;border:1px solid #3a8afd} +.hd_login>li a {color:#fff} +.hd_login>li.shop_login {margin-top:-15px} +.hd_login .fa-shopping-cart {font-size:1.6em} +.hd_login .count {display:inline-block;position:absolute;top:-5px;right:-10px;line-height:12px;padding:0 5px;border-radius:10px;background:#ff1a21;color:#fff;min-width:16px;height:14px;font-size:0.85em} + +#hd_menu {position:relative;background:#000;width:1200px;margin:0 auto} +#hd_menu:after {display:block;visibility:hidden;clear:both;content:""} +#hd_menu button#menu_open {float:left;width:265px;height:50px;border:0;background:#3a8afd;text-align:left;color:#fff;padding:0 20px;font-weight:bold;font-size:1.167em} +.hd_menu {float:left;display:inline-block;width:935px;font-size:1.083em} +.hd_menu:after {display:block;visibility:hidden;clear:both;content:""} +.hd_menu li {float:left;width:20%;padding:12px 0;line-height:26px;text-align:center} +.hd_menu li:last-child a {border-right:0} +.hd_menu li a {display:block;color:#fff;border-right:1px solid #333} + + +/*사이드 메뉴*/ +#side_menu {height:100%;position:fixed;top:0;right:0;background:#fff;border-left:1px solid #e5e7ea;z-index:120;padding-left:50px;-webkit-box-shadow:0 1px 5px #d6d6d6; +-moz-box-shadow:0 1px 5px #d6d6d6; +box-shadow:0 1px 5px #d6d6d6} + +#quick {position:absolute;top:50%;left:0;width:50px;margin-top:-157.5px} +#quick li {position:relative} +#quick li button {width:50px;height:50px;border:0;font-size:1.325em;background:#fff;color:#495057} +#quick .qk_tit {display:none;position:absolute;top:12px;right:60px;white-space:pre;padding:0 15px;line-height:30px;background:#8b929c;color:#fff;font-size:0.75em;border-radius:5px} +#quick .qk_tit:after {content:"";position:absolute;top:10px;right:-8px;display:inline-block;width:0;height:0;border-style:solid;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #8b929c;color:transparent} +#quick li:hover .qk_tit {display:block} + +#tabs_con {height:100%;text-align:left} + +.side_mn_wr1 {display:none;width:230px;overflow-y:auto;height:100%} +.side_mn_wr2 {display:none;width:230px;overflow-y:auto;height:100%} +.side_mn_wr3 {display:none;width:230px;overflow-y:auto;height:100%} +.side_mn_wr4 {display:none;width:230px;overflow-y:auto;height:100%} +.btn_sm_on i {color:#3a8afd} + +.qk_con {display:none;position:relative;width:230px;height:100%;background:#fff;border-left:1px solid #f0f0f0} +.qk_con h2.s_h2 {position:relative;margin:0;font-size:1.25em;padding:15px;border-bottom:1px solid #e5e7ea} +.qk_con h2.s_h2 span {display:inline-block;min-width:20px;padding:2px 8px;border-radius:30px;text-align:center;background:#eff5ff;color:#3b8afc;font-size:0.7em;font-weight:normal;vertical-align:text-bottom} +.qk_con_wr {padding:0;height:100%;overflow-y:auto} +.qk_con_wr .btn_side_shop {position:relative;width:100%;height:30px;background:none;border:0;text-align:left;font-weight:bold} +.qk_con_wr .btn_side_shop span {position:absolute;top:5px;right:0;padding:0 5px;line-height:20px;border-radius:10px;color:#fff;background:#ed1c24} +.qk_con_wr .con_close {position:fixed;top:0;right:230px;width:50px;height:50px;border:0;background:none;font-size:25px;color:#dedede} +.qk_con_wr .con_close:hover {color:rgba(0,0,0,0.8)} +.qk_con_wr .side_tnb {padding:25px} +.qk_con_wr .side_tnb li a {display:block;line-height:28px;color:#465168;padding:5px 0} +.qk_con_wr .side_tnb li:hover a {color:#3a8afd} + +#category {display:none;position:absolute;border:1px solid #c5d6da;width:100%;background:#fff;z-index:1000;-webkit-box-shadow:0 2px 5px rgba(0,0,0,0.2); +-moz-box-shadow:0 2px 5px rgba(0,0,0,0.2); +box-shadow:0 2px 5px rgba(0,0,0,0.2)} +#category h2 {font-size:1.3em;padding:15px 20px;border-bottom:1px solid #e7eeef} +#category ul:after {display:block;visibility:hidden;clear:both;content:""} +#category ul li:nth-child(5n+1) {border-left:0} +#category .cate_li_1 {float:left;width:20%;min-height:150px;padding:20px;border-left:1px solid #e7eeef} +#category .cate_li_1_a {font-size:1.2em;display:block;position:relative;margin-bottom:10px;font-weight:bold;color:#3a8afd} +#category .cate_li_2 {line-height:2em} +#category .cate_li_2 a {color:#555} +#category .close_btn {position:absolute;top:0;right:0;width:50px;height:50px;background:#fff;color:#b6b9bb;border:0;vertical-align:top;font-size:18px} +#category_all_bg {display:none;background:rgba(0,0,0,0.1);width:100%;height:100%;position:fixed;left:0;top:0;z-index:999} +#category .no-cate{text-align:center;padding:15px} + + +/* 중간 레이아웃 */ +/* #wrapper {z-index:5;margin:0 auto;width:1200px;position:relative} */ +#wrapper {z-index:5;position:relative;width:100%;background:#f6f6f6} +#wrapper.is_community{background:#fff} +#wrapper:after {display:block;visibility:hidden;clear:both;content:""} +#wrapper_title {padding:20px 0;font-size:2em;font-weight:bold} + +.lt_wr {width:49%} +.lt_wr:nth-child(2n+1) {clear:both} + +/* aside + wrapper */ +#aside {position:absolute;top:0;left:0;margin:0 10px 0 0;width:265px} +#side_pd {position:relative;border:1px solid #dde7e9;background:#fff;border-radius:3px;margin-bottom:15px} +#side_pd h2 {border-bottom:1px solid #e8e8e8;padding:15px} +#side_pd .bx-wrapper {padding-bottom:10px;height:400px;overflow:hidden} +#side_pd .bx-controls {display:inline-block;position:absolute;right:10px;top:12px} +#side_pd .bx-prev {display:inline-block;width:20px;height:20px;text-indent:-9999em;background:url('../img/btn_prev.png') no-repeat} +#side_pd .bx-next {display:inline-block;width:20px;height:20px;text-indent:-9999em;background:url('../img/btn_next.png') no-repeat} + +#container {position:relative;margin:0 auto;width:1200px;min-height:500px;height:auto !important} +#container:after {display:block;visibility:hidden;clear:both;content:""} +#container .shop-content {position:relative;padding:1px 0} +#container .is_index {margin-left:285px} +.shop-content #bo_v{margin-top:20px} + +#idx_hit {overflow:hidden} +#idx_hit:after {display:block;visibility:hidden;clear:both;content:""} +#idx_hit .owl-prev {position:absolute;top:50%;left:0;width:36px;height:36px;margin-top:-20px;text-indent:-9999em;background:url('../img/btn_idx_left.png') no-repeat} +#idx_hit .owl-next {position:absolute;top:50%;right:0;width:36px;height:36px;margin-top:-20px;text-indent:-9999px;background:url('../img/btn_idx_right.png') no-repeat} + + +.sale_prd h2 {font-size:1.167em;margin:20px 0 10px} +.st_bg {display:inline-block;width:1px;height:10px;margin:0 10px;background:#e2e1e0;vertical-align:-1px} + +/* 텍스트 크기 조절 */ +#text_size {display:none;position:absolute;top:-31px;left:-1px} +#text_size button {padding:0 10px;height:30px;border:1px solid #cfded8;border-bottom:0;background:#000;color:#fff;cursor:pointer} + +/* 하단 레이아웃 */ +#ft {background:#212020;margin:0 auto;text-align:center} +#ft h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#ft_wr {max-width:1240px;margin:0;padding:40px 0;position:relative;display:inline-block;text-align:left} +#ft_wr:after {display:block;visibility:hidden;clear:both;content:""} +#ft_wr .ft_cnt {width:25%;float:left;padding:0 20px} + +#ft_link {text-align:left} +#ft_link a {display:block;color:#fff;line-height:2em;font-weight:bold} +#ft_company h2 {font-size:1.2em;margin-bottom:20px} +#ft_company {font-weight:normal;color:#e3e3e3;line-height:2em} +#ft_catch {margin:20px 0 10px} +#ft_copy {text-align:center;width:1200px;margin:0 auto;padding:20px 0;color:#5b5b5b;font-size:0.92em;border-top:1px solid #383838} +#top_btn {position:absolute;bottom:0;left:0;border:0;border-top:1px solid #e5e7ea;margin-top:-25px;width:50px;height:50px;background:none;font-size:20px;color:#dedede} +#top_btn:hover {border-color:#3059c7;background:#3059c7;color:#fff} + +/* 쇼핑몰 회원가입 */ +#container .register{margin-bottom:30px} +#register_form .register_form_inner{background:#fff} +.register #register_form{background-color:initial} + +/* 쇼핑몰 비회원 주문조회 */ +#mb_login_od_wr {margin:20px auto 0;border:1px solid #dde7e9;width:360px;background:#fff;text-align:center} +#mb_login_od_wr h2 {font-size:1.25em;margin:20px 0 10px} +/*#mb_login_od_wr #mb_login_od {padding:0 35px}*/ +#mb_login_od_wr .frm_input {width:100%;margin:10px 0 0} +#mb_login_od_wr .btn_submit {width:100%;margin:10px 0 0;height:45px;font-weight:bold;font-size:1.25em} +#mb_login_od_wr p {background:#f3f3f3;margin:20px 0 0;padding:15px 20px;line-height:1.5em} + +#mb_login #sns_login {margin-top:0;border-color:#edeaea;padding:25px} +#mb_login #sns_login:after {display:block;visibility:hidden;clear:both;content:""} +#mb_login #sns_login h3 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#mb_login #sns_login .sns-wrap {margin:0 !important} +#mb_login #sns_login .sns-icon {width:49% !important;float:left !important} +#mb_login #sns_login .sns-icon:nth-child(odd) {margin-right:2%} +#mb_login #sns_login .txt {font-size:0.95em;padding-left:5px !important;border-left:0 !important} + +/*쇼핑몰 비회원 구매*/ +#mb_login_notmb {width:360px;margin:30px auto;padding:20px 30px;background:#fff;border:1px solid #dde7e9} +#mb_login_notmb h2 {font-size:1.25em;margin:10px 0;text-align:center} +#mb_login_notmb p {text-align:left} +#mb_login_notmb label {text-align:left} +#guest_privacy {border:1px solid #ccc;text-align:left;line-height:1.6em;color:#666;background:#fafafa;padding:10px;height:150px;margin:10px 0;overflow-y:auto} +#mb_login_notmb .btn_submit {display:block;text-align:center;margin-top:10px;line-height:45px} + +/* 쇼핑몰 로그인 */ +.mb_log_cate h2 {width:50%;float:left;padding:20px 0;text-align:center} +.mb_log_cate .join {width:50%;float:left;padding:20px 0;text-align:center;background:#f7f7f7;color:#6e6e6e} +.mb_log_cate:after {display:block;visibility:hidden;clear:both;content:""} +.mbskin .chk_box input[type="checkbox"] + label span{position:relative} + +/* 새글 */ +.is_community .tbl_head01 td {color:#666;padding:10px 5px;border-top:1px solid #ecf0f1;border-bottom:1px solid #ecf0f1;border-left:0 none;line-height:1.4em;height:60px;word-break:break-all} + +/* 글쓰기 및 글보기 */ +.is_community .chk_box input[type="checkbox"] + label span{top:2px;left:0} +.is_community .bo_fx{margin-bottom:20px} + +/* 화면낭독기 사용자용 */ +#hd_login_msg {position:absolute;top:0;left:0;width:1px;height:1px;overflow:hidden} +.msg_sound_only, .sound_only {display:inline-block !important;position:absolute;top:0;left:0;margin:0 !important;padding:0 !important;font-size:0;line-height:0;border:0 !important;overflow:hidden !important} + +/* 본문 바로가기 */ +#skip_to_container a {z-index:100000;position:absolute;top:0;left:0;width:1px;height:1px;font-size:0;line-height:0;overflow:hidden} +#skip_to_container a:focus, #skip_to_container a:active {width:100%;height:75px;background:#21272e;color:#fff;font-size:2em;font-weight:bold;text-align:center;text-decoration:none;line-height:3.3em} + +/* 이미지 등비율 리사이징 */ +.img_fix {width:100%;height:auto} + +/* 캡챠 자동등록(입력)방지 기본 -pc */ +#captcha {display:inline-block;position:relative} +#captcha legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} +#captcha #captcha_img {height:40px;border:1px solid #898989;vertical-align:top;padding:0;margin:0} +#captcha #captcha_mp3 {margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;background:url('../img/captcha2.png') no-repeat;text-indent:-999px;border-radius:3px} +#captcha #captcha_reload {margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;background:url('../img/captcha2.png') no-repeat 0 -40px;text-indent:-999px;border-radius:3px} +#captcha #captcha_key {margin:0 0 0 3px;padding:0 5px;width:90px;height:40px;border:1px solid #ccc;background:#fff;font-size:1.333em;font-weight:bold;text-align:center;border-radius:3px;vertical-align:top} +#captcha #captcha_info {display:block;margin:5px 0 0;font-size:0.95em;letter-spacing:-0.1em} + +/* ckeditor 단축키 */ +.cke_sc {margin:0 0 5px;text-align:right} +.btn_cke_sc {display:inline-block;padding:0 10px;height:23px;border:1px solid #ccc !important;background:#fafafa !important;color:#000 !important;text-decoration:none !important;line-height:1.9em;vertical-align:middle} +.cke_sc_def {margin:0 0 5px;padding:10px;border:1px solid #ccc;background:#f2f5f9;text-align:center} +.cke_sc_def dl {margin:0 0 5px;text-align:left} +.cke_sc_def dl:after {display:block;visibility:hidden;clear:both;content:""} +.cke_sc_def dt, .cke_sc_def dd {float:left;margin:0;padding:5px 0;border-bottom:1px solid #e9e9e9} +.cke_sc_def dt {width:20%;font-weight:bold} +.cke_sc_def dd {width:30%} + +/* ckeditor 태그 기본값 */ +#bo_v_con ul {display:block;list-style-type:disc;margin-top:1em;margin-bottom:1em;margin-left:0;margin-right:0;padding-left:40px} +#bo_v_con ol {display:block;list-style-type:decimal;margin-top:1em;margin-bottom:1em;margin-left:0;margin-right:0;padding-left:40px} +#bo_v_con li {display:list-item} + +/* Mobile화면으로 */ +#mobile_cng {display:block;margin:0.3em;padding:0.5em 0;border:1px solid #eee;border-radius:2em;background:#fff;color:#000;font-size:2em;text-decoration:none;text-align:center} + +/* 목록 바로가기 */ +.sanchor {margin:30px 0 20px;padding:0} +.sanchor:after {display:block;visibility:hidden;clear:both;content:""} +.sanchor li {float:left;width:20%;text-align:center;list-style:none} +.sanchor li a {display:block;position:relative;height:60px;margin-left:-1px;background-color:#f7f7f7;border:1px solid #cdcdcd;border-bottom:1px solid #000;font-size:1.25em;color:#666;line-height:58px;text-align:center;z-index:1} +.sanchor li .sanchor_on {margin:0 0 0 -1px;border:1px solid #000;background:#fff;z-index:2;border-bottom-color:#fff;color:#000;font-weight:bold} +.sanchor li a .item_qa_count,.sanchor li a .item_use_count {display:inline-block;background:#aaa;padding:0 5px;line-height:23px;border-radius:15px;color:#fff;min-width:23px;font-size:12px} +.sanchor li .sanchor_on .item_qa_count,.sanchor li .sanchor_on .item_use_count {background:#55bfb1} + +/* 콘텐츠별 스타일 */ +.cnt_cmt {display:inline-block;margin:0 0 0 3px;font-weight:bold} + +/* 버튼 */ +a.btn,.btn {line-height:35px;height:35px;padding:0 10px;text-align:center;font-weight:bold;border:0;font-size:1.4em; +-webkit-transition:background-color 0.3s ease-out; +-moz-transition:background-color 0.3s ease-out; +-o-transition:background-color 0.3s ease-out; +transition:background-color 0.3s ease-out} + +a.btn01 {display:inline-block;padding:7px;border:1px solid #bababa;border-radius:3px;background:#fff;color:#717171;text-decoration:none;vertical-align:middle} +a.btn01:focus, a.btn01:hover {text-decoration:none} +button.btn01 {display:inline-block;margin:0;padding:7px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none} +a.btn02 {display:inline-block;padding:7px;background:#3a8afd;color:#fff;border-radius:3px;text-decoration:none;vertical-align:middle} +a.btn02:focus, .btn02:hover {text-decoration:none} +button.btn02 {display:inline-block;margin:0;padding:7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none} + +.btn_confirm {text-align:center} /* 서식단계 진행 */ + +.btn_submit {border:1px solid #1c70e9;background:#3a8afd;color:#fff;cursor:pointer;border-radius:3px} +.btn_submit:hover {background:#2375eb} +.btn_close {border:1px solid #dcdcdc;cursor:pointer;border-radius:3px;background:#fff} +a.btn_close {text-align:center;line-height:50px} + +a.btn_cancel {display:inline-block;background:#969696;color:#fff;text-decoration:none;vertical-align:middle} +button.btn_cancel {display:inline-block;background:#969696;color:#fff;text-decoration:none;vertical-align:middle} +.btn_cancel:hover {background:#aaa} +a.btn_frmline, button.btn_frmline {display:inline-block;width:128px;padding:0 5px;height:40px;border:0;background:#434a54;border-radius:3px;color:#fff;text-decoration:none;vertical-align:top} /* 우편번호검색버튼 등 */ +a.btn_frmline {} +button.btn_frmline {font-size:1em} +a.btn_frmline {line-height:24px} + +/* 게시판용 버튼 */ +a.btn_b01,.btn_b01 {display:inline-block;color:#bababa;text-decoration:none;vertical-align:middle;border:0;background:transparent} +.btn_b01:hover, .btn_b01:hover {color:#000} +a.btn_b02,.btn_b02 {display:inline-block;background:#253dbe;padding:0 10px;color:#fff;text-decoration:none;border:0;vertical-align:middle} +a.btn_b02:hover, .btn_b02:hover {background:#0025eb} +a.btn_b03, .btn_b03 {display:inline-block;background:#fff;border:1px solid #b9bdd3;color:#646982;text-decoration:none;vertical-align:middle} +a.btn_b03:hover, .btn_b03:hover {background:#ebedf6} +a.btn_b04, .btn_b04 {display:inline-block;background:#fff;border:1px solid #ccc;color:#707070;text-decoration:none;vertical-align:middle} +a.btn_b04:hover, .btn_b04:hover {color:#333;background:#f9f9f9} +a.btn_admin,.btn_admin {display:inline-block;color:#d13f4a;text-decoration:none;vertical-align:middle} /* 관리자 전용 버튼 */ +.btn_admin:hover, a.btn_admin:hover {color:#ff3746} + +/* 선택수정 버튼 */ +.btn_list {margin:0 auto;width:93%} +.btn_list input, .btn_list button {background:none repeat scroll 0 0 #617D46;border:0 none;color:#FFFFFF;height:28px;line-height:2.2em;padding:0 15px;vertical-align:middle} + +/* 기본테이블 */ +.tbl_wrap table {width:100%;border-collapse:collapse;border-spacing:0} +.tbl_wrap caption {padding:10px 0;font-weight:bold;text-align:left} + +.tbl_head01 {margin:0 0 10px} +.tbl_head01 table {} +.tbl_head01 caption {padding:0;font-size:0;line-height:0;overflow:hidden} +.tbl_head01 thead th {padding:12px 0;border-top:2px solid #000;border-bottom:1px solid #d3d3d3;background:#fff;color:#383838;font-size:0.95em;text-align:center;letter-spacing:-0.1em} +.tbl_head01 thead a {color:#383838} +.tbl_head01 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head01 tfoot th, .tbl_head01 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center} +.tbl_head01 tbody th {padding:10px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head01 td {padding:15px 5px;border-top:1px solid #f3f3f3;border-left:1px solid #f3f3f3;line-height:1.5em;word-break:break-all} +.tbl_head01 td:first-child {border-left:0} +.tbl_head01 a {} + +.tbl_head02 {margin:0 0 10px} +.tbl_head02 caption {padding:0;font-size:0;line-height:0;overflow:hidden} +.tbl_head02 thead th {padding:7px;background:#f3f3f3;border-top:1px solid #d3d3d3;border-bottom:1px solid #d3d3d3} +.tbl_head02 thead a {color:#383838} +.tbl_head02 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head02 tfoot th, .tbl_head02 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center} +.tbl_head02 tbody th {padding:5px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head02 td {padding:5px 3px;border-bottom:1px solid #e9e9e9;line-height:1.4em;word-break:break-all} +.tbl_head02 a {} + +.tbl_head03 {margin:0 0 10px} +.tbl_head03 table {border-bottom:1px solid #d3d3d3} +.tbl_head03 caption {padding:0;font-size:0;line-height:0;overflow:hidden} +.tbl_head03 thead th {padding:20px 0;border-top:2px solid #959da6;border-bottom:1px solid #d3d3d3;color:#383838;font-size:1.2em;text-align:center;letter-spacing:-0.1em} +.tbl_head03 thead a {color:#383838} +.tbl_head03 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head03 tfoot th, .tbl_head03 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center} +.tbl_head03 tbody th {padding:10px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head03 td {background:#fff;background-clip:padding-box;padding:25px 15px;border-top:1px solid #ccd2d9;border-left:1px solid #f6f6f6;line-height:1.5em;word-break:break-all} +.tbl_head03 td:first-child {border-left:0} +.tbl_head03 a {} + +/* 폼 테이블 */ +.tbl_frm01 {margin:0 0 20px} +.tbl_frm01 table {width:100%;border-collapse:collapse;border-spacing:0} +.tbl_frm01 th {width:90px;padding:5px 10px;background:none;text-align:right;font-weight:normal} +.tbl_frm01 td {padding:5px 10px;background:transparent} +.wr_content textarea, +.tbl_frm01 textarea, +.form_01 textarea, +.frm_input {border:1px solid #d0d3db;background:#fff;color:#000;vertical-align:middle;border-radius:3px;padding:5px; +-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)} +.tbl_frm01 textarea {padding:2px 2px 3px} +.frm_input {height:45px} + +.full_input, .frm_address {width:100%} +.half_input {width:49.5%} +.tbl_frm01 textarea {width:100%;height:100px} +.tbl_frm01 a {text-decoration:none} +.tbl_frm01 .frm_address {margin-top:5px} +.tbl_frm01 .frm_file {display:block;margin-bottom:5px} +.tbl_frm01 .frm_info {display:block;padding:0 0 5px;line-height:1.4em} + +/*기본리스트*/ +.list_01 li {position:relative;border:1px solid #dbdbdb;border-radius:3px;margin:8px 0;padding:10px 15px;list-style:none} +.list_01 li:after {display:block;visibility:hidden;clear:both;content:""} +.list_01 li:hover {background:#f9f9f9} + +.list_02 ul:after {display:block;visibility:hidden;clear:both;content:""} +.list_02 li {float:left;width:225px;margin:10px 0 20px 18px} +.list_02 li:nth-child(5n+1) {clear:both;margin-left:0} + +/*폼 리스트*/ +.form_01 h2 {margin:0 0 10px;font-size:1.25em} +.form_01 li {margin:10px 0} +.form_01 li:after {display:block;visibility:hidden;clear:both;content:""} +.form_01 li .right_input {float:right} +.form_01 textarea {height:100px;width:100%} +.form_01 .frm_label {display:inline-block;width:130px} +.form_01 .form_left {float:left;width:49.5%} +.form_01 .form_right {float:right;width:49.5%} + +/* 자료 없는 목록 */ +.empty_table {padding:50px 0 !important;text-align:center;color:#777 !important} +.empty_list, .empty_li {padding:20px 0 !important;text-align:center !important;color:#777 !important} + +/* 필수입력 */ +.required, textarea.required {background-image:url('../img/require.png') !important;background-repeat:no-repeat !important;background-position:right top !important} + +/* 테이블 그리드 padding 0 5px 고려한 넓이 */ +.grid_1 {width:40px} +.grid_2 {width:90px} +.grid_3 {width:140px} +.grid_4 {width:190px} +.grid_5 {width:240px} +.grid_6 {width:290px} +.grid_7 {width:340px} +.grid_8 {width:390px} +.grid_9 {width:440px} +.grid_10 {width:490px} +.grid_11 {width:540px} +.grid_12 {width:590px} +.grid_13 {width:640px} +.grid_14 {width:690px} +.grid_15 {width:740px} +.grid_16 {width:790px} +.grid_17 {width:840px} +.grid_18 {width:890px} + +/* 테이블 항목별 정의 */ +.td_board {width:120px;text-align:center} +.td_chk {width:30px;text-align:center} +.td_date {width:60px;text-align:center} +.td_datetime {width:110px;text-align:center} +.td_default {width:60px;text-align:center} +.td_dvr {width:100px;text-align:center} +.td_group {width:100px;text-align:center} +.td_imgsmall {width:60px;text-align:center} +.td_num {width:80px;text-align:center} +.td_numbig {width:100px;text-align:center} +.td_nick {width:100px;text-align:center} +.td_name {width:100px;text-align:left} +.td_namesmall {width:50px;text-align:left} +.td_mb_id {width:100px;text-align:center} +.td_mng {width:80px;text-align:center} +.td_mngsmall {width:100px;text-align:center} +.td_statsmall {width:50px;text-align:center} + +.text_left {text-align:left !important} +.text_center {text-align:center !important} +.text_right {text-align:right !important} + +/* 새창 기본 스타일 */ +.new_win {position:relative;background:#fff} +.new_win .tbl_wrap {margin:0 20px} +.new_win #win_title {font-size:1.3em;height:50px;line-height:30px;padding:10px 20px;background:#fff;color:#000;-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1); +-moz-box-shadow:0 1px 10px rgba(0,0,0,.1); +box-shadow:0 1px 10px rgba(0,0,0,.1)} +.new_win #win_title .sv {font-size:0.75em;line-height:1.2em} +.new_win .win_ul {margin-bottom:15px;padding:0 20px} +.new_win .win_ul:after {display:block;visibility:hidden;clear:both;content:""} +.new_win .win_ul li {float:left;background:#fff;text-align:center;padding:0 10px;border:1px solid #d6e9ff;border-radius:30px;margin-left:5px} +.new_win .win_ul li:first-child {margin-left:0} +.new_win .win_ul li a {display:block;padding:8px 0;color:#6794d3} +.new_win .win_ul .selected {background:#3a8afd;border-color:#3a8afd;position:relative;z-index:5} +.new_win .win_ul .selected a {color:#fff;font-weight:bold} +.new_win .win_desc {position:relative;margin:10px;border-radius:5px;font-size:1em;background:#f2838f;color:#fff;line-height:50px;text-align:left;padding:0 20px} +.new_win .win_desc i {font-size:1.2em;vertical-align:baseline} +.new_win .win_desc:after {content:"";position:absolute;left:0;top:0;width:4px;height:50px;background:#da4453;border-radius:3px 0 0 3px} +.new_win .frm_info {font-size:0.92em;color:#919191} +.new_win .win_total {float:right;display:inline-block;line-height:30px;font-weight:normal;font-size:0.75em;color:#3a8afd;background:#f6f6f6;padding:0 10px;border-radius:5px} +.new_win .new_win_con {margin:20px 0;padding:20px} +.new_win .new_win_con:after {display:block;visibility:hidden;clear:both;content:""} +.new_win .new_win_con2 {margin:20px 0 0} +.new_win .btn_confirm:after {display:block;visibility:hidden;clear:both;content:""} +.new_win .win_btn {text-align:center;padding-bottom:30px} +.new_win .btn_close {padding:0 20px;height:45px;overflow:hidden;cursor:pointer} +.new_win .btn_submit {padding:0 20px;height:45px;font-weight:bold;font-size:1.083em} + + +/* 자바스크립트 alert 대안 */ +#validation_check {margin:100px auto;width:500px} +#validation_check h1 {margin-bottom:20px;font-size:1.3em} +#validation_check p {margin-bottom:20px;padding:30px 20px;border:1px solid #e9e9e9;background:#fff} + +/* 사이드뷰 */ +.sv_wrap {display:inline-block;position:relative;font-weight:normal} +.sv_wrap .sv {z-index:1000;display:none;margin:5px 0 0;border:1px solid #283646;background:#111} +.sv_wrap .sv a {display:inline-block !important;margin:0 !important;padding:3px !important;width:94px;border-bottom:1px solid #283646;color:#fff !important} +.sv_wrap a:focus, .sv_wrap a:hover, .sv_wrap a:active {text-decoration:none !important} +.sv_on {display:block !important;position:absolute;top:10px;left:20px;width:auto;height:auto !important} +.sv_nojs .sv {display:block} + +/* 페이징 */ +.pg_wrap {margin:10px 0 30px;text-align:center} +.pg_wrap:after {display:block;visibility:hidden;clear:both;content:""} +.pg {text-align:center} +.pg_page, .pg_current,.qa_page {display:inline-block;vertical-align:middle;background:#eee;border:1px solid #eee} +.pg a:focus, .pg a:hover {text-decoration:none} +.pg_page,.qa_page {color:#959595;font-size:1.083em;height:30px;line-height:28px;padding:0 5px;min-width:30px;text-decoration:none;border-radius:3px} +.pg_page:hover,.qa_page:hover {background-color:#fafafa} +.pg_start {text-indent:-999px;overflow:hidden;background:url('../img/btn_first.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_prev {text-indent:-999px;overflow:hidden;background:url('../img/btn_prev.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_end {text-indent:-999px;overflow:hidden;background:url('../img/btn_end.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_next {text-indent:-999px;overflow:hidden;background:url('../img/btn_next.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_start:hover,.pg_prev:hover,.pg_end:hover,.pg_next:hover {background-color:#fafafa} + +.pg_current {display:inline-block;background:#3a8afd;border:1px solid #3a8afd;color:#fff;font-weight:bold;height:30px;line-height:30px;padding:0 10px;min-width:30px;border-radius:3px} + +/* 팁 */ +.tooltip_icon {display:inline-block;vertical-align:middle;color:#b3b5b8;border:0;font-size:1.4em;background:transparent;cursor:pointer} +.tooltip_icon:hover {color:#448bf5} +.tooltip {position:relative;width:auto;color:#fff;background:#000;padding:10px;font-size:small;line-height:18px;display:none;position:absolute;z-index:9;font-weight:normal;margin-left:15px;margin-top:20px} +.tooltip:before {content:"";position:absolute;top:0;left:-10px;width:0;height:0;border-style:solid;border-top:0px solid transparent;border-bottom:10px solid transparent;border-left:0;border-right:10px solid #000} + +.tooltip_txt {position:relative;text-align:left;color:#fff;height:50px;line-height:50px;font-size:1.1em;background:#f2838f;margin:0 0 10px;padding:0 20px;border-radius:5px;font-weight:bold} +.tooltip_txt:before {content:"";position:absolute;top:0;left:0;width:5px;height:50px;border-radius:5px 0 0 5px;background:#da4453} +.tooltip_txt i {font-size:1.2em;vertical-align:middle} + + +/* ########## 쇼핑몰 컨텐츠 ########## */ +/* 인덱스 이미지 출력 */ +#sidx_img {margin:0 0 20px} +#sidx_img img {max-width:100%;height:auto} + + +/* 상품 메일 추천하기 */ +#sit_rec_new {} +#sit_rec_new th, +#sit_rec_new td {display:block;width:100%} +#sit_rec_new th {text-align:left;margin-top:20px;margin-bottom:5px} +#sit_rec_new textarea {width:100%;min-height:100px} +#sit_rec_new .win_btn {margin:20px 0} + +/* 마이페이지 */ +#smb_my {position:relative} + +#smb_my_ov {margin:0 0 20px;position:relative} +#smb_my_ov h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#smb_my_ov .my_ov_name{display:block;background:#fff;border:1px solid #ccc;line-height:45px;padding:0 20px;font-size:1.167em;} +#smb_my_ov .my_ov_name img{width:20px;border-radius:50%} +#smb_my_act {position:absolute;top:-35px;right:0;zoom:1} +#smb_my_act:after {display:block;visibility:hidden;clear:both;content:""} +#smb_my_act ul {float:right;margin:0;padding:0;list-style:none} +#smb_my_act li {float:left;margin:0 0 0 4px} +#smb_my_act li a{line-height:25px;padding:0 5px} +#smb_my_act li .btn_admin{height:27px;} +#smb_my_ov .cou_pt{position:absolute;top:0 ;right:0;} +#smb_my_ov .cou_pt dt{float:left;width:90px;line-height:45px;} +#smb_my_ov .cou_pt dd{float:left;width:110px;text-align:right;padding:0 20px 0 0 ;line-height:45px;} +#smb_my_ov .cou_pt dd a{color:#ff2b64;font-weight:bold;font-size:1.167em} +#smb_my_ov .op_area{background:#fff;border:1px solid #ccc;border-top:0;padding:10px 15px;line-height:18px;color:#555} +#smb_my_ov .btn_admin {display:inline-block;background:#d13f4a;color:#fff;text-decoration:none;vertical-align:middle;border-radius:3px} +#smb_my_ov .op_area:after {display:block;visibility:hidden;clear:both;content:""} +#smb_my_ov .op_area dt{float:left;width:10%;margin:3px 0;font-weight:bold} +#smb_my_ov .op_area dd{float:left;width:40%;;margin:3px 0} +.my_ov_btn{text-align:center;} +.my_ov_btn button{background:#fff;border:1px solid #ccc;vertical-align:top;border-top:0;padding:0 20px;height:25px} +.my_ov_btn button:hover{background:#f3f3f3} + +#smb_my_ovaddd{width:90%} + +#smb_my_ovaddt {border-bottom:0 !important} +#smb_my_ovaddd {width:590px !important;border-bottom:0 !important} + +#smb_my_od {margin:0 0 50px;position:relative} +#smb_my_od h2 {margin:0 0 10px;font-size:1.25em;} +#smb_my_od td{text-align:center} +#smb_my_od td a{font-weight:bold} +#smb_my_wish{position:relative;} +#smb_my_wish h2 {margin:0 0 10px;font-size:1.25em;padding:0 0 10px;border-bottom:2px solid #000} +.smb_my_img{margin:0 0 5px;} +.smb_my_tit{margin:5px 0 ; font-size:1.167em;font-weight:bold} +.smb_my_date{font-size:0.92em;color:#777} +.smb_my_more {position:absolute;top:0;right:0;} +#smb_my_wish .list_02 .smb_my_img{float:none;margin:0} +.smb_my_more a{display:block;background:url('../img/more-btn.gif') no-repeat 0 2px;padding-left:20px;height:30px} +.smb_my_img a{display:block} +.smb_my_img a img{max-width:100%;height:auto} + +/* 마이페이지 list */ +#smb_my_list {float:left;width:915px} + +#smb_my_od h2 {margin:0 0 10px;font-size:1.25em} +#smb_my_od {position:relative;margin:0 0 50px} +.smb_my_od {background:#fff} +.smb_my_od li {padding:15px;border-bottom:1px solid #ececec} +.smb_my_od li:last-child {border-bottom:0} +.smb_my_od li:after {display:block;visibility:hidden;clear:both;content:""} +.smb_my_od li:hover {background:#fff6f6} +.smb_my_od .smb_my_od_li {float:left;line-height:18px} +.smb_my_od .smb_my_od_li1 {width:140px;text-align:center} +.smb_my_od .smb_my_od_li2 {width:75%;padding:0 20px} +.smb_my_od .smb_my_od_li3 {width:80px;float:right;text-align:center} + +.smb_my_od .ord_num, +.smb_my_od .ord_name {font-size:1.2em;font-weight:bold;letter-spacing:-0.5px} +.smb_my_od .date {color:#b5b5b5} +.smb_my_od .cost {color:#3a8afd;font-weight:bold} +.smb_my_od .misu {color:#6d6d6d} + +#smb_my_wish {position:relative;margin-bottom:30px} +#smb_my_wish h2 {font-size:1.25em;padding:0 0 20px;border-bottom:1px solid #d9dde2} +#smb_my_wish li {position:relative;background:#fff;border-bottom:1px solid #ececec;padding:15px} +#smb_my_wish li:after {display:block;visibility:hidden;clear:both;content:""} +#smb_my_wish .smb_my_chk {display:inline-block;float:left;margin-right:10px;color:red} +#smb_my_wish .smb_my_img {float:left;margin-right:20px} +#smb_my_wish .smb_my_tit {margin:5px 0;font-size:1.167em;font-weight:bold} +#smb_my_wish .smb_my_price {font-weight:bold;font-size:1.2em;margin-bottom:30px} +#smb_my_wish .smb_my_date {font-size:1em;color:#777} +.smb_my_more {position:absolute;top:0;right:0} +.smb_my_more a {display:block;background:url('../img/more-btn.gif') no-repeat 0 2px;padding-left:20px;height:30px} +#smb_my_wish li .wish_del {position:absolute;right:20px;top:50px;font-size:1.4em;color:#b2b2b2} +#smb_ws_act {text-align:center;margin:20px 0 30px} +#smb_ws_act .btn01 {width:180px;height:50px;font-weight:bold;font-size:1.167em;border:1px solid #98a3b3;border-radius:3px} +#smb_ws_act .btn02 {width:180px;height:50px;font-weight:bold;font-size:1.167em;border:1px solid #1c70e9;border-radius:3px;background:#3a8afd} + + +/* 장바구니 주문서 공통 */ +.od_prd_list .td_chk {} +.od_prd_list .td_prd {border-left:0;position:relative;padding-left:120px;min-height:100px} +.od_prd_list .td_prd .sod_img {position:absolute;top:25px;left:20px} +.od_prd_list .td_prd .sod_name {min-height:80px} +.od_prd_list .td_prd .prd_name {font-size:1.4em} +.od_prd_list .total_prc {color:#000;font-weight:bold;font-size:1.4em} + +.sod_opt {margin:5px 0} +.sod_opt ul {display:inline-block;margin:0;padding:0;list-style:none} +.sod_opt li {color:#000;padding:3px 0;line-height:1.3em} +.sod_opt li:before {content:"옵션";display:inline-block;margin:1px 5px 2px 0;padding:3px;border-radius:3px;background:#e2eaf6;line-height:1em;color:#3a8afd} +.sod_option_btn .mod_options {height:30px;margin:5px 0 0;padding:0 5px;border:1px solid #d4d6db;color:#606060;background:#fff;border-radius:3px} +.cp_btn {padding:0 10px;border:1px solid #d4d6db;color:#3a8afd;background:#fff;height:26px;border-radius:3px} +.cp_cancel {padding:0 10px;border:1px solid #aaa;color:#666;background:#fff;height:26px;border-radius:3px} + +/* 장바구니 */ +#sod_bsk {margin-bottom:30px} +.btn_cart_del {padding:20px 0;border-bottom:1px solid #ccd2d9} +.btn_cart_del button {height:30px;padding:0 10px;border:1px solid #d4d6db;border-radius:5px;background:#fff;color:#666} +#sod_bsk_list {position:relative} +#sod_bsk #sod_bsk_tot {border:1px solid #212a37;margin:20px 0} +#sod_bsk #sod_bsk_tot ul:after {display:block;visibility:hidden;clear:both;content:""} +#sod_bsk #sod_bsk_tot li {float:left;width:33.333%;background:#4a505a;color:#fff;border-left:1px solid #212a37;text-align:right;padding:25px;font-size:1.167em} +#sod_bsk #sod_bsk_tot li:first-child {border:0} +#sod_bsk #sod_bsk_tot li span {display:inline-block;float:left} +#sod_bsk #sod_bsk_tot .sod_bsk_cnt {width:33.335%;background:#212a37} +#sod_bsk_act {text-align:center;margin-bottom:30px} +#sod_bsk_act .btn_submit {height:50px;padding:0 10px;width:160px;font-weight:bold;font-size:1.25em} +#sod_bsk_act .btn01 {height:50px;line-height:50px;padding:0 10px;width:160px;font-weight:bold;font-size:1.25em} +#sod_bsk_act p {margin:0 0 10px} + +/* 장바구니 선택사항수정 */ +#sod_bsk_list #mod_option_frm {z-index:10000;position:fixed;top:50%;left:50%;width:540px;height:auto !important;height:500px;max-height:500px;margin-left:-280px; +margin-top:-150px;border:1px solid #dde7e9;border-radius:3px;background:#fff;overflow-y:auto;overflow-x:inherit} +#sod_bsk_list .mod_option_bg {content:"";position:fixed;left:0;top:0;width:100%;height:100%;background:rgba(0,0,0,0.1);display:block;z-index:9999} +#mod_option_frm h2 {border-bottom:1px solid #e8e8e8;padding:0 20px;line-height:50px;font-size:1.25em} + +.option_wr {padding:20px 20px 0} +.option_wr h3 {font-size:1.167em;margin-bottom:10px} +.option_wr .get_item_options, +.option_wr .get_item_supply {margin-bottom:10px} +.option_wr label {display:block;margin:10px 0 5px} +.option_wr select {width:100%;border:1px solid #d4d4d4;height:48px} + +#sit_opt_added {margin:0;padding:0;border-bottom:0;list-style:none} +#sit_opt_added li {padding:10px 15px;background:#f9f9f9;border:1px solid #e6e9ed;margin:10px 0;position:relative} +#sit_opt_added li:after {display:block;visibility:hidden;clear:both;content:""} +#sit_opt_added li .opt_name {line-height:28px;font-weight:bold} +#sit_opt_added li .opt_count {} +#sit_opt_added button {float:left;width:30px;height:30px;border:1px solid #bdc9dc;border-radius:0;background:#fff;color:#666;font-size:0.92em} +#sit_opt_added button:hover {color:#000} +#sit_opt_added .num_input {float:left;border:0;height:30px;border-top:1px solid #e4e4e4;border-bottom:1px solid #e4e4e4;text-align:center} +#sit_opt_added .sit_opt_del {position:absolute;right:0;top:0;font-size:15px;border:0;border-left:1px solid #e6e9ed;border-bottom:1px solid #e6e9ed} +#sit_opt_added .sit_opt_del:hover {color:#be334a} +#sit_opt_added .sit_opt_prc {display:block;float:right;width:100px;padding:0 3px;text-align:right;line-height:30px;font-size:1.183em;font-weight:bold} + +#mod_option_frm #sit_sel_option {margin:20px 20px 10px} +#mod_option_frm #sit_tot_price {float:left;display:inline-block;margin:0 20px 20px} +#mod_option_frm #sit_opt_added {} +#mod_option_frm .btn_confirm {float:right;display:inline-block;margin:0 20px 20px;background:yellow} +#mod_option_frm .btn_confirm .btn_submit {width:100px;height:40px;font-size:1.167em;font-weight:bold;cursor:pointer} +#mod_option_frm .btn_confirm .btn_close {position:absolute;top:0;right:0;width:50px;height:50px;border:0;background:none;font-size:1.25em;border-radius:0} +#mod_option_frm .btn_confirm .btn_close:hover {background:#f3f3f3} + +/* 주문서 작성 */ +#sod_frm {} +#sod_frm:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm p {margin:0 0 10px} +#sod_frm .od_prd_list {margin-bottom:20px} +#sod_list {position:relative} +#sod_list #cp_frm {z-index:10000;position:absolute;top:50%;left:50%;width:540px;height:auto !important;height:500px;max-height:500px;margin-left:-270px;margin-top:-150px;border:1px solid #dde7e9;border-radius:3px;background:#fff;overflow-y:auto;overflow-x:inherit} + +.od_coupon h3{border-bottom: 1px solid #cdcdcd;padding: 0 20px;line-height: 50px;margin: 0 0 15px;font-size: 1.25em;text-align:left; +-webkit-box-shadow: 1px 2px 2px #eee; +-moz-box-shadow: 1px 2px 2px #eee; +box-shadow: 1px 2px 2px #eee;} +.od_coupon .btn_close {position: absolute;top: 0;right: 0;width: 50px;height: 50px;border: 0;background: none;border-left: 1px solid #cdcdcd;font-size: 1.25em;} +.od_coupon .btn_close:hover{background:#f3f3f3} +.od_coupon .tbl_head02{margin:20px} +.od_coupon .cp_apply{padding: 0 5px;border: 1px solid #38b2b9;color: #38b2b9;background: #fff;height: 23px;line-height: 21px;} +.od_coupon td,#sod_frm_pay .od_coupon td{text-align:left;border-left:0;padding:7px} +#sod_frm_pay .od_coupon th{width:auto;text-align:center;padding: 7px;background: #f3f3f3;border-top: 1px solid #d3d3d3;border-bottom: 1px solid #d3d3d3;} +.od_coupon .td_numbig,#sod_frm_pay .od_coupon .td_numbig{text-align:center;} +.od_coupon .td_mngsmall{width:60px} + +/* 주문서 작성 - 왼쪽 */ +.sod_left {display:inline-block;float:left;width:840px;margin-right:20px;vertical-align:top} + +/* 주문서 작성 - 주문하시는 분 */ +#sod_frm .tbl_frm01 {padding:20px 10px} +#sod_frm .tbl_frm01 th,#sod_frm .tbl_frm01 td {text-align:left;padding:10px;vertical-align:top} +#sod_frm .tbl_frm01 th{padding:0px 10px} +#sod_frm .tbl_frm01 td input {width:100%} +#sod_frm .tbl_frm01 td .addr input {width:20%} +#sod_frm .tbl_frm01 td .addr button {background:#434a54;color:#fff;width:128px;height:45px;border:0;border-radius:3px} + +/* 주문서 작성 - 받으시는 분 */ +#sod_frm_taker .tbl_frm01 {padding:20px 10px} +#sod_frm_taker .tbl_frm01 .choice_place {display:block;background:#edf3fc;padding:10px 15px;border:1px solid #d1ddee;margin:0 10px 10px} +#sod_frm_taker .tbl_frm01 .choice_place:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm_taker .tbl_frm01 .choice_place .chk_box {float:left;display:inline-block;width:85%;line-height:30px} +#sod_frm_taker .tbl_frm01 .choice_tit {float:left;display:inline-block;width:15% !important;line-height:30px} +#sod_frm_taker .tbl_frm01 .choice_place input[type="radio"] + label span {top:7px} +#sod_frm_taker .tbl_frm01 .choice_place input, +#sod_frm_taker .tbl_frm01 .choice_place label {margin-left:10px} +#sod_frm_taker .tbl_frm01 .btn_frmline {padding:0;width:80px;height:30px;line-height:28px;background:#fff;border:1px solid #d4d6db;color:#606060;text-align:center;float:right} + +#sod_frm_taker .tbl_frm01 td input {width:100%} +#sod_frm_taker .tbl_frm01 td .addr input {width:20%} +#sod_frm_taker .tbl_frm01 td .addr button {background:#434a54;color:#fff;width:128px;height:45px;border:0;border-radius:3px} +#sod_frm_taker .tbl_frm01 td .ad_choice {padding:5px 0} +#sod_frm_taker .tbl_frm01 td .ad_choice input {width:auto} + +/* 주문서 작성 - 공통 */ +#sod_frm_orderer, #sod_frm_taker {margin:0 0 30px;border:1px solid #e3e5e8;background:#fff} +#sod_frm section h2 {border-bottom:1px solid #e2e4e7;font-size:1.167em;padding:20px} +#sod_frm_orderer #od_addr_jibeon, +#sod_frm_taker #od_b_addr_jibeon {display:inline-block;margin:5px 0 0} + +/* 5.4.1.3 버전이후 추가 css */ +#sod_frm div.tbl_frm01, #sod_frm_taker div.tbl_frm01{padding:0px 10px !important} +#sod_frm .tbl_frm01 th, #sod_frm .tbl_frm01 td{padding:10px;line-height:45px} +#sod_frm .tbl_frm01 th{width:94px} +#sod_frm #od_name,#sod_frm #od_tel,#sod_frm #od_hp,#sod_frm #od_pwd,#sod_frm #od_b_name,#sod_frm #od_b_tel,#sod_frm #od_b_hp,#sod_frm #ad_subject,#sod_frm #od_hope_date{width:40%} +#sod_frm #od_zip,#sod_frm #od_b_zip{width:90px} +#sod_frm .tbl_frm01 td .btn_address {background:#434a54;color:#fff;width:128px;height:45px;border:0;border-radius:3px} +#sod_frm #od_memo{min-height:100px} +#sod_frm_taker .order_choice_place{position:relative;background:#edf3fc;border:1px solid #d1ddee;padding-left:10px} +#sod_frm_taker .tbl_frm01 .btn_frmline{float:none;position:absolute;top:8px;right:10px} +#sod_frm #sod_bsk_tot:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm #sod_bsk_tot li{position:relative;float:left;background:#fff;width:33.333%;height:70px;text-align:center;border-bottom:1px solid #e7ebf1;padding:15px 0} +#sod_frm #sod_bsk_tot li:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm #sod_bsk_tot li span{display:block;color:#777;margin-bottom:5px;font-weight:bold} +#sod_frm #sod_bsk_tot .sod_bsk_sell,#sod_frm #sod_bsk_tot .sod_bsk_coupon{border-right:1px solid #e7ebf1} +#sod_frm #sod_bsk_tot .sod_bsk_point,#sod_frm #sod_bsk_tot .sod_bsk_cnt{width:100%;clear:both;height:40px;padding:0 15px;line-height:40px;text-align:right} +#sod_frm #sod_bsk_tot li:last-child {border-bottom:0 none} +#sod_frm #sod_bsk_tot .sod_bsk_point span,#sod_frm #sod_bsk_tot .sod_bsk_cnt span {float:left;margin:0} +#sod_frm #sod_bsk_tot .sod_bsk_coupon:before{display:block;content:"-";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#ff006c;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size: 16px;line-height: 14px;} +#sod_frm #sod_bsk_tot .sod_bsk_dvr:before{display:block;content:"+";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#ff006c;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size: 16px;line-height: 14px;} +#sod_frm #sod_bsk_tot .sod_bsk_cnt strong{color:#ff006c;font-size:1.25em} +#sod_frm_pay {position:relative;margin:10px 0} +#sod_frm #sod_frm_pay h2 {position:absolute;border:0;font-size:0;line-height:0;content:""} +#sod_frm_pay .pay_tbl table{width:100%;border-collapse:collapse} +#sod_frm_pay .pay_tbl th{text-align:left;padding:10px;width:80px;border-bottom:1px solid #e7ebf1;background:#fff;font-weight:bold;color:#777} +#sod_frm_pay .pay_tbl td{text-align:right;padding: 10px;height:30px;border-bottom:1px solid #e7ebf1;background:#fff} +#sod_frm_pay .pay_tbl td .cp_cancel{margin:0 0 0 2px} +#sod_frm_pay .pay_tbl td .btn_frmline{padding: 0 7px;border: 1px solid #38b2b9;color: #38b2b9;background: #fff;height: 23px;line-height: 21px;margin: 0;} +#od_tot_price{margin:10px 0;background:#fff;line-height:40px;text-align:right;padding:0 10px} +#od_tot_price span{float:left;font-weight:bold} +#od_tot_price strong{font-size:1.5em;color:#ff006c} +#sod_frm #sod_frm_pt_alert {margin:5px 0;color:#38b2bb } +#od_pay_sl h3{font-size:1.167em;margin:20px 0 5px} +#od_pay_sl input[type="radio"]{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden;text-indent:-999px;left: 0;z-index: -1px;} +#od_pay_sl .lb_icon {display: inline-block;float:left;width:50%;background:#fff;border:1px solid #eceff4;margin:-1px 0 0 -1px;cursor: pointer;height:60px;position:relative;padding-left:65px;padding-top:20px;z-index:1} +#od_pay_sl input[type="radio"]:checked+.lb_icon {border:1px solid #ff006c;z-index:3} +#sod_frm_paysel {} +#sod_frm_paysel legend {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_frm_paysel .KPAY{background:url('../img/kpay.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .PAYNOW{background:url('../img/paynow.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .PAYCO{background:url('../img/payco.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .inicis_lpay{background:url('../img/lpay_logo.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .inicis_kakaopay{position:relative;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .inicis_kakaopay em{position:absolute;top:15px;left:45px;width:70px;height:30px;background:url('../img/kakao.png') no-repeat 50% 50% #ffeb00;overflow:hidden;text-indent:-999px;border-radius:30px} +#sod_frm_paysel .kakaopay_icon{background:url('../img/kakao.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .naverpay_icon{background:url('../img/ico-default-naverpay.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .bank_icon{background:url('../img/pay_icon1.png') no-repeat 15px 50% #fff} +#sod_frm_paysel .vbank_icon{background:url('../img/pay_icon2.png') no-repeat 15px 50% #fff;padding-top:13px} +#sod_frm_paysel .iche_icon{background:url('../img/pay_icon2.png') no-repeat 15px 50% #fff;padding-top:13px} +#sod_frm_paysel .hp_icon{background:url('../img/pay_icon3.png') no-repeat 24px 50% #fff} +#sod_frm_paysel .card_icon{background:url('../img/pay_icon4.png') no-repeat 17px 50% #fff} +#forderform .sod_right #sod_bsk_tot {border:1px solid #e3e5e8} +#forderform .od_pay_buttons_el{margin-top:20px;border:1px solid #e3e5e8;background:#fff;padding:10px} +#forderform .od_pay_buttons_el h3{font-size:1.167em;margin:0px 0 5px} +#forderform #sod_frm_pt{border-top:1px solid #e3e5e8} + +.sod_right .pay_tbl{border:1px solid #e3e5e8;border-bottom:0 none} +.sod_right #od_tot_price{border:1px solid #e3e5e8} +#sod_frm_pay .od_pay_buttons_el:after{display:block;visibility:hidden;clear:both;content:""} +#sod_frm_pay .sod_frm_point{margin-top:20px;border:1px solid #e3e5e8} +#sod_frm_pay .sod_frm_point div{background:#fff;padding:10px;text-align:left;text-align:right} +#sod_frm_pay .sod_frm_point div:after {display:block;visibility:hidden;clear:both;content:''} +#sod_frm_pay .sod_frm_point div label{float:left;line-height:30px;font-weight:bold} +#sod_frm_pay .sod_frm_point div span{display:block} +#sod_frm_pay .sod_frm_point div span:after {display:block;visibility:hidden;clear:both;content:''} +#sod_frm_pay .sod_frm_point div strong{float:left;color:#666} +#sod_frm_pay .sod_frm_point .max_point_box em{font-style:normal !important} +#sod_frm_pay .sod_frm_point #od_temp_point{height:30px;text-align:right;padding:0 5px;border:1px solid #ccc;} + +/* 주문서 작성 - 오른쪽 */ +.sod_right {display:inline-block;float:left;width:340px;height:100%;vertical-align:top} + +.sod_right #sod_bsk_tot {border:1px solid #3a8afd} +.sod_right #sod_bsk_tot:after {display:block;visibility:hidden;clear:both;content:""} +.sod_right .sod_info li {position:relative;float:left;background:#fff;width:33.333%;height:70px;text-align:center;border-bottom:1px solid #e7ebf1;padding:15px 0} +.sod_right .sod_info li:after {display:block;visibility:hidden;clear:both;content:""} +.sod_right .sod_info li span {display:block;color:#777;margin-bottom:5px;font-weight:bold;color:#000} +.sod_right .sod_info .sod_bsk_sell, .sod_right .sod_info .sod_bsk_coupon {border-right:1px solid #e7ebf1} +.sod_right .sod_info .sod_bsk_coupon:before {display:block;content:"-";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#9da6c9;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size:16px;line-height:14px} +.sod_right .sod_info .sod_bsk_dvr:before {display:block;content:"+";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#9da6c9;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size:16px;line-height:14px} +.sod_right .sod_info .sod_bsk_cnt strong {font-size:1.25em} + +.sod_right .sod_info_bt {clear:both;padding:10px 15px;background:#fff} +.sod_right .sod_info_bt:after {display:block;visibility:hidden;clear:both;content:""} +.sod_right .sod_info_bt li {} +.sod_right .sod_info_bt li:after {display:block;visibility:hidden;clear:both;content:""} +.sod_right .sod_info_bt li span {display:inline-block;float:left;width:50%;line-height:28px;text-align:left;font-weight:bold;color:#000} +.sod_right .sod_info_bt li strong {display:inline-block;float:left;width:50%;line-height:28px;text-align:right} + +.sod_right .sod_info_option {clear:both;border-top:1px solid #e7ebf1} +.sod_right .sod_info_option h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.sod_right .sod_info_option ul {padding:10px 15px;background:#fff} +.sod_right .sod_info_option li {margin-bottom:5px} +.sod_right .sod_info_option li:after {display:block;visibility:hidden;clear:both;content:""} +.sod_right .sod_info_option .sod_ifop_tit {display:inline-block;float:left;width:50%;line-height:28px;text-align:left;font-weight:bold} +.sod_right .sod_info_option .sod_ifop_tit .btn_frmline {width:auto;height:30px;color:#3a8afd;background:#fff;border:1px solid #d4d6db} +.sod_right .sod_info_option .sod_ifop_tit .cp_cancel {width:auto;height:30px;border:1px solid #d4d6db;padding:0 5px;margin-left:5px;color:#b1b1b1;vertical-align:baseline} +.sod_right .sod_info_option .sod_ifop_tit .od_coupon {z-index:10000;position:absolute;top:50%;left:50%;min-width:300px;height:auto !important;height:500px;max-height:500px;margin-left:-200px;margin-top:-150px;border:1px solid #dde7e9;border-radius:3px;background:#fff;overflow-y:auto;overflow-x:inherit} +.sod_right .sod_info_option .sod_ifop_tit .od_coupon>td {text-align:left} +.sod_right .sod_info_option>td, .sod_right .sod_info_option .sod_ifop_t {display:inline-block;float:left;width:50%;line-height:28px;text-align:right} +.sod_right .sod_info_option>td {text-align:right;padding:10px;height:30px} +.sod_right .sod_info_option>td .cp_cancel {margin:0 0 0 2px} +.sod_right .sod_info_option>td .btn_frmline {padding:0 7px;border:1px solid #38b2b9;color:#38b2b9;background:#fff;height:23px;line-height:21px;margin:0} + + +/* 주문서 작성 - 포인트사용 */ +#sod_point {clear:both;background:#fff;margin-top:10px;border:1px solid #e3e5e8} +#sod_point h2 {font-size:1.167em;padding:15px;border-bottom:1px solid #e3e5e8} +#sod_point h2:after {display:block;visibility:hidden;clear:both;content:''} + +#sod_point .point_tit {vertical-align:baseline;float:left;line-height:28px} +#sod_point .point_tit label {vertical-align:baseline} +#sod_point .point_ipt {float:right;display:inline-block;margin-left:35px;text-align:left;text-align:right;font-weight:normal} +#sod_point .point_ipt:after {display:block;visibility:hidden;clear:both;content:''} +#sod_point .point_ipt #od_temp_point {width:100px;height:30px;text-align:right;padding:0 5px;border:1px solid #d0d3db;border-radius:3px} + +#sod_frm_pt {padding:20px} +/* +#sod_frm_pt strong {display:inline-block;width:45%;color:#000;line-height:28px;text-align:left} +#sod_frm_pt span {display:inline-block;width:55%;color:#000;text-align:right} +#sod_frm_pt span:after {display:block;visibility:hidden;clear:both;content:''} +*/ +#sod_frm_pt .max_point_box em {font-style:normal !important} + + +/* 주문서 작성 - 결제수단 */ +/* #sod_frm_pay {position:relative;margin:10px 0 0;background:#fff;border:1px solid #e3e5e8} */ +#sod_frm_pay {position:relative;margin:10px 0 0} +#sod_frm_pay h2 {font-size:1.167em;padding:15px;border-bottom:1px solid #e3e5e8} +#sod_frm_pay .tooltip_txt {height:auto;line-height:18px;font-weight:normal;font-size:1em;padding:10px 20px;margin:10px} +#sod_frm_pay .tooltip_txt i {float:left;line-height:36px;font-size:2em;margin-right:15px} +#sod_frm_pay .tooltip_txt:before {height:100%} +#sod_frm_pay input[type="radio"] {} +#sod_frm_pay .lb_icon {display:inline-block;position:relative;cursor:pointer;z-index:1} +#sod_frm_pay input[type="radio"]:checked+.lb_icon {color:#3a8afd;z-index:3} +#sod_frm_pay input[type="radio"] + label span {top:7px} + +#sod_frm_paysel {} +#sod_frm_paysel legend {position:absolute;font-size:0;line-height:0;overflow:hidden} +/* +#sod_frm_paysel .PAYCO {display:inline-block;width:75px;background:url('../img/payco.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px;border-radius:30px;border:1px solid #fa1417} +#sod_frm_paysel .PAYNOW {display:inline-block;width:75px;background:url('../img/paynow.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px;border-radius:30px;border:1px solid #c01734} +#sod_frm_paysel .kakaopay_icon {display:inline-block;width:60px;background:url('../img/kakao.png') no-repeat 50% 50% #ffeb00;overflow:hidden;text-indent:-999px;border-radius:30px} +#sod_frm_paysel .KPAY {display:inline-block;width:58px;background:url('../img/kpay.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px;border-radius:30px;border:1px solid #22096a} +#sod_frm_paysel .inicis_lpay {display:inline-block;width:50px;background:url('../img/lpay_logo.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px;border-radius:30px;border:1px solid #009bd7} +*/ +#sod_frm_paysel ul.pay_way {margin:0;padding:15px} +#sod_frm_paysel ul.pay_way input[type="radio"] + label span {top:7px} +#sod_frm_paysel ul:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm_paysel li {position:relative;line-height:28px;text-align:left;list-style:none} + +#settle_bank {border:1px solid #e3e5e8;border-top:0 none;background:#fff;padding:10px;clear:both;line-height:32px} +#settle_bank:after {display:block;visibility:hidden;clear:both;content:''} +#settle_bank label {float:left;width:30%;line-height:30px} +#settle_bank select, #settle_bank input {width:70%;height:32px;margin:0 0 5px;border:1px solid #e3e5e8;border-radius:3px;text-align:left} +#settle_bank option {padding:3px 0} +#settle_bank #od_deposit_name {height:32px;padding:0 5px;border:1px solid #e3e5e8} + +#display_pay_button {background:#fff;padding:20px;border:1px solid #e3e5e8;border-top:0} +#display_pay_button .btn_submit {width:100%;height:50px;font-weight:bold;font-size:1.25em;cursor:pointer;border:1px solid #3a8afd} +#display_pay_button .btn01 {width:100%;height:50px;line-height:38px;font-weight:bold;font-size:1.25em;margin:5px 0;border:1px solid #ccd1d9} + +.display_setup_message {margin:0 0 10px;padding:15px;border:1px solid #fccdff;background:#ffeef9} +.display_setup_message strong {display:block;margin:0 0 10px} + +#sod_frm_taker td input[type="radio"], #sod_frm_taker td input[type="checkbox"]{width:auto;-webkit-appearance:radio;-webkit-border-radius:initial} +#sod_frm_taker label {display:inline-block;font-weight:normal;margin-right:1em} +#sod_frm_same {margin:0 0 10px} + +#sod_frm #display_pay_process {text-align:center} +#sod_frm #display_pay_process span {display:block;margin:5px 0 0} + +#od_tot_price {background:#e5f0ff;line-height:20px;text-align:right;padding:15px} +#od_tot_price span {float:left;font-weight:bold} +#od_tot_price strong {font-size:1.5em;color:#ff006c} +#sod_frm_pay_info {margin:0 0 10px} + +#sod_frm_pay #sc_coupon_frm, #sod_frm_pay #od_coupon_frm {z-index:10000;position:absolute;top:0;right:0;width:500px;height:auto !important;height:500px;max-height:500px;border:1px solid #000;background:#fff;overflow-y:auto} +#sod_frm_deli {position:relative;line-height:2em} + +#sod_frm_escrow {margin:30px 0 0} +#sod_frm #sod_frm_escrow h2 {margin:0;border:0} +#sod_frm #sod_frm_escrow p {margin:5px 0} +#display_pay_process {padding:20px;text-align:center} + +/* 위시리스트 */ +#sod_ws {} +.sod_ws_img {width:90px;text-align:center} +#sod_ws_act {text-align:center;margin:20px 0 30px} +#sod_ws_act button {height:50px;width:180px;font-weight:bold;font-size:1.167em;border-radius:3px} +#sod_ws_act .btn01 {border:1px solid #98a3b3} +#sod_ws_act .btn02 {border:1px solid #1c70e9;background:#3a8afd} + +#sod_ws li .info_link {display:block;margin:10px 0 5px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:#646464;font-weight:bold} +#sod_ws li .info_date {color:#646464;font-size:0.92em} +#sod_ws li .wish_chk {position:absolute;top:0;left:0;width:30px;text-align:center;line-height:35px;color:#f00} +#sod_ws li .wish_info {padding:0 35px 10px 30px;position:relative;border-bottom:1px solid #e0e0e0;margin-top:10px;height:45px} +#sod_ws li .wish_del {position:absolute;top:0;right:0;width:35px;height:35px;line-height:35px;text-align:center;background:#e6e6e6;display:block;font-size:1.25em;color:#777} +#sod_ws li .wish_del:hover {background:#777;color:#fff} + +/* 배송지 목록 */ +#sod_addr .tbl_wrap {margin:30px} +#sod_addr .td_mng .sel_address {color:#fff;background:#fff;border:1px solid #19bc9b;color:#19bc9b;padding:0 5px;height:26px;border-radius:3px} +#sod_addr .td_mng .del_address {display:inline-block;border:1px solid #aaa;color:#888;padding:0 5px;height:26px;line-height:24px;vertical-align:middle;border-radius:3px} +#sod_addr input[type="radio"] {position:absolute;left:0;z-index:-1;visibility:hidden;width:0;height:0;overflow:hidden;text-indent:-999px} +#sod_addr .default_lb {display:inline-block;background:#fff;border:1px solid #1c70e9;color:#3a8afd;cursor:pointer;position:relative;padding:0 5px;height:26px;line-height:24px;border-radius:3px} +#sod_addr input[type="radio"]:checked+.default_lb {background:#3476be;color:#fff} +#sod_addr td {height:40px;vertical-align:top} +#sod_addr .td_name {width:100px} +#sod_addr .frm_input {height:30px} +#sod_addr .td_sbj {width:155px;text-align:left} +#sod_addr .td_sbj .chk_box {display:inline-block;float:left} +#sod_addr .td_sbj .chk_box input[type="checkbox"]:checked + label span {background:url(../img/chk.png) no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} +#sod_addr .ad_tel {display:block;color:#666} +#sod_addr .td_mng {width:100px;padding:10px} +#sod_addr .td_mng .mng_btn {width:100%;margin:2px 0} + +/* 주문내역 */ +#sod_v {margin-bottom:30px} +#sod_v:after {display:block;visibility:hidden;clear:both;content:''} +#sod_v td {text-align:center} +#sod_v td a {font-weight:bold} +#sod_v .basic_tbl {text-align:center} +.status_01 {display:inline-block;background:#edfbde;color:#8cc152;padding:0 5px;line-height:20px;font-size:0.92em;border-radius:5px} +.status_02 {display:inline-block;background:#84c93a;color:#fff;padding:0 5px;line-height:20px;font-size:0.92em;border-radius:5px} +.status_03 {display:inline-block;background:#e2f6f2;color:#16b494;padding:0 5px;line-height:20px;font-size:0.92em;border-radius:5px} +.status_04 {display:inline-block;background:#e2eaf6;color:#3a8afd;padding:0 5px;line-height:20px;font-size:0.92em;border-radius:5px} +.status_05 {display:inline-block;background:#3a8afd;color:#fff;padding:0 5px;line-height:20px;font-size:0.92em;border-radius:5px} +.status_06 {display:inline-block;background:#fff;color:red;padding:0 5px;line-height:20px;font-size:0.92em;border-radius:5px} + +/* 주문상세내역 */ +#sod_fin {} +#sod_fin th{padding:8px} +#sod_fin .th_line th{border-top:1px solid #ddd;} +#sod_fin_no {margin:0 0 20px;padding:15px;border:1px solid #d6e2f4;background:#edf3fc;font-size:1.2em;border-radius:5px;color:#3a8afd} +#sod_sts_wrap {margin:0 0 10px;text-align:right} +#sod_sts_explan {display:none} + +#sod_fin_legend {padding:10px;background:#fff;margin:10px 0;border:1px solid #e9e9e9;text-align:left;zoom:1} +#sod_fin_legend:after {display:block;visibility:hidden;clear:both;content:''} +#sod_fin_legend dt {clear:both;float:left;margin:0 0 5px;width:50px;font-weight:bold} +#sod_fin_legend dd {float:left;margin:0} + +#sod_fin #sod_bsk_tot li{background:#fff;border-bottom:1px solid #e7ebf1;height: 40px;;padding:0 15px;line-height:40px;text-align:right} +#sod_fin #sod_bsk_tot li span{float:left;clear:both;color: #777;} +#sod_fin #sod_bsk_tot li strong{} +#sod_fin #sod_bsk_tot .sod_bsk_cnt strong{color:#ff006c;font-size:1.25em} + +#request_form {position:relative} +#request_form div {display:none;z-index:10000;position:absolute;top:23px;left:0;padding:20px 0;width:520px;border:1px solid #000;background:#f2f5f9;text-align:center} +#request_form .frm_input {width:300px;background:#fff !important} +#request_form .btn_frmline, #request_form .btn_cancel {vertical-align:middle !important} +#request_form .btn_frmline {padding:0 10px;line-height:1.6em} + +#sod_req_btn {margin:0 0 10px} +#sod_req_btn button {background:#626870} + +#sod_req_log {margin:0 0 20px} +#sod_req_log ul {margin:0;padding:0;border-top:1px solid #e9e9e9;background:#f2f5f9;list-style:none} +#sod_req_log li {padding:10px 10px 20px;border:1px solid #e9e9e9;border-top:0} +#sod_req_log h3 {margin:20px 0 10px} +.sod_req_log_view table {margin:0} +.sod_req_log_view caption {padding:10px 0;font-size:1em;font-weight:bold;text-align:left;line-height:1em} +.sod_req_log_view caption span {color:#ff3061} +.sod_req_log_view th {border-top:1px solid #e9e9e9;background:#f7f7f7 !important;color:#000 !important;text-align:center} +.sod_req_log_view td {background:#fff;color:#000} +.sod_req_log_view p {padding:10px 15px;border-bottom:1px solid #e9e9e9;background:#fff;color:#000} +.sod_req_log_view .sod_req_it {width:270px} +.sod_req_log_view button {margin:0;padding:0;border:0;background:transparent;color:#ff3061;text-decoration:underline;vertical-align:middle;cursor:pointer} + +#sod_fin_list h2 {margin:0 0 10px} + +#sod_fin_list .td_bdno{border-left:0} +#sod_fin_list .td_bdno a{font-weight:bold} +#sod_fin_view {border:1px solid #e9e9e9} +#sod_fin_view h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_fin_view h3 {margin:0 0 10px} +#sod_fin_view .basic_tbl th {padding:0 10px;border-top:1px solid #eee;border-bottom:1px solid #eee;background:#f2f5f9;text-align:left} + +#sod_fin_pay {margin:0 0 30px} +#sod_fin_orderer {margin:0 0 30px} +#sod_fin_receiver {margin:0 0 30px;} +#sod_fin_dvr {} +#sod_fin .sod_left h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_fin .sod_left h3 {background:#fff;font-size:1.167em;padding:15px 10px;border-top:1px solid #e3e5e8;border-bottom:0} +#sod_fin .sod_left .tbl_head01 {} +#sod_fin .sod_left th{padding:10px;border:0;border-top:1px solid #f3f3f3;text-align:left;width:100px;color:#666;background:#fff} +#sod_fin .sod_left td{padding:10px;border:0;border-top:1px solid #f3f3f3;background:#fff} + +#sod_fin_dvr .dvr_link {color:#ff3061;text-decoration:underline} + +#sod_fin_tot {margin:10px 0} +#sod_fin_tot h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_fin_tot ul {margin:0;padding:0;list-style:none} +#sod_fin_tot li {padding:10px;background:#38b2b9;border-bottom:1px solid #5ec2c7;color:#fff;zoom:1} +#sod_fin_tot li:after {display:block;visibility:hidden;clear:both;content:""} +#sod_fin_tot #alrdy {border-bottom:0 !important} +#sod_fin_tot #alrdy .right{margin-top:10px;text-align:right;color:#f3f3f3;font-size:0.9em} +#sod_fin_tot #alrdy .right p{position:relative} +#sod_fin_tot #alrdy .right .title{position:absolute;left:0;padding-left:8px} +#sod_fin_tot strong {float:right} + +#sod_fin_cancel {text-align:center} +#sod_fin_cancel h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_fin_cancel button {height:40px;border:1px solid #5e6b6f;font-weight:bold;width:100%;background:none;color:#5e6b6f} +#sod_fin_cancel button:hover{background:#fff} +#sod_fin_cancelfrm {display:none;margin:10px 0 0;text-align:center;background:#fff;padding:15px} +#sod_fin_cancelfrm .frm_input {background:#fff;margin: 0 0 5px;width:100%} +#sod_fin_cancelfrm .btn_frmline{background:#5e6b6f;color:#fff;border:0;padding:10px;width:100%;cursor:pointer} +#sod_fin_test {padding:10px} + +/* 주문상세내역 중 현금영수증 발급 */ +#scash {} +#scash section {padding:10px 0} +#scash h2 {margin:0 0 10px;text-align:center} +#scash .basic_tbl th {padding:0 10px;border-top:1px solid #eee;border-bottom:1px solid #eee;background:#f2f5f9;text-align:left} +#scash_apply {padding:10px 0 20px;text-align:center} +#scash_apply button {padding:10px;border:0;background:#565e60;color:#fff} +#scash_copy {text-align:center} + +/* 배너 인덱스 출력 */ +#sbn_idx {} + +/* 쇼핑몰 이벤트 */ +#sev {} +.sev_admin {margin:0 0 10px;text-align:right} +.sev_admin a {line-height:35px;padding:0 10px} + +/* 쿠폰 */ +#coupon {text-align:center} +#coupon h1 {text-align:left} +#coupon ul:after {display:block;visibility:hidden;clear:both;content:""} +#coupon li {padding:15px;border-bottom:1px solid #ececec;text-align:left} +#coupon .cou_top {margin-bottom:10px} +#coupon .cou_tit {font-size:1.25em;font-weight:bold} +#coupon .cou_pri {font-size:1.25em;color:#3a8afd;font-weight:bold;float:right} +#coupon .cou_target {color:#8cc152;background:#edfbde;padding:5px;line-height:20px;font-size:0.92em;border-radius:5px} +#coupon .cou_date {float:right;color:#888d92} +#coupon .btn_close {margin:20px auto} + +/* 모바일일때 피시버전 주문폼 */ +.sod_frm_mobile .sod_list{margin:10px 0} +.sod_frm_mobile .sod_list .sod_li{background:#fff;border-bottom:1px solid #e5e5e5;margin:10px 0} +.sod_frm_mobile .sod_list .li_name{font-size:1.083em} +.sod_frm_mobile .sod_list .li_op_wr{position:relative;padding:10px 10px 0 110px;min-height:75px} +.sod_frm_mobile .sod_list .li_op_wr .chk_box{position:absolute;top:10px;left:10px} +.sod_frm_mobile .sod_list .total_img{position:absolute;top:10px;left:35px} +.sod_frm_mobile .sod_list .mod_options{padding:0 7px;border:1px solid #d4d6db;border-radius:3px;color:#606060;background:#fff;line-height:24px;margin:5px 0 0;font-size:.923em} +.sod_frm_mobile .sod_list .li_prqty{padding:10px;border-top:1px solid #f8f8f8} +.sod_frm_mobile .sod_list .li_prqty:after{display:block;visibility:hidden;clear:both;content:''} +.sod_frm_mobile .sod_list .li_prqty_sp{float:left;width:50%;display:block;line-height:20px;padding:0 5px;text-align:right} +.sod_frm_mobile .sod_list .li_prqty_sp span{float:left;color:#696969} +.sod_frm_mobile .sod_list .prqty_sc,.sod_frm_mobile .sod_list .prqty_price{border-right:1px solid #e5e5e5} +.sod_frm_mobile .sod_list .total_price{background:#f2f7ff;display:block;clear:both;margin:0 10px 10px;text-align:right;padding:5px 10px;line-height:20px} +.sod_frm_mobile .sod_list .total_price span{float:left} +.sod_frm_mobile .sod_list .total_price strong{font-size:1.25em;color:#3a8afd} +.sod_frm_mobile .sod_opt{padding:5px 10px 5px 35px} +.sod_frm_mobile .sod_opt li{color:#777;margin:3px 0;line-height:1.3em} +.sod_frm_mobile .sod_opt li:before{content:"옵션";display:inline-block;margin:1px 5px 2px 0;font-size:11px;padding:0 5px;border-radius:3px;background:#e2eaf6;line-height:20px;color:#3a8afd} +.sod_frm_mobile .sod_opt .opt_name:before{content:"옵션";display:inline-block;margin:1px 5px 2px 0;font-size:11px;padding:0 5px;border-radius:3px;background:#e2eaf6;line-height:20px;color:#3a8afd} +.sod_frm_mobile #sod_frm_orderer,.sod_frm_mobile #sod_frm_taker{margin:0 0 30px;border:1px solid #e3e5e8;background:#fff} +.sod_frm_mobile #sod_frm_orderer #od_addr_jibeon,.sod_frm_mobile #sod_frm_taker #od_b_addr_jibeon{display:inline-block;margin:5px 0 0} +.sod_frm_mobile #m_sod_bsk_tot{background:#4a505a;color:#fff} +.sod_frm_mobile #m_sod_bsk_tot:after{display:block;visibility:hidden;clear:both;content:""} +.sod_frm_mobile #m_sod_bsk_tot dt{float:left;width:40%;padding:10px;line-height:20px;clear:both} +.sod_frm_mobile #m_sod_bsk_tot dd{float:left;width:60%;padding:10px;text-align:right;line-height:20px} +.sod_frm_mobile #m_sod_bsk_tot .sod_bsk_cnt{font-weight:700;margin-top:5px;line-height:25px;background:#212a37} +.sod_frm_mobile #m_sod_bsk_tot .sod_bsk_cnt strong{color:#3a8afd;font-size:1.25em} +.sod_frm_mobile .sod_list .li_op_wr{padding-left:100px} +.sod_frm_mobile .sod_list .total_img{left:10px} +.sod_frm_mobile .sod_opt{padding-left:10px} +.sod_frm_mobile #m_sod_frm_paysel{margin:10px 0} +.sod_frm_mobile #m_sod_frm_paysel h3{background:#fff;padding:15px 10px;border:1px solid #e3e5e8;border-bottom:0} +.sod_frm_mobile #m_sod_frm_paysel ul{margin:0;background:#fff;padding:10px;border:1px solid #e3e5e8} +.sod_frm_mobile #m_sod_frm_paysel ul:after{display:block;visibility:hidden;clear:both;content:""} +.sod_frm_mobile #m_sod_frm_paysel li{float:left;padding:5px;width:46%;height:25px} +.sod_frm_mobile #m_sod_frm_paysel .KPAY{background:url(../img/kpay.png) no-repeat;width:37px;height:15px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%} +.sod_frm_mobile #m_sod_frm_paysel .PAYNOW{background:url(../img/paynow.png) no-repeat;width:46px;height:15px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%} +.sod_frm_mobile #m_sod_frm_paysel .PAYCO{background:url(../img/payco.png) no-repeat 1px;width:46px;height:15px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%} +.sod_frm_mobile #m_sod_frm_paysel .inicis_lpay{background:url(../img/lpay_logo.png) no-repeat;width:35px;height:12px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%} +.sod_frm_mobile #m_sod_frm_paysel .inicis_kakaopay{background:url(../img/kakao.png) no-repeat 50% 50% #f4dc34;border-radius:30px;height:22px;width:74px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +.sod_frm_mobile #m_sod_frm_paysel .kakaopay_icon{background:url(../img/kakao.png) no-repeat 50% 50% #f4dc34;border-radius:30px;height:22px;width:74px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +.sod_frm_mobile #m_sod_frm_paysel .samsung_pay{margin-left:-23px;background:url(../img/samsungpay.png) no-repeat 24px 3px;height:25px;width:106px;display:inline-block;overflow:hidden;text-indent:-999px} +.sod_frm_mobile #sod_frm_pay{border-top:1px solid #f3f3f3} +.sod_frm_mobile #sod_frm_pay h2{margin:10px 0;font-size:1.25em} +.sod_frm_mobile #sod_frm_pay .cp_btn1,.sod_frm_mobile #sod_frm_pay .cp_cancel1{margin-top:0} +.sod_frm_mobile .odf_tbl{position:relative} +.sod_frm_mobile .odf_tbl table{background:#fff;width:100%;border-collapse:collapse;border-bottom:1px solid #ccc} +.sod_frm_mobile .odf_tbl table th{border-top:1px solid #eceff4;padding:10px;text-align:left;width:120px;font-weight:400} +.sod_frm_mobile .odf_tbl table td{border-top:1px solid #eceff4;padding:7px 10px;text-align:right} +.sod_frm_mobile#sod_frm #sod_frm_pt_alert{margin:10px 0;text-align:left;color:#fff;line-height:18px;background:#f2838f;padding:10px 10px 10px 13px;border-radius:5px;position:relative} +.sod_frm_mobile #sod_frm_pt_alert::before{content:"";position:absolute;top:0;left:0;width:5px;height:50px;border-radius:5px 0 0 5px;background:#da4453;height:100%} +.sod_frm_mobile#sod_frm .sod_frm_point{padding:10px 0;clear:both;border:0 none} +.sod_frm_mobile .sod_frm_point div{background:#fff;border:1px solid #e3e5e8;padding:10px;text-align:right} +.sod_frm_mobile .sod_frm_point div:after{display:block;visibility:hidden;clear:both;content:''} +.sod_frm_mobile .sod_frm_point div label{float:left;line-height:30px} +.sod_frm_mobile .sod_frm_point div span{display:block;margin:5px 0} +.sod_frm_mobile .sod_frm_point div span:after{display:block;visibility:hidden;clear:both;content:''} +.sod_frm_mobile .sod_frm_point .max_point_box em{font-style:normal!important} +.sod_frm_mobile .sod_frm_point div strong{float:left;color:#666;font-weight:400} +.sod_frm_mobile .sod_frm_point #od_temp_point{height:30px;border:1px solid #d0d3db;text-align:right;background:#fff;border-radius:3px;-webkit-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1);-moz-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1);box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1)} +.sod_frm_mobile #settle_bank{background:#fff;border:1px solid #e3e5e8;padding:10px;clear:both;line-height:30px} +.sod_frm_mobile #settle_bank:after{display:block;visibility:hidden;clear:both;content:''} +.sod_frm_mobile #settle_bank select{height:30px;margin:0 0 5px;width:100%;border:1px solid #d0d3db} +.sod_frm_mobile #settle_bank #od_deposit_name{height:30px;border:1px solid #d0d3db;text-align:center;border-radius:3px;float:right;-webkit-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1);-moz-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1);box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1)} +.sod_frm_mobile #settle_bank label{float:left;line-height:30px} +.sod_frm_mobile #sod_frm_pt_info{border-top:0} +.sod_frm_mobile .od_coupon{position:absolute;top:0;left:0;background:#fff;width:100%;z-index:99;border-radius:0 0 3px 3px;-webkit-box-shadow:1px 1px 5px rgba(0,0,0,0.4);-moz-box-shadow:1px 1px 5px rgba(0,0,0,0.4);box-shadow:1px 1px 5px rgba(0,0,0,0.4)} +.sod_frm_mobile .od_coupon h3{height:45px;line-height:45px;font-size:1.167em;background:#333;color:#fff;padding:0 15px;text-align:left} +.sod_frm_mobile .od_coupon .tbl_head02 .btn_frmline{background:#3b67c2;color:#fff;border:0;padding:0 5px;line-height:25px} +.sod_frm_mobile .od_coupon .tbl_head02 td{text-align:left} +.sod_frm_mobile .od_coupon .tbl_head02 th{width:auto!important} +.sod_frm_mobile .od_coupon .tbl_head02 .td_mngsmall{width:60px;text-align:center} +.sod_frm_mobile .od_coupon .tbl_head02 .td_numbig{width:80px;text-align:right} +.sod_frm_mobile .od_coupon .btn_confirm{margin:20px} +.sod_frm_mobile .od_coupon .btn_confirm .btn_submit{height:40px;font-size:1.167em;font-weight:700;width:100%} +.sod_frm_mobile .od_coupon .btn_confirm .btn_close{position:absolute;top:0;right:0;width:45px;height:45px;border:0;background:none;color:#fff;font-size:1.25em} +.sod_frm_mobile .cp_btn,.sod_frm_mobile .cp_btn1{padding:0 7px;border:1px solid #d4d6db;border-radius:3px;color:#3a8afd;background:#fff;line-height:24px;margin:5px 0 0;font-size:.923em} +.sod_frm_mobile .cp_apply{padding:0 5px;border:1px solid #3a8afd;color:#3a8afd;background:#fff;height:23px;line-height:21px} +.sod_frm_mobile .cp_cancel,.sod_frm_mobile .cp_cancel1{padding:0 7px;border:1px solid #d4d6db;border-radius:3px;color:#aaa;background:#fff;line-height:24px;margin:5px 0 0 2px;font-size:.923em} +.sod_frm_mobile #sod_frm_escrow{margin:10px} +.sod_frm_mobile #sod_frm_escrow h2{font-size:1.25em} +.sod_frm_mobile #od_pay_sl h3{font-size:1.25em} +.sod_frm_mobile .sod_list .li_name{border-bottom:1px solid #dcdcdc;line-height:1.3em;padding:10px;font-size:1.083em} +#sod_frm.sod_frm_mobile .odf_list .frm_input{width:100%!important} +#sod_frm.sod_frm_mobile input[type="radio"],.sod_frm_mobile #sod_frm.sod_frm_mobile input[type="checkbox"]{width:auto;-webkit-appearance:radio;-webkit-border-radius:initial} +#sod_frm.sod_frm_mobile #od_memo{min-height:50px} +.sod_frm_mobile .od_prd_list{margin:10px;background:#fff;padding:15px} +.sod_frm_mobile .od_prd_list .td_chk{border-left:0} +.sod_frm_mobile .od_prd_list .td_prd{border-left:0;position:relative;padding-left:90px;min-height:100px} +.sod_frm_mobile .od_prd_list .td_prd .sod_img{position:absolute;top:15px;left:0} +.sod_frm_mobile .od_prd_list .td_prd .sod_name{min-height:80px} +.sod_frm_mobile .od_prd_list .td_prd .prd_name{font-size:1.167em} +.sod_frm_mobile .od_prd_list .total_prc{color:#ff006c;font-weight:700;font-size:1.167em} +.sod_frm_mobile #sod_frm_orderer{padding:10px;border-bottom:1px solid #d6d3d3} +.sod_frm_mobile #sod_frm_taker{padding:10px;border-bottom:1px solid #d6d3d3;border-top:1px solid #f3f3f3} +.sod_frm_mobile #sod_frm_taker h2,.sod_frm_mobile #sod_frm_orderer h2{margin:10px 0;font-size:1.25em} +.sod_frm_mobile .odf_list label,.sod_frm_mobile .odf_list strong{display:block;margin:7px 0 5px;color:#444;font-weight:400} +.sod_frm_mobile .odf_list .frm_input{width:100%;margin:0 0 5px} +.sod_frm_mobile .odf_list .dlv_slt{background:#edf3fc;position:relative;border:1px solid #d1ddee;margin:5px 0;padding:10px} +.sod_frm_mobile .odf_list .dlv_slt strong{margin:0;font-weight:700;line-height:30px} +.sod_frm_mobile .odf_list .dlv_slt div label{display:inline-block;margin:3px 0;color:#000} +.sod_frm_mobile #order_address{display:block;position:absolute;top:5px;right:5px;text-align:center;border:1px solid #d4d6db;background:#fff;border-radius:3px;color:#606060;height:30px;line-height:28px;margin:5px 0 0;padding:0 5px} +.sod_frm_mobile .odf_list .ad_default{display:inline-block;margin:0} +.sod_frm_mobile .odf_list .btn_addsch{position:absolute;top:5px;right:5px;border-radius:3px;height:30px} +.sod_frm_mobile .odf_list .add_num{position:relative;display:block} +.sod_frm_mobile .odf_list textarea{border:1px solid #ccc;background:#fff;color:#000;vertical-align:middle;border-radius:3px;padding:5px;width:100%;height:70px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)} +.sod_frm_mobile .sod_ta_wr{background:#fff;margin-bottom:1em} +.sod_frm_mobile .btn_confirm{margin:0 0 10px} +.sod_frm_mobile .btn_submit{width:100%;height:45px;font-size:1.167em;font-weight:700;margin:5px 0;border-radius:4px} +.sod_frm_mobile .btn_cancel,.sod_frm_mobile .btn01{width:100%;height:45px;line-height:43px;font-size:1.167em;font-weight:700;padding:0;border-radius:4px} +.sod_frm_mobile #sod_frm_escrow{margin:10px} +.sod_frm_mobile #sod_frm_escrow h2{font-size:1.25em} +.sod_frm_mobile #od_pay_sl h3{font-size:1.25em} +.sod_frm_mobile #od_tot_price{background:none;font-weight:700} + +html.no-overflowscrolling #sc_coupon_frm, html.no-overflowscrolling #od_coupon_frm {height:auto;max-height:10000px !important} /* overflow 미지원 기기 대응 */ +#sod_frm_pay_info {margin:0 0 10px} + +/* 네이버페이 */ +.itemform-naverpay {margin:15px 0;clear:both} +.cart-naverpay {margin-top:15px} + +/* theme.config.php 파일에서 G5_COMMUNITY_USE 를 false로 한 경우 1:1 문의와 게시판 css 처리 */ +#bo_list table td, #fqalist table td {border-left:0;border-right:0} +#bo_v_top .btn_admin, #bo_list .btn_admin {padding-top:0} + +/* 개인결제 */ +.pesonal {background:#fff;border:1px solid #e3e5e8;margin-bottom:30px} +.pesonal h2 {border-bottom:1px solid #e2e4e7;font-size:1.167em;padding:20px} +.pesonal .tbl_frm01 {padding:20px 10px;margin:0} +.pesonal th {text-align:left} +.pesonal td {text-align:left;font-weight:bold} +.pesonal td input {width:100%} +.pesonal .half_tr {width:50%} + +#personal_pay {background:#fff;border:1px solid #e3e5e8} +#personal_pay h2 {background:#fff;border-bottom:1px solid #e2e4e7;font-size:1.167em;padding:20px} +#personal_pay input[type="radio"] {} +#personal_pay .lb_icon {position:relative;display:inline-block;cursor:pointer;z-index:1} +#personal_pay input[type="radio"]:checked+.lb_icon {z-index:3} + +#personal_pay legend {position:absolute;font-size:0;line-height:0;overflow:hidden} +#personal_pay .KPAY {width:58px;background:url('../img/kpay.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#personal_pay .PAYNOW {width:75px;background:url('../img/paynow.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px;border-radius:30px} +#personal_pay .PAYCO {width:75px;background:url('../img/payco.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px;border-radius:30px} +#personal_pay .kakaopay_icon {width:60px;background:url('../img/kakao.png') no-repeat 50% 50% #ffeb00;overflow:hidden;text-indent:-999px;border-radius:30px} +#personal_pay .pay_way {border-bottom:1px solid #e2e4e7} +#personal_pay #display_pay_button {border:0} + + +/* input, radio */ +.selec_chk {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box {position:relative} +.chk_box input[type="checkbox"] {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box input[type="checkbox"] + label {position:relative;padding-left:20px;color:#676e70} +.chk_box input[type="checkbox"] + label:hover{color:#2172f8} +.chk_box input[type="checkbox"] + label span {position:absolute;top:2px;left:0;width:15px;height:15px;display:block;margin:0;background:#fff;border:1px solid #d0d4df;border-radius:3px} +.chk_box input[type="checkbox"]:checked + label {color:#000} +.chk_box input[type="checkbox"]:checked + label span {background:url('../img/chk.png') no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} + +.chk_box input[type="radio"] {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box input[type="radio"] + label {position:relative;padding-left:23px;display:inline-block;color:#676e70} +.chk_box input[type="radio"] + label span {position:absolute;top:0;left:0;width:15px;height:15px;display:block;background:#fff;border:1px solid #cdd6df;border-radius:50%} +.chk_box input[type="radio"]:checked + label {color:#305af9} +.chk_box input[type="radio"]:checked + label span:before {width:7px;height:7px;background:#305af9;content:'';position:absolute;top:3px;left:3px;border-radius:50%} + diff --git a/css/mobile.css b/css/mobile.css index e37088e53..fe161442d 100644 --- a/css/mobile.css +++ b/css/mobile.css @@ -321,6 +321,7 @@ box-shadow:0 1px 10px rgba(0,0,0,.1)} .new_win .win_btn {clear:both;padding:10px 0 30px;text-align:center} .new_win .win_btn a {display:inline-block;height:45px;line-height:40px;font-weight:bold} +.new_win .cert_btn {text-align:center} .new_win .btn_close {width:60px;height:45px;overflow:hidden;cursor:pointer} .new_win .btn_submit {padding:0 20px;height:45px;font-weight:bold;font-size:1.083em} diff --git a/css/mobile_shop.css b/css/mobile_shop.css new file mode 100644 index 000000000..e031d1238 --- /dev/null +++ b/css/mobile_shop.css @@ -0,0 +1,1031 @@ +@charset "utf-8"; + +/* 초기화 */ +body {margin:0;padding:0;font-size:0.813em;height:100%;font-family:HelveticaNeue-Light,AppleSDGothicNeo-Light,'Malgun Gothic','맑은 고딕',sans-serif;;background:#f8f8f8;min-width:320px;-webkit-text-size-adjust: none; } +body.is_hidden{overflow:hidden} +html, h1, h2, h3, h4, h5, h6, form, fieldset {margin:0;padding:0;border:0} +h1, h2, h3, h4, h5, h6 {font-size:1em} +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {display:block} +header ul, nav ul, footer ul {margin:0;padding:0;list-style:none} +legend {position:absolute;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} +label, input, button, select {vertical-align:middle} +input, button {margin:0;padding:0;font-size:1em} +button,input[type=submit] {cursor:pointer;font-family:HelveticaNeue-Light,AppleSDGothicNeo-Light,'Malgun Gothic','맑은 고딕',sans-serif} +input[type=text], input[type=password], input[type=submit], input[type=image], button {-webkit-appearance:none} +textarea, select {font-size:1em;font-family:HelveticaNeue-Light,AppleSDGothicNeo-Light,'Malgun Gothic','맑은 고딕',sans-serif} +textarea {border-radius:0;-webkit-appearance:none} +select{background:#fff} +p {margin:0;padding:0;word-break:break-all} +hr {display:none} +pre {overflow-x:scroll;font-size:1.1em} +a:link, a:visited {color:#000;text-decoration:none} +ul,li,dl,dt,dd {padding:0;margin:0} +ul {list-style:none} + +*, :after, :before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; +} + +input[type=text],input[type=password], textarea { + -webkit-transition:all 0.30s ease-in-out; + -moz-transition:all 0.30s ease-in-out; + -ms-transition:all 0.30s ease-in-out; + -o-transition:all 0.30s ease-in-out; + outline:none; +} + +input[type=text]:focus,input[type=password]:focus, textarea:focus,select:focus { + -webkit-box-shadow:0 0 5px #9ed4ff; + -moz-box-shadow:0 0 5px #9ed4ff; + box-shadow:0 0 5px #9ed4ff; + border:1px solid #558ab7 !important; +} + +/*safari*/ +input, textarea { + -webkit-appearance: none; + -webkit-border-radius: 0; +} +input[type=checkbox] {-webkit-appearance: checkbox} +input[type=radio] {-webkit-appearance: radio} + +/* 팝업레이어 */ +#hd_pop {z-index:1000;position:relative;margin:0 auto;width:100%;height:0px} +#hd_pop h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +.hd_pops {position:absolute;border:1px solid #e9e9e9;background:#fff} +.hd_pops_con {} +.hd_pops img {max-width:100%;height:auto} +.hd_pops_footer {padding:10px 0;background:#000;color:#fff;text-align:right} +.hd_pops_footer button {margin-right:5px;padding:5px 10px;border:0;background:#393939;color:#fff} + +/* 상단 레이아웃 */ +#hd {position:relative;background:#212020} +#hd h1 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} + +#hd #logo a{display:block;text-align:center;padding:15px;height:55px;vertical-align:top} +#hd #logo img {max-height:100%;width:auto;vertical-align:top} + +#btn_hdcate {height:55px;width:40px;border:0;background:0;font-size:18px;vertical-align:top;position:absolute;top:0;left:5px;color:#fff;} +#btn_hdsch {position:absolute;top:0;left:45px;color:#fff;font-size:18px;border:0;background:none;height:55px;width:40px} +#btn_hdcart {position:absolute;top:0px;right:5px;color:#fff;font-size:18px;display:block;width:40px;line-height:55px;text-align:center} +#btn_hduser {position:absolute;top:0px;right:45px;color:#fff;font-size:18px;display:block;width:40px;line-height:55px;text-align:center;background:none;border:0} +#hd_btn .cart-count {position:absolute;top:20%;right:0px;display:block;height:16px;line-height:16px;border-radius:8px;background:#ff4444;font-size:10px;color:#fff;padding:0 5px} + +#hd_sch {display:none;position:absolute;top:0;left:0;text-align:center;padding:0 0 10px;width:100%;background:#212020;padding:10px 50px 10px 10px} +#hd_sch h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#hd_sch .sch_inner {position:relative} +#hd_sch #sch_str {width:100%;height:35px;background:#3a3838;border:0;padding:0 10px 0 40px;color:#000;color:#fff} +#hd_sch .sch_submit {position:absolute;top:0;left:0;width:40px;height:35px;border:0;border-radius:0 3px 3px 0;cursor:pointer;background:none;font-size:15px;color:#878786} +#hd_sch .btn_close {position:absolute;top:10px;right:0px;width:50px;height:35px;border:0;background:none;color:#c2bbb5;font-size:18px} + + +/*카테고리*/ +.menu {display:none;position:fixed;top:0;height:100%;z-index:99999;-webkit-backface-visibility:hidden;width:100%;background:#efefef} +.menu .menu_wr{;width:100%;height:100%;overflow-y:auto;background:#eee;position:relative;z-index:199919; + -webkit-box-shadow: 0 0 5px rgba(55,55,5,0.4)); + -moz-box-shadow: 0 0 5px rgba(55,55,5,0.4)); + box-shadow: 0 0 5px rgba(55,55,5,0.4);} +.menu .menu_close {position:absolute;top:50%;right:0px;width:40px;height:40px;background:none;color:#fff;font-size:20px;margin-top:-20px;border:0;z-index:199999} + +.cate {background:#fff;border-bottom:1px solid #e1e1e1} +.cate a {display:block;color:#333;padding:0 10px;border-bottom:1px solid #efefef} +.cate li {position:relative;line-height:40px} +.cate li button {position:absolute;top:0;right:0;background:url;border:0;width:30px;height:40px;overflow:hidden;border:0;background:url(../img/mobile/gnb_bg.png) no-repeat 50% 50%;text-indent:-9999px} +.cate li button.ct_cl {background:url(../img/mobile/gnb_bg2.png) no-repeat 50% 50%} + +.sub_cate {display:none} +.sub_cate a {border-bottom:1px solid #efefef;background:url(../img/btn_next.gif) no-repeat 21px 17px;padding-left:30px} +.sub_cate2 a {padding-left:40px;background-position:31px 17px} +.sub_cate3 a {padding-left:50px;background-position:41px 17px} +.sub_cate4 a {padding-left:60px;background-position:51px 17px} + +#cate_tnb {background:#fff;border-bottom:1px solid #e1e1e1;margin:10px 0} +#cate_tnb:after {display:block;visibility:hidden;clear:both;content:""} +#cate_tnb li {border-bottom:1px solid #efefef;float:left;width:50%;line-height:43px;padding:0 10px 0 50px;position:relative} +#cate_tnb li:nth-child(2n+1) {clear:both;border-right:1px solid #efefef} +#cate_tnb li i {position:absolute;top:0;left:0;width:50px;text-align:center;color:#a5a8ac;line-height:42px;font-size:16px} + +/* 중간 레이아웃 */ +#container {padding:0 0 10px} +#container_title {margin:0;font-size:1.5em;text-align:left;font-weight:bold;border-bottom:1px solid #e7e7e7;background:#fff;padding:15px;font-size:1.25em;line-height:20px;text-overflow: ellipsis;overflow: hidden;white-space: nowrap; +-webkit-box-shadow: 0 0 5px #eee; +-moz-box-shadow: 0 0 5px #eee; +box-shadow:0 0 5px #eee} +.fixed #container_title{position:fixed;top:0;left:0;width:100%;z-index:999} +#container.fixed {padding-top:60px;} +#container.idx-container {padding:0px;} + +/* 내용관리 */ +#ctt {margin:10px 0;padding:10px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.ctt_admin {margin:0 5px;text-align:right} +#ctt header h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#ctt_con {padding:10px 0} +.ctt_img {text-align:center} + +/* 하단 레이아웃 */ +#ft {background:#212020;padding:20px;text-align:left} +#ft h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#ft p {margin:0;padding:10px 0;line-height:1.8em;color:#e3e3e3;font-size:0.92em} +#ft_logo {padding:20px 0 0} +#ft_company {} +#ft_company a {display:inline-block;padding-right:10px;line-height:1em;color:#fff} +#ft_company a:first-child {border:0} +#device_change {background:#302e2e;display:block;text-align:center;padding:10px;color:#afafaf;border-radius:5px} + +/* 목록 바로가기 */ +.sanchor {margin:0 0 5px;padding:0} +.sanchor:after {display:block;visibility:hidden;clear:both;content:""} +.sanchor li {float:left;list-style:none;width:25%;border-top:2px solid #000;text-align:center; overflow:hidden; white-space:nowrap;letter-spacing:0.2em;font-size:0.93em} +.sanchor a {display:block;padding:10px;border-left:1px solid #ededed;border-bottom:1px solid #ededed;background:#fcfcfc;text-decoration:none;color:#484848} +.sanchor a:focus, .sanchor a:hover {background:#eee;text-decoration:none} +.sanchor a.sanchor_on {background:#fff;text-decoration:none;border-bottom:1px solid #fff} + +/* ####### 쇼핑몰 컨텐츠 ####### */ +.st_bg {display:inline-block;width:1px;height:10px;margin:0 10px;background:#e2e1e0;vertical-align:-1px} + +/* 장바구니 주문서 공통 */ +#sod_chk {margin:10px} +.sod_list {margin:10px 0} +.sod_list .sod_li {background:#fff;border-bottom:1px solid #e5e5e5;margin:10px 0} +.sod_list .li_name {font-size:1.083em} +.sod_list .li_op_wr {position:relative;padding:10px 10px 0 110px;min-height:90px} +.sod_list .li_op_wr .chk_box {position:absolute;top:10px;left:10px} +.sod_list .total_img {position:absolute;top:10px;left:35px} +.sod_list .mod_options {padding:0 7px;border:1px solid #d4d6db;border-radius:3px;color:#606060;background:#fff;line-height:24px;margin:5px 0 0;font-size:0.923em} +.sod_list .li_prqty {padding:10px ;border-top:1px solid #f8f8f8} +.sod_list .li_prqty:after {display:block;visibility:hidden;clear:both;content:''} +.sod_list .li_prqty_sp {float:left;width:50%;display:block;line-height:20px;padding:0 5px;text-align :right} +.sod_list .li_prqty_sp span {float:left;color:#696969} +.sod_list .prqty_sc,.sod_list .prqty_price {border-right:1px solid #e5e5e5} +.sod_list .total_price {background:#f2f7ff;display:block;clear:both;margin:0 10px 10px;text-align:right;padding:5px 10px;line-height:20px} +.sod_list .total_price span {float:left} +.sod_list .total_price strong {font-size:1.25em;color:#3a8afd} +.sod_opt {padding:5px 10px 5px 35px} +.sod_opt li {color:#777;margin:3px 0;line-height:1.3em} +.sod_opt li:before {content:"옵션";display:inline-block;margin:1px 5px 2px 0;font-size:11px;padding:0 5px;border-radius:3px;background:#e2eaf6;line-height:20px;color:#3a8afd} +.sod_opt .opt_name:before {content:"옵션";display:inline-block;margin:1px 5px 2px 0;font-size:11px;padding:0 5px;border-radius:3px;background:#e2eaf6;line-height:20px;color:#3a8afd} + +#sit_opt_added {margin:0;padding:0;border-bottom:0;background:#fff;list-style:none} +#sit_opt_added li {padding:10px 15px;margin:5px 0;border:1px solid #e6e9ed;background:#f9f9f9;position:relative} +#sit_opt_added li .opt_name {line-height:18px;padding:0 30px 5px 0;display:block} +#sit_opt_added li .opt_count {} +#sit_opt_added li .opt_count:after {display:block;visibility:hidden;clear:both;content:""} +#sit_opt_added button {float:left;width:30px;height:30px;border:1px solid #c1cdde;background:#fff;color:#666;font-size:0.92em} +#sit_opt_added button:hover {color:#000} +#sit_opt_added .num_input {float:left;border:0;height:30px;width:40px;border-top:1px solid #dee3eb;border-bottom:1px solid #dee3eb;text-align:center} +#sit_opt_added .sit_opt_del {border:0;font-size:15px;background:#fff;margin-left:3px;position:absolute;top:0;right:0;border-left:1px solid #e6e9ed;border-bottom:1px solid #e6e9ed} +#sit_opt_added .sit_opt_del:hover {color:#be334a} +#sit_opt_added .sit_opt_prc {float:right;display:block;padding:0 3px;text-align:right;line-height:30px;font-size:1.183em;font-weight:bold} + +/* 장바구니 */ +#mod_option_frm {z-index:10000;position:fixed;top:10%;left:5%;width:90%;height:auto !important;height:80%;max-height:80%;border:1px solid #dde7e9;border-radius:3px;background:#fff;overflow-y:auto;overflow-x:none} +#mod_option_frm h2 {border-bottom: 1px solid #e8e8e8;padding: 0 20px;line-height: 50px;font-size: 1.25em;} +#sod_bsk_list .mod_option_bg {content:"";position:fixed;left:0;top:0;width:100%;height:100%;background:rgba(0,0,0,0.1);display:block;z-index:9999} +#mod_option_frm #sit_sel_option{margin:15px } +#mod_option_frm #sit_tot_price{margin:15px } +#mod_option_frm h3{margin: 0 0 10px;color:#5772d5;} +#mod_option_frm .option_wr {margin:15px ; } +#mod_option_frm .option_wr label{margin: 0 0 5px;display:block} +#mod_option_frm .option_wr select{width:100%; height: 30px;border: 1px solid #d9d9d9;margin: 0 0 5px;} +#mod_option_frm .btn_confirm{margin:15px ; } +#mod_option_frm .btn_confirm .btn_submit{height:40px;font-size:1.167em;font-weight:bold;width:100%;} +#mod_option_frm .btn_confirm .btn_close{position: absolute; top: 0; right: 0;width: 50px;height: 50px;border: 0;background: none;font-size: 1.25em;border-radius: 0;} + +#sod_bsk .btn_del_wr{margin:10px } +#sod_bsk .go_shopping{margin: 10px} +#sod_bsk .go_shopping .btn01{height:45px;line-height:43px;font-size:1.167em;font-weight:bold;width:100%;text-align:center} +#m_sod_bsk_tot{background:#4a505a;color:#fff;} +#m_sod_bsk_tot:after{display:block;visibility:hidden;clear:both;content:""} +#m_sod_bsk_tot dt{float:left;width:40%;padding:10px ;line-height:20px;clear:both} +#m_sod_bsk_tot dd{float:left;width:60%;padding:10px;text-align:right;line-height:20px} +#m_sod_bsk_tot .sod_bsk_cnt{font-weight:bold;margin-top:5px;line-height:25px;background:#212a37} +#m_sod_bsk_tot .sod_bsk_cnt strong{color:#3a8afd;font-size:1.25em} +#sod_bsk_act {position:fixed;bottom:0;left:0;width:100%;background:#fff;z-index:90;border-top:1px solid #000; padding:10px 10px 10px 50%; +-webkit-box-shadow: 0 0 9px rgba(0,0,0,0.2); +-moz-box-shadow: 0 0 9px rgba(0,0,0,0.2); +box-shadow: 0 0 6px rgba(0,0,0,0.2);} +#sod_bsk_act .btn_submit{height:45px;font-size:1.167em;font-weight:bold;width:100%;border-radius:3px} +#sod_bsk_act .total{position:absolute;top:0;left:0;width:50%;padding:10px;text-align:left;color:#717171;line-height:20px;} +#sod_bsk_act .total strong{display:block;color:#000;font-size:1.154em;line-height:25px} +.naverpay-cart{text-align:center;padding:10px} + +/* 주문서 작성 */ +#sod_frm .sod_list .li_op_wr{padding-left:100px} +#sod_frm .sod_list .total_img {left:10px} +#sod_frm .sod_opt {padding-left:10px} + +#m_sod_frm_paysel {margin:10px 0;} +#m_sod_frm_paysel h3{background:#fff;padding:15px 10px ;border:1px solid #e3e5e8;border-bottom:0} +#m_sod_frm_paysel ul {margin:0 0 ;background:#fff;padding:10px;border:1px solid #e3e5e8} +#m_sod_frm_paysel ul:after {display:block;visibility:hidden;clear:both;content:""} +#m_sod_frm_paysel li {float:left;padding:5px ;width:46%;height:25px} +#m_sod_frm_paysel .KPAY{background:url('../img/kpay.png') no-repeat;width:37px;height:15px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%} +#m_sod_frm_paysel .PAYNOW{background:url('../img/paynow.png') no-repeat;width:46px;height:15px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%;} +#m_sod_frm_paysel .PAYCO{background:url('../img/payco.png') no-repeat 1px;width:46px;height:15px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%;} +#m_sod_frm_paysel .inicis_lpay{background:url('../img/lpay_logo.png') no-repeat;width:35px;height:12px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%;} +#m_sod_frm_paysel .inicis_kakaopay{background:url('../img/kakao.png') no-repeat 50% 50% #ffeb00;border-radius:30px;height:22px;width:74px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +#m_sod_frm_paysel .kakaopay_icon{background:url('../img/ico-mobile-kakaopay.png') no-repeat #fff;height:15px;width:43px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +#m_sod_frm_paysel .naverpay_icon{background:url('../img/ico-mobile-naverpay.png') no-repeat #fff;height:15px;width:40px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +#m_sod_frm_paysel .samsung_pay{margin-left:-23px;background:url('../img/samsungpay.png') no-repeat 24px 3px;height:25px;width:106px;display:inline-block;overflow:hidden;text-indent:-999px} + +#sod_frm_pay{padding:10px;;border-top:1px solid #f3f3f3} +#sod_frm_pay h2{margin:10px 0;font-size:1.25em} +#sod_frm_pay .cp_btn1,#sod_frm_pay .cp_cancel1{margin-top:0} +.odf_tbl{position:relative} +.odf_tbl table{background:#fff;width:100%;border-collapse:collapse;border-bottom:1px solid #ccc} +.odf_tbl table th{border-top:1px solid #eceff4;padding: 10px;text-align:left;width:120px;font-weight:normal} +.odf_tbl table td{border-top:1px solid #eceff4;padding:7px 10px;text-align:right} + +#sod_frm_pt_alert{margin:10px 0 10px;text-align:left;color:#fff;line-height: 18px;background: #f2838f;padding: 10px 10px 10px 13px;border-radius: 5px;position:relative} +#sod_frm_pt_alert::before {content: ""; position: absolute;top: 0;left: 0;width: 5px; height: 50px; border-radius: 5px 0 0 5px;background: #da4453;height:100%} + +.sod_frm_point {padding:10px 0;;clear:both} +.sod_frm_point div{background:#fff;border:1px solid #e3e5e8;padding:10px;text-align:right} +.sod_frm_point div:after {display:block;visibility:hidden;clear:both;content:''} +.sod_frm_point div label {float:left;line-height:30px} +.sod_frm_point div span {display:block;margin:5px 0} +.sod_frm_point div span:after {display:block;visibility:hidden;clear:both;content:''} +.sod_frm_point .max_point_box em{font-style:normal !important} +.sod_frm_point div strong{float:left;color:#666;font-weight:normal} +.sod_frm_point #od_temp_point{height:30px;border:1px solid #d0d3db;text-align:right;background:#fff;border-radius:3px; +-webkit-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1); +-moz-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1); +box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1);} + +#settle_bank{background:#fff;border:1px solid #e3e5e8;padding:10px;clear:both;line-height:30px} +#settle_bank:after {display:block;visibility:hidden;clear:both;content:''} +#settle_bank select{height:30px;margin:0 0 5px;width:100%;border:1px solid #d0d3db} +#settle_bank #od_deposit_name{height:30px;border:1px solid #d0d3db;text-align:center; border-radius:3px;float:right; +-webkit-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1); +-moz-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1); +box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1);} +#settle_bank label{float:left;line-height:30px} +#sod_frm_pt_info{border-top:0} +.od_coupon{position:absolute;top:0;left:0;background:#fff;width:100%;z-index:99;border-radius:0 0 3px 3px; +-webkit-box-shadow:1px 1px 5px rgba(0,0,0,0.4); +-moz-box-shadow: 1px 1px 5px rgba(0,0,0,0.4); +box-shadow: 1px 1px 5px rgba(0,0,0,0.4);} +.od_coupon h3{height:45px;line-height:45px;font-size:1.167em;background:#333;color:#fff;padding:0 15px;text-align:left} +.od_coupon .tbl_head02{} +.od_coupon .tbl_head02 .btn_frmline {background:#3b67c2;color:#fff;border:0;padding:0 5px;line-height:25px } +.od_coupon .tbl_head02 td{text-align:left} +.od_coupon .tbl_head02 th{width:auto !important} +.od_coupon .tbl_head02 .td_mngsmall{width:60px;text-align:center} +.od_coupon .tbl_head02 .td_numbig{width:80px;text-align:right} +.od_coupon .btn_confirm{margin:20px ; } +.od_coupon .btn_confirm .btn_submit{height:40px;font-size:1.167em;font-weight:bold;width:100%;} +.od_coupon .btn_confirm .btn_close{position:absolute;top:0;right:0;width:45px;height:45px;border:0;background:none;color:#fff;font-size:1.25em} + +.cp_btn ,.cp_btn1{padding: 0 7px; border: 1px solid #d4d6db;border-radius: 3px;color: #3a8afd;background: #fff; line-height: 24px; margin: 5px 0 0; font-size: 0.923em; } +.cp_apply{padding: 0 5px;border: 1px solid #3a8afd; color: #3a8afd;background: #fff;height: 23px; line-height: 21px;} +.cp_cancel,.cp_cancel1 {padding: 0 7px;border: 1px solid #d4d6db;border-radius: 3px; color: #aaa;background: #fff;line-height: 24px;margin: 5px 0 0 2px;font-size: 0.923em;} + +#sod_frm_escrow{margin:10px;} +#sod_frm_escrow h2{font-size:1.25em} +#od_pay_sl h3{font-size:1.25em} + +.sod_frm_mobile .sod_list .li_name{border-bottom:1px solid #dcdcdc;line-height:1.3em;padding:10px 10px;font-size:1.083em} +#sod_frm.sod_frm_mobile .odf_list .frm_input{width:100% !important} +#sod_frm.sod_frm_mobile input[type="radio"],#sod_frm.sod_frm_mobile input[type="checkbox"]{width:auto;-webkit-appearance:radio;-webkit-border-radius:initial} +#sod_frm.sod_frm_mobile #od_memo{min-height:50px} +#sod_frm .od_prd_list{margin:10px;background:#fff;padding:15px} +.od_prd_list .td_chk{border-left:0;} +.od_prd_list .td_prd{border-left:0;position:relative;padding-left:90px;min-height:100px} +.od_prd_list .td_prd .sod_img{position:absolute;top:15px;left:0} +.od_prd_list .td_prd .sod_name{min-height:80px} +.od_prd_list .td_prd .prd_name{font-size:1.167em} +.od_prd_list .total_prc{color:#ff006c;font-weight:bold;font-size:1.167em} + +#sod_frm_orderer{padding:10px;;border-bottom:1px solid #d6d3d3} +#sod_frm_taker{padding:10px;border-bottom:1px solid #d6d3d3;border-top:1px solid #f3f3f3} +#sod_frm_taker h2,#sod_frm_orderer h2{margin:10px 0;font-size:1.25em} +.odf_list li{} +.odf_list label,.odf_list strong{display:block;margin:7px 0 5px;color:#444;font-weight:normal} +.odf_list .frm_input{width:100%;margin:0 0 5px} +.odf_list .dlv_slt {background:#edf3fc;position:relative;border:1px solid #d1ddee;margin:5px 0;padding:10px} +.odf_list .dlv_slt strong{margin:0 ;font-weight:bold;line-height:30px} +.odf_list .dlv_slt div label{display:inline-block;margin:3px 0;color:#000} +.sod_frm_mobile #order_address{display:block;position:absolute;top:5px;right:5px;text-align:center;border: 1px solid #d4d6db;background:#fff;border-radius:3px;color:#606060;;height:30px;line-height:28px;margin:5px 0 0;padding:0 5px} +.odf_list .ad_default{display:inline-block;margin:0} +.odf_list .btn_addsch{position:absolute;top:5px;right:5px;border-radius:3px;height:30px;} +.odf_list .add_num{position:relative;display:block;} +.odf_list textarea{border: 1px solid #ccc;background: #fff;color: #000;vertical-align: middle;border-radius: 3px;padding: 5px;width:100%;height:70px; +-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} + +#sod_frm .sod_ta_wr{background: #fff} +#sod_frm .btn_confirm{;margin:0 10px 10px} +#sod_frm .btn_submit{width:100%;height:45px;font-size: 1.167em;font-weight: bold;margin:5px 0;border-radius:4px} +#sod_frm .btn_cancel,#sod_frm .btn01{width:100%;height:45px;line-height:43px;font-size:1.167em;font-weight: bold;padding:0;border-radius:4px} + +#sod_frm_escrow{margin:10px;} +#sod_frm_escrow h2{font-size:1.25em} +#od_pay_sl h3{font-size:1.25em} +.sod_frm_mobile #od_tot_price{background:none;font-weight:bold} + +/* 쿠폰 */ +#scp_list {text-align:center;background:#fff} +#scp_list .li_pd {position:relative;padding:10px} #scp_list h1 {text-align:left} +#scp_list .li_title {font-weight:bold;font-size:1.167em} +#scp_list ul:after {display:block;visibility:hidden;clear:both;content:""} +#scp_list .pd_price {position:absolute;top:10px;right:10px} +#scp_list li {padding:15px;border-bottom:1px solid #ececec;text-align:left} +#scp_list .pd_price strong {color:#ff006c;font-size:1.5em} +#scp_list .cou_top {margin-bottom:10px;position:relative} +#scp_list .li_target {color:#666;margin:5px 0 0;background:#f3f3f3;border-top:1px dotted #ccc;padding:5px 10px} #scp_list .cou_tit {font-size:1.25em;font-weight:bold} +#scp_list .pd_date {float:right;color:#777} #scp_list .cou_pri {font-size:1.25em;color:#3a8afd;font-weight:bold;position:absolute;top:0;right:0;} +#scp_list .cou_target {color:#8cc152;background:#edfbde;padding:5px;line-height:20px;font-size:0.92em;border-radius:5px} +#scp_list .cou_date {float:right;color:#888d92} +#scp_list .btn_close {margin:20px auto} + +/* 배송지 목록 */ +#sod_addr {} +#sod_addr ul {margin:0;padding:0;list-style:none} +#sod_addr li {position:relative;padding:0;border-bottom:1px solid #e9e9e9} +#sod_addr .addr_title {border-bottom:1px solid #ddd;padding:10px} +#sod_addr .ad_subject {height:30px;border:1px solid #bbb;padding:0 10px} +#sod_addr .ad_chk {position:absolute;top:17px;left:10px} +#sod_addr .addr_info {padding:15px} +#sod_addr .addr_name {margin:0 0 10px;font-weight:bold;font-size:1.083em} +#sod_addr .addr_addr {line-height:1.5em;margin:5px 0} +#sod_addr .addr_tel {margin:5px 0;color:#666} +#sod_addr .fa-mobile {font-size:14px} +#sod_addr .addr_btn {border-radius:0 0 3px 3px;padding:10px} +#sod_addr .addr_btn:after {display:block;visibility:hidden;clear:both;content:""} +#sod_addr .sel_address {width:32%;float:left;margin-right:1%;height:30px;background:none;border:1px solid #333;color:#333;padding:0 5px} +#sod_addr .del_address {display:block;width:32%;text-align:center;float:left;margin-right:1%;border:1px solid #aaa;background:none;color:#888;padding:0 5px;height:30px;line-height:28px;vertical-align:middle} +#sod_addr input[type="radio"] {position:absolute;width:0;height:0;overflow:hidden;visibility:hidden;text-indent:-999px;left:0;z-index:-1px} +#sod_addr .add_lb {display:inline-block;float:left;width:32%;text-align:center;border:1px solid #4162ff;color:#4162ff;height:30px;line-height:28px} +#sod_addr input[type="radio"]:checked+.add_lb {z-index:3;background:#4162ff;color:#fff} + +/* 주문내역 */ +#sod_v {} +#sod_v .td_stat {width:100px} +#sod_v_info {position:relative;text-align:left;color:#fff;line-height:18px;font-size:1.1em;background:#f2838f;margin:10px;padding:10px 20px;border-radius:5px;font-weight:bold} +#sod_v_info:before {content:"";position:absolute;top:0;left:0;width:5px;height:100%;border-radius:5px 0 0 5px;background:#da4453} +#sod_v_info i {font-size:1.2em;vertical-align:middle} + +/* 주문상세내역 */ +#sod_list_inq {} +#sod_list_inq .li_op_wr {padding-left:85px} +#sod_list_inq .total_img {left:10px} +#sod_list_inq .sod_opt {padding-left:10px} + +.sod_fin_list h2 {position:absolute;border:0;font-size:0;line-height:0;content:""} +.sod_fin_list .prqty_stat {display:inline-block;background: #edfbde; color: #8cc152;line-height: 24px;border-radius: 5px; border-radius: 5px;padding: 0 5px; font-weight: normal;font-size: 0.85em;margin:5px 0} +.sod_fin_list .li_opt {color:#777;margin:3px 0;line-height:1.3em;padding-right:50px} +#sod_sts_wrap {margin:10px} +#sod_sts_wrap .btn_wr {border-top:1px solid #bbb;text-align:center} +#sod_sts_explan_open {padding:0 10px;height:30px;border:1px solid #bbb;border-top:1px solid #e6e6e6;margin-top:-1px;color:#333;background:none} +#sod_sts_explan {display:none} +#sod_fin_legend {background:#edf3fc;border:1px solid #d6e2f4;border-radius:3px;margin:0 0 10px;padding:10px;line-height:20px;color:#3967ac} +#sod_fin_legend:after {display:block;visibility:hidden;clear:both;content:""} +#sod_fin_legend dt {float:left;width:20%} +#sod_fin_legend dd {float:left;width:80%} + +#sod_fin_pay,#sod_fin_orderer,#sod_fin_receiver,#sod_fin_receiver,#sod_fin_dvr{margin:10px;background:#fff;border:1px solid #e3e5e8} +#sod_fin_view h2 {position:absolute;border:0;font-size:0;line-height:0;content:""} +#sod_fin_view h3 {font-size:1.167em;padding:10px;border-bottom:1px solid #e3e5e8;line-height:1.5em} +#sod_fin_view .odf_tbl {padding:5px} +#sod_fin_view .odf_tbl .dvr_link{display:inline-block;line-height: 30px;color: #3a8afd;background: #fff;border: 1px solid #d4d6db;font-size: 0.93em;border-radius: 3px;padding:0 10px;} +#sod_fin_view table {background:#fff;width:100%;border-collapse:collapse;padding:10px 0;border:0} +#sod_fin_view table th {border:0;padding: 10px 0 10px 10px;text-align:left;width:100px;font-weight:normal} +#sod_fin_view table td {border:0;padding: 10px;text-align:left} + +#sod_fin_no {margin:10px;border:2px solid #d6e2f4;background:#edf3fc;color:#5a81bd;border-radius:3px;padding:10px 15px} +#sod_fin_no strong {font-size:1.167em} + +#sod_fin_tot {margin:10px} +#sod_fin_tot h2 {font-size:1.167em;margin:20px 0 10px} +#sod_fin_tot ul {background:#fff;border:1px solid #3a8afd;color:#000} +#sod_fin_tot li {padding:10px;line-height:25px;zoom:1} +#sod_fin_tot li:after {display:block;visibility:hidden;clear:both;content:""} +#sod_fin_tot #alrdy {background:#e5f0ff;font-weight:bold;border-top:1px solid #c6d7ef} +#sod_fin_tot #alrdy .right {margin-top:10px;text-align:right;font-weight:normal;font-size:0.9em} +#sod_fin_tot #alrdy .right p {position:relative;color:#333;margin:5px 0} +#sod_fin_tot #alrdy .right .title {position:absolute;left:0;padding-left:8px} +#sod_fin_tot strong {float:right} + +#sod_fin_cancel {margin:10px} +#sod_fin_cancel h2 {position:absolute;border:0;font-size:0;line-height:0;content:""} +#sod_fin_cancel h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_fin_cancel button {height:40px;border:1px solid #ddd;font-weight:bold;width:100%;background:none;color:#282828;font-weight:normal} +#sod_fin_cancel p {text-align:center;background:#ffe0e0;border:2px solid #d50c0c;padding:15px;color:#d50c0c;font-size:1.167em;font-weight:bold} +#sod_fin_cancelfrm {display:none;position:relative;margin:10px 0 0;text-align:center;background:#fff;padding:15px 75px 15px 15px} +#sod_fin_cancelfrm .frm_input {background:#fff;margin:0 0 5px;width:100%} +#sod_fin_cancelfrm .btn_frmline {background:#5e6b6f;color:#fff;border:0;padding:10px;width:55px;cursor:pointer;position:absolute;top:15px;right:15px;height:40px} +#sod_fin_test {padding:10px} + +/* 마이페이지 */ +#smb_my_ov {position:relative;background:#fff;margin-right:20px} +#smb_my_ov h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#smb_my_ov .my_name {display:block;background:#fff;border-bottom:1px solid #efefef;padding:15px 10px 15px 80px;font-size:1.167em} +#smb_my_ov .profile_img {display:inline-block;position:absolute;top:15px;left:15px} +#smb_my_ov .my_info_modi {position:absolute;bottom:0;right:-5px;text-align:center;background:#212020;width:20px;height:20px;line-height:20px;color:#fff;font-size:13px;border-radius:50%} +#smb_my_ov .my_name>strong {display:block} +#smb_my_ov .win_point {color:#c7d4e6;font-size:0.92em} +#smb_my_ov .win_point strong {color:#3a8afd} + +#smb_my_ov .my_name img {width:45px;border-radius:50%} +#smb_my_ov .my_name .my_ov_name {display:inline-block;margin-bottom:10px;line-height:28px} +#smb_my_ov .my_name a.smb_info {color:#3a8afd} +#smb_my_ov .smb_my_act {position:absolute;right:15px;top:20px;display:inline-block} +#smb_my_ov .smb_my_act li {display:inline-block;font-size:0.92em} +#smb_my_ov .smb_my_act li a {line-height:28px;height:30px;vertical-align:middle;padding:0 5px;margin:0;border-radius:3px} +#smb_my_ov .smb_my_act li a.btn_logout {display:inline-block;border:1px solid #4f93fd;color:#4f93fd} + +#smb_my {} +#smb_my .btn_more {display:block;height:43px;margin:15px;background:#eee;font-size:1.167em;color:#7f7e7e;line-height:43px;text-align:center;border-radius:3px} +#smb_my_ov {margin:0 0 20px} + +#smb_my_ov .my_pocou {background:#fff} +#smb_my_ov .my_pocou:after {display:block;visibility:hidden;clear:both;content:''} +#smb_my_ov .my_pocou li {width:50%;float:left;padding:15px;border-right:1px solid #efefef} +#smb_my_ov .my_pocou li:last-child {border-right:0} +#smb_my_ov .my_pocou li a{display:block;position:relative;line-height:20px} +#smb_my_ov .my_pocou li a span{display:inline-block;float:right;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:clip;padding:0 5px;line-height:20px;border-radius:35px;font-weight:normal;font-size:0.846em} +#smb_my_ov .my_pocou li.my_cou a span{background:#a352c1} +#smb_my_ov .my_pocou li.my_memo a span{background:#ff8b77} +#smb_my_ov .my_pocou li i {color:#8c9eb0;font-size:16px} + +#smb_my_ov .my_info {display:none;clear:both;width:100%;margin-top:-1px;background:#fff;padding:5px 20px 20px;border-bottom:1px solid #e6e6e6} +#smb_my_ov .my_info:after {display:block;visibility:hidden;clear:both;content:''} +#smb_my_ov .my_info_wr {float:left;width:50%;line-height:20px;padding-bottom:10px;margin:5px 0;border-bottom:1px dashed #e5e5e5} +#smb_my_ov .my_info_wr strong {display:block;vertical-align:top;padding:3px 0px;color:#8c9eb0} +#smb_my_ov .my_info_wr span {display:block;text-align:left} +#smb_my_ov .ov_addr {border-bottom:0} +#smb_my_ov .ov_addr a {color:#c7c7c7} + +#smb_my_ov .my_ov_btn {border-top:1px solid #efefef} +#smb_my_ov .my_ov_btn button {display:block;width:100%;border:0;border-bottom:1px solid #dde7e9;background:#fff;padding:15px;text-align:left;font-size:1.125em;font-weight:bold} +#smb_my_ov .my_ov_btn button i {display:inline-block;float:right} + +#smb_my_od h2 {font-size:1.167em;margin:10px} +#smb_my_wish h2 {font-size:1.167em;margin:30px 10px 10px} +.wishlist ul {margin:10px 10px 0} +.wishlist ul:after {display:block;visibility:hidden;clear:both;content:''} +.wishlist li {float:left;padding:5px;width:33.333%;text-align:center} +.wishlist li img {width:100%;height:auto;max-width:250px} +.wishlist li .info_link {display:block;font-weight:bold;margin:5px 0 2px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap} +.wishlist li .info_date {font-size:0.92em;color:#666} + +@media (max-width:970px) { + #smb_my_ov .my_info_wr {width:100%} +} + +/* 위시리스트 */ +#sod_ws {margin:10px 0} +#sod_ws li {position:relative;background:#fff;border-bottom:1px solid #e8e8e8;border-radius:3px} +#sod_ws .wish_img {position:absolute;top:50%;left:25px;z-index:10;width:70px;height:70px;margin-top:-35px;overflow:hidden;z-index:4} +#sod_ws .info_price {font-weight:bold;line-height:28px} +#sod_ws .wish_info {padding:10px 15px 10px 100px;min-height:90px} +#sod_ws .wish_chk {position:absolute;top:5px;left:5px;z-index:9} +#sod_ws .info_date {display:block;color:#777;font-size:0.92em} +#sod_ws .wish_prd {display:block;font-weight:bold;font-size:1.083em} +#sod_ws .wish_del {position:absolute;bottom:30px;right:10px} +#sod_ws .wish_del a {display:block;width:30px;height:30px;line-height:30px;background:transparent;border-radius:3px;color:#b2b2b2;text-align:center;font-size:1.25em} +#sod_ws .sold_out {display:inline-block;padding:3px 5px;background:#ff0000;color:#fff;border-radius:3px} + +#sod_ws_act {text-align:center;margin:10px} +#sod_ws_act:after {display:block;visibility:hidden;clear:both;content:''} +#sod_ws_act .btn01 {float:left;width:49%;height:50px;background:#fff;font-weight:bold;color:#000;border-radius:5px;border-radius:1px solid #98a3b3;font-weight:bold;font-size:1.25em} +#sod_ws_act .btn02 {float:right;width:49%;height:50px;border:1px solid #1c70e9;color:#fff;border-radius:5px;font-weight:bold;background:#3a8afd;font-weight:bold;font-size:1.25em} + +/* 주문내역 include */ +#sod_inquiry{border-bottom:1px solid #dde7e9} +#sod_inquiry li {background:#fff;border-top:1px solid #ececec;padding:15px;position:relative} +#sod_inquiry li:after {display:block;visibility:hidden;clear:both;content:''} +#sod_inquiry li .idtime_link {font-weight:bold;font-size:1.167em} +#sod_inquiry li .idtime_time {color:#999} +#sod_inquiry li .inq_wr:after {display:block;visibility:hidden;clear:both;content:''} +#sod_inquiry li .inquiry_name {margin:10px 0;} +#sod_inquiry li .inquiry_price {font-size:1.25em;font-weight:bold;color:#3a8afd;float:left} +#sod_inquiry li .inv_status {display:inline-block;float:right;margin: 0;font-weight:bold} +#sod_inquiry li .inv_inv {margin: 10px 0 0;display: block;border: 1px solid #e5ecf2;border-radius:3px;color:#4963b8;background:#f9fdff;padding:10px;} +#sod_inquiry li .inv_inv i {margin-right:5px} +#sod_inquiry .li_cancel{background:#fcf1f1} + +.status_01 {display:block;background:#edfbde;color:#8cc152;line-height:24px;border-radius:5px;border-radius:5px;padding:0 5px;font-weight:normal;font-size:0.85em} +.status_02 {display:block;background:#84c93a;color:#fff;line-height:24px;border-radius:5px;border-radius:5px;padding:0 5px;font-weight:normal;font-size:0.85em} +.status_03 {display:block;background:#5bd085;color:#16b494;line-height:24px;border-radius:5px;border-radius:5px;padding:0 5px;font-weight:normal;font-size:0.85em} +.status_04 {display:block;background:#e2eaf6;color:#3a8afd;line-height:24px;border-radius:5px;border-radius:5px;padding:0 5px;font-weight:normal;font-size:0.85em} +.status_05 {display:block;background:#3a8afd;color:#fff;line-height:24px;border-radius:5px;border-radius:5px;padding:0 5px;font-weight:normal;font-size:0.85em} +.status_06 {display:block;background:#fff;color:red;line-height:24px;border-radius:5px;border-radius:5px;padding:0 5px;font-weight:normal;font-size:0.85em} + +/* 주문상세내역 중 현금영수증 발급 */ +#scash {} +#scash section {padding:10px 0} +#scash h2 {margin:0 0 10px;text-align:center} +#scash .tbl_head01 th {padding:0 10px;border-top:1px solid #eee;border-bottom:1px solid #eee;background:#f2f5f9;text-align:left} +#scash_apply {padding:10px 0 15px;text-align:center} +#scash_apply button {padding:10px;border:0;background:#565e60;color:#fff} +#scash_copy {text-align:center} + +/* 화면낭독기 사용자용 */ +#hd_login_msg {position:absolute;top:0;left:0;width:1px;height:1px;overflow:hidden} +.msg_sound_only, .sound_only {display:inline-block !important;position:absolute;top:0;left:0;margin:0 !important;padding:0 !important;width:1px !important;height:1px !important;font-size:0;text-indent:-9999em;line-height:0;border:0 !important;overflow:hidden !important} + +/* 본문 바로가기 */ +#skip_to_container a {z-index:100000;position:absolute;font-size:0;line-height:0;overflow:hidden;left:0} +#skip_to_container a:focus, #skip_to_container a:active {width:100%;height:75px;background:#21272e;color:#fff;font-size:1.5em;font-weight:bold;text-align:center;text-decoration:none;line-height:3.3em} + +/* 이미지 등비율 리사이징 */ +.img_fix {width:100%;height:auto} + +/* 캡챠 자동등록(입력)방지 기본 -pc */ +#captcha {position:relative} +#captcha legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} +#captcha #captcha_img {height:40px;border:1px solid #898989;vertical-align:top;padding:0;margin:0} +#captcha #captcha_mp3 {margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;width:40px;height:40px;background:url('../img/captcha.png') no-repeat;text-indent:-999px;border-radius:3px} +#captcha #captcha_reload {margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;background:url('../img/captcha.png') no-repeat 0 -40px;text-indent:-999px;border-radius:3px} +#captcha #captcha_key {margin:0 0 0 3px;padding:0 5px;width:90px;height:40px;border:1px solid #ccc;background:#fff;font-size:1.333em;font-weight:bold;text-align:center;border-radius:3px;vertical-align:top} +#captcha #captcha_info {display:block;margin:3px 0 5px;font-size:0.95em;letter-spacing:-0.1em} + +/* ckeditor 태그 기본값 */ +#bo_v_con ul {display:block;list-style-type:disc;margin-top:1em;margin-bottom:1em;margin-left:0;margin-right:0;padding-left:40px} +#bo_v_con ol {display:block;list-style-type:decimal;margin-top:1em;margin-bottom:1em;margin-left:0;margin-right:0;padding-left:40px} +#bo_v_con li {display:list-item} + +/* 캡챠 자동등록(입력)방지 기본 - mobile */ +#captcha.m_captcha audio {display:block;margin:0 0 5px} + +/* Mobile화면으로 */ +#mobile_cng {display:block;margin:5px;padding:5px 0;border:1px solid #eee;border-radius:2em;background:#fff;color:#000;font-size:2em;text-decoration:none;text-align:center} + +/* ckeditor 단축키 */ +.cke_sc {margin:0 0 5px;text-align:right} +.btn_cke_sc {display:inline-block;padding:0 10px;height:23px;border:1px solid #ccc !important;background:#fafafa !important;color:#000 !important;text-decoration:none !important;line-height:1.9em;vertical-align:middle} +.cke_sc_def {margin:0 0 5px;padding:10px;border:1px solid #ccc;background:#f2f5f9;text-align:center} +.cke_sc_def dl {margin:0 0 5px;text-align:left} +.cke_sc_def dl:after {display:block;visibility:hidden;clear:both;content:""} +.cke_sc_def dt, .cke_sc_def dd {float:left;margin:0;padding:5px 0;border-bottom:1px solid #e9e9e9} +.cke_sc_def dt {width:20%;font-weight:bold} +.cke_sc_def dd {width:30%} + +/* 콘텐츠별 스타일 */ +.cnt_cmt {display:inline-block;margin:0 0 0 5px;font-weight:bold} + +/* 버튼 */ +.btn {display:inline-block;padding:0 5px;height:45px;line-height:43px;border-radius:3px} +a.btn01 {display:inline-block;padding:0 7px;border:1px solid #ccc;border-bottom:1px solid #aaa;background:#fff;color:#333;text-decoration:none;vertical-align:middle} +a.btn01:focus, a.btn01:hover {text-decoration:none} +button.btn01 {display:inline-block;margin:0;padding:7px;border:1px solid #ccc;background:#fff;color:#666;text-decoration:none} +a.btn02 {display:inline-block;padding:8px 7px 7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none;vertical-align:middle} +a.btn02:focus, .btn02:hover {text-decoration:none} +button.btn02 {display:inline-block;margin:0;padding:7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none} +.btn_confirm {text-align:center} /* 서식단계 진행 */ +.btn_submit {padding:0 5px;border:0;background:#3a8afd;border:1px solid #1c70e9;color:#fff;letter-spacing:-0.1em;border-radius:3px}} +fieldset .btn_submit {padding:0 7px;height:24px;line-height:1em} +a.btn_cancel {display:inline-block;padding:8px 7px 7px;border:1px solid #ccc;background:#fff;color:#000;text-decoration:none;vertical-align:middle} +button.btn_cancel {display:inline-block;padding:7px;border:1px solid #ccc;background:#fafafa;color:#000;vertical-align:top;text-decoration:none} +a.btn_frmline, button.btn_frmline {display:inline-block;padding:0 5px;height:1.9em;border:0;background:#fff;color:#3a8afd;border:1px solid #3a8afd;letter-spacing:-0.1em;text-decoration:none;vertical-align:top;line-height:1.9em} +.btn_close {border:1px solid #dcdcdc;cursor:pointer;border-radius:3px;background:#fff} +a.btn_close {text-align:center;line-height:50px} + +/* 우편번호검색버튼 등 */ +button.btn_frmline {font-size:1em} +.btn_top {margin:10px;text-align:right} +.btn_top li {display:inline-block} +.btn_top a,.btn_top .btn_submit {line-height:30px;padding:0 10px;border-radius:3px} +.btn_top .btn_cancel,.btn_top .btn_b01 {border:1px solid #aaa;background:none;color:#666;line-height:28px;background:#fff} + +/* 게시판용 버튼 */ +a.btn_b01,.btn_b01 {display:inline-block;background:#4c4f6f;color:#fff;text-decoration:none;vertical-align:middle} +.btn_b01:hover, .btn_b01:hover {} +a.btn_b02 ,.btn_b02 {display:inline-block;background:#ff506a;color:#fff;text-decoration:none;vertical-align:middle;border:0} +a.btn_b02:hover, .btn_b02:hover {} +a.btn_b03, .btn_b03 {display:inline-block;line-height:28px;border:1px solid #ed6478;color:#ed6478;background:none;text-decoration:none;vertical-align:middle} +a.btn_b03:hover, .btn_b03:hover {} +a.btn_admin {display:inline-block;background:#e8180c;color:#fff;text-decoration:none;vertical-align:middle} /* 관리자 전용 버튼 */ +a.btn_admin:focus, a.btn_admin:hover {} + +.is_community .btn_top {position:relative;height:50px;margin:0;padding:10px 15px;line-height:30px;background:#fff;color:#333;text-align:right; +-webkit-box-shadow:0 0 10px rgba(181, 181, 181, 0.4); +-moz-box-shadow:0 0 10px rgba(181, 181, 181, 0.4); +box-shadow:0 0 10px rgba(181, 181, 181, 0.4); +} +.is_community a.btn_admin {display:inline-block;color:#d13f4a;font-size:1.4em;background:transparent;text-decoration:none;vertical-align:middle} +.is_community .btn_bo_user > li {display:inline-block;float:none;text-align:center;margin-left:5px} +.is_community .all_chk.chk_box input[type="checkbox"] + label span{top:2px;left:0} +.is_community a.btn,.is_community .btn {line-height:35px;width:30px;height:35px;padding:0 5px;text-align:center;font-weight:bold;border:0;font-size:1.4em} +.is_community .more_opt{right:40px} +.is_community .chk_box input[type="checkbox"] + label {padding-left:20px;color:#676e70} +.is_community .all_chk {padding:10px 15px;} + +/* 기본테이블 */ +.tbl_wrap {margin:0 0 10px} +.tbl_wrap table {width:100%;border-collapse:collapse;border-spacing:0} +.tbl_wrap caption {padding:10px 0;color:#4b8b99;font-weight:bold;text-align:left} + +.tbl_head01 {margin:0 0 10px} +.tbl_head01 table {border-bottom:1px solid #d3d3d3} +.tbl_head01 caption {padding:0;font-size:0;line-height:0;overflow:hidden} +.tbl_head01 thead th {padding:12px 0;border-top:2px solid #000;border-bottom:1px solid #d3d3d3;background:#fff;color:#383838;font-size:0.95em;text-align:center;letter-spacing:-0.1em} +.tbl_head01 thead a {color:#383838} +.tbl_head01 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head01 tfoot th, .tbl_head01 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center} +.tbl_head01 tbody th {padding:10px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head01 td {padding:15px 5px;border-top:1px solid #f3f3f3;border-left:1px solid #f3f3f3;line-height:1.5em;word-break:break-all} +.tbl_head01 td:first-child {border-left:0} +.tbl_head01 a {} + +.tbl_head02 {margin:15px} +.tbl_head02 caption {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +.tbl_head02 thead th {padding:7px 0;border-top:1px solid #333;border-bottom:1px solid #ddd;background:#f3f3f3;color:#333;font-size:0.95em;text-align:center} +.tbl_head02 thead a {color:#383838} +.tbl_head02 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head02 tfoot th {border-top:1px solid #666;border-bottom:1px solid #666;background:#484848;color:#fff} +.tbl_head02 tfoot td {background:#484848;color:#fff;font-weight:bold;text-align:center} +.tbl_head02 tbody th {padding:5px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head02 td {padding:5px 3px;border-bottom:1px solid #e9e9e9;line-height:1.4em;word-break:break-all} + +.tbl_head03 {margin:0 0 10px} +.tbl_head03 table {border-bottom:1px solid #d3d3d3} +.tbl_head03 caption {padding:0;font-size:0;line-height:0;overflow:hidden} +.tbl_head03 thead th {padding:12px 0;border-top:2px solid #000;border-bottom:1px solid #d3d3d3;;color:#383838;font-size:0.95em;text-align:center;letter-spacing:-0.1em} +.tbl_head03 thead a {color:#383838} +.tbl_head03 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head03 tfoot th, .tbl_head03 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center} +.tbl_head03 tbody th {padding:10px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head03 td {padding:15px 5px;border-top:1px solid #f3f3f3;border-left:1px solid #f3f3f3;background:#fff;line-height:1.5em;word-break:break-all} +.tbl_head03 td:first-child {border-left:0} +.tbl_head03 a {} + +/* 폼 테이블 */ +.tbl_frm01 {} +.tbl_frm01 th {padding:10px 0;width:90px;border:1px solid #e9e9e9;border-left:0;text-align:left} +.tbl_frm01 td {padding:10px 5px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;background:transparent} +.wr_content textarea,.tbl_frm01 textarea,.form_01 textarea, .frm_input {border:1px solid #d0d3db;background:#fff;color:#000;vertical-align:middle;padding:5px;font-size:1.083em;max-width:100%;} +.frm_input {height:40px;} + +.tbl_frm01 a {text-decoration:none} +.tbl_frm01 .frm_address {margin-top:5px;width:100%} +.tbl_frm01 .frm_file {display:block;margin-bottom:5px;width:100%} +.tbl_frm01 .frm_info {display:block;padding:5px 0 0;color:#666;line-height:1.3em} + +/* 기본리스트 */ +.list_01 {padding:0 10px} +.list_01 li {background:#fff;border-radius:3px;margin:10px 0;padding:10px 15px; +-webkit-box-shadow: 0 1px 4px #cbd1df; +-moz-box-shadow: 0 1px 4px #cbd1df; +box-shadow:0 1px 4px #cbd1df;} + +/* 기본폼 */ +.form_01{margin:10px} +.form_01 div{margin:5px 0;position:relative} +.form_01 li{margin:5px 0;position:relative} +.form_01 textarea {width:100%;height:100px} +.frm_input {height:40px} +.full_input {width:100%} +.form_01 .frm_file {display:block;margin-bottom:5px;width:100%} +.form_01 select {height:40px;border-radius:3px} +.form_01 .frm_info {font-size:0.92em;color:#4162ff;text-align:left;margin:3px 0 10px;display:block;line-height:1.3em} + +/* 자료 없는 목록 */ +.empty_table {padding:50px 0 !important;text-align:center !important;color:#666 !important} +.empty_list {padding:50px 0 !important;text-align:center !important;color:#666 !important} + +/* 필수입력 */ +.required, textarea.required {background-image:url('../img/require.png') !important;background-repeat:no-repeat !important;background-position:right top !important} + +/* 테이블 그리드 padding 0 5px 고려한 넓이 */ +.grid_1 {width:40px} +.grid_2 {width:100px} +.grid_3 {width:120px} +.grid_4 {width:190px} +.grid_5 {width:240px} +.grid_6 {width:290px} +.grid_7 {width:340px} +.grid_8 {width:390px} +.grid_9 {width:440px} +.grid_10 {width:490px} +.grid_11 {width:540px} +.grid_12 {width:590px} +.grid_13 {width:640px} +.grid_14 {width:690px} +.grid_15 {width:740px} +.grid_16 {width:790px} +.grid_17 {width:840px} +.grid_18 {width:890px} + +/* 테이블 항목별 정의 */ +.td_chk {width:50px;text-align:center} +.td_group {width:100px;text-align:center} +.td_board {width:120px;text-align:center} +.td_statsmall {width:50px;text-align:center} +.td_num {width:50px;text-align:center} +.td_numbig {width:100px;text-align:center} +.td_mb_id {width:100px;text-align:center} +.td_nick {width:100px;text-align:center} +.td_name {width:100px;text-align:left} +.td_namesmall {width:100px;text-align:left} +.td_date {width:50px;text-align:center} +.td_datetime {width:170px;text-align:center} +.td_mngsmall {width:50px;text-align:center} +.td_mng {width:80px;text-align:center} +.td_stat {text-align:center} +.td_dvr {text-align:center} + +/* 새창 기본 스타일 */ +.new_win {} +.new_win #win_title {font-size:1.3em;min-height:50px;line-height:30px;padding:10px 20px;background:#fff;color:#000;-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1); +-moz-box-shadow:0 1px 10px rgba(0,0,0,.1); +box-shadow:0 1px 10px rgba(0,0,0,.1)} +.new_win #win_title .sv {font-size:0.75em;line-height:1.2em} +.new_win_con {margin:10px} + +.new_win .win_ul {margin:10px} +.new_win .win_ul li {display:inline-block} +.new_win .win_ul li a {display:block;line-height:24px;padding:0 10px} +.new_win .win_ul li .selected {background:#4162ff;color:#fff;border-radius:13px; +-webkit-box-shadow:0 0 5px rgba(65,98,255,0.8); +-moz-box-shadow:0 0 5px rgba(65,98,255,0.8); +box-shadow:0 0 8px rgba(65,98,255,0.8)} + +.new_win .win_desc {margin:5px 0;font-size:0.92em;color:#4162ff} +.new_win .win_btn {clear:both;margin:10px;text-align:center} +.new_win .win_btn a {display:inline-block;height:45px;line-height:45px;font-weight:bold} +.new_win .btn_close {height:45px;width:60px;overflow:hidden;cursor:pointer} +.new_win .btn_submit {padding:0 20px;height:45px;font-weight:bold;font-size:1.083em;vertical-align:top} + +/* 자바스크립트 alert 대안 */ +#validation_check {margin:100px auto;width:500px} +#validation_check h1 {margin-bottom:20px;font-size:1.3em} +#validation_check p {margin-bottom:20px;padding:30px 20px;border:1px solid #e9e9e9;background:#fff} + +/* 사이드뷰*/ +.sv_wrap {display:inline-block;position:relative;font-weight:normal} +.sv_wrap .sv {z-index:1000;display:none;margin:5px 0 0;border:1px solid #283646;background:#111} +.sv_wrap .sv a {display:inline-block !important;margin:0 !important;padding:5px !important;width:94px;border-bottom:1px solid #283646;color:#fff !important} +.sv_wrap a:focus, .sv_wrap a:hover, .sv_wrap a:active {text-decoration:none !important} +.sv_on {display:block !important;position:absolute;top:10px;left:20px;width:auto;height:auto !important} +.sv_nojs .sv {display:block} + +/* 페이징 */ +.pg_wrap {clear:both;display:block;padding:10px 0;text-align:center} +.pg_wrap:after {display:block;visibility:hidden;clear:both;content:""} +.pg {text-align:center} +.pg_page, .pg_current, .qa_page {display:inline-block;vertical-align:middle;background:#eee;border:1px solid #eee} +.pg a:focus, .pg a:hover {text-decoration:none} +.pg_page,.qa_page {color:#959595;font-size:1.083em;height:30px;line-height:28px;padding:0 5px;min-width:30px;text-decoration:none;border-radius:3px} +.pg_page:hover,.qa_page:hover {background-color:#fafafa} +.pg_start {text-indent:-999px;overflow:hidden;background:url('../img/btn_first.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_prev {text-indent:-999px;overflow:hidden;background:url('../img/btn_prev.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_end {text-indent:-999px;overflow:hidden;background:url('../img/btn_end.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_next {text-indent:-999px;overflow:hidden;background:url('../img/btn_next.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_start:hover,.pg_prev:hover,.pg_end:hover,.pg_next:hover {background-color:#fafafa} + +.pg_current {display:inline-block;background:#3a8afd;border:1px solid #3a8afd;color:#fff;font-weight:bold;height:30px;line-height:30px;padding:0 10px;min-width:30px;border-radius:3px} + +/* 상품상세 메뉴 floating */ +#info_top_layer {display:none;position:absolute;top:0;left:0;width:100%;background-color:#eee} +#form_btn_layer {display:none;position:absolute;top:0;left:0;width:100%;height:60px;background-color:#eee} + +/*현금영수증*/ +#kcp_req_rx .tbl_head01 tbody th {text-align:left} + +/*배송지목록*/ +#sod_addr .win_desc {padding:10px 20px} + +/*쇼핑몰레이아웃*/ +#mb_login .btn_submit {} +#bo_list,#bo_cate {margin-top:10px !important} +#fregisterform {} +#bo_w .btn_submit, #bo_w a.btn_cancel {padding:8px 7px} +#bo_w {padding:10px} +#fqalist {padding:0 10px} + +/*이벤트*/ +#sev_hhtml,#sev_thtml {padding:10px} +#sev_hhtml img,#sev_thtml img {width:100%} + +/*네이버페이*/ +.naverpay-item {padding-top:15px;clear:both} +#sod_bsk_act .naverpay-cart {margin-top:15px;clear:both;position:static} + +/*PC 주문서*/ + +#sod_frm .tbl_head03{padding:0;background:none} +#sod_frm .tbl_head03 .sod_opt {padding:5px 0} +#sod_frm_orderer .odpw_info{display:block;margin:0 0 7px;color:#3a8afd} +#sod_frm_orderer .tbl_frm01,#sod_frm_taker .tbl_frm01{background:#fff;padding:10px 0;margin:0} +#sod_frm_taker .choice_place{background:#edf3fc;margin:10px;padding:10px;border:1px solid #d1ddee} +#sod_frm_taker .choice_tit{display:block;font-weight:bold;margin:0 0 5px} +#sod_frm_orderer table th,#sod_frm_taker table th{border:0;padding:10px 5px;text-align:right;vertical-align:top} +#sod_frm_orderer table td,#sod_frm_taker table td{border:0;padding:5px 10px;vertical-align:middle} +.sod_right #sod_bsk_tot{margin:10px} +#sod_frm_taker textarea{width:100%;height:80px} + +#od_pay_sl input[type="radio"] {position:absolute;width:0;height:0;overflow:hidden;visibility:hidden;text-indent:-999px;left:0;z-index:-1px} +#od_pay_sl .lb_icon {display:inline-block;float:left;width:150px;background:#fff;border:1px solid #eceff4;margin:-1px 0 0 -1px;cursor:pointer;height:60px;position:relative;padding-left:65px;padding-top:20px;z-index:1} +#od_pay_sl input[type="radio"]:checked+.lb_icon {border:1px solid #ff006c;z-index:3} + +#sod_frm_paysel {} +#sod_frm_paysel legend {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#sod_frm_paysel .KPAY{background:url('../img/kpay.png') no-repeat 0 3px;width:67px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:35px auto} +#sod_frm_paysel .PAYNOW{background:url('../img/paynow.png') no-repeat 0 3px;width:74px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:45px auto;} +#sod_frm_paysel .PAYCO{background:url('../img/payco.png') no-repeat 0 3px;width:74px;;overflow:hidden;text-indent:-999px;display:inline-block;background-size:45px auto;} +#sod_frm_paysel .inicis_lpay{background:url('../img/lpay_logo.png') no-repeat 0 3px;width:65px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:35px auto;} +#sod_frm_paysel .kakaopay_icon{background:url('../img/kakao.png') no-repeat 0 3px;width:74px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +#sod_frm_paysel .samsung_pay{background:url('../img/samsungpay.png') no-repeat 0 3px;width:106px;display:inline-block;overflow:hidden;text-indent:-999px} + +#sod_bsk_tot:after {display:block;visibility:hidden;clear:both;content:""} +.sod_info li {position:relative;float:left;background:#fff;width:33.333%;height:70px;text-align:center;border-bottom:1px solid #e7ebf1;padding:15px 0} +.sod_info li:after {display:block;visibility:hidden;clear:both;content:""} +.sod_info li span {display:block;color:#777;margin-bottom:5px;font-weight:bold;color:#000} +.sod_info .sod_bsk_sell, .sod_info .sod_bsk_coupon {border-right:1px solid #e7ebf1} +.sod_info .sod_bsk_coupon:before {display:block;content:"-";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#9da6c9;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size:16px;line-height:14px} +.sod_info .sod_bsk_dvr:before {display:block;content:"+";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#9da6c9;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size:16px;line-height:14px} +.sod_info .sod_bsk_cnt strong {font-size:1.25em} + +.sod_info_bt {clear:both;padding:10px 15px;background:#fff} +.sod_info_bt:after {display:block;visibility:hidden;clear:both;content:""} +.sod_info_bt li {} +.sod_info_bt li:after {display:block;visibility:hidden;clear:both;content:""} +.sod_info_bt li span {display:inline-block;float:left;width:50%;line-height:28px;text-align:left;font-weight:bold;color:#000} +.sod_info_bt li strong {display:inline-block;float:left;width:50%;line-height:28px;text-align:right} + +.sod_info_option {clear:both;border-top:1px solid #e7ebf1} +.sod_info_option h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.sod_info_option ul {padding:10px 15px;background:#fff} +.sod_info_option li {margin-bottom:5px} +.sod_info_option li:after {display:block;visibility:hidden;clear:both;content:""} +.sod_info_option .sod_ifop_tit {display:inline-block;float:left;width:50%;line-height:28px;text-align:left;font-weight:bold} +.sod_info_option .sod_ifop_tit .btn_frmline {width:auto;height:30px;color:#3a8afd;background:#fff;border:1px solid #d4d6db;font-size:0.93em;border-radius:3px} +.sod_info_option .sod_ifop_tit .cp_cancel {width:auto;height:30px;border:1px solid #d4d6db;padding:0 5px;margin-left:5px;color:#b1b1b1;vertical-align:baseline} +.sod_info_option .sod_ifop_tit .od_coupon>td {text-align:left} +.sod_info_option>td, .sod_info_option .sod_ifop_t {display:inline-block;float:left;width:50%;line-height:28px;text-align:right} +.sod_info_option>td {text-align:right;padding:10px;height:30px} +.sod_info_option>td .cp_cancel {margin:0 0 0 2px} +.sod_info_option>td .btn_frmline {padding:0 7px;border:1px solid #38b2b9;color:#38b2b9;background:#fff;height:23px;line-height:21px;margin:0} + +.btn_address{background:#70aff2;border:1px solid #3476be;height:40px;color:#fff;padding:0 10px;font-size:1.083em;font-weight:bold} + +/* 5.4.1.3 버전이후 추가 css */ +#sod_frm div.tbl_frm01, #sod_frm_taker div.tbl_frm01{padding:0px 10px !important} +#sod_frm .tbl_frm01 th, #sod_frm .tbl_frm01 td{padding:10px;line-height:45px} +#sod_frm .tbl_frm01 th{width:94px} +#sod_frm #od_name,#sod_frm #od_tel,#sod_frm #od_hp,#sod_frm #od_pwd,#sod_frm #od_b_name,#sod_frm #od_b_tel,#sod_frm #od_b_hp,#sod_frm #ad_subject,#sod_frm #od_hope_date{width:50%} +#sod_frm #od_zip,#sod_frm #od_b_zip{width:90px} +#sod_frm .tbl_frm01 td .btn_address {background:#434a54;color:#fff;width:128px;height:45px;border:0;border-radius:3px} +#sod_frm #od_memo{min-height:100px} +#sod_frm_taker .order_choice_place{position:relative;background:#edf3fc;border:1px solid #d1ddee;padding:10px} +#sod_frm_taker .order_choice_place{line-height:23px} +#sod_frm_taker .tbl_frm01 #order_address{display:block;;text-align:center;border: 1px solid #3476be;color: #3476be;;height:30px;line-height:28px;margin:5px 0 0;background:none} +#sod_frm #sod_bsk_tot:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm #sod_bsk_tot li{position:relative;float:left;background:#fff;width:33.333%;height:70px;text-align:center;border-bottom:1px solid #e7ebf1;padding:15px 0} +#sod_frm #sod_bsk_tot li:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm #sod_bsk_tot li span{display:block;color:#777;margin-bottom:5px;font-weight:bold} +#sod_frm #sod_bsk_tot .sod_bsk_sell,#sod_frm #sod_bsk_tot .sod_bsk_coupon{border-right:1px solid #e7ebf1} +#sod_frm #sod_bsk_tot .sod_bsk_point,#sod_frm #sod_bsk_tot .sod_bsk_cnt{width:100%;clear:both;height:40px;padding:0 15px;line-height:40px;text-align:right} +#sod_frm #sod_bsk_tot li:last-child {border-bottom:0 none} +#sod_frm #sod_bsk_tot .sod_bsk_point span,#sod_frm #sod_bsk_tot .sod_bsk_cnt span {float:left;margin:0} +#sod_frm #sod_bsk_tot .sod_bsk_coupon:before{display:block;content:"-";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#ff006c;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size: 16px;line-height: 14px;} +#sod_frm #sod_bsk_tot .sod_bsk_dvr:before{display:block;content:"+";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#ff006c;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size: 16px;line-height: 14px;} +#sod_frm #sod_bsk_tot .sod_bsk_cnt strong{color:#ff006c;font-size:1.25em} +#sod_frm_pay {position:relative;margin:10px 0} +#sod_frm #sod_frm_pay h2 {position:absolute;border:0;font-size:0;line-height:0;content:""} +#sod_frm_pay .pay_tbl table{width:100%;border-collapse:collapse} +#sod_frm_pay .pay_tbl th{text-align:left;padding:10px;width:80px;border-bottom:1px solid #e7ebf1;background:#fff;font-weight:bold;color:#777} +#sod_frm_pay .pay_tbl td{text-align:right;padding: 10px;height:30px;border-bottom:1px solid #e7ebf1;background:#fff} +#sod_frm_pay .pay_tbl td .cp_cancel{margin:0 0 0 2px} +#sod_frm_pay .pay_tbl td .btn_frmline{padding: 0 7px;border: 1px solid #38b2b9;color: #38b2b9;background: #fff;height: 23px;line-height: 21px;margin: 0;} +#od_tot_price{margin:10px 0;background:#fff;line-height:40px;text-align:right;padding:0 10px} +#od_tot_price span{float:left;font-weight:bold} +#od_tot_price strong{font-size:1.5em;color:#ff006c} +#od_pay_sl h3{font-size:1.167em;margin:20px 0 5px} +#od_pay_sl input[type="radio"]{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden;text-indent:-999px;left: 0;z-index: -1px;} +#od_pay_sl .lb_icon {display: inline-block;float:left;width:50%;background:#fff;border:1px solid #eceff4;margin:-1px 0 0 -1px;cursor: pointer;height:60px;position:relative;padding-left:65px;padding-top:20px;z-index:1} +#od_pay_sl input[type="radio"]:checked+.lb_icon {border:1px solid #ff006c;z-index:3} +#sod_frm_paysel {} +#sod_frm_paysel legend {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_frm_paysel .KPAY{background:url('../img/kpay.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .PAYNOW{background:url('../img/paynow.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .PAYCO{background:url('../img/payco.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .inicis_lpay{background:url('../img/lpay_logo.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .inicis_kakaopay{background:url('../img/kakao.png') no-repeat 50% 50% #f4dc34;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .kakaopay_icon{background:url('../img/kakao.png') no-repeat 50% 50% #f4dc34;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .bank_icon{background:url('../img/pay_icon1.png') no-repeat 15px 50% #fff} +#sod_frm_paysel .vbank_icon{background:url('../img/pay_icon2.png') no-repeat 15px 50% #fff;padding-top:13px} +#sod_frm_paysel .iche_icon{background:url('../img/pay_icon2.png') no-repeat 15px 50% #fff;padding-top:13px} +#sod_frm_paysel .hp_icon{background:url('../img/pay_icon3.png') no-repeat 24px 50% #fff} +#sod_frm_paysel .card_icon{background:url('../img/pay_icon4.png') no-repeat 17px 50% #fff} +#forderform .sod_right #sod_bsk_tot {border:1px solid #e3e5e8} +#forderform .od_pay_buttons_el{margin-top:20px;border:1px solid #e3e5e8;background:#fff;padding:10px} +#forderform .od_pay_buttons_el h3{font-size:1.167em;margin:0px 0 5px} +#forderform #sod_frm_pt{border-top:1px solid #e3e5e8} +#sod_frm_taker td input[type="radio"], #sod_frm_taker td input[type="checkbox"]{width:auto;-webkit-appearance:radio;-webkit-border-radius:initial} +#sod_frm_taker label {display:inline-block;font-weight:normal;margin-right:1em} + +#sod_frm #sod_bsk_tot{margin:10px;} +#sod_frm #sod_bsk_tot:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm #sod_bsk_tot li{position:relative;float:left;background:#fff;width:33.333%;height:70px;text-align:center;border-bottom:1px solid #e7ebf1;padding:15px 0} +#sod_frm #sod_bsk_tot li:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm #sod_bsk_tot li span{display:block;color:#777;margin-bottom:5px;font-weight:bold} +#sod_frm #sod_bsk_tot .sod_bsk_sell,#sod_frm #sod_bsk_tot .sod_bsk_coupon{border-right:1px solid #e7ebf1} +#sod_frm #sod_bsk_tot .sod_bsk_point,#sod_frm #sod_bsk_tot .sod_bsk_cnt{width:100%;clear:both;height:40px;padding:0 15px;line-height:40px;text-align:right} +#sod_frm #sod_bsk_tot .sod_bsk_point span,#sod_frm #sod_bsk_tot .sod_bsk_cnt span {float:left;margin:0} +#sod_frm #sod_bsk_tot .sod_bsk_coupon:before{display:block;content:"-";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#ff006c;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size: 16px;line-height: 14px;} +#sod_frm #sod_bsk_tot .sod_bsk_dvr:before{display:block;content:"+";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#ff006c;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size: 16px;line-height: 14px;} +#sod_frm #sod_bsk_tot .sod_bsk_cnt strong{color:#ff006c;font-size:1.25em} +#sod_frm_pay .pay_tbl table{width:100%;border-collapse:collapse} +#sod_frm_pay .pay_tbl th{text-align:left;padding:10px;width:90px;border-bottom:1px solid #e7ebf1;background:#fff;font-weight:bold;color:#777} +#sod_frm_pay .pay_tbl td{text-align:right;padding: 10px;height:30px;border-bottom:1px solid #e7ebf1;background:#fff} +#sod_frm_pay .pay_tbl td .cp_cancel{margin:0 0 0 2px} +#sod_frm_pay .pay_tbl td .btn_frmline{padding: 0 7px;border: 1px solid #38b2b9;color: #38b2b9;background: #fff;height: 23px;line-height: 21px;margin: 0;} +#od_tot_price{margin:10px 0;background:#fff;line-height:40px;text-align:right;padding:0 10px} +#od_tot_price span{float:left;font-weight:bold} +#od_tot_price strong{font-size:1.5em;color:#ff006c} + +#od_tot_price {background:#e5f0ff;line-height:20px;text-align:right;padding:15px} +#od_tot_price span {float:left;font-weight:bold} +#od_tot_price strong {font-size:1.5em;color:#ff006c} +#sod_frm_pay_info {margin:0 0 10px} + +#sod_point {clear:both;background:#fff;margin:10px;border:1px solid #e3e5e8} +#sod_point h2 {font-size:1.167em;padding:15px;border-bottom:1px solid #e3e5e8} +#sod_point h2:after {display:block;visibility:hidden;clear:both;content:''} + +#sod_point .point_tit {vertical-align:baseline;float:left;line-height:28px} +#sod_point .point_tit label {vertical-align:baseline} +#sod_point .point_ipt {float:right;display:inline-block;margin-left:35px;text-align:left;text-align:right;font-weight:normal} +#sod_point .point_ipt:after {display:block;visibility:hidden;clear:both;content:''} +#sod_point .point_ipt #od_temp_point {width:100px;height:30px;text-align:right;padding:0 5px;border:1px solid #d0d3db;border-radius:3px} + +#sod_frm_pt .max_point_box em {font-style:normal !important} + +.sod_frm_pc #sod_frm_pay {position:relative;margin:10px;padding:0} +.sod_frm_pc #sod_frm_pay h2 {font-size:1.167em;padding:15px;margin:0;border-bottom:1px solid #e3e5e8} +.sod_frm_pc #sod_frm_pay .tooltip_txt {height:auto;line-height:18px;font-weight:normal;font-size:1em;padding:10px 20px;margin:10px} +.sod_frm_pc #sod_frm_pay .tooltip_txt:before {height:100%} +.sod_frm_pc #sod_frm_pay input[type="radio"] {} +.sod_frm_pc #sod_frm_pay .lb_icon {display:inline-block;position:relative;cursor:pointer;z-index:1} +.sod_frm_pc #sod_frm_pay input[type="radio"]:checked+.lb_icon {color:#3a8afd;z-index:3} +.sod_frm_pc #sod_frm_pay input[type="radio"] + label span {top:0px} +.sod_frm_pc .pay_way {padding:0 10px 10px} +.sod_frm_pc .pay_way li{margin:0 0 5px} +.sod_frm_pc #settle_bank {border:0;border-top:1px solid #e3e5e8;text-align:right;padding:0} +.sod_frm_pc #sod_frm_paysel {padding:0;} +.sod_frm_pc #settle_bank {padding:10px;} + +.sod_frm_pc #sod_frm_orderer .tbl_frm01 th{text-align:left} +.sod_frm_pc #sod_frm_taker .tbl_frm01 th{text-align:left} +.sod_frm_pc td .frm_input{width:100%} +.sod_frm_pc td #od_zip ,.sod_frm_pc td #od_b_zip{width:auto} +/* 팁 */ +.tooltip_icon {display:inline-block;vertical-align:middle;color:#b3b5b8;border:0;font-size:1.4em;background:transparent;cursor:pointer} +.tooltip_icon:hover {color:#448bf5} +.tooltip {position:relative;width:auto;color:#fff;background:#000;padding:10px;font-size:small;line-height:18px;display:none;position:absolute;z-index:9;font-weight:normal;margin-left:15px;margin-top:20px} +.tooltip:before {content:"";position:absolute;top:0;left:-10px;width:0;height:0;border-style:solid;border-top:0px solid transparent;border-bottom:10px solid transparent;border-left:0;border-right:10px solid #000} + +.tooltip_txt {position:relative;text-align:left;color:#fff;height:50px;line-height:50px;font-size:1.1em;background:#f2838f;margin:0 0 10px;padding:0 20px;border-radius:5px;font-weight:bold} +.tooltip_txt:before {content:"";position:absolute;top:0;left:0;width:5px;height:50px;border-radius:5px 0 0 5px;background:#da4453} +.tooltip_txt i {font-size:1.2em;vertical-align:middle} + +/*-- 개인결제 --*/ +/*모바일*/ +#m_sod_frm_orderer {margin:10px 0;border-top:1px solid #e7ebf1} +#m_sod_frm_orderer h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#m_sod_frm_orderer ul {background:#fff;margin:15px 0;border-bottom:1px solid #ccc;padding:10px 15px} +#m_sod_frm_orderer li {line-height:20px} +#m_sod_frm_orderer th {display:block;width:100% !important;font-weight:bold;border:0} +#m_sod_frm_orderer td {display:block;width:100% !important;text-align:left;padding:5px 10px;border:0;margin-bottom:10px} +#m_sod_frm_orderer td .frm_input {width:100%} +#m_pv_sod_frm .btn_confirm {margin:10px} +#m_pv_sod_frm .btn_confirm .btn_submit {width:100%;height:45px;font-size:1.167em;font-weight:bold;margin:0 0 3px} +#m_pv_sod_frm .btn_confirm .btn_cancel {width:100%;height:45px;line-height:43px;font-size:1.167em;font-weight:bold;padding:0} +#m_pv_sod_frm .pay_way {border-top:1px solid #e7ebf1} +#m_pv_sod_frm .pay_way li {padding:5px 0} + +/*피씨에서 모바일*/ +.pesonal {background:#fff;border-top:1px solid #e7ebf1;border-bottom:1px solid #e3e5e8;margin:10px 0} +.pesonal h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +.pesonal .tbl_frm01 {padding:10px;margin:0} +.pesonal tr {display:inline-block;width:100%;padding:0 5px;margin-bottom:20px} +.pesonal th {display:block;width:auto;text-align:left;padding:10px 0;font-weight:bold;border:0} +.pesonal td {display:block;padding:0;border:0} +.pesonal td input {width:100%} +.pesonal .half_tr {width:50%} +.sod_right .btn_confirm {margin:10px} +.sod_right .btn_submit, .sod_right .btn01 {width:100%;height:45px;font-size:1.167em;font-weight:bold;margin:5px 0;border-radius:4px;line-height:45px} + +/* input, radio */ +.selec_chk {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box {position:relative} +.chk_box input[type="checkbox"] + label {position:relative;padding-left:20px;color:#676e70} +.chk_box input[type="checkbox"] + label:hover {color:#2172f8} +.chk_box input[type="checkbox"] + label span {position:absolute;top:2px;left:0;width:15px;height:15px;display:block;margin:0;background:#fff;border:1px solid #d0d4df;border-radius:3px} +.chk_box input[type="checkbox"]:checked + label {color:#000} +.chk_box input[type="checkbox"]:checked + label span {background:url('../img/chk.png') no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} + +.chk_box input[type="radio"] {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box input[type="radio"] + label {position:relative;padding-left:23px;display:inline-block;color:#676e70} +.chk_box input[type="radio"] + label span {position:absolute;top:0;left:0;width:15px;height:15px;display:block;background:#fff;border:1px solid #cdd6df;border-radius:50%} +.chk_box input[type="radio"]:checked + label {color:#305af9} +.chk_box input[type="radio"]:checked + label span:before {width:7px;height:7px;background:#305af9;content:'';position:absolute;top:3px;left:3px;border-radius:50%} + diff --git a/extend/shop.extend.php b/extend/shop.extend.php new file mode 100644 index 000000000..c0feded8a --- /dev/null +++ b/extend/shop.extend.php @@ -0,0 +1,81 @@ + +

    @@ -33,7 +34,15 @@ include_once(G5_LIB_PATH.'/popular.lib.php'); } ?>
    -
    +
    + + +
    • FAQ
    • Q&A
    • @@ -86,7 +95,6 @@ include_once(G5_LIB_PATH.'/popular.lib.php'); return true; } - diff --git a/head.sub.php b/head.sub.php index 504f663e7..c3ba28b6a 100644 --- a/head.sub.php +++ b/head.sub.php @@ -43,7 +43,7 @@ header("Pragma: no-cache"); // HTTP/1.0 '.PHP_EOL; + echo ''.PHP_EOL; echo ''.PHP_EOL; echo ''.PHP_EOL; } else { @@ -60,7 +60,9 @@ if (defined('G5_IS_ADMIN')) { if(!defined('_THEME_PREVIEW_')) echo ''.PHP_EOL; } else { - echo ''.PHP_EOL; + $shop_css = ''; + if (defined('_SHOP_')) $shop_css = '_shop'; + echo ''.PHP_EOL; } ?> ';\n // return true / false value based on what will browser render\n return div.getElementsByTagName('i').length === 1;\n }\n function isSafari() {\n var ua = win.navigator.userAgent.toLowerCase();\n return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);\n }\n return {\n isSafari: isSafari(),\n isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent),\n ie: win.navigator.pointerEnabled || win.navigator.msPointerEnabled,\n ieTouch: (win.navigator.msPointerEnabled && win.navigator.msMaxTouchPoints > 1) ||\n (win.navigator.pointerEnabled && win.navigator.maxTouchPoints > 1),\n lteIE9: isIE9(),\n };\n}());\n\nvar slideTo = function (index, speed, runCallbacks, internal) {\n if ( index === void 0 ) index = 0;\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var slideIndex = index;\n if (slideIndex < 0) { slideIndex = 0; }\n\n var params = swiper.params;\n var snapGrid = swiper.snapGrid;\n var slidesGrid = swiper.slidesGrid;\n var previousIndex = swiper.previousIndex;\n var activeIndex = swiper.activeIndex;\n var rtl = swiper.rtl;\n var $wrapperEl = swiper.$wrapperEl;\n\n var snapIndex = Math.floor(slideIndex / params.slidesPerGroup);\n if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }\n\n if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n swiper.emit('beforeSlideChangeStart');\n }\n\n var translate = -snapGrid[snapIndex];\n\n // Update progress\n swiper.updateProgress(translate);\n\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n for (var i = 0; i < slidesGrid.length; i += 1) {\n if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {\n slideIndex = i;\n }\n }\n }\n\n // Directions locks\n if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {\n return false;\n }\n if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {\n if ((activeIndex || 0) !== slideIndex) { return false; }\n }\n\n // Update Index\n if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {\n swiper.updateActiveIndex(slideIndex);\n // Update Height\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n swiper.updateSlidesClasses();\n if (params.effect !== 'slide') {\n swiper.setTranslate(translate);\n }\n return false;\n }\n\n if (speed === 0 || Browser.lteIE9) {\n swiper.setTransition(0);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks);\n swiper.transitionEnd(runCallbacks);\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks);\n if (!swiper.animating) {\n swiper.animating = true;\n $wrapperEl.transitionEnd(function () {\n if (!swiper || swiper.destroyed) { return; }\n swiper.transitionEnd(runCallbacks);\n });\n }\n }\n\n return true;\n};\n\n/* eslint no-unused-vars: \"off\" */\nvar slideNext = function (speed, runCallbacks, internal) {\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var params = swiper.params;\n var animating = swiper.animating;\n if (params.loop) {\n if (animating) { return false; }\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);\n }\n return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);\n};\n\n/* eslint no-unused-vars: \"off\" */\nvar slidePrev = function (speed, runCallbacks, internal) {\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var params = swiper.params;\n var animating = swiper.animating;\n\n if (params.loop) {\n if (animating) { return false; }\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n return swiper.slideTo(swiper.activeIndex - 1, speed, runCallbacks, internal);\n }\n return swiper.slideTo(swiper.activeIndex - 1, speed, runCallbacks, internal);\n};\n\n/* eslint no-unused-vars: \"off\" */\nvar slideReset = function (speed, runCallbacks, internal) {\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n};\n\nvar slideToClickedSlide = function () {\n var swiper = this;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n\n var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n var slideToIndex = swiper.clickedIndex;\n var realIndex;\n if (params.loop) {\n if (swiper.animating) { return; }\n realIndex = parseInt($$1(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n if (params.centeredSlides) {\n if (\n (slideToIndex < swiper.loopedSlides - (slidesPerView / 2)) ||\n (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2))\n ) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children((\".\" + (params.slideClass) + \"[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]:not(.\" + (params.slideDuplicateClass) + \")\"))\n .eq(0)\n .index();\n\n Utils.nextTick(function () {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children((\".\" + (params.slideClass) + \"[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]:not(.\" + (params.slideDuplicateClass) + \")\"))\n .eq(0)\n .index();\n\n Utils.nextTick(function () {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else {\n swiper.slideTo(slideToIndex);\n }\n};\n\nvar slide = {\n slideTo: slideTo,\n slideNext: slideNext,\n slidePrev: slidePrev,\n slideReset: slideReset,\n slideToClickedSlide: slideToClickedSlide,\n};\n\nvar loopCreate = function () {\n var swiper = this;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n // Remove duplicated slides\n $wrapperEl.children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass))).remove();\n\n var slides = $wrapperEl.children((\".\" + (params.slideClass)));\n\n if (params.loopFillGroupWithBlank) {\n var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);\n if (blankSlidesNum !== params.slidesPerGroup) {\n for (var i = 0; i < blankSlidesNum; i += 1) {\n var blankNode = $$1(doc.createElement('div')).addClass(((params.slideClass) + \" \" + (params.slideBlankClass)));\n $wrapperEl.append(blankNode);\n }\n slides = $wrapperEl.children((\".\" + (params.slideClass)));\n }\n }\n\n if (params.slidesPerView === 'auto' && !params.loopedSlides) { params.loopedSlides = slides.length; }\n\n swiper.loopedSlides = parseInt(params.loopedSlides || params.slidesPerView, 10);\n swiper.loopedSlides += params.loopAdditionalSlides;\n if (swiper.loopedSlides > slides.length) {\n swiper.loopedSlides = slides.length;\n }\n\n var prependSlides = [];\n var appendSlides = [];\n slides.each(function (index, el) {\n var slide = $$1(el);\n if (index < swiper.loopedSlides) { appendSlides.push(el); }\n if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); }\n slide.attr('data-swiper-slide-index', index);\n });\n for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) {\n $wrapperEl.append($$1(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) {\n $wrapperEl.prepend($$1(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n};\n\nvar loopFix = function () {\n var swiper = this;\n var params = swiper.params;\n var activeIndex = swiper.activeIndex;\n var slides = swiper.slides;\n var loopedSlides = swiper.loopedSlides;\n var allowSlidePrev = swiper.allowSlidePrev;\n var allowSlideNext = swiper.allowSlideNext;\n var newIndex;\n swiper.allowSlidePrev = true;\n swiper.allowSlideNext = true;\n // Fix For Negative Oversliding\n if (activeIndex < loopedSlides) {\n newIndex = (slides.length - (loopedSlides * 3)) + activeIndex;\n newIndex += loopedSlides;\n swiper.slideTo(newIndex, 0, false, true);\n } else if ((params.slidesPerView === 'auto' && activeIndex >= loopedSlides * 2) || (activeIndex > slides.length - (params.slidesPerView * 2))) {\n // Fix For Positive Oversliding\n newIndex = -slides.length + activeIndex + loopedSlides;\n newIndex += loopedSlides;\n swiper.slideTo(newIndex, 0, false, true);\n }\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n};\n\nvar loopDestroy = function () {\n var swiper = this;\n var $wrapperEl = swiper.$wrapperEl;\n var params = swiper.params;\n var slides = swiper.slides;\n $wrapperEl.children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass))).remove();\n slides.removeAttr('data-swiper-slide-index');\n};\n\nvar loop = {\n loopCreate: loopCreate,\n loopFix: loopFix,\n loopDestroy: loopDestroy,\n};\n\nvar setGrabCursor = function (moving) {\n var swiper = this;\n if (Support.touch || !swiper.params.simulateTouch) { return; }\n var el = swiper.el;\n el.style.cursor = 'move';\n el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n el.style.cursor = moving ? 'grabbing' : 'grab';\n};\n\nvar unsetGrabCursor = function () {\n var swiper = this;\n if (Support.touch) { return; }\n swiper.el.style.cursor = '';\n};\n\nvar grabCursor = {\n setGrabCursor: setGrabCursor,\n unsetGrabCursor: unsetGrabCursor,\n};\n\nvar appendSlide = function (slides) {\n var swiper = this;\n var $wrapperEl = swiper.$wrapperEl;\n var params = swiper.params;\n if (params.loop) {\n swiper.loopDestroy();\n }\n if (typeof slides === 'object' && 'length' in slides) {\n for (var i = 0; i < slides.length; i += 1) {\n if (slides[i]) { $wrapperEl.append(slides[i]); }\n }\n } else {\n $wrapperEl.append(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!(params.observer && Support.observer)) {\n swiper.update();\n }\n};\n\nvar prependSlide = function (slides) {\n var swiper = this;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n var activeIndex = swiper.activeIndex;\n\n if (params.loop) {\n swiper.loopDestroy();\n }\n var newActiveIndex = activeIndex + 1;\n if (typeof slides === 'object' && 'length' in slides) {\n for (var i = 0; i < slides.length; i += 1) {\n if (slides[i]) { $wrapperEl.prepend(slides[i]); }\n }\n newActiveIndex = activeIndex + slides.length;\n } else {\n $wrapperEl.prepend(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!(params.observer && Support.observer)) {\n swiper.update();\n }\n swiper.slideTo(newActiveIndex, 0, false);\n};\n\nvar removeSlide = function (slidesIndexes) {\n var swiper = this;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n var activeIndex = swiper.activeIndex;\n\n if (params.loop) {\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children((\".\" + (params.slideClass)));\n }\n var newActiveIndex = activeIndex;\n var indexToRemove;\n\n if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n for (var i = 0; i < slidesIndexes.length; i += 1) {\n indexToRemove = slidesIndexes[i];\n if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }\n if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }\n }\n newActiveIndex = Math.max(newActiveIndex, 0);\n } else {\n indexToRemove = slidesIndexes;\n if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }\n if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }\n newActiveIndex = Math.max(newActiveIndex, 0);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n\n if (!(params.observer && Support.observer)) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n};\n\nvar removeAllSlides = function () {\n var swiper = this;\n\n var slidesIndexes = [];\n for (var i = 0; i < swiper.slides.length; i += 1) {\n slidesIndexes.push(i);\n }\n swiper.removeSlide(slidesIndexes);\n};\n\nvar manipulation = {\n appendSlide: appendSlide,\n prependSlide: prependSlide,\n removeSlide: removeSlide,\n removeAllSlides: removeAllSlides,\n};\n\nvar Device = (function Device() {\n var ua = win.navigator.userAgent;\n\n var device = {\n ios: false,\n android: false,\n androidChrome: false,\n desktop: false,\n windows: false,\n iphone: false,\n ipod: false,\n ipad: false,\n cordova: win.cordova || win.phonegap,\n phonegap: win.cordova || win.phonegap,\n };\n\n var windows = ua.match(/(Windows Phone);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n var iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n\n\n // Windows\n if (windows) {\n device.os = 'windows';\n device.osVersion = windows[2];\n device.windows = true;\n }\n // Android\n if (android && !windows) {\n device.os = 'android';\n device.osVersion = android[2];\n device.android = true;\n device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\n }\n if (ipad || iphone || ipod) {\n device.os = 'ios';\n device.ios = true;\n }\n // iOS\n if (iphone && !ipod) {\n device.osVersion = iphone[2].replace(/_/g, '.');\n device.iphone = true;\n }\n if (ipad) {\n device.osVersion = ipad[2].replace(/_/g, '.');\n device.ipad = true;\n }\n if (ipod) {\n device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\n device.iphone = true;\n }\n // iOS 8+ changed UA\n if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\n if (device.osVersion.split('.')[0] === '10') {\n device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\n }\n }\n\n // Desktop\n device.desktop = !(device.os || device.android || device.webView);\n\n // Webview\n device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\n\n // Minimal UI\n if (device.os && device.os === 'ios') {\n var osVersionArr = device.osVersion.split('.');\n var metaViewport = doc.querySelector('meta[name=\"viewport\"]');\n device.minimalUi =\n !device.webView &&\n (ipod || iphone) &&\n (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) &&\n metaViewport && metaViewport.getAttribute('content').indexOf('minimal-ui') >= 0;\n }\n\n // Pixel Ratio\n device.pixelRatio = win.devicePixelRatio || 1;\n\n // Export object\n return device;\n}());\n\nvar onTouchStart = function (event) {\n var swiper = this;\n var data = swiper.touchEventsData;\n var params = swiper.params;\n var touches = swiper.touches;\n var e = event;\n if (e.originalEvent) { e = e.originalEvent; }\n data.isTouchEvent = e.type === 'touchstart';\n if (!data.isTouchEvent && 'which' in e && e.which === 3) { return; }\n if (data.isTouched && data.isMoved) { return; }\n if (params.noSwiping && $$1(e.target).closest((\".\" + (params.noSwipingClass)))[0]) {\n swiper.allowClick = true;\n return;\n }\n if (params.swipeHandler) {\n if (!$$1(e).closest(params.swipeHandler)[0]) { return; }\n }\n\n touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n var startX = touches.currentX;\n var startY = touches.currentY;\n\n // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore\n\n if (\n Device.ios &&\n !Device.cordova &&\n params.iOSEdgeSwipeDetection &&\n (startX <= params.iOSEdgeSwipeThreshold) &&\n (startX >= window.screen.width - params.iOSEdgeSwipeThreshold)\n ) {\n return;\n }\n\n Utils.extend(data, {\n isTouched: true,\n isMoved: false,\n allowTouchCallbacks: true,\n isScrolling: undefined,\n startMoving: undefined,\n });\n\n touches.startX = startX;\n touches.startY = startY;\n data.touchStartTime = Utils.now();\n swiper.allowClick = true;\n swiper.updateSize();\n swiper.swipeDirection = undefined;\n if (params.threshold > 0) { data.allowThresholdMove = false; }\n if (e.type !== 'touchstart') {\n var preventDefault = true;\n if ($$1(e.target).is(data.formElements)) { preventDefault = false; }\n if (doc.activeElement && $$1(doc.activeElement).is(data.formElements)) {\n doc.activeElement.blur();\n }\n if (preventDefault && swiper.allowTouchMove) {\n e.preventDefault();\n }\n }\n swiper.emit('touchStart', e);\n};\n\nvar onTouchMove = function (event) {\n var swiper = this;\n var data = swiper.touchEventsData;\n var params = swiper.params;\n var touches = swiper.touches;\n var rtl = swiper.rtl;\n var e = event;\n if (e.originalEvent) { e = e.originalEvent; }\n if (data.isTouchEvent && e.type === 'mousemove') { return; }\n var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n if (e.preventedByNestedSwiper) {\n touches.startX = pageX;\n touches.startY = pageY;\n return;\n }\n if (!swiper.allowTouchMove) {\n // isMoved = true;\n swiper.allowClick = false;\n if (data.isTouched) {\n Utils.extend(touches, {\n startX: pageX,\n startY: pageY,\n currentX: pageX,\n currentY: pageY,\n });\n data.touchStartTime = Utils.now();\n }\n return;\n }\n if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n if (swiper.isVertical()) {\n // Vertical\n if (\n (pageY < touches.startY && swiper.translate <= swiper.maxTranslate()) ||\n (pageY > touches.startY && swiper.translate >= swiper.minTranslate())\n ) {\n data.isTouched = false;\n data.isMoved = false;\n return;\n }\n } else if (\n (pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) ||\n (pageX > touches.startX && swiper.translate >= swiper.minTranslate())\n ) {\n return;\n }\n }\n if (data.isTouchEvent && doc.activeElement) {\n if (e.target === doc.activeElement && $$1(e.target).is(data.formElements)) {\n data.isMoved = true;\n swiper.allowClick = false;\n return;\n }\n }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchMove', e);\n }\n if (e.targetTouches && e.targetTouches.length > 1) { return; }\n\n touches.currentX = pageX;\n touches.currentY = pageY;\n\n var diffX = touches.currentX - touches.startX;\n var diffY = touches.currentY - touches.startY;\n\n if (typeof data.isScrolling === 'undefined') {\n var touchAngle;\n if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) {\n data.isScrolling = false;\n } else {\n // eslint-disable-next-line\n if ((diffX * diffX) + (diffY * diffY) >= 25) {\n touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;\n data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle);\n }\n }\n }\n if (data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n if (typeof startMoving === 'undefined') {\n if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n data.startMoving = true;\n }\n }\n if (!data.isTouched) { return; }\n if (data.isScrolling) {\n data.isTouched = false;\n return;\n }\n if (!data.startMoving) {\n return;\n }\n swiper.allowClick = false;\n e.preventDefault();\n if (params.touchMoveStopPropagation && !params.nested) {\n e.stopPropagation();\n }\n\n if (!data.isMoved) {\n if (params.loop) {\n swiper.loopFix();\n }\n data.startTranslate = swiper.getTranslate();\n swiper.setTransition(0);\n if (swiper.animating) {\n swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n }\n data.allowMomentumBounce = false;\n // Grab Cursor\n if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(true);\n }\n swiper.emit('sliderFirstMove', e);\n }\n swiper.emit('sliderMove', e);\n data.isMoved = true;\n\n var diff = swiper.isHorizontal() ? diffX : diffY;\n touches.diff = diff;\n\n diff *= params.touchRatio;\n if (rtl) { diff = -diff; }\n\n swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n data.currentTranslate = diff + data.startTranslate;\n\n var disableParentSwiper = true;\n var resistanceRatio = params.resistanceRatio;\n if (params.touchReleaseOnEdges) {\n resistanceRatio = 0;\n }\n if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) {\n disableParentSwiper = false;\n if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); }\n } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n disableParentSwiper = false;\n if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); }\n }\n\n if (disableParentSwiper) {\n e.preventedByNestedSwiper = true;\n }\n\n // Directions locks\n if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {\n data.currentTranslate = data.startTranslate;\n }\n if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {\n data.currentTranslate = data.startTranslate;\n }\n\n\n // Threshold\n if (params.threshold > 0) {\n if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n if (!data.allowThresholdMove) {\n data.allowThresholdMove = true;\n touches.startX = touches.currentX;\n touches.startY = touches.currentY;\n data.currentTranslate = data.startTranslate;\n touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;\n return;\n }\n } else {\n data.currentTranslate = data.startTranslate;\n return;\n }\n }\n\n if (!params.followFinger) { return; }\n\n // Update active index in free mode\n if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n if (params.freeMode) {\n // Velocity\n if (data.velocities.length === 0) {\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n time: data.touchStartTime,\n });\n }\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n time: Utils.now(),\n });\n }\n // Update progress\n swiper.updateProgress(data.currentTranslate);\n // Update translate\n swiper.setTranslate(data.currentTranslate);\n};\n\nvar onTouchEnd = function (event) {\n var swiper = this;\n var data = swiper.touchEventsData;\n\n var params = swiper.params;\n var touches = swiper.touches;\n var rtl = swiper.rtl;\n var $wrapperEl = swiper.$wrapperEl;\n var slidesGrid = swiper.slidesGrid;\n var snapGrid = swiper.snapGrid;\n var e = event;\n if (e.originalEvent) { e = e.originalEvent; }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchEnd', e);\n }\n data.allowTouchCallbacks = false;\n if (!data.isTouched) { return; }\n // Return Grab Cursor\n if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(false);\n }\n\n // Time diff\n var touchEndTime = Utils.now();\n var timeDiff = touchEndTime - data.touchStartTime;\n\n // Tap, doubleTap, Click\n if (swiper.allowClick) {\n swiper.updateClickedSlide(e);\n swiper.emit('tap', e);\n if (timeDiff < 300 && (touchEndTime - data.lastClickTime) > 300) {\n if (data.clickTimeout) { clearTimeout(data.clickTimeout); }\n data.clickTimeout = Utils.nextTick(function () {\n if (!swiper || swiper.destroyed) { return; }\n swiper.emit('click', e);\n }, 300);\n }\n if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) {\n if (data.clickTimeout) { clearTimeout(data.clickTimeout); }\n swiper.emit('doubleTap', e);\n }\n }\n\n data.lastClickTime = Utils.now();\n Utils.nextTick(function () {\n if (!swiper.destroyed) { swiper.allowClick = true; }\n });\n\n if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {\n data.isTouched = false;\n data.isMoved = false;\n return;\n }\n data.isTouched = false;\n data.isMoved = false;\n\n var currentPos;\n if (params.followFinger) {\n currentPos = rtl ? swiper.translate : -swiper.translate;\n } else {\n currentPos = -data.currentTranslate;\n }\n if (params.freeMode) {\n if (currentPos < -swiper.minTranslate()) {\n swiper.slideTo(swiper.activeIndex);\n return;\n } else if (currentPos > -swiper.maxTranslate()) {\n if (swiper.slides.length < snapGrid.length) {\n swiper.slideTo(snapGrid.length - 1);\n } else {\n swiper.slideTo(swiper.slides.length - 1);\n }\n return;\n }\n\n if (params.freeModeMomentum) {\n if (data.velocities.length > 1) {\n var lastMoveEvent = data.velocities.pop();\n var velocityEvent = data.velocities.pop();\n\n var distance = lastMoveEvent.position - velocityEvent.position;\n var time = lastMoveEvent.time - velocityEvent.time;\n swiper.velocity = distance / time;\n swiper.velocity /= 2;\n if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {\n swiper.velocity = 0;\n }\n // this implies that the user stopped moving a finger then released.\n // There would be no events with distance zero, so the last event is stale.\n if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) {\n swiper.velocity = 0;\n }\n } else {\n swiper.velocity = 0;\n }\n swiper.velocity *= params.freeModeMomentumVelocityRatio;\n\n data.velocities.length = 0;\n var momentumDuration = 1000 * params.freeModeMomentumRatio;\n var momentumDistance = swiper.velocity * momentumDuration;\n\n var newPosition = swiper.translate + momentumDistance;\n if (rtl) { newPosition = -newPosition; }\n var doBounce = false;\n var afterBouncePosition;\n var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;\n if (newPosition < swiper.maxTranslate()) {\n if (params.freeModeMomentumBounce) {\n if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n newPosition = swiper.maxTranslate() - bounceAmount;\n }\n afterBouncePosition = swiper.maxTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.maxTranslate();\n }\n } else if (newPosition > swiper.minTranslate()) {\n if (params.freeModeMomentumBounce) {\n if (newPosition - swiper.minTranslate() > bounceAmount) {\n newPosition = swiper.minTranslate() + bounceAmount;\n }\n afterBouncePosition = swiper.minTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.minTranslate();\n }\n } else if (params.freeModeSticky) {\n var nextSlide;\n for (var j = 0; j < snapGrid.length; j += 1) {\n if (snapGrid[j] > -newPosition) {\n nextSlide = j;\n break;\n }\n }\n if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {\n newPosition = snapGrid[nextSlide];\n } else {\n newPosition = snapGrid[nextSlide - 1];\n }\n newPosition = -newPosition;\n }\n // Fix duration\n if (swiper.velocity !== 0) {\n if (rtl) {\n momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n } else {\n momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n }\n } else if (params.freeModeSticky) {\n swiper.slideReset();\n return;\n }\n\n if (params.freeModeMomentumBounce && doBounce) {\n swiper.updateProgress(afterBouncePosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart();\n swiper.animating = true;\n $wrapperEl.transitionEnd(function () {\n if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; }\n swiper.emit('momentumBounce');\n\n swiper.setTransition(params.speed);\n swiper.setTranslate(afterBouncePosition);\n $wrapperEl.transitionEnd(function () {\n if (!swiper || swiper.destroyed) { return; }\n swiper.transitionEnd();\n });\n });\n } else if (swiper.velocity) {\n swiper.updateProgress(newPosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart();\n if (!swiper.animating) {\n swiper.animating = true;\n $wrapperEl.transitionEnd(function () {\n if (!swiper || swiper.destroyed) { return; }\n swiper.transitionEnd();\n });\n }\n } else {\n swiper.updateProgress(newPosition);\n }\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n return;\n }\n\n // Find current slide\n var stopIndex = 0;\n var groupSize = swiper.slidesSizesGrid[0];\n for (var i = 0; i < slidesGrid.length; i += params.slidesPerGroup) {\n if (typeof slidesGrid[i + params.slidesPerGroup] !== 'undefined') {\n if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + params.slidesPerGroup]) {\n stopIndex = i;\n groupSize = slidesGrid[i + params.slidesPerGroup] - slidesGrid[i];\n }\n } else if (currentPos >= slidesGrid[i]) {\n stopIndex = i;\n groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n }\n }\n\n // Find current slide size\n var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n\n if (timeDiff > params.longSwipesMs) {\n // Long touches\n if (!params.longSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + params.slidesPerGroup); }\n else { swiper.slideTo(stopIndex); }\n }\n if (swiper.swipeDirection === 'prev') {\n if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + params.slidesPerGroup); }\n else { swiper.slideTo(stopIndex); }\n }\n } else {\n // Short swipes\n if (!params.shortSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n swiper.slideTo(stopIndex + params.slidesPerGroup);\n }\n if (swiper.swipeDirection === 'prev') {\n swiper.slideTo(stopIndex);\n }\n }\n};\n\nvar onResize = function () {\n var swiper = this;\n\n var params = swiper.params;\n var el = swiper.el;\n\n if (el && el.offsetWidth === 0) { return; }\n\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Save locks\n var allowSlideNext = swiper.allowSlideNext;\n var allowSlidePrev = swiper.allowSlidePrev;\n\n // Disable locks on resize\n swiper.allowSlideNext = true;\n swiper.allowSlidePrev = true;\n\n swiper.updateSize();\n swiper.updateSlides();\n\n if (params.freeMode) {\n var newTranslate = Math.min(Math.max(swiper.translate, swiper.maxTranslate()), swiper.minTranslate());\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n swiper.updateSlidesClasses();\n if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {\n swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n }\n // Return locks after resize\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n};\n\nvar onClick = function (e) {\n var swiper = this;\n if (!swiper.allowClick) {\n if (swiper.params.preventClicks) { e.preventDefault(); }\n if (swiper.params.preventClicksPropagation && swiper.animating) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n }\n};\n\nfunction attachEvents() {\n var swiper = this;\n\n var params = swiper.params;\n var touchEvents = swiper.touchEvents;\n var el = swiper.el;\n var wrapperEl = swiper.wrapperEl;\n\n {\n swiper.onTouchStart = onTouchStart.bind(swiper);\n swiper.onTouchMove = onTouchMove.bind(swiper);\n swiper.onTouchEnd = onTouchEnd.bind(swiper);\n }\n\n swiper.onClick = onClick.bind(swiper);\n\n var target = params.touchEventsTarget === 'container' ? el : wrapperEl;\n var capture = !!params.nested;\n\n // Touch Events\n {\n if (Browser.ie) {\n target.addEventListener(touchEvents.start, swiper.onTouchStart, false);\n (Support.touch ? target : doc).addEventListener(touchEvents.move, swiper.onTouchMove, capture);\n (Support.touch ? target : doc).addEventListener(touchEvents.end, swiper.onTouchEnd, false);\n } else {\n if (Support.touch) {\n var passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n target.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);\n target.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture);\n target.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);\n }\n if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {\n target.addEventListener('mousedown', swiper.onTouchStart, false);\n doc.addEventListener('mousemove', swiper.onTouchMove, capture);\n doc.addEventListener('mouseup', swiper.onTouchEnd, false);\n }\n }\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n target.addEventListener('click', swiper.onClick, true);\n }\n }\n\n // Resize handler\n swiper.on('resize observerUpdate', onResize);\n}\n\nfunction detachEvents() {\n var swiper = this;\n\n var params = swiper.params;\n var touchEvents = swiper.touchEvents;\n var el = swiper.el;\n var wrapperEl = swiper.wrapperEl;\n\n var target = params.touchEventsTarget === 'container' ? el : wrapperEl;\n var capture = !!params.nested;\n\n // Touch Events\n {\n if (Browser.ie) {\n target.removeEventListener(touchEvents.start, swiper.onTouchStart, false);\n (Support.touch ? target : doc).removeEventListener(touchEvents.move, swiper.onTouchMove, capture);\n (Support.touch ? target : doc).removeEventListener(touchEvents.end, swiper.onTouchEnd, false);\n } else {\n if (Support.touch) {\n var passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n target.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);\n target.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);\n target.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);\n }\n if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {\n target.removeEventListener('mousedown', swiper.onTouchStart, false);\n doc.removeEventListener('mousemove', swiper.onTouchMove, capture);\n doc.removeEventListener('mouseup', swiper.onTouchEnd, false);\n }\n }\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n target.removeEventListener('click', swiper.onClick, true);\n }\n }\n\n // Resize handler\n swiper.off('resize observerUpdate', onResize);\n}\n\nvar events = {\n attachEvents: attachEvents,\n detachEvents: detachEvents,\n};\n\nvar setBreakpoint = function () {\n var swiper = this;\n var activeIndex = swiper.activeIndex;\n var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0;\n var params = swiper.params;\n var breakpoints = params.breakpoints;\n if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; }\n // Set breakpoint for window width and update parameters\n var breakpoint = swiper.getBreakpoint(breakpoints);\n if (breakpoint && swiper.currentBreakpoint !== breakpoint) {\n var breakPointsParams = breakpoint in breakpoints ? breakpoints[breakpoint] : swiper.originalParams;\n var needsReLoop = params.loop && (breakPointsParams.slidesPerView !== params.slidesPerView);\n\n Utils.extend(swiper.params, breakPointsParams);\n\n Utils.extend(swiper, {\n allowTouchMove: swiper.params.allowTouchMove,\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n });\n\n swiper.currentBreakpoint = breakpoint;\n\n if (needsReLoop) {\n swiper.loopDestroy();\n swiper.loopCreate();\n swiper.updateSlides();\n swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false);\n }\n swiper.emit('breakpoint', breakPointsParams);\n }\n};\n\nvar getBreakpoint = function (breakpoints) {\n // Get breakpoint for window width\n if (!breakpoints) { return undefined; }\n var breakpoint = false;\n var points = [];\n Object.keys(breakpoints).forEach(function (point) {\n points.push(point);\n });\n points.sort(function (a, b) { return parseInt(a, 10) - parseInt(b, 10); });\n for (var i = 0; i < points.length; i += 1) {\n var point = points[i];\n if (point >= win.innerWidth && !breakpoint) {\n breakpoint = point;\n }\n }\n return breakpoint || 'max';\n};\n\nvar breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint };\n\nvar addClasses = function () {\n var swiper = this;\n var classNames = swiper.classNames;\n var params = swiper.params;\n var rtl = swiper.rtl;\n var $el = swiper.$el;\n var suffixes = [];\n\n suffixes.push(params.direction);\n\n if (params.freeMode) {\n suffixes.push('free-mode');\n }\n if (!Support.flexbox) {\n suffixes.push('no-flexbox');\n }\n if (params.autoHeight) {\n suffixes.push('autoheight');\n }\n if (rtl) {\n suffixes.push('rtl');\n }\n if (params.slidesPerColumn > 1) {\n suffixes.push('multirow');\n }\n if (Device.android) {\n suffixes.push('android');\n }\n if (Device.ios) {\n suffixes.push('ios');\n }\n // WP8 Touch Events Fix\n if (win.navigator.pointerEnabled || win.navigator.msPointerEnabled) {\n suffixes.push((\"wp8-\" + (params.direction)));\n }\n\n suffixes.forEach(function (suffix) {\n classNames.push(params.containerModifierClass + suffix);\n });\n\n $el.addClass(classNames.join(' '));\n};\n\nvar removeClasses = function () {\n var swiper = this;\n var $el = swiper.$el;\n var classNames = swiper.classNames;\n\n $el.removeClass(classNames.join(' '));\n};\n\nvar classes = { addClasses: addClasses, removeClasses: removeClasses };\n\nvar loadImage = function (imageEl, src, srcset, sizes, checkForComplete, callback) {\n var image;\n function onReady() {\n if (callback) { callback(); }\n }\n if (!imageEl.complete || !checkForComplete) {\n if (src) {\n image = new win.Image();\n image.onload = onReady;\n image.onerror = onReady;\n if (sizes) {\n image.sizes = sizes;\n }\n if (srcset) {\n image.srcset = srcset;\n }\n if (src) {\n image.src = src;\n }\n } else {\n onReady();\n }\n } else {\n // image already loaded...\n onReady();\n }\n};\n\nvar preloadImages = function () {\n var swiper = this;\n swiper.imagesToLoad = swiper.$el.find('img');\n function onReady() {\n if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; }\n if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; }\n if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n if (swiper.params.updateOnImagesReady) { swiper.update(); }\n swiper.emit('imagesReady');\n }\n }\n for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {\n var imageEl = swiper.imagesToLoad[i];\n swiper.loadImage(\n imageEl,\n imageEl.currentSrc || imageEl.getAttribute('src'),\n imageEl.srcset || imageEl.getAttribute('srcset'),\n imageEl.sizes || imageEl.getAttribute('sizes'),\n true,\n onReady\n );\n }\n};\n\nvar images = {\n loadImage: loadImage,\n preloadImages: preloadImages,\n};\n\nvar defaults = {\n init: true,\n direction: 'horizontal',\n touchEventsTarget: 'container',\n initialSlide: 0,\n speed: 300,\n\n // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).\n iOSEdgeSwipeDetection: false,\n iOSEdgeSwipeThreshold: 20,\n\n // Free mode\n freeMode: false,\n freeModeMomentum: true,\n freeModeMomentumRatio: 1,\n freeModeMomentumBounce: true,\n freeModeMomentumBounceRatio: 1,\n freeModeMomentumVelocityRatio: 1,\n freeModeSticky: false,\n freeModeMinimumVelocity: 0.02,\n\n // Autoheight\n autoHeight: false,\n\n // Set wrapper width\n setWrapperSize: false,\n\n // Virtual Translate\n virtualTranslate: false,\n\n // Effects\n effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n // Breakpoints\n breakpoints: undefined,\n\n // Slides grid\n spaceBetween: 0,\n slidesPerView: 1,\n slidesPerColumn: 1,\n slidesPerColumnFill: 'column',\n slidesPerGroup: 1,\n centeredSlides: false,\n slidesOffsetBefore: 0, // in px\n slidesOffsetAfter: 0, // in px\n normalizeSlideIndex: true,\n\n // Round length\n roundLengths: false,\n\n // Touches\n touchRatio: 1,\n touchAngle: 45,\n simulateTouch: true,\n shortSwipes: true,\n longSwipes: true,\n longSwipesRatio: 0.5,\n longSwipesMs: 300,\n followFinger: true,\n allowTouchMove: true,\n threshold: 0,\n touchMoveStopPropagation: true,\n touchReleaseOnEdges: false,\n\n // Unique Navigation Elements\n uniqueNavElements: true,\n\n // Resistance\n resistance: true,\n resistanceRatio: 0.85,\n\n // Progress\n watchSlidesProgress: false,\n watchSlidesVisibility: false,\n\n // Cursor\n grabCursor: false,\n\n // Clicks\n preventClicks: true,\n preventClicksPropagation: true,\n slideToClickedSlide: false,\n\n // Images\n preloadImages: true,\n updateOnImagesReady: true,\n\n // loop\n loop: false,\n loopAdditionalSlides: 0,\n loopedSlides: null,\n loopFillGroupWithBlank: false,\n\n // Swiping/no swiping\n allowSlidePrev: true,\n allowSlideNext: true,\n swipeHandler: null, // '.swipe-handler',\n noSwiping: true,\n noSwipingClass: 'swiper-no-swiping',\n\n // Passive Listeners\n passiveListeners: true,\n\n // NS\n containerModifierClass: 'swiper-container-', // NEW\n slideClass: 'swiper-slide',\n slideBlankClass: 'swiper-slide-invisible-blank',\n slideActiveClass: 'swiper-slide-active',\n slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n slideVisibleClass: 'swiper-slide-visible',\n slideDuplicateClass: 'swiper-slide-duplicate',\n slideNextClass: 'swiper-slide-next',\n slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n slidePrevClass: 'swiper-slide-prev',\n slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n wrapperClass: 'swiper-wrapper',\n\n // Callbacks\n runCallbacksOnInit: true,\n};\n\nvar prototypes = {\n update: update,\n translate: translate,\n transition: transition$1,\n slide: slide,\n loop: loop,\n grabCursor: grabCursor,\n manipulation: manipulation,\n events: events,\n breakpoints: breakpoints,\n classes: classes,\n images: images,\n};\n\nvar extendedDefaults = {};\n\nvar Swiper$1 = (function (SwiperClass$$1) {\n function Swiper() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var el;\n var params;\n if (args.length === 1 && args[0].constructor && args[0].constructor === Object) {\n params = args[0];\n } else {\n var assign;\n (assign = args, el = assign[0], params = assign[1]);\n }\n if (!params) { params = {}; }\n\n params = Utils.extend({}, params);\n if (el && !params.el) { params.el = el; }\n\n SwiperClass$$1.call(this, params);\n\n Object.keys(prototypes).forEach(function (prototypeGroup) {\n Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {\n if (!Swiper.prototype[protoMethod]) {\n Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n }\n });\n });\n\n // Swiper Instance\n var swiper = this;\n if (typeof swiper.modules === 'undefined') {\n swiper.modules = {};\n }\n Object.keys(swiper.modules).forEach(function (moduleName) {\n var module = swiper.modules[moduleName];\n if (module.params) {\n var moduleParamName = Object.keys(module.params)[0];\n var moduleParams = module.params[moduleParamName];\n if (typeof moduleParams !== 'object') { return; }\n if (!(moduleParamName in params && 'enabled' in moduleParams)) { return; }\n if (params[moduleParamName] === true) {\n params[moduleParamName] = { enabled: true };\n }\n if (\n typeof params[moduleParamName] === 'object' &&\n !('enabled' in params[moduleParamName])\n ) {\n params[moduleParamName].enabled = true;\n }\n if (!params[moduleParamName]) { params[moduleParamName] = { enabled: false }; }\n }\n });\n\n // Extend defaults with modules params\n var swiperParams = Utils.extend({}, defaults);\n swiper.useModulesParams(swiperParams);\n\n // Extend defaults with passed params\n swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params);\n swiper.originalParams = Utils.extend({}, swiper.params);\n swiper.passedParams = Utils.extend({}, params);\n\n // Find el\n var $el = $$1(swiper.params.el);\n el = $el[0];\n\n if (!el) {\n return undefined;\n }\n\n if ($el.length > 1) {\n var swipers = [];\n $el.each(function (index, containerEl) {\n var newParams = Utils.extend({}, params, { el: containerEl });\n swipers.push(new Swiper(newParams));\n });\n return swipers;\n }\n\n el.swiper = swiper;\n $el.data('swiper', swiper);\n\n // Find Wrapper\n var $wrapperEl = $el.children((\".\" + (swiper.params.wrapperClass)));\n\n // Extend Swiper\n Utils.extend(swiper, {\n $el: $el,\n el: el,\n $wrapperEl: $wrapperEl,\n wrapperEl: $wrapperEl[0],\n\n // Classes\n classNames: [],\n\n // Slides\n slides: $$1(),\n slidesGrid: [],\n snapGrid: [],\n slidesSizesGrid: [],\n\n // isDirection\n isHorizontal: function isHorizontal() {\n return swiper.params.direction === 'horizontal';\n },\n isVertical: function isVertical() {\n return swiper.params.direction === 'vertical';\n },\n // RTL\n rtl: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n wrongRTL: $wrapperEl.css('display') === '-webkit-box',\n\n // Indexes\n activeIndex: 0,\n realIndex: 0,\n\n //\n isBeginning: true,\n isEnd: false,\n\n // Props\n translate: 0,\n progress: 0,\n velocity: 0,\n animating: false,\n\n // Locks\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n\n // Touch Events\n touchEvents: (function touchEvents() {\n var touch = ['touchstart', 'touchmove', 'touchend'];\n var desktop = ['mousedown', 'mousemove', 'mouseup'];\n if (win.navigator.pointerEnabled) {\n desktop = ['pointerdown', 'pointermove', 'pointerup'];\n } else if (win.navigator.msPointerEnabled) {\n desktop = ['MSPointerDown', 'MsPointerMove', 'MsPointerUp'];\n }\n\n return {\n start: Support.touch || !swiper.params.simulateTouch ? touch[0] : desktop[0],\n move: Support.touch || !swiper.params.simulateTouch ? touch[1] : desktop[1],\n end: Support.touch || !swiper.params.simulateTouch ? touch[2] : desktop[2],\n };\n }()),\n touchEventsData: {\n isTouched: undefined,\n isMoved: undefined,\n allowTouchCallbacks: undefined,\n touchStartTime: undefined,\n isScrolling: undefined,\n currentTranslate: undefined,\n startTranslate: undefined,\n allowThresholdMove: undefined,\n // Form elements to match\n formElements: 'input, select, option, textarea, button, video',\n // Last click time\n lastClickTime: Utils.now(),\n clickTimeout: undefined,\n // Velocities\n velocities: [],\n allowMomentumBounce: undefined,\n isTouchEvent: undefined,\n startMoving: undefined,\n },\n\n // Clicks\n allowClick: true,\n\n // Touches\n allowTouchMove: swiper.params.allowTouchMove,\n\n touches: {\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n diff: 0,\n },\n\n // Images\n imagesToLoad: [],\n imagesLoaded: 0,\n\n });\n\n // Install Modules\n swiper.useModules();\n\n // Init\n if (swiper.params.init) {\n swiper.init();\n }\n\n // Return app instance\n return swiper;\n }\n\n if ( SwiperClass$$1 ) Swiper.__proto__ = SwiperClass$$1;\n Swiper.prototype = Object.create( SwiperClass$$1 && SwiperClass$$1.prototype );\n Swiper.prototype.constructor = Swiper;\n\n var staticAccessors = { extendedDefaults: {},defaults: {},Class: {},$: {} };\n Swiper.prototype.slidesPerViewDynamic = function slidesPerViewDynamic () {\n var swiper = this;\n var params = swiper.params;\n var slides = swiper.slides;\n var slidesGrid = swiper.slidesGrid;\n var swiperSize = swiper.size;\n var activeIndex = swiper.activeIndex;\n var spv = 1;\n if (params.centeredSlides) {\n var slideSize = slides[activeIndex].swiperSlideSize;\n var breakLoop;\n for (var i = activeIndex + 1; i < slides.length; i += 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) { breakLoop = true; }\n }\n }\n for (var i$1 = activeIndex - 1; i$1 >= 0; i$1 -= 1) {\n if (slides[i$1] && !breakLoop) {\n slideSize += slides[i$1].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) { breakLoop = true; }\n }\n }\n } else {\n for (var i$2 = activeIndex + 1; i$2 < slides.length; i$2 += 1) {\n if (slidesGrid[i$2] - slidesGrid[activeIndex] < swiperSize) {\n spv += 1;\n }\n }\n }\n return spv;\n };\n Swiper.prototype.update = function update$$1 () {\n var swiper = this;\n if (!swiper || swiper.destroyed) { return; }\n swiper.updateSize();\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n\n var newTranslate;\n function setTranslate() {\n newTranslate = Math.min(Math.max(swiper.translate, swiper.maxTranslate()), swiper.minTranslate());\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n var translated;\n if (swiper.params.freeMode) {\n setTranslate();\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {\n translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n if (!translated) {\n setTranslate();\n }\n }\n swiper.emit('update');\n };\n Swiper.prototype.init = function init () {\n var swiper = this;\n if (swiper.initialized) { return; }\n\n swiper.emit('beforeInit');\n\n // Set breakpoint\n if (swiper.params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Add Classes\n swiper.addClasses();\n\n // Create loop\n if (swiper.params.loop) {\n swiper.loopCreate();\n }\n\n // Update size\n swiper.updateSize();\n\n // Update slides\n swiper.updateSlides();\n\n // Set Grab Cursor\n if (swiper.params.grabCursor) {\n swiper.setGrabCursor();\n }\n\n if (swiper.params.preloadImages) {\n swiper.preloadImages();\n }\n\n // Slide To Initial Slide\n if (swiper.params.loop) {\n swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit);\n } else {\n swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit);\n }\n\n // Attach events\n swiper.attachEvents();\n\n // Init Flag\n swiper.initialized = true;\n\n // Emit\n swiper.emit('init');\n };\n Swiper.prototype.destroy = function destroy (deleteInstance, cleanStyles) {\n if ( deleteInstance === void 0 ) deleteInstance = true;\n if ( cleanStyles === void 0 ) cleanStyles = true;\n\n var swiper = this;\n var params = swiper.params;\n var $el = swiper.$el;\n var $wrapperEl = swiper.$wrapperEl;\n var slides = swiper.slides;\n swiper.emit('beforeDestroy');\n\n // Init Flag\n swiper.initialized = false;\n\n // Detach events\n swiper.detachEvents();\n\n // Destroy loop\n if (params.loop) {\n swiper.loopDestroy();\n }\n\n // Cleanup styles\n if (cleanStyles) {\n swiper.removeClasses();\n $el.removeAttr('style');\n $wrapperEl.removeAttr('style');\n if (slides && slides.length) {\n slides\n .removeClass([\n params.slideVisibleClass,\n params.slideActiveClass,\n params.slideNextClass,\n params.slidePrevClass ].join(' '))\n .removeAttr('style')\n .removeAttr('data-swiper-slide-index')\n .removeAttr('data-swiper-column')\n .removeAttr('data-swiper-row');\n }\n }\n\n swiper.emit('destroy');\n\n // Detach emitter events\n Object.keys(swiper.eventsListeners).forEach(function (eventName) {\n swiper.off(eventName);\n });\n\n if (deleteInstance !== false) {\n swiper.$el[0].swiper = null;\n swiper.$el.data('swiper', null);\n Utils.deleteProps(swiper);\n }\n swiper.destroyed = true;\n };\n Swiper.extendDefaults = function extendDefaults (newDefaults) {\n Utils.extend(extendedDefaults, newDefaults);\n };\n staticAccessors.extendedDefaults.get = function () {\n return extendedDefaults;\n };\n staticAccessors.defaults.get = function () {\n return defaults;\n };\n staticAccessors.Class.get = function () {\n return SwiperClass$$1;\n };\n staticAccessors.$.get = function () {\n return $$1;\n };\n\n Object.defineProperties( Swiper, staticAccessors );\n\n return Swiper;\n}(SwiperClass));\n\nvar Device$2 = {\n name: 'device',\n proto: {\n device: Device,\n },\n static: {\n device: Device,\n },\n};\n\nvar Support$2 = {\n name: 'support',\n proto: {\n support: Support,\n },\n static: {\n support: Support,\n },\n};\n\nvar Browser$2 = {\n name: 'browser',\n proto: {\n browser: Browser,\n },\n static: {\n browser: Browser,\n },\n};\n\nvar Resize = {\n name: 'resize',\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n resize: {\n resizeHandler: function resizeHandler() {\n if (!swiper || swiper.destroyed || !swiper.initialized) { return; }\n swiper.emit('beforeResize');\n swiper.emit('resize');\n },\n orientationChangeHandler: function orientationChangeHandler() {\n if (!swiper || swiper.destroyed || !swiper.initialized) { return; }\n swiper.emit('orientationchange');\n },\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n // Emit resize\n win.addEventListener('resize', swiper.resize.resizeHandler);\n\n // Emit orientationchange\n win.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);\n },\n destroy: function destroy() {\n var swiper = this;\n win.removeEventListener('resize', swiper.resize.resizeHandler);\n win.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);\n },\n },\n};\n\nvar Observer = {\n func: win.MutationObserver || win.WebkitMutationObserver,\n attach: function attach(target, options) {\n if ( options === void 0 ) options = {};\n\n var swiper = this;\n\n var ObserverFunc = Observer.func;\n var observer = new ObserverFunc(function (mutations) {\n mutations.forEach(function (mutation) {\n swiper.emit('observerUpdate', mutation);\n });\n });\n\n observer.observe(target, {\n attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n childList: typeof options.childList === 'undefined' ? true : options.childList,\n characterData: typeof options.characterData === 'undefined' ? true : options.characterData,\n });\n\n swiper.observer.observers.push(observer);\n },\n init: function init() {\n var swiper = this;\n if (!Support.observer || !swiper.params.observer) { return; }\n if (swiper.params.observeParents) {\n var containerParents = swiper.$el.parents();\n for (var i = 0; i < containerParents.length; i += 1) {\n swiper.observer.attach(containerParents[i]);\n }\n }\n // Observe container\n swiper.observer.attach(swiper.$el[0], { childList: false });\n\n // Observe wrapper\n swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false });\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.observer.observers.forEach(function (observer) {\n observer.disconnect();\n });\n swiper.observer.observers = [];\n },\n};\n\nvar Observer$1 = {\n name: 'observer',\n params: {\n observer: false,\n observeParents: false,\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n observer: {\n init: Observer.init.bind(swiper),\n attach: Observer.attach.bind(swiper),\n destroy: Observer.destroy.bind(swiper),\n observers: [],\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n swiper.observer.init();\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.observer.destroy();\n },\n },\n};\n\nvar Virtual = {\n update: function update(force) {\n var swiper = this;\n var ref = swiper.params;\n var slidesPerView = ref.slidesPerView;\n var slidesPerGroup = ref.slidesPerGroup;\n var centeredSlides = ref.centeredSlides;\n var ref$1 = swiper.virtual;\n var previousFrom = ref$1.from;\n var previousTo = ref$1.to;\n var slides = ref$1.slides;\n var previousSlidesGrid = ref$1.slidesGrid;\n var renderSlide = ref$1.renderSlide;\n var previousOffset = ref$1.offset;\n swiper.updateActiveIndex();\n var activeIndex = swiper.activeIndex || 0;\n\n var offsetProp;\n if (swiper.rtl && swiper.isHorizontal()) { offsetProp = 'right'; }\n else { offsetProp = swiper.isHorizontal() ? 'left' : 'top'; }\n\n var slidesAfter;\n var slidesBefore;\n if (centeredSlides) {\n slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup;\n slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup;\n } else {\n slidesAfter = slidesPerView + (slidesPerGroup - 1);\n slidesBefore = slidesPerGroup;\n }\n var from = Math.max((activeIndex || 0) - slidesBefore, 0);\n var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);\n var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n\n Utils.extend(swiper.virtual, {\n from: from,\n to: to,\n offset: offset,\n slidesGrid: swiper.slidesGrid,\n });\n\n function onRendered() {\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n if (swiper.lazy && swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n }\n\n if (previousFrom === from && previousTo === to && !force) {\n if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n swiper.slides.css(offsetProp, (offset + \"px\"));\n }\n swiper.updateProgress();\n return;\n }\n if (swiper.params.virtual.renderExternal) {\n swiper.params.virtual.renderExternal.call(swiper, {\n offset: offset,\n from: from,\n to: to,\n slides: (function getSlides() {\n var slidesToRender = [];\n for (var i = from; i <= to; i += 1) {\n slidesToRender.push(slides[i]);\n }\n return slidesToRender;\n }()),\n });\n onRendered();\n return;\n }\n var prependIndexes = [];\n var appendIndexes = [];\n if (force) {\n swiper.$wrapperEl.find((\".\" + (swiper.params.slideClass))).remove();\n } else {\n for (var i = previousFrom; i <= previousTo; i += 1) {\n if (i < from || i > to) {\n swiper.$wrapperEl.find((\".\" + (swiper.params.slideClass) + \"[data-swiper-slide-index=\\\"\" + i + \"\\\"]\")).remove();\n }\n }\n }\n for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {\n if (i$1 >= from && i$1 <= to) {\n if (typeof previousTo === 'undefined' || force) {\n appendIndexes.push(i$1);\n } else {\n if (i$1 > previousTo) { appendIndexes.push(i$1); }\n if (i$1 < previousFrom) { prependIndexes.push(i$1); }\n }\n }\n }\n appendIndexes.forEach(function (index) {\n swiper.$wrapperEl.append(renderSlide(slides[index], index));\n });\n prependIndexes.sort(function (a, b) { return a < b; }).forEach(function (index) {\n swiper.$wrapperEl.prepend(renderSlide(slides[index], index));\n });\n swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, (offset + \"px\"));\n onRendered();\n },\n renderSlide: function renderSlide(slide, index) {\n var swiper = this;\n var params = swiper.params.virtual;\n if (params.cache && swiper.virtual.cache[index]) {\n return swiper.virtual.cache[index];\n }\n var $slideEl = params.renderSlide\n ? $$1(params.renderSlide.call(swiper, slide, index))\n : $$1((\"
      \" + slide + \"
      \"));\n if (!$slideEl.attr('data-swiper-slide-index')) { $slideEl.attr('data-swiper-slide-index', index); }\n if (params.cache) { swiper.virtual.cache[index] = $slideEl; }\n return $slideEl;\n },\n appendSlide: function appendSlide(slide) {\n var swiper = this;\n swiper.virtual.slides.push(slide);\n swiper.virtual.update(true);\n },\n prependSlide: function prependSlide(slide) {\n var swiper = this;\n swiper.virtual.slides.unshift(slide);\n if (swiper.params.virtual.cache) {\n var cache = swiper.virtual.cache;\n var newCache = {};\n Object.keys(cache).forEach(function (cachedIndex) {\n newCache[cachedIndex + 1] = cache[cachedIndex];\n });\n swiper.virtual.cache = newCache;\n }\n swiper.virtual.update(true);\n swiper.slideNext(0);\n },\n};\n\nvar Virtual$1 = {\n name: 'virtual',\n params: {\n virtual: {\n enabled: false,\n slides: [],\n cache: true,\n renderSlide: null,\n renderExternal: null,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n virtual: {\n update: Virtual.update.bind(swiper),\n appendSlide: Virtual.appendSlide.bind(swiper),\n prependSlide: Virtual.prependSlide.bind(swiper),\n renderSlide: Virtual.renderSlide.bind(swiper),\n slides: swiper.params.virtual.slides,\n cache: {},\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (!swiper.params.virtual.enabled) { return; }\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"virtual\"));\n var overwriteParams = {\n watchSlidesProgress: true,\n };\n Utils.extend(swiper.params, overwriteParams);\n Utils.extend(swiper.originalParams, overwriteParams);\n\n swiper.virtual.update();\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (!swiper.params.virtual.enabled) { return; }\n swiper.virtual.update();\n },\n },\n};\n\nvar Keyboard = {\n handle: function handle(event) {\n var swiper = this;\n var e = event;\n if (e.originalEvent) { e = e.originalEvent; } // jquery fix\n var kc = e.keyCode || e.charCode;\n // Directions locks\n if (!swiper.allowSlideNext && ((swiper.isHorizontal() && kc === 39) || (swiper.isVertical() && kc === 40))) {\n return false;\n }\n if (!swiper.allowSlidePrev && ((swiper.isHorizontal() && kc === 37) || (swiper.isVertical() && kc === 38))) {\n return false;\n }\n if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n return undefined;\n }\n if (doc.activeElement && doc.activeElement.nodeName && (doc.activeElement.nodeName.toLowerCase() === 'input' || doc.activeElement.nodeName.toLowerCase() === 'textarea')) {\n return undefined;\n }\n if (kc === 37 || kc === 39 || kc === 38 || kc === 40) {\n var inView = false;\n // Check that swiper should be inside of visible area of window\n if (swiper.$el.parents((\".\" + (swiper.params.slideClass))).length > 0 && swiper.$el.parents((\".\" + (swiper.params.slideActiveClass))).length === 0) {\n return undefined;\n }\n var windowScroll = {\n left: win.pageXOffset,\n top: win.pageYOffset,\n };\n var windowWidth = win.innerWidth;\n var windowHeight = win.innerHeight;\n var swiperOffset = swiper.$el.offset();\n if (swiper.rtl) { swiperOffset.left -= swiper.$el[0].scrollLeft; }\n var swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiper.width, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiper.height],\n [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height] ];\n for (var i = 0; i < swiperCoord.length; i += 1) {\n var point = swiperCoord[i];\n if (\n point[0] >= windowScroll.left && point[0] <= windowScroll.left + windowWidth &&\n point[1] >= windowScroll.top && point[1] <= windowScroll.top + windowHeight\n ) {\n inView = true;\n }\n }\n if (!inView) { return undefined; }\n }\n if (swiper.isHorizontal()) {\n if (kc === 37 || kc === 39) {\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n }\n if ((kc === 39 && !swiper.rtl) || (kc === 37 && swiper.rtl)) { swiper.slideNext(); }\n if ((kc === 37 && !swiper.rtl) || (kc === 39 && swiper.rtl)) { swiper.slidePrev(); }\n } else {\n if (kc === 38 || kc === 40) {\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n }\n if (kc === 40) { swiper.slideNext(); }\n if (kc === 38) { swiper.slidePrev(); }\n }\n swiper.emit('keyPress', kc);\n return undefined;\n },\n enable: function enable() {\n var swiper = this;\n if (swiper.keyboard.enabled) { return; }\n $$1(doc).on('keydown', swiper.keyboard.handle);\n swiper.keyboard.enabled = true;\n },\n disable: function disable() {\n var swiper = this;\n if (!swiper.keyboard.enabled) { return; }\n $$1(doc).off('keydown', swiper.keyboard.handle);\n swiper.keyboard.enabled = false;\n },\n};\n\nvar Keyboard$1 = {\n name: 'keyboard',\n params: {\n keyboard: {\n enabled: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n keyboard: {\n enabled: false,\n enable: Keyboard.enable.bind(swiper),\n disable: Keyboard.disable.bind(swiper),\n handle: Keyboard.handle.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.keyboard.enabled) {\n swiper.keyboard.enable();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.keyboard.enabled) {\n swiper.keyboard.disable();\n }\n },\n },\n};\n\nfunction isEventSupported() {\n var eventName = 'onwheel';\n var isSupported = eventName in doc;\n\n if (!isSupported) {\n var element = doc.createElement('div');\n element.setAttribute(eventName, 'return;');\n isSupported = typeof element[eventName] === 'function';\n }\n\n if (!isSupported &&\n doc.implementation &&\n doc.implementation.hasFeature &&\n // always returns true in newer browsers as per the standard.\n // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature\n doc.implementation.hasFeature('', '') !== true\n ) {\n // This is the only way to test support for the `wheel` event in IE9+.\n isSupported = doc.implementation.hasFeature('Events.wheel', '3.0');\n }\n\n return isSupported;\n}\nvar Mousewheel = {\n lastScrollTime: Utils.now(),\n event: (function getEvent() {\n if (win.navigator.userAgent.indexOf('firefox') > -1) { return 'DOMMouseScroll'; }\n return isEventSupported() ? 'wheel' : 'mousewheel';\n }()),\n normalize: function normalize(e) {\n // Reasonable defaults\n var PIXEL_STEP = 10;\n var LINE_HEIGHT = 40;\n var PAGE_HEIGHT = 800;\n\n var sX = 0;\n var sY = 0; // spinX, spinY\n var pX = 0;\n var pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in e) {\n sY = e.detail;\n }\n if ('wheelDelta' in e) {\n sY = -e.wheelDelta / 120;\n }\n if ('wheelDeltaY' in e) {\n sY = -e.wheelDeltaY / 120;\n }\n if ('wheelDeltaX' in e) {\n sX = -e.wheelDeltaX / 120;\n }\n\n // side scrolling on FF with DOMMouseScroll\n if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in e) {\n pY = e.deltaY;\n }\n if ('deltaX' in e) {\n pX = e.deltaX;\n }\n\n if ((pX || pY) && e.deltaMode) {\n if (e.deltaMode === 1) { // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else { // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) {\n sX = (pX < 1) ? -1 : 1;\n }\n if (pY && !sY) {\n sY = (pY < 1) ? -1 : 1;\n }\n\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY,\n };\n },\n handle: function handle(event) {\n var e = event;\n var swiper = this;\n var params = swiper.params.mousewheel;\n if (e.originalEvent) { e = e.originalEvent; } // jquery fix\n var delta = 0;\n var rtlFactor = swiper.rtl ? -1 : 1;\n\n var data = Mousewheel.normalize(e);\n\n if (params.forceToAxis) {\n if (swiper.isHorizontal()) {\n if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) { delta = data.pixelX * rtlFactor; }\n else { return true; }\n } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) { delta = data.pixelY; }\n else { return true; }\n } else {\n delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n }\n\n if (delta === 0) { return true; }\n\n if (params.invert) { delta = -delta; }\n\n if (!swiper.params.freeMode) {\n if (Utils.now() - swiper.mousewheel.lastScrollTime > 60) {\n if (delta < 0) {\n if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n swiper.slideNext();\n swiper.emit('scroll', e);\n } else if (params.releaseOnEdges) { return true; }\n } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n swiper.slidePrev();\n swiper.emit('scroll', e);\n } else if (params.releaseOnEdges) { return true; }\n }\n swiper.mousewheel.lastScrollTime = (new win.Date()).getTime();\n } else {\n // Freemode or scrollContainer:\n var position = swiper.getTranslate() + (delta * params.sensitivity);\n var wasBeginning = swiper.isBeginning;\n var wasEnd = swiper.isEnd;\n\n if (position >= swiper.minTranslate()) { position = swiper.minTranslate(); }\n if (position <= swiper.maxTranslate()) { position = swiper.maxTranslate(); }\n\n swiper.setTransition(0);\n swiper.setTranslate(position);\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {\n swiper.updateSlidesClasses();\n }\n\n if (swiper.params.freeModeSticky) {\n clearTimeout(swiper.mousewheel.timeout);\n swiper.mousewheel.timeout = Utils.nextTick(function () {\n swiper.slideReset();\n }, 300);\n }\n // Emit event\n swiper.emit('scroll', e);\n\n // Stop autoplay\n if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) { swiper.stopAutoplay(); }\n\n // Return page scroll on edge positions\n if (position === 0 || position === swiper.maxTranslate()) { return true; }\n }\n\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n return false;\n },\n enable: function enable() {\n var swiper = this;\n if (!Mousewheel.event) { return false; }\n if (swiper.mousewheel.enabled) { return false; }\n var target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarged !== 'container') {\n target = $$1(swiper.params.mousewheel.eventsTarged);\n }\n target.on(Mousewheel.event, swiper.mousewheel.handle);\n swiper.mousewheel.enabled = true;\n return true;\n },\n disable: function disable() {\n var swiper = this;\n if (!Mousewheel.event) { return false; }\n if (!swiper.mousewheel.enabled) { return false; }\n var target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarged !== 'container') {\n target = $$1(swiper.params.mousewheel.eventsTarged);\n }\n target.off(Mousewheel.event, swiper.mousewheel.handle);\n swiper.mousewheel.enabled = false;\n return true;\n },\n};\n\nvar Mousewheel$1 = {\n name: 'mousewheel',\n params: {\n mousewheel: {\n enabled: false,\n releaseOnEdges: false,\n invert: false,\n forceToAxis: false,\n sensitivity: 1,\n eventsTarged: 'container',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n mousewheel: {\n enabled: false,\n enable: Mousewheel.enable.bind(swiper),\n disable: Mousewheel.disable.bind(swiper),\n handle: Mousewheel.handle.bind(swiper),\n lastScrollTime: Utils.now(),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.mousewheel.enabled) { swiper.mousewheel.enable(); }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.mousewheel.enabled) { swiper.mousewheel.disable(); }\n },\n },\n};\n\nvar Navigation = {\n update: function update() {\n // Update Navigation Buttons\n var swiper = this;\n var params = swiper.params.navigation;\n\n if (swiper.params.loop) { return; }\n var ref = swiper.navigation;\n var $nextEl = ref.$nextEl;\n var $prevEl = ref.$prevEl;\n\n if ($prevEl && $prevEl.length > 0) {\n if (swiper.isBeginning) {\n $prevEl.addClass(params.disabledClass);\n } else {\n $prevEl.removeClass(params.disabledClass);\n }\n }\n if ($nextEl && $nextEl.length > 0) {\n if (swiper.isEnd) {\n $nextEl.addClass(params.disabledClass);\n } else {\n $nextEl.removeClass(params.disabledClass);\n }\n }\n },\n init: function init() {\n var swiper = this;\n var params = swiper.params.navigation;\n if (!(params.nextEl || params.prevEl)) { return; }\n\n var $nextEl;\n var $prevEl;\n if (params.nextEl) {\n $nextEl = $$1(params.nextEl);\n if (\n swiper.params.uniqueNavElements &&\n typeof params.nextEl === 'string' &&\n $nextEl.length > 1 &&\n swiper.$el.find(params.nextEl).length === 1\n ) {\n $nextEl = swiper.$el.find(params.nextEl);\n }\n }\n if (params.prevEl) {\n $prevEl = $$1(params.prevEl);\n if (\n swiper.params.uniqueNavElements &&\n typeof params.prevEl === 'string' &&\n $prevEl.length > 1 &&\n swiper.$el.find(params.prevEl).length === 1\n ) {\n $prevEl = swiper.$el.find(params.prevEl);\n }\n }\n\n if ($nextEl && $nextEl.length > 0) {\n $nextEl.on('click', function (e) {\n e.preventDefault();\n if (swiper.isEnd && !swiper.params.loop) { return; }\n swiper.slideNext();\n });\n }\n if ($prevEl && $prevEl.length > 0) {\n $prevEl.on('click', function (e) {\n e.preventDefault();\n if (swiper.isBeginning && !swiper.params.loop) { return; }\n swiper.slidePrev();\n });\n }\n\n Utils.extend(swiper.navigation, {\n $nextEl: $nextEl,\n nextEl: $nextEl && $nextEl[0],\n $prevEl: $prevEl,\n prevEl: $prevEl && $prevEl[0],\n });\n },\n destroy: function destroy() {\n var swiper = this;\n var ref = swiper.navigation;\n var $nextEl = ref.$nextEl;\n var $prevEl = ref.$prevEl;\n if ($nextEl && $nextEl.length) {\n $nextEl.off('click');\n $nextEl.removeClass(swiper.params.navigation.disabledClass);\n }\n if ($prevEl && $prevEl.length) {\n $prevEl.off('click');\n $prevEl.removeClass(swiper.params.navigation.disabledClass);\n }\n },\n};\n\nvar Navigation$1 = {\n name: 'navigation',\n params: {\n navigation: {\n nextEl: null,\n prevEl: null,\n\n hideOnClick: false,\n disabledClass: 'swiper-button-disabled',\n hiddenClass: 'swiper-button-hidden',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n navigation: {\n init: Navigation.init.bind(swiper),\n update: Navigation.update.bind(swiper),\n destroy: Navigation.destroy.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n swiper.navigation.init();\n swiper.navigation.update();\n },\n toEdge: function toEdge() {\n var swiper = this;\n swiper.navigation.update();\n },\n fromEdge: function fromEdge() {\n var swiper = this;\n swiper.navigation.update();\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.navigation.destroy();\n },\n click: function click(e) {\n var swiper = this;\n var ref = swiper.navigation;\n var $nextEl = ref.$nextEl;\n var $prevEl = ref.$prevEl;\n if (\n swiper.params.navigation.hideOnClick &&\n !$$1(e.target).is($prevEl) &&\n !$$1(e.target).is($nextEl)\n ) {\n if ($nextEl) { $nextEl.toggleClass(swiper.params.navigation.hiddenClass); }\n if ($prevEl) { $prevEl.toggleClass(swiper.params.navigation.hiddenClass); }\n }\n },\n },\n};\n\nvar Pagination = {\n update: function update() {\n // Render || Update Pagination bullets/items\n var swiper = this;\n var rtl = swiper.rtl;\n var params = swiper.params.pagination;\n if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }\n var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n var $el = swiper.pagination.$el;\n // Current/Total\n var current;\n var total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n if (swiper.params.loop) {\n current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);\n if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) {\n current -= (slidesLength - (swiper.loopedSlides * 2));\n }\n if (current > total - 1) { current -= total; }\n if (current < 0 && swiper.params.paginationType !== 'bullets') { current = total + current; }\n } else if (typeof swiper.snapIndex !== 'undefined') {\n current = swiper.snapIndex;\n } else {\n current = swiper.activeIndex || 0;\n }\n // Types\n if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {\n var bullets = swiper.pagination.bullets;\n if (params.dynamicBullets) {\n swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n $el.css(swiper.isHorizontal() ? 'width' : 'height', ((swiper.pagination.bulletSize * 5) + \"px\"));\n }\n bullets.removeClass(((params.bulletActiveClass) + \" \" + (params.bulletActiveClass) + \"-next \" + (params.bulletActiveClass) + \"-next-next \" + (params.bulletActiveClass) + \"-prev \" + (params.bulletActiveClass) + \"-prev-prev\"));\n if ($el.length > 1) {\n bullets.each(function (index, bullet) {\n var $bullet = $$1(bullet);\n if ($bullet.index() === current) {\n $bullet.addClass(params.bulletActiveClass);\n if (params.dynamicBullets) {\n $bullet\n .prev()\n .addClass(((params.bulletActiveClass) + \"-prev\"))\n .prev()\n .addClass(((params.bulletActiveClass) + \"-prev-prev\"));\n $bullet\n .next()\n .addClass(((params.bulletActiveClass) + \"-next\"))\n .next()\n .addClass(((params.bulletActiveClass) + \"-next-next\"));\n }\n }\n });\n } else {\n var $bullet = bullets.eq(current);\n $bullet.addClass(params.bulletActiveClass);\n if (params.dynamicBullets) {\n $bullet\n .prev()\n .addClass(((params.bulletActiveClass) + \"-prev\"))\n .prev()\n .addClass(((params.bulletActiveClass) + \"-prev-prev\"));\n $bullet\n .next()\n .addClass(((params.bulletActiveClass) + \"-next\"))\n .next()\n .addClass(((params.bulletActiveClass) + \"-next-next\"));\n }\n }\n if (params.dynamicBullets) {\n var dynamicBulletsLength = Math.min(bullets.length, 5);\n var bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (current * swiper.pagination.bulletSize);\n var offsetProp = rtl ? 'right' : 'left';\n bullets.css(swiper.isHorizontal() ? offsetProp : 'top', (bulletsOffset + \"px\"));\n }\n }\n if (params.type === 'fraction') {\n $el.find((\".\" + (params.currentClass))).text(current + 1);\n $el.find((\".\" + (params.totalClass))).text(total);\n }\n if (params.type === 'progressbar') {\n var scale = (current + 1) / total;\n var scaleX = scale;\n var scaleY = 1;\n if (!swiper.isHorizontal()) {\n scaleY = scale;\n scaleX = 1;\n }\n $el.find((\".\" + (params.progressbarFillClass))).transform((\"translate3d(0,0,0) scaleX(\" + scaleX + \") scaleY(\" + scaleY + \")\")).transition(swiper.params.speed);\n }\n if (params.type === 'custom' && params.renderCustom) {\n $el.html(params.renderCustom(swiper, current + 1, total));\n swiper.emit('paginationRender', swiper, $el[0]);\n } else {\n swiper.emit('paginationUpdate', swiper, $el[0]);\n }\n },\n render: function render() {\n // Render Container\n var swiper = this;\n var params = swiper.params.pagination;\n if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }\n var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n\n var $el = swiper.pagination.$el;\n var paginationHTML = '';\n if (params.type === 'bullets') {\n var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n for (var i = 0; i < numberOfBullets; i += 1) {\n if (params.renderBullet) {\n paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n } else {\n paginationHTML += \"<\" + (params.bulletElement) + \" class=\\\"\" + (params.bulletClass) + \"\\\">\";\n }\n }\n $el.html(paginationHTML);\n swiper.pagination.bullets = $el.find((\".\" + (params.bulletClass)));\n }\n if (params.type === 'fraction') {\n if (params.renderFraction) {\n paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n } else {\n paginationHTML =\n \"\" +\n ' / ' +\n \"\";\n }\n $el.html(paginationHTML);\n }\n if (params.type === 'progressbar') {\n if (params.renderProgressbar) {\n paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n } else {\n paginationHTML = \"\";\n }\n $el.html(paginationHTML);\n }\n if (params.type !== 'custom') {\n swiper.emit('paginationRender', swiper.pagination.$el[0]);\n }\n },\n init: function init() {\n var swiper = this;\n var params = swiper.params.pagination;\n if (!params.el) { return; }\n\n var $el = $$1(params.el);\n if ($el.length === 0) { return; }\n\n if (\n swiper.params.uniqueNavElements &&\n typeof params.el === 'string' &&\n $el.length > 1 &&\n swiper.$el.find(params.el).length === 1\n ) {\n $el = swiper.$el.find(params.el);\n }\n\n if (params.type === 'bullets' && params.clickable) {\n $el.addClass(params.clickableClass);\n }\n\n $el.addClass(params.modifierClass + params.type);\n\n if (params.type === 'bullets' && params.dynamicBullets) {\n $el.addClass((\"\" + (params.modifierClass) + (params.type) + \"-dynamic\"));\n }\n\n if (params.clickable) {\n $el.on('click', (\".\" + (params.bulletClass)), function onClick(e) {\n e.preventDefault();\n var index = $$1(this).index() * swiper.params.slidesPerGroup;\n if (swiper.params.loop) { index += swiper.loopedSlides; }\n swiper.slideTo(index);\n });\n }\n\n Utils.extend(swiper.pagination, {\n $el: $el,\n el: $el[0],\n });\n },\n destroy: function destroy() {\n var swiper = this;\n var params = swiper.params.pagination;\n if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }\n var $el = swiper.pagination.$el;\n\n $el.removeClass(params.hiddenClass);\n $el.removeClass(params.modifierClass + params.type);\n if (swiper.pagination.bullets) { swiper.pagination.bullets.removeClass(params.bulletActiveClass); }\n if (params.clickable) {\n $el.off('click', (\".\" + (params.bulletClass)));\n }\n },\n};\n\nvar Pagination$1 = {\n name: 'pagination',\n params: {\n pagination: {\n el: null,\n bulletElement: 'span',\n clickable: false,\n hideOnClick: false,\n renderBullet: null,\n renderProgressbar: null,\n renderFraction: null,\n renderCustom: null,\n type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n dynamicBullets: false,\n\n bulletClass: 'swiper-pagination-bullet',\n bulletActiveClass: 'swiper-pagination-bullet-active',\n modifierClass: 'swiper-pagination-', // NEW\n currentClass: 'swiper-pagination-current',\n totalClass: 'swiper-pagination-total',\n hiddenClass: 'swiper-pagination-hidden',\n progressbarFillClass: 'swiper-pagination-progressbar-fill',\n clickableClass: 'swiper-pagination-clickable', // NEW\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n pagination: {\n init: Pagination.init.bind(swiper),\n render: Pagination.render.bind(swiper),\n update: Pagination.update.bind(swiper),\n destroy: Pagination.destroy.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n swiper.pagination.init();\n swiper.pagination.render();\n swiper.pagination.update();\n },\n activeIndexChange: function activeIndexChange() {\n var swiper = this;\n if (swiper.params.loop) {\n swiper.pagination.update();\n } else if (typeof swiper.snapIndex === 'undefined') {\n swiper.pagination.update();\n }\n },\n snapIndexChange: function snapIndexChange() {\n var swiper = this;\n if (!swiper.params.loop) {\n swiper.pagination.update();\n }\n },\n slidesLengthChange: function slidesLengthChange() {\n var swiper = this;\n if (swiper.params.loop) {\n swiper.pagination.render();\n swiper.pagination.update();\n }\n },\n snapGridLengthChange: function snapGridLengthChange() {\n var swiper = this;\n if (!swiper.params.loop) {\n swiper.pagination.render();\n swiper.pagination.update();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.pagination.destroy();\n },\n click: function click(e) {\n var swiper = this;\n if (\n swiper.params.pagination.el &&\n swiper.params.pagination.hideOnClick &&\n swiper.pagination.$el.length > 0 &&\n !$$1(e.target).hasClass(swiper.params.pagination.bulletClass)\n ) {\n swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);\n }\n },\n },\n};\n\nvar Scrollbar = {\n setTranslate: function setTranslate() {\n var swiper = this;\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }\n var scrollbar = swiper.scrollbar;\n var rtl = swiper.rtl;\n var progress = swiper.progress;\n var dragSize = scrollbar.dragSize;\n var trackSize = scrollbar.trackSize;\n var $dragEl = scrollbar.$dragEl;\n var $el = scrollbar.$el;\n var params = swiper.params.scrollbar;\n\n var newSize = dragSize;\n var newPos = (trackSize - dragSize) * progress;\n if (rtl && swiper.isHorizontal()) {\n newPos = -newPos;\n if (newPos > 0) {\n newSize = dragSize - newPos;\n newPos = 0;\n } else if (-newPos + dragSize > trackSize) {\n newSize = trackSize + newPos;\n }\n } else if (newPos < 0) {\n newSize = dragSize + newPos;\n newPos = 0;\n } else if (newPos + dragSize > trackSize) {\n newSize = trackSize - newPos;\n }\n if (swiper.isHorizontal()) {\n if (Support.transforms3d) {\n $dragEl.transform((\"translate3d(\" + newPos + \"px, 0, 0)\"));\n } else {\n $dragEl.transform((\"translateX(\" + newPos + \"px)\"));\n }\n $dragEl[0].style.width = newSize + \"px\";\n } else {\n if (Support.transforms3d) {\n $dragEl.transform((\"translate3d(0px, \" + newPos + \"px, 0)\"));\n } else {\n $dragEl.transform((\"translateY(\" + newPos + \"px)\"));\n }\n $dragEl[0].style.height = newSize + \"px\";\n }\n if (params.hide) {\n clearTimeout(swiper.scrollbar.timeout);\n $el[0].style.opacity = 1;\n swiper.scrollbar.timeout = setTimeout(function () {\n $el[0].style.opacity = 0;\n $el.transition(400);\n }, 1000);\n }\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }\n swiper.scrollbar.$dragEl.transition(duration);\n },\n updateSize: function updateSize() {\n var swiper = this;\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }\n\n var scrollbar = swiper.scrollbar;\n var $dragEl = scrollbar.$dragEl;\n var $el = scrollbar.$el;\n\n $dragEl[0].style.width = '';\n $dragEl[0].style.height = '';\n var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n\n var divider = swiper.size / swiper.virtualSize;\n var moveDivider = divider * (trackSize / swiper.size);\n var dragSize;\n if (swiper.params.scrollbar.dragSize === 'auto') {\n dragSize = trackSize * divider;\n } else {\n dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n }\n\n if (swiper.isHorizontal()) {\n $dragEl[0].style.width = dragSize + \"px\";\n } else {\n $dragEl[0].style.height = dragSize + \"px\";\n }\n\n if (divider >= 1) {\n $el[0].style.display = 'none';\n } else {\n $el[0].style.display = '';\n }\n if (swiper.params.scrollbarHide) {\n $el[0].style.opacity = 0;\n }\n Utils.extend(scrollbar, {\n trackSize: trackSize,\n divider: divider,\n moveDivider: moveDivider,\n dragSize: dragSize,\n });\n },\n setDragPosition: function setDragPosition(e) {\n var swiper = this;\n var scrollbar = swiper.scrollbar;\n var $el = scrollbar.$el;\n var dragSize = scrollbar.dragSize;\n var trackSize = scrollbar.trackSize;\n\n var pointerPosition;\n if (swiper.isHorizontal()) {\n pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX);\n } else {\n pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY);\n }\n var positionRatio;\n positionRatio = ((pointerPosition) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragSize / 2)) / (trackSize - dragSize);\n positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n if (swiper.rtl) {\n positionRatio = 1 - positionRatio;\n }\n\n var position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio);\n\n swiper.updateProgress(position);\n swiper.setTranslate(position);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n },\n onDragStart: function onDragStart(e) {\n var swiper = this;\n var params = swiper.params.scrollbar;\n var scrollbar = swiper.scrollbar;\n var $wrapperEl = swiper.$wrapperEl;\n var $el = scrollbar.$el;\n var $dragEl = scrollbar.$dragEl;\n swiper.scrollbar.isTouched = true;\n e.preventDefault();\n e.stopPropagation();\n\n $wrapperEl.transition(100);\n $dragEl.transition(100);\n scrollbar.setDragPosition(e);\n\n clearTimeout(swiper.scrollbar.dragTimeout);\n\n $el.transition(0);\n if (params.hide) {\n $el.css('opacity', 1);\n }\n swiper.emit('scrollbarDragStart', e);\n },\n onDragMove: function onDragMove(e) {\n var swiper = this;\n var scrollbar = swiper.scrollbar;\n var $wrapperEl = swiper.$wrapperEl;\n var $el = scrollbar.$el;\n var $dragEl = scrollbar.$dragEl;\n\n if (!swiper.scrollbar.isTouched) { return; }\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n scrollbar.setDragPosition(e);\n $wrapperEl.transition(0);\n $el.transition(0);\n $dragEl.transition(0);\n swiper.emit('scrollbarDragMove', e);\n },\n onDragEnd: function onDragEnd(e) {\n var swiper = this;\n\n var params = swiper.params.scrollbar;\n var scrollbar = swiper.scrollbar;\n var $el = scrollbar.$el;\n\n if (!swiper.scrollbar.isTouched) { return; }\n swiper.scrollbar.isTouched = false;\n if (params.hide) {\n clearTimeout(swiper.scrollbar.dragTimeout);\n swiper.scrollbar.dragTimeout = Utils.nextTick(function () {\n $el.css('opacity', 0);\n $el.transition(400);\n }, 1000);\n }\n swiper.emit('scrollbarDragEnd', e);\n if (params.snapOnRelease) {\n swiper.slideReset();\n }\n },\n enableDraggable: function enableDraggable() {\n var swiper = this;\n if (!swiper.params.scrollbar.el) { return; }\n var scrollbar = swiper.scrollbar;\n var $el = scrollbar.$el;\n var target = Support.touch ? $el[0] : document;\n $el.on(swiper.scrollbar.dragEvents.start, swiper.scrollbar.onDragStart);\n $$1(target).on(swiper.scrollbar.dragEvents.move, swiper.scrollbar.onDragMove);\n $$1(target).on(swiper.scrollbar.dragEvents.end, swiper.scrollbar.onDragEnd);\n },\n disableDraggable: function disableDraggable() {\n var swiper = this;\n if (!swiper.params.scrollbar.el) { return; }\n var scrollbar = swiper.scrollbar;\n var $el = scrollbar.$el;\n var target = Support.touch ? $el[0] : document;\n $el.off(swiper.scrollbar.dragEvents.start);\n $$1(target).off(swiper.scrollbar.dragEvents.move);\n $$1(target).off(swiper.scrollbar.dragEvents.end);\n },\n init: function init() {\n var swiper = this;\n if (!swiper.params.scrollbar.el) { return; }\n var scrollbar = swiper.scrollbar;\n var $swiperEl = swiper.$el;\n var touchEvents = swiper.touchEvents;\n var params = swiper.params.scrollbar;\n\n var $el = $$1(params.el);\n if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {\n $el = $swiperEl.find(params.el);\n }\n\n var $dragEl = $el.find('.swiper-scrollbar-drag');\n if ($dragEl.length === 0) {\n $dragEl = $$1('
      ');\n $el.append($dragEl);\n }\n\n swiper.scrollbar.dragEvents = (function dragEvents() {\n if ((swiper.params.simulateTouch === false && !Support.touch)) {\n return {\n start: 'mousedown',\n move: 'mousemove',\n end: 'mouseup',\n };\n }\n return touchEvents;\n }());\n\n Utils.extend(scrollbar, {\n $el: $el,\n el: $el[0],\n $dragEl: $dragEl,\n dragEl: $dragEl[0],\n });\n\n if (params.draggable) {\n scrollbar.enableDraggable();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.scrollbar.disableDraggable();\n },\n};\n\nvar Scrollbar$1 = {\n name: 'scrollbar',\n params: {\n scrollbar: {\n el: null,\n dragSize: 'auto',\n hide: false,\n draggable: false,\n snapOnRelease: true,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n scrollbar: {\n init: Scrollbar.init.bind(swiper),\n destroy: Scrollbar.destroy.bind(swiper),\n updateSize: Scrollbar.updateSize.bind(swiper),\n setTranslate: Scrollbar.setTranslate.bind(swiper),\n setTransition: Scrollbar.setTransition.bind(swiper),\n enableDraggable: Scrollbar.enableDraggable.bind(swiper),\n disableDraggable: Scrollbar.disableDraggable.bind(swiper),\n setDragPosition: Scrollbar.setDragPosition.bind(swiper),\n onDragStart: Scrollbar.onDragStart.bind(swiper),\n onDragMove: Scrollbar.onDragMove.bind(swiper),\n onDragEnd: Scrollbar.onDragEnd.bind(swiper),\n isTouched: false,\n timeout: null,\n dragTimeout: null,\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n swiper.scrollbar.init();\n swiper.scrollbar.updateSize();\n swiper.scrollbar.setTranslate();\n },\n update: function update() {\n var swiper = this;\n swiper.scrollbar.updateSize();\n },\n resize: function resize() {\n var swiper = this;\n swiper.scrollbar.updateSize();\n },\n observerUpdate: function observerUpdate() {\n var swiper = this;\n swiper.scrollbar.updateSize();\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n swiper.scrollbar.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n swiper.scrollbar.setTransition(duration);\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.scrollbar.destroy();\n },\n },\n};\n\nvar Parallax = {\n setTransform: function setTransform(el, progress) {\n var swiper = this;\n var rtl = swiper.rtl;\n\n var $el = $$1(el);\n var rtlFactor = rtl ? -1 : 1;\n\n var p = $el.attr('data-swiper-parallax') || '0';\n var x = $el.attr('data-swiper-parallax-x');\n var y = $el.attr('data-swiper-parallax-y');\n var scale = $el.attr('data-swiper-parallax-scale');\n var opacity = $el.attr('data-swiper-parallax-opacity');\n\n if (x || y) {\n x = x || '0';\n y = y || '0';\n } else if (swiper.isHorizontal()) {\n x = p;\n y = '0';\n } else {\n y = p;\n x = '0';\n }\n\n if ((x).indexOf('%') >= 0) {\n x = (parseInt(x, 10) * progress * rtlFactor) + \"%\";\n } else {\n x = (x * progress * rtlFactor) + \"px\";\n }\n if ((y).indexOf('%') >= 0) {\n y = (parseInt(y, 10) * progress) + \"%\";\n } else {\n y = (y * progress) + \"px\";\n }\n\n if (typeof opacity !== 'undefined' && opacity !== null) {\n var currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress)));\n $el[0].style.opacity = currentOpacity;\n }\n if (typeof scale === 'undefined' || scale === null) {\n $el.transform((\"translate3d(\" + x + \", \" + y + \", 0px)\"));\n } else {\n var currentScale = scale - ((scale - 1) * (1 - Math.abs(progress)));\n $el.transform((\"translate3d(\" + x + \", \" + y + \", 0px) scale(\" + currentScale + \")\"));\n }\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n var $el = swiper.$el;\n var slides = swiper.slides;\n var progress = swiper.progress;\n var snapGrid = swiper.snapGrid;\n $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')\n .each(function (index, el) {\n swiper.parallax.setTransform(el, progress);\n });\n slides.each(function (slideIndex, slideEl) {\n var slideProgress = slideEl.progress;\n if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1));\n }\n slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n $$1(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')\n .each(function (index, el) {\n swiper.parallax.setTransform(el, slideProgress);\n });\n });\n },\n setTransition: function setTransition(duration) {\n if ( duration === void 0 ) duration = this.params.speed;\n\n var swiper = this;\n var $el = swiper.$el;\n $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')\n .each(function (index, parallaxEl) {\n var $parallaxEl = $$1(parallaxEl);\n var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;\n if (duration === 0) { parallaxDuration = 0; }\n $parallaxEl.transition(parallaxDuration);\n });\n },\n};\n\nvar Parallax$1 = {\n name: 'parallax',\n params: {\n parallax: {\n enabled: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n parallax: {\n setTransform: Parallax.setTransform.bind(swiper),\n setTranslate: Parallax.setTranslate.bind(swiper),\n setTransition: Parallax.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n swiper.params.watchSlidesProgress = true;\n },\n init: function init() {\n var swiper = this;\n if (!swiper.params.parallax) { return; }\n swiper.parallax.setTranslate();\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (!swiper.params.parallax) { return; }\n swiper.parallax.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (!swiper.params.parallax) { return; }\n swiper.parallax.setTransition(duration);\n },\n },\n};\n\nvar Zoom = {\n // Calc Scale From Multi-touches\n getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {\n if (e.targetTouches.length < 2) { return 1; }\n var x1 = e.targetTouches[0].pageX;\n var y1 = e.targetTouches[0].pageY;\n var x2 = e.targetTouches[1].pageX;\n var y2 = e.targetTouches[1].pageY;\n var distance = Math.sqrt((Math.pow( (x2 - x1), 2 )) + (Math.pow( (y2 - y1), 2 )));\n return distance;\n },\n // Events\n onGestureStart: function onGestureStart(e) {\n var swiper = this;\n var params = swiper.params.zoom;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n zoom.fakeGestureTouched = false;\n zoom.fakeGestureMoved = false;\n if (!Support.gestures) {\n if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {\n return;\n }\n zoom.fakeGestureTouched = true;\n gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);\n }\n if (!gesture.$slideEl || !gesture.$slideEl.length) {\n gesture.$slideEl = $$1(this);\n if (gesture.$slideEl.length === 0) { gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); }\n gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');\n gesture.$imageWrapEl = gesture.$imageEl.parent((\".\" + (params.containerClass)));\n gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (gesture.$imageWrapEl.length === 0) {\n gesture.$imageEl = undefined;\n return;\n }\n }\n gesture.$imageEl.transition(0);\n swiper.zoom.isScaling = true;\n },\n onGestureChange: function onGestureChange(e) {\n var swiper = this;\n var params = swiper.params.zoom;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n if (!Support.gestures) {\n if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {\n return;\n }\n zoom.fakeGestureMoved = true;\n gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n if (Support.gestures) {\n swiper.zoom.scale = e.scale * zoom.currentScale;\n } else {\n zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale;\n }\n if (zoom.scale > gesture.maxRatio) {\n zoom.scale = (gesture.maxRatio - 1) + (Math.pow( ((zoom.scale - gesture.maxRatio) + 1), 0.5 ));\n }\n if (zoom.scale < params.minRatio) {\n zoom.scale = (params.minRatio + 1) - (Math.pow( ((params.minRatio - zoom.scale) + 1), 0.5 ));\n }\n gesture.$imageEl.transform((\"translate3d(0,0,0) scale(\" + (zoom.scale) + \")\"));\n },\n onGestureEnd: function onGestureEnd(e) {\n var swiper = this;\n var params = swiper.params.zoom;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n if (!Support.gestures) {\n if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {\n return;\n }\n if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) {\n return;\n }\n zoom.fakeGestureTouched = false;\n zoom.fakeGestureMoved = false;\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n gesture.$imageEl.transition(swiper.params.speed).transform((\"translate3d(0,0,0) scale(\" + (zoom.scale) + \")\"));\n zoom.currentScale = zoom.scale;\n zoom.isScaling = false;\n if (zoom.scale === 1) { gesture.$slideEl = undefined; }\n },\n onTouchStart: function onTouchStart(e) {\n var swiper = this;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n var image = zoom.image;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n if (image.isTouched) { return; }\n if (Device.android) { e.preventDefault(); }\n image.isTouched = true;\n image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n },\n onTouchMove: function onTouchMove(e) {\n var swiper = this;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n var image = zoom.image;\n var velocity = zoom.velocity;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n swiper.allowClick = false;\n if (!image.isTouched || !gesture.$slideEl) { return; }\n\n if (!image.isMoved) {\n image.width = gesture.$imageEl[0].offsetWidth;\n image.height = gesture.$imageEl[0].offsetHeight;\n image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0;\n image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0;\n gesture.slideWidth = gesture.$slideEl[0].offsetWidth;\n gesture.slideHeight = gesture.$slideEl[0].offsetHeight;\n gesture.$imageWrapEl.transition(0);\n if (swiper.rtl) { image.startX = -image.startX; }\n if (swiper.rtl) { image.startY = -image.startY; }\n }\n // Define if we need image drag\n var scaledWidth = image.width * zoom.scale;\n var scaledHeight = image.height * zoom.scale;\n\n if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) { return; }\n\n image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);\n image.maxX = -image.minX;\n image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);\n image.maxY = -image.minY;\n\n image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n\n if (!image.isMoved && !zoom.isScaling) {\n if (\n swiper.isHorizontal() &&\n (\n (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x) ||\n (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)\n )\n ) {\n image.isTouched = false;\n return;\n } else if (\n !swiper.isHorizontal() &&\n (\n (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y) ||\n (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)\n )\n ) {\n image.isTouched = false;\n return;\n }\n }\n e.preventDefault();\n e.stopPropagation();\n\n image.isMoved = true;\n image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX;\n image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY;\n\n if (image.currentX < image.minX) {\n image.currentX = (image.minX + 1) - (Math.pow( ((image.minX - image.currentX) + 1), 0.8 ));\n }\n if (image.currentX > image.maxX) {\n image.currentX = (image.maxX - 1) + (Math.pow( ((image.currentX - image.maxX) + 1), 0.8 ));\n }\n\n if (image.currentY < image.minY) {\n image.currentY = (image.minY + 1) - (Math.pow( ((image.minY - image.currentY) + 1), 0.8 ));\n }\n if (image.currentY > image.maxY) {\n image.currentY = (image.maxY - 1) + (Math.pow( ((image.currentY - image.maxY) + 1), 0.8 ));\n }\n\n // Velocity\n if (!velocity.prevPositionX) { velocity.prevPositionX = image.touchesCurrent.x; }\n if (!velocity.prevPositionY) { velocity.prevPositionY = image.touchesCurrent.y; }\n if (!velocity.prevTime) { velocity.prevTime = Date.now(); }\n velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) { velocity.x = 0; }\n if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) { velocity.y = 0; }\n velocity.prevPositionX = image.touchesCurrent.x;\n velocity.prevPositionY = image.touchesCurrent.y;\n velocity.prevTime = Date.now();\n\n gesture.$imageWrapEl.transform((\"translate3d(\" + (image.currentX) + \"px, \" + (image.currentY) + \"px,0)\"));\n },\n onTouchEnd: function onTouchEnd() {\n var swiper = this;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n var image = zoom.image;\n var velocity = zoom.velocity;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n if (!image.isTouched || !image.isMoved) {\n image.isTouched = false;\n image.isMoved = false;\n return;\n }\n image.isTouched = false;\n image.isMoved = false;\n var momentumDurationX = 300;\n var momentumDurationY = 300;\n var momentumDistanceX = velocity.x * momentumDurationX;\n var newPositionX = image.currentX + momentumDistanceX;\n var momentumDistanceY = velocity.y * momentumDurationY;\n var newPositionY = image.currentY + momentumDistanceY;\n\n // Fix duration\n if (velocity.x !== 0) { momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); }\n if (velocity.y !== 0) { momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); }\n var momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n\n image.currentX = newPositionX;\n image.currentY = newPositionY;\n\n // Define if we need image drag\n var scaledWidth = image.width * zoom.scale;\n var scaledHeight = image.height * zoom.scale;\n image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);\n image.maxX = -image.minX;\n image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);\n image.maxY = -image.minY;\n image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n\n gesture.$imageWrapEl.transition(momentumDuration).transform((\"translate3d(\" + (image.currentX) + \"px, \" + (image.currentY) + \"px,0)\"));\n },\n onTransitionEnd: function onTransitionEnd() {\n var swiper = this;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {\n gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');\n gesture.$imageWrapEl.transform('translate3d(0,0,0)');\n gesture.$slideEl = undefined;\n gesture.$imageEl = undefined;\n gesture.$imageWrapEl = undefined;\n\n zoom.scale = 1;\n zoom.currentScale = 1;\n }\n },\n // Toggle Zoom\n toggle: function toggle(e) {\n var swiper = this;\n var zoom = swiper.zoom;\n\n if (zoom.scale && zoom.scale !== 1) {\n // Zoom Out\n zoom.out();\n } else {\n // Zoom In\n zoom.in(e);\n }\n },\n in: function in$1(e) {\n var swiper = this;\n\n var zoom = swiper.zoom;\n var params = swiper.params.zoom;\n var gesture = zoom.gesture;\n var image = zoom.image;\n\n if (!gesture.$slideEl) {\n gesture.$slideEl = swiper.clickedSlide ? $$1(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);\n gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');\n gesture.$imageWrapEl = gesture.$imageEl.parent((\".\" + (params.containerClass)));\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n\n gesture.$slideEl.addClass((\"\" + (params.zoomedSlideClass)));\n\n var touchX;\n var touchY;\n var offsetX;\n var offsetY;\n var diffX;\n var diffY;\n var translateX;\n var translateY;\n var imageWidth;\n var imageHeight;\n var scaledWidth;\n var scaledHeight;\n var translateMinX;\n var translateMinY;\n var translateMaxX;\n var translateMaxY;\n var slideWidth;\n var slideHeight;\n\n if (typeof image.touchesStart.x === 'undefined' && e) {\n touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n } else {\n touchX = image.touchesStart.x;\n touchY = image.touchesStart.y;\n }\n\n zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (e) {\n slideWidth = gesture.$slideEl[0].offsetWidth;\n slideHeight = gesture.$slideEl[0].offsetHeight;\n offsetX = gesture.$slideEl.offset().left;\n offsetY = gesture.$slideEl.offset().top;\n diffX = (offsetX + (slideWidth / 2)) - touchX;\n diffY = (offsetY + (slideHeight / 2)) - touchY;\n\n imageWidth = gesture.$imageEl[0].offsetWidth;\n imageHeight = gesture.$imageEl[0].offsetHeight;\n scaledWidth = imageWidth * zoom.scale;\n scaledHeight = imageHeight * zoom.scale;\n\n translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0);\n translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0);\n translateMaxX = -translateMinX;\n translateMaxY = -translateMinY;\n\n translateX = diffX * zoom.scale;\n translateY = diffY * zoom.scale;\n\n if (translateX < translateMinX) {\n translateX = translateMinX;\n }\n if (translateX > translateMaxX) {\n translateX = translateMaxX;\n }\n\n if (translateY < translateMinY) {\n translateY = translateMinY;\n }\n if (translateY > translateMaxY) {\n translateY = translateMaxY;\n }\n } else {\n translateX = 0;\n translateY = 0;\n }\n gesture.$imageWrapEl.transition(300).transform((\"translate3d(\" + translateX + \"px, \" + translateY + \"px,0)\"));\n gesture.$imageEl.transition(300).transform((\"translate3d(0,0,0) scale(\" + (zoom.scale) + \")\"));\n },\n out: function out() {\n var swiper = this;\n\n var zoom = swiper.zoom;\n var params = swiper.params.zoom;\n var gesture = zoom.gesture;\n\n if (!gesture.$slideEl) {\n gesture.$slideEl = swiper.clickedSlide ? $$1(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);\n gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');\n gesture.$imageWrapEl = gesture.$imageEl.parent((\".\" + (params.containerClass)));\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n\n zoom.scale = 1;\n zoom.currentScale = 1;\n gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');\n gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');\n gesture.$slideEl.removeClass((\"\" + (params.zoomedSlideClass)));\n gesture.$slideEl = undefined;\n },\n // Attach/Detach Events\n enable: function enable() {\n var swiper = this;\n var zoom = swiper.zoom;\n if (zoom.enabled) { return; }\n zoom.enabled = true;\n\n var slides = swiper.slides;\n\n var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;\n\n // Scale image\n if (Support.gestures) {\n slides.on('gesturestart', zoom.onGestureStart, passiveListener);\n slides.on('gesturechange', zoom.onGestureChange, passiveListener);\n slides.on('gestureend', zoom.onGestureEnd, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n slides.on(swiper.touchEvents.start, zoom.onGestureStart, passiveListener);\n slides.on(swiper.touchEvents.move, zoom.onGestureChange, passiveListener);\n slides.on(swiper.touchEvents.end, zoom.onGestureEnd, passiveListener);\n }\n\n // Move image\n swiper.slides.each(function (index, slideEl) {\n var $slideEl = $$1(slideEl);\n if ($slideEl.find((\".\" + (swiper.params.zoom.containerClass))).length > 0) {\n $slideEl.on(swiper.touchEvents.move, zoom.onTouchMove);\n }\n });\n },\n disable: function disable() {\n var swiper = this;\n var zoom = swiper.zoom;\n if (!zoom.enabled) { return; }\n\n swiper.zoom.enabled = false;\n\n var slides = swiper.slides;\n\n var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;\n\n // Scale image\n if (Support.gestures) {\n slides.off('gesturestart', zoom.onGestureStart, passiveListener);\n slides.off('gesturechange', zoom.onGestureChange, passiveListener);\n slides.off('gestureend', zoom.onGestureEnd, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n slides.off(swiper.touchEvents.start, zoom.onGestureStart, passiveListener);\n slides.off(swiper.touchEvents.move, zoom.onGestureChange, passiveListener);\n slides.off(swiper.touchEvents.end, zoom.onGestureEnd, passiveListener);\n }\n\n // Move image\n swiper.slides.each(function (index, slideEl) {\n var $slideEl = $$1(slideEl);\n if ($slideEl.find((\".\" + (swiper.params.zoom.containerClass))).length > 0) {\n $slideEl.off(swiper.touchEvents.move, zoom.onTouchMove);\n }\n });\n },\n};\n\nvar Zoom$1 = {\n name: 'zoom',\n params: {\n zoom: {\n enabled: false,\n maxRatio: 3,\n minRatio: 1,\n toggle: true,\n containerClass: 'swiper-zoom-container',\n zoomedSlideClass: 'swiper-slide-zoomed',\n },\n },\n create: function create() {\n var swiper = this;\n var zoom = {\n enabled: false,\n scale: 1,\n currentScale: 1,\n isScaling: false,\n gesture: {\n $slideEl: undefined,\n slideWidth: undefined,\n slideHeight: undefined,\n $imageEl: undefined,\n $imageWrapEl: undefined,\n maxRatio: 3,\n },\n image: {\n isTouched: undefined,\n isMoved: undefined,\n currentX: undefined,\n currentY: undefined,\n minX: undefined,\n minY: undefined,\n maxX: undefined,\n maxY: undefined,\n width: undefined,\n height: undefined,\n startX: undefined,\n startY: undefined,\n touchesStart: {},\n touchesCurrent: {},\n },\n velocity: {\n x: undefined,\n y: undefined,\n prevPositionX: undefined,\n prevPositionY: undefined,\n prevTime: undefined,\n },\n };\n ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName) {\n zoom[methodName] = Zoom[methodName].bind(swiper);\n });\n Utils.extend(swiper, {\n zoom: zoom,\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.zoom.enabled) {\n swiper.zoom.enable();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.zoom.disable();\n },\n touchStart: function touchStart(e) {\n var swiper = this;\n if (!swiper.zoom.enabled) { return; }\n swiper.zoom.onTouchStart(e);\n },\n touchEnd: function touchEnd(e) {\n var swiper = this;\n if (!swiper.zoom.enabled) { return; }\n swiper.zoom.onTouchEnd(e);\n },\n doubleTap: function doubleTap(e) {\n var swiper = this;\n if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {\n swiper.zoom.toggle(e);\n }\n },\n transitionEnd: function transitionEnd() {\n var swiper = this;\n if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n swiper.zoom.onTransitionEnd();\n }\n },\n },\n};\n\nvar Lazy = {\n loadInSlide: function loadInSlide(index, loadInDuplicate) {\n if ( loadInDuplicate === void 0 ) loadInDuplicate = true;\n\n var swiper = this;\n var params = swiper.params.lazy;\n if (typeof index === 'undefined') { return; }\n if (swiper.slides.length === 0) { return; }\n var isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n var $slideEl = isVirtual\n ? swiper.$wrapperEl.children((\".\" + (swiper.params.slideClass) + \"[data-swiper-slide-index=\\\"\" + index + \"\\\"]\"))\n : swiper.slides.eq(index);\n\n var $images = $slideEl.find((\".\" + (params.elementClass) + \":not(.\" + (params.loadedClass) + \"):not(.\" + (params.loadingClass) + \")\"));\n if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {\n $images = $images.add($slideEl[0]);\n }\n if ($images.length === 0) { return; }\n\n $images.each(function (imageIndex, imageEl) {\n var $imageEl = $$1(imageEl);\n $imageEl.addClass(params.loadingClass);\n\n var background = $imageEl.attr('data-background');\n var src = $imageEl.attr('data-src');\n var srcset = $imageEl.attr('data-srcset');\n var sizes = $imageEl.attr('data-sizes');\n\n swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, function () {\n if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) { return; }\n if (background) {\n $imageEl.css('background-image', (\"url(\\\"\" + background + \"\\\")\"));\n $imageEl.removeAttr('data-background');\n } else {\n if (srcset) {\n $imageEl.attr('srcset', srcset);\n $imageEl.removeAttr('data-srcset');\n }\n if (sizes) {\n $imageEl.attr('sizes', sizes);\n $imageEl.removeAttr('data-sizes');\n }\n if (src) {\n $imageEl.attr('src', src);\n $imageEl.removeAttr('data-src');\n }\n }\n\n $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);\n $slideEl.find((\".\" + (params.preloaderClass))).remove();\n if (swiper.params.loop && loadInDuplicate) {\n var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');\n if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {\n var originalSlide = swiper.$wrapperEl.children((\"[data-swiper-slide-index=\\\"\" + slideOriginalIndex + \"\\\"]:not(.\" + (swiper.params.slideDuplicateClass) + \")\"));\n swiper.lazy.loadInSlide(originalSlide.index(), false);\n } else {\n var duplicatedSlide = swiper.$wrapperEl.children((\".\" + (swiper.params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + slideOriginalIndex + \"\\\"]\"));\n swiper.lazy.loadInSlide(duplicatedSlide.index(), false);\n }\n }\n swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);\n });\n\n swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);\n });\n },\n load: function load() {\n var swiper = this;\n var $wrapperEl = swiper.$wrapperEl;\n var swiperParams = swiper.params;\n var slides = swiper.slides;\n var activeIndex = swiper.activeIndex;\n var isVirtual = swiper.virtual && swiperParams.virtual.enabled;\n var params = swiperParams.lazy;\n\n var slidesPerView = swiperParams.slidesPerView;\n if (slidesPerView === 'auto') {\n slidesPerView = 0;\n }\n\n function slideExist(index) {\n if (isVirtual) {\n if ($wrapperEl.children((\".\" + (swiperParams.slideClass) + \"[data-swiper-slide-index=\\\"\" + index + \"\\\"]\")).length) {\n return true;\n }\n } else if (slides[index]) { return true; }\n return false;\n }\n function slideIndex(slideEl) {\n if (isVirtual) {\n return $$1(slideEl).attr('data-swiper-slide-index');\n }\n return $$1(slideEl).index();\n }\n\n if (!swiper.lazy.initialImageLoaded) { swiper.lazy.initialImageLoaded = true; }\n if (swiper.params.watchSlidesVisibility) {\n $wrapperEl.children((\".\" + (swiperParams.slideVisibleClass))).each(function (elIndex, slideEl) {\n var index = isVirtual ? $$1(slideEl).attr('data-swiper-slide-index') : $$1(slideEl).index();\n swiper.lazy.loadInSlide(index);\n });\n } else if (slidesPerView > 1) {\n for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {\n if (slideExist(i)) { swiper.lazy.loadInSlide(i); }\n }\n } else {\n swiper.lazy.loadInSlide(activeIndex);\n }\n if (params.loadPrevNext) {\n if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {\n var amount = params.loadPrevNextAmount;\n var spv = slidesPerView;\n var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);\n var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);\n // Next Slides\n for (var i$1 = activeIndex + slidesPerView; i$1 < maxIndex; i$1 += 1) {\n if (slideExist(i$1)) { swiper.lazy.loadInSlide(i$1); }\n }\n // Prev Slides\n for (var i$2 = minIndex; i$2 < activeIndex; i$2 += 1) {\n if (slideExist(i$2)) { swiper.lazy.loadInSlide(i$2); }\n }\n } else {\n var nextSlide = $wrapperEl.children((\".\" + (swiperParams.slideNextClass)));\n if (nextSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(nextSlide)); }\n\n var prevSlide = $wrapperEl.children((\".\" + (swiperParams.slidePrevClass)));\n if (prevSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(prevSlide)); }\n }\n }\n },\n};\n\nvar Lazy$1 = {\n name: 'lazy',\n params: {\n lazy: {\n enabled: false,\n loadPrevNext: false,\n loadPrevNextAmount: 1,\n loadOnTransitionStart: false,\n\n elementClass: 'swiper-lazy',\n loadingClass: 'swiper-lazy-loading',\n loadedClass: 'swiper-lazy-loaded',\n preloaderClass: 'swiper-lazy-preloader',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n lazy: {\n initialImageLoaded: false,\n load: Lazy.load.bind(swiper),\n loadInSlide: Lazy.loadInSlide.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.lazy.enabled && swiper.params.preloadImages) {\n swiper.params.preloadImages = false;\n }\n },\n init: function init() {\n var swiper = this;\n if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {\n swiper.lazy.load();\n }\n },\n scroll: function scroll() {\n var swiper = this;\n if (swiper.params.freeMode && !swiper.params.freeModeSticky) {\n swiper.lazy.load();\n }\n },\n resize: function resize() {\n var swiper = this;\n if (swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n },\n scrollbarDragMove: function scrollbarDragMove() {\n var swiper = this;\n if (swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n },\n transitionStart: function transitionStart() {\n var swiper = this;\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) {\n swiper.lazy.load();\n }\n }\n },\n transitionEnd: function transitionEnd() {\n var swiper = this;\n if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {\n swiper.lazy.load();\n }\n },\n },\n};\n\n/* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\nvar Controller = {\n LinearSpline: function LinearSpline(x, y) {\n var binarySearch = (function search() {\n var maxIndex;\n var minIndex;\n var guess;\n return function (array, val) {\n minIndex = -1;\n maxIndex = array.length;\n while (maxIndex - minIndex > 1) {\n guess = maxIndex + minIndex >> 1;\n if (array[guess] <= val) {\n minIndex = guess;\n } else {\n maxIndex = guess;\n }\n }\n return maxIndex;\n };\n }());\n this.x = x;\n this.y = y;\n this.lastIndex = x.length - 1;\n // Given an x value (x2), return the expected y2 value:\n // (x1,y1) is the known point before given value,\n // (x3,y3) is the known point after given value.\n var i1;\n var i3;\n\n this.interpolate = function interpolate(x2) {\n if (!x2) { return 0; }\n\n // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n i3 = binarySearch(this.x, x2);\n i1 = i3 - 1;\n\n // We have our indexes i1 & i3, so we can calculate already:\n // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1];\n };\n return this;\n },\n // xxx: for now i will just save one spline function to to\n getInterpolateFunction: function getInterpolateFunction(c) {\n var swiper = this;\n if (!swiper.controller.spline) {\n swiper.controller.spline = swiper.params.loop ?\n new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid) :\n new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);\n }\n },\n setTranslate: function setTranslate(setTranslate$1, byController) {\n var swiper = this;\n var controlled = swiper.controller.control;\n var multiplier;\n var controlledTranslate;\n function setControlledTranslate(c) {\n // this will create an Interpolate function based on the snapGrids\n // x is the Grid of the scrolled scroller and y will be the controlled scroller\n // it makes sense to create this only once and recall it for the interpolation\n // the function does a lot of value caching for performance\n var translate = c.rtl && c.params.direction === 'horizontal' ? -swiper.translate : swiper.translate;\n if (swiper.params.controller.by === 'slide') {\n swiper.controller.getInterpolateFunction(c);\n // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n // but it did not work out\n controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n }\n\n if (!controlledTranslate || swiper.params.controller.by === 'container') {\n multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate();\n }\n\n if (swiper.params.controller.inverse) {\n controlledTranslate = c.maxTranslate() - controlledTranslate;\n }\n c.updateProgress(controlledTranslate);\n c.setTranslate(controlledTranslate, swiper);\n c.updateActiveIndex();\n c.updateSlidesClasses();\n }\n if (Array.isArray(controlled)) {\n for (var i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper$1) {\n setControlledTranslate(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper$1 && byController !== controlled) {\n setControlledTranslate(controlled);\n }\n },\n setTransition: function setTransition(duration, byController) {\n var swiper = this;\n var controlled = swiper.controller.control;\n var i;\n function setControlledTransition(c) {\n c.setTransition(duration, swiper);\n if (duration !== 0) {\n c.transitionStart();\n c.$wrapperEl.transitionEnd(function () {\n if (!controlled) { return; }\n if (c.params.loop && swiper.params.controller.by === 'slide') {\n c.loopFix();\n }\n c.transitionEnd();\n });\n }\n }\n if (Array.isArray(controlled)) {\n for (i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper$1) {\n setControlledTransition(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper$1 && byController !== controlled) {\n setControlledTransition(controlled);\n }\n },\n};\nvar Controller$1 = {\n name: 'controller',\n params: {\n controller: {\n control: undefined,\n inverse: false,\n by: 'slide', // or 'container'\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n controller: {\n control: swiper.params.controller.control,\n getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper),\n setTranslate: Controller.setTranslate.bind(swiper),\n setTransition: Controller.setTransition.bind(swiper),\n },\n });\n },\n on: {\n update: function update() {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n },\n resize: function resize() {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n },\n observerUpdate: function observerUpdate() {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n },\n setTranslate: function setTranslate(translate, byController) {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n swiper.controller.setTranslate(translate, byController);\n },\n setTransition: function setTransition(duration, byController) {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n swiper.controller.setTransition(duration, byController);\n },\n },\n};\n\nvar a11y = {\n makeElFocusable: function makeElFocusable($el) {\n $el.attr('tabIndex', '0');\n return $el;\n },\n addElRole: function addElRole($el, role) {\n $el.attr('role', role);\n return $el;\n },\n addElLabel: function addElLabel($el, label) {\n $el.attr('aria-label', label);\n return $el;\n },\n disableEl: function disableEl($el) {\n $el.attr('aria-disabled', true);\n return $el;\n },\n enableEl: function enableEl($el) {\n $el.attr('aria-disabled', false);\n return $el;\n },\n onEnterKey: function onEnterKey(e) {\n var swiper = this;\n var params = swiper.params.a11y;\n if (e.keyCode !== 13) { return; }\n var $targetEl = $$1(e.target);\n if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n if (!(swiper.isEnd && !swiper.params.loop)) {\n swiper.slideNext();\n }\n if (swiper.isEnd) {\n swiper.a11y.notify(params.lastSlideMessage);\n } else {\n swiper.a11y.notify(params.nextSlideMessage);\n }\n }\n if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n if (!(swiper.isBeginning && !swiper.params.loop)) {\n swiper.slidePrev();\n }\n if (swiper.isBeginning) {\n swiper.a11y.notify(params.firstSlideMessage);\n } else {\n swiper.a11y.notify(params.prevSlideMessage);\n }\n }\n if (swiper.pagination && $targetEl.is((\".\" + (swiper.params.pagination.bulletClass)))) {\n $targetEl[0].click();\n }\n },\n notify: function notify(message) {\n var swiper = this;\n var notification = swiper.a11y.liveRegion;\n if (notification.length === 0) { return; }\n notification.html('');\n notification.html(message);\n },\n updateNavigation: function updateNavigation() {\n var swiper = this;\n\n if (swiper.params.loop) { return; }\n var ref = swiper.navigation;\n var $nextEl = ref.$nextEl;\n var $prevEl = ref.$prevEl;\n\n if ($prevEl && $prevEl.length > 0) {\n if (swiper.isBeginning) {\n swiper.a11y.disableEl($prevEl);\n } else {\n swiper.a11y.enableEl($prevEl);\n }\n }\n if ($nextEl && $nextEl.length > 0) {\n if (swiper.isEnd) {\n swiper.a11y.disableEl($nextEl);\n } else {\n swiper.a11y.enableEl($nextEl);\n }\n }\n },\n updatePagination: function updatePagination() {\n var swiper = this;\n var params = swiper.params.a11y;\n if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {\n swiper.pagination.bullets.each(function (bulletIndex, bulletEl) {\n var $bulletEl = $$1(bulletEl);\n swiper.a11y.makeElFocusable($bulletEl);\n swiper.a11y.addElRole($bulletEl, 'button');\n swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/{{index}}/, $bulletEl.index() + 1));\n });\n }\n },\n init: function init() {\n var swiper = this;\n\n swiper.$el.append(swiper.a11y.liveRegion);\n\n // Navigation\n var params = swiper.params.a11y;\n var $nextEl;\n var $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n if ($nextEl) {\n swiper.a11y.makeElFocusable($nextEl);\n swiper.a11y.addElRole($nextEl, 'button');\n swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);\n $nextEl.on('keydown', swiper.a11y.onEnterKey);\n }\n if ($prevEl) {\n swiper.a11y.makeElFocusable($prevEl);\n swiper.a11y.addElRole($prevEl, 'button');\n swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);\n $prevEl.on('keydown', swiper.a11y.onEnterKey);\n }\n\n // Pagination\n if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {\n swiper.pagination.$el.on('keydown', (\".\" + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) { swiper.a11y.liveRegion.remove(); }\n\n var $nextEl;\n var $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n if ($nextEl) {\n $nextEl.off('keydown', swiper.a11y.onEnterKey);\n }\n if ($prevEl) {\n $prevEl.off('keydown', swiper.a11y.onEnterKey);\n }\n\n // Pagination\n if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {\n swiper.pagination.$el.off('keydown', (\".\" + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);\n }\n },\n};\nvar A11y = {\n name: 'a11y',\n params: {\n a11y: {\n enabled: false,\n notificationClass: 'swiper-notification',\n prevSlideMessage: 'Previous slide',\n nextSlideMessage: 'Next slide',\n firstSlideMessage: 'This is the first slide',\n lastSlideMessage: 'This is the last slide',\n paginationBulletMessage: 'Go to slide {{index}}',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n a11y: {\n liveRegion: $$1((\"\")),\n },\n });\n Object.keys(a11y).forEach(function (methodName) {\n swiper.a11y[methodName] = a11y[methodName].bind(swiper);\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.init();\n swiper.a11y.updateNavigation();\n },\n toEdge: function toEdge() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.updateNavigation();\n },\n fromEdge: function fromEdge() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.updateNavigation();\n },\n paginationUpdate: function paginationUpdate() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.updatePagination();\n },\n destroy: function destroy() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.destroy();\n },\n },\n};\n\nvar History = {\n init: function init() {\n var swiper = this;\n if (!swiper.params.history) { return; }\n if (!win.history || !win.history.pushState) {\n swiper.params.history.enabled = false;\n swiper.params.hashNavigation.enabled = true;\n return;\n }\n var history = swiper.history;\n history.initialized = true;\n history.paths = History.getPathValues();\n if (!history.paths.key && !history.paths.value) { return; }\n history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit);\n if (!swiper.params.history.replaceState) {\n win.addEventListener('popstate', swiper.history.setHistoryPopState);\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (!swiper.params.history.replaceState) {\n win.removeEventListener('popstate', swiper.history.setHistoryPopState);\n }\n },\n setHistoryPopState: function setHistoryPopState() {\n var swiper = this;\n swiper.history.paths = History.getPathValues();\n swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);\n },\n getPathValues: function getPathValues() {\n var pathArray = win.location.pathname.slice(1).split('/').filter(function (part) { return part !== ''; });\n var total = pathArray.length;\n var key = pathArray[total - 2];\n var value = pathArray[total - 1];\n return { key: key, value: value };\n },\n setHistory: function setHistory(key, index) {\n var swiper = this;\n if (!swiper.history.initialized || !swiper.params.history.enabled) { return; }\n var slide = swiper.slides.eq(index);\n var value = History.slugify(slide.attr('data-history'));\n if (!win.location.pathname.includes(key)) {\n value = key + \"/\" + value;\n }\n var currentState = win.history.state;\n if (currentState && currentState.value === value) {\n return;\n }\n if (swiper.params.history.replaceState) {\n win.history.replaceState({ value: value }, null, value);\n } else {\n win.history.pushState({ value: value }, null, value);\n }\n },\n slugify: function slugify(text) {\n return text.toString().toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^\\w-]+/g, '')\n .replace(/--+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n },\n scrollToSlide: function scrollToSlide(speed, value, runCallbacks) {\n var swiper = this;\n if (value) {\n for (var i = 0, length = swiper.slides.length; i < length; i += 1) {\n var slide = swiper.slides.eq(i);\n var slideHistory = History.slugify(slide.attr('data-history'));\n if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n var index = slide.index();\n swiper.slideTo(index, speed, runCallbacks);\n }\n }\n } else {\n swiper.slideTo(0, speed, runCallbacks);\n }\n },\n};\n\nvar History$1 = {\n name: 'history',\n params: {\n history: {\n enabled: false,\n replaceState: false,\n key: 'slides',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n history: {\n init: History.init.bind(swiper),\n setHistory: History.setHistory.bind(swiper),\n setHistoryPopState: History.setHistoryPopState.bind(swiper),\n scrollToSlide: History.scrollToSlide.bind(swiper),\n destroy: History.destroy.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.history.enabled) {\n swiper.history.init();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.params.history.enabled) {\n swiper.history.destroy();\n }\n },\n transitionEnd: function transitionEnd() {\n var swiper = this;\n if (swiper.history.initialized) {\n swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n },\n },\n};\n\nvar HashNavigation = {\n onHashCange: function onHashCange() {\n var swiper = this;\n var newHash = doc.location.hash.replace('#', '');\n var activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');\n if (newHash !== activeSlideHash) {\n swiper.slideTo(swiper.$wrapperEl.children((\".\" + (swiper.params.slideClass) + \"[data-hash=\\\"\" + newHash + \"\\\"]\")).index());\n }\n },\n setHash: function setHash() {\n var swiper = this;\n if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) { return; }\n if (swiper.params.hashNavigation.replaceState && win.history && win.history.replaceState) {\n win.history.replaceState(null, null, ((\"#\" + (swiper.slides.eq(swiper.activeIndex).attr('data-hash'))) || ''));\n } else {\n var slide = swiper.slides.eq(swiper.activeIndex);\n var hash = slide.attr('data-hash') || slide.attr('data-history');\n doc.location.hash = hash || '';\n }\n },\n init: function init() {\n var swiper = this;\n if (!swiper.params.hashNavigation.enabled || (swiper.params.history && swiper.params.history.enabled)) { return; }\n swiper.hashNavigation.initialized = true;\n var hash = doc.location.hash.replace('#', '');\n if (hash) {\n var speed = 0;\n for (var i = 0, length = swiper.slides.length; i < length; i += 1) {\n var slide = swiper.slides.eq(i);\n var slideHash = slide.attr('data-hash') || slide.attr('data-history');\n if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n var index = slide.index();\n swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);\n }\n }\n }\n if (swiper.params.hashNavigation.watchState) {\n $$1(win).on('hashchange', swiper.hashNavigation.onHashCange);\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.params.hashNavigation.watchState) {\n $$1(win).off('hashchange', swiper.hashNavigation.onHashCange);\n }\n },\n};\nvar HashNavigation$1 = {\n name: 'hash-navigation',\n params: {\n hashNavigation: {\n enabled: false,\n replaceState: false,\n watchState: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n hashNavigation: {\n initialized: false,\n init: HashNavigation.init.bind(swiper),\n destroy: HashNavigation.destroy.bind(swiper),\n setHash: HashNavigation.setHash.bind(swiper),\n onHashCange: HashNavigation.onHashCange.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.hashNavigation.enabled) {\n swiper.hashNavigation.init();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.params.hashNavigation.enabled) {\n swiper.hashNavigation.destroy();\n }\n },\n transitionEnd: function transitionEnd() {\n var swiper = this;\n if (swiper.hashNavigation.initialized) {\n swiper.hashNavigation.setHash();\n }\n },\n },\n};\n\nvar Autoplay = {\n run: function run() {\n var swiper = this;\n var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n var delay = swiper.params.autoplay.delay;\n if ($activeSlideEl.attr('data-swiper-autoplay')) {\n delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n }\n swiper.autoplay.timeout = Utils.nextTick(function () {\n if (swiper.params.loop) {\n swiper.loopFix();\n swiper.slideNext(swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else if (!swiper.isEnd) {\n swiper.slideNext(swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n swiper.slideTo(0, swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else {\n swiper.autoplay.stop();\n }\n }, delay);\n },\n start: function start() {\n var swiper = this;\n if (typeof swiper.autoplay.timeout !== 'undefined') { return false; }\n if (swiper.autoplay.running) { return false; }\n swiper.autoplay.running = true;\n swiper.emit('autoplayStart');\n swiper.autoplay.run();\n return true;\n },\n stop: function stop() {\n var swiper = this;\n if (!swiper.autoplay.running) { return false; }\n if (typeof swiper.autoplay.timeout === 'undefined') { return false; }\n\n if (swiper.autoplay.timeout) {\n clearTimeout(swiper.autoplay.timeout);\n swiper.autoplay.timeout = undefined;\n }\n swiper.autoplay.running = false;\n swiper.emit('autoplayStop');\n return true;\n },\n pause: function pause(speed) {\n var swiper = this;\n if (!swiper.autoplay.running) { return; }\n if (swiper.autoplay.paused) { return; }\n if (swiper.autoplay.timeout) { clearTimeout(swiper.autoplay.timeout); }\n swiper.autoplay.paused = true;\n if (speed === 0) {\n swiper.autoplay.paused = false;\n swiper.autoplay.run();\n } else {\n swiper.$wrapperEl.transitionEnd(function () {\n if (!swiper || swiper.destroyed) { return; }\n swiper.autoplay.paused = false;\n if (!swiper.autoplay.running) {\n swiper.autoplay.stop();\n } else {\n swiper.autoplay.run();\n }\n });\n }\n },\n};\n\nvar Autoplay$1 = {\n name: 'autoplay',\n params: {\n autoplay: {\n enabled: false,\n delay: 3000,\n disableOnInteraction: true,\n stopOnLastSlide: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n autoplay: {\n running: false,\n paused: false,\n run: Autoplay.run.bind(swiper),\n start: Autoplay.start.bind(swiper),\n stop: Autoplay.stop.bind(swiper),\n pause: Autoplay.pause.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.autoplay.enabled) {\n swiper.autoplay.start();\n }\n },\n beforeTransitionStart: function beforeTransitionStart(speed, internal) {\n var swiper = this;\n if (swiper.autoplay.running) {\n if (internal || !swiper.params.autoplay.disableOnInteraction) {\n swiper.autoplay.pause(speed);\n } else {\n swiper.autoplay.stop();\n }\n }\n },\n sliderFirstMove: function sliderFirstMove() {\n var swiper = this;\n if (swiper.autoplay.running) {\n if (swiper.params.autoplay.disableOnInteraction) {\n swiper.autoplay.stop();\n } else {\n swiper.autoplay.pause();\n }\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.autoplay.running) {\n swiper.autoplay.stop();\n }\n },\n },\n};\n\nvar Fade = {\n setTranslate: function setTranslate() {\n var swiper = this;\n var slides = swiper.slides;\n for (var i = 0; i < slides.length; i += 1) {\n var $slideEl = swiper.slides.eq(i);\n var offset = $slideEl[0].swiperSlideOffset;\n var tx = -offset;\n if (!swiper.params.virtualTranslate) { tx -= swiper.translate; }\n var ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n }\n var slideOpacity = swiper.params.fadeEffect.crossFade ?\n Math.max(1 - Math.abs($slideEl[0].progress), 0) :\n 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);\n $slideEl\n .css({\n opacity: slideOpacity,\n })\n .transform((\"translate3d(\" + tx + \"px, \" + ty + \"px, 0px)\"));\n }\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n var slides = swiper.slides;\n var $wrapperEl = swiper.$wrapperEl;\n slides.transition(duration);\n if (swiper.params.virtualTranslate && duration !== 0) {\n var eventTriggered = false;\n slides.transitionEnd(function () {\n if (eventTriggered) { return; }\n if (!swiper || swiper.destroyed) { return; }\n eventTriggered = true;\n swiper.animating = false;\n var triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n for (var i = 0; i < triggerEvents.length; i += 1) {\n $wrapperEl.trigger(triggerEvents[i]);\n }\n });\n }\n },\n};\n\nvar EffectFade = {\n name: 'effect-fade',\n params: {\n fadeEffect: {\n crossFade: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n fadeEffect: {\n setTranslate: Fade.setTranslate.bind(swiper),\n setTransition: Fade.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.effect !== 'fade') { return; }\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"fade\"));\n var overwriteParams = {\n slidesPerView: 1,\n slidesPerColumn: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: true,\n };\n Utils.extend(swiper.params, overwriteParams);\n Utils.extend(swiper.originalParams, overwriteParams);\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (swiper.params.effect !== 'fade') { return; }\n swiper.fadeEffect.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (swiper.params.effect !== 'fade') { return; }\n swiper.fadeEffect.setTransition(duration);\n },\n },\n};\n\nvar Cube = {\n setTranslate: function setTranslate() {\n var swiper = this;\n var $el = swiper.$el;\n var $wrapperEl = swiper.$wrapperEl;\n var slides = swiper.slides;\n var swiperWidth = swiper.width;\n var swiperHeight = swiper.height;\n var rtl = swiper.rtl;\n var swiperSize = swiper.size;\n var params = swiper.params.cubeEffect;\n var isHorizontal = swiper.isHorizontal();\n var isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n var wrapperRotate = 0;\n var $cubeShadowEl;\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $$1('
      ');\n $wrapperEl.append($cubeShadowEl);\n }\n $cubeShadowEl.css({ height: (swiperWidth + \"px\") });\n } else {\n $cubeShadowEl = $el.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $$1('
      ');\n $el.append($cubeShadowEl);\n }\n }\n }\n for (var i = 0; i < slides.length; i += 1) {\n var $slideEl = slides.eq(i);\n var slideIndex = i;\n if (isVirtual) {\n slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);\n }\n var slideAngle = slideIndex * 90;\n var round = Math.floor(slideAngle / 360);\n if (rtl) {\n slideAngle = -slideAngle;\n round = Math.floor(-slideAngle / 360);\n }\n var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n var tx = 0;\n var ty = 0;\n var tz = 0;\n if (slideIndex % 4 === 0) {\n tx = -round * 4 * swiperSize;\n tz = 0;\n } else if ((slideIndex - 1) % 4 === 0) {\n tx = 0;\n tz = -round * 4 * swiperSize;\n } else if ((slideIndex - 2) % 4 === 0) {\n tx = swiperSize + (round * 4 * swiperSize);\n tz = swiperSize;\n } else if ((slideIndex - 3) % 4 === 0) {\n tx = -swiperSize;\n tz = (3 * swiperSize) + (swiperSize * 4 * round);\n }\n if (rtl) {\n tx = -tx;\n }\n\n if (!isHorizontal) {\n ty = tx;\n tx = 0;\n }\n\n var transform = \"rotateX(\" + (isHorizontal ? 0 : -slideAngle) + \"deg) rotateY(\" + (isHorizontal ? slideAngle : 0) + \"deg) translate3d(\" + tx + \"px, \" + ty + \"px, \" + tz + \"px)\";\n if (progress <= 1 && progress > -1) {\n wrapperRotate = (slideIndex * 90) + (progress * 90);\n if (rtl) { wrapperRotate = (-slideIndex * 90) - (progress * 90); }\n }\n $slideEl.transform(transform);\n if (params.slideShadows) {\n // Set shadows\n var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = $$1((\"
      \"));\n $slideEl.append(shadowBefore);\n }\n if (shadowAfter.length === 0) {\n shadowAfter = $$1((\"
      \"));\n $slideEl.append(shadowAfter);\n }\n if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }\n if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }\n }\n }\n $wrapperEl.css({\n '-webkit-transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n '-moz-transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n '-ms-transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n 'transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n });\n\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl.transform((\"translate3d(0px, \" + ((swiperWidth / 2) + params.shadowOffset) + \"px, \" + (-swiperWidth / 2) + \"px) rotateX(90deg) rotateZ(0deg) scale(\" + (params.shadowScale) + \")\"));\n } else {\n var shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90);\n var multiplier = 1.5 - (\n (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2) +\n (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2)\n );\n var scale1 = params.shadowScale;\n var scale2 = params.shadowScale / multiplier;\n var offset = params.shadowOffset;\n $cubeShadowEl.transform((\"scale3d(\" + scale1 + \", 1, \" + scale2 + \") translate3d(0px, \" + ((swiperHeight / 2) + offset) + \"px, \" + (-swiperHeight / 2 / scale2) + \"px) rotateX(-90deg)\"));\n }\n }\n var zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0;\n $wrapperEl\n .transform((\"translate3d(0px,0,\" + zFactor + \"px) rotateX(\" + (swiper.isHorizontal() ? 0 : wrapperRotate) + \"deg) rotateY(\" + (swiper.isHorizontal() ? -wrapperRotate : 0) + \"deg)\"));\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n var $el = swiper.$el;\n var slides = swiper.slides;\n slides\n .transition(duration)\n .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')\n .transition(duration);\n if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n $el.find('.swiper-cube-shadow').transition(duration);\n }\n },\n};\n\nvar EffectCube = {\n name: 'effect-cube',\n params: {\n cubeEffect: {\n slideShadows: true,\n shadow: true,\n shadowOffset: 20,\n shadowScale: 0.94,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n cubeEffect: {\n setTranslate: Cube.setTranslate.bind(swiper),\n setTransition: Cube.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.effect !== 'cube') { return; }\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"cube\"));\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"3d\"));\n var overwriteParams = {\n slidesPerView: 1,\n slidesPerColumn: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n resistanceRatio: 0,\n spaceBetween: 0,\n centeredSlides: false,\n virtualTranslate: true,\n };\n Utils.extend(swiper.params, overwriteParams);\n Utils.extend(swiper.originalParams, overwriteParams);\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (swiper.params.effect !== 'cube') { return; }\n swiper.cubeEffect.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (swiper.params.effect !== 'cube') { return; }\n swiper.cubeEffect.setTransition(duration);\n },\n },\n};\n\nvar Flip = {\n setTranslate: function setTranslate() {\n var swiper = this;\n var slides = swiper.slides;\n for (var i = 0; i < slides.length; i += 1) {\n var $slideEl = slides.eq(i);\n var progress = $slideEl[0].progress;\n if (swiper.params.flipEffect.limitRotation) {\n progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n }\n var offset = $slideEl[0].swiperSlideOffset;\n var rotate = -180 * progress;\n var rotateY = rotate;\n var rotateX = 0;\n var tx = -offset;\n var ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n rotateX = -rotateY;\n rotateY = 0;\n } else if (swiper.rtl) {\n rotateY = -rotateY;\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n if (swiper.params.flipEffect.slideShadows) {\n // Set shadows\n var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = $$1((\"
      \"));\n $slideEl.append(shadowBefore);\n }\n if (shadowAfter.length === 0) {\n shadowAfter = $$1((\"
      \"));\n $slideEl.append(shadowAfter);\n }\n if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }\n if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }\n }\n $slideEl\n .transform((\"translate3d(\" + tx + \"px, \" + ty + \"px, 0px) rotateX(\" + rotateX + \"deg) rotateY(\" + rotateY + \"deg)\"));\n }\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n var slides = swiper.slides;\n var activeIndex = swiper.activeIndex;\n var $wrapperEl = swiper.$wrapperEl;\n slides\n .transition(duration)\n .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')\n .transition(duration);\n if (swiper.params.virtualTranslate && duration !== 0) {\n var eventTriggered = false;\n // eslint-disable-next-line\n slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {\n if (eventTriggered) { return; }\n if (!swiper || swiper.destroyed) { return; }\n // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;\n eventTriggered = true;\n swiper.animating = false;\n var triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n for (var i = 0; i < triggerEvents.length; i += 1) {\n $wrapperEl.trigger(triggerEvents[i]);\n }\n });\n }\n },\n};\n\nvar EffectFlip = {\n name: 'effect-flip',\n params: {\n flipEffect: {\n slideShadows: true,\n limitRotation: true,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n flipEffect: {\n setTranslate: Flip.setTranslate.bind(swiper),\n setTransition: Flip.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.effect !== 'flip') { return; }\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"flip\"));\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"3d\"));\n var overwriteParams = {\n slidesPerView: 1,\n slidesPerColumn: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: true,\n };\n Utils.extend(swiper.params, overwriteParams);\n Utils.extend(swiper.originalParams, overwriteParams);\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (swiper.params.effect !== 'flip') { return; }\n swiper.flipEffect.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (swiper.params.effect !== 'flip') { return; }\n swiper.flipEffect.setTransition(duration);\n },\n },\n};\n\nvar Coverflow = {\n setTranslate: function setTranslate() {\n var swiper = this;\n var swiperWidth = swiper.width;\n var swiperHeight = swiper.height;\n var slides = swiper.slides;\n var $wrapperEl = swiper.$wrapperEl;\n var slidesSizesGrid = swiper.slidesSizesGrid;\n var params = swiper.params.coverflowEffect;\n var isHorizontal = swiper.isHorizontal();\n var transform = swiper.translate;\n var center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2);\n var rotate = isHorizontal ? params.rotate : -params.rotate;\n var translate = params.depth;\n // Each slide offset from center\n for (var i = 0, length = slides.length; i < length; i += 1) {\n var $slideEl = slides.eq(i);\n var slideSize = slidesSizesGrid[i];\n var slideOffset = $slideEl[0].swiperSlideOffset;\n var offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier;\n\n var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n // var rotateZ = 0\n var translateZ = -translate * Math.abs(offsetMultiplier);\n\n var translateY = isHorizontal ? 0 : params.stretch * (offsetMultiplier);\n var translateX = isHorizontal ? params.stretch * (offsetMultiplier) : 0;\n\n // Fix for ultra small values\n if (Math.abs(translateX) < 0.001) { translateX = 0; }\n if (Math.abs(translateY) < 0.001) { translateY = 0; }\n if (Math.abs(translateZ) < 0.001) { translateZ = 0; }\n if (Math.abs(rotateY) < 0.001) { rotateY = 0; }\n if (Math.abs(rotateX) < 0.001) { rotateX = 0; }\n\n var slideTransform = \"translate3d(\" + translateX + \"px,\" + translateY + \"px,\" + translateZ + \"px) rotateX(\" + rotateX + \"deg) rotateY(\" + rotateY + \"deg)\";\n\n $slideEl.transform(slideTransform);\n $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n if (params.slideShadows) {\n // Set shadows\n var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n if ($shadowBeforeEl.length === 0) {\n $shadowBeforeEl = $$1((\"
      \"));\n $slideEl.append($shadowBeforeEl);\n }\n if ($shadowAfterEl.length === 0) {\n $shadowAfterEl = $$1((\"
      \"));\n $slideEl.append($shadowAfterEl);\n }\n if ($shadowBeforeEl.length) { $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; }\n if ($shadowAfterEl.length) { $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; }\n }\n }\n\n // Set correct perspective for IE10\n if (Browser.ie) {\n var ws = $wrapperEl[0].style;\n ws.perspectiveOrigin = center + \"px 50%\";\n }\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n swiper.slides\n .transition(duration)\n .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')\n .transition(duration);\n },\n};\n\nvar EffectCoverflow = {\n name: 'effect-coverflow',\n params: {\n coverflowEffect: {\n rotate: 50,\n stretch: 0,\n depth: 100,\n modifier: 1,\n slideShadows: true,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n coverflowEffect: {\n setTranslate: Coverflow.setTranslate.bind(swiper),\n setTransition: Coverflow.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.effect !== 'coverflow') { return; }\n\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"coverflow\"));\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"3d\"));\n\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (swiper.params.effect !== 'coverflow') { return; }\n swiper.coverflowEffect.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (swiper.params.effect !== 'coverflow') { return; }\n swiper.coverflowEffect.setTransition(duration);\n },\n },\n};\n\n// Swiper Class\n// Core Modules\nSwiper$1.use([\n Device$2,\n Support$2,\n Browser$2,\n Resize,\n Observer$1,\n Virtual$1,\n Keyboard$1,\n Mousewheel$1,\n Navigation$1,\n Pagination$1,\n Scrollbar$1,\n Parallax$1,\n Zoom$1,\n Lazy$1,\n Controller$1,\n A11y,\n History$1,\n HashNavigation$1,\n Autoplay$1,\n EffectFade,\n EffectCube,\n EffectFlip,\n EffectCoverflow\n]);\n\nreturn Swiper$1;\n\n})));\n"]} \ No newline at end of file diff --git a/lib/Excel/itemexcel.xls b/lib/Excel/itemexcel.xls new file mode 100644 index 000000000..d99bf6b64 Binary files /dev/null and b/lib/Excel/itemexcel.xls differ diff --git a/lib/common.lib.php b/lib/common.lib.php index 48d2a98bf..8966c48a6 100644 --- a/lib/common.lib.php +++ b/lib/common.lib.php @@ -850,12 +850,14 @@ function get_admin($admin='super', $fields='*') $is = true; } - if (($is && !$mb['mb_id']) || $admin == 'group') { + // if (($is && !$mb['mb_id']) || $admin == 'group') { + if (($is && !isset($mb['mb_id'])) || $admin == 'group') { $mb = sql_fetch("select {$fields} from {$g5['member_table']} where mb_id in ('{$group['gr_admin']}') limit 1 "); $is = true; } - if (($is && !$mb['mb_id']) || $admin == 'super') { + // if (($is && !$mb['mb_id']) || $admin == 'super') { + if (($is && !isset($mb['mb_id'])) || $admin == 'super') { $mb = sql_fetch("select {$fields} from {$g5['member_table']} where mb_id in ('{$config['cf_admin']}') limit 1 "); } @@ -1525,7 +1527,7 @@ function sql_connect($host, $user, $pass, $db=G5_MYSQL_DB) global $g5; if(function_exists('mysqli_connect') && G5_MYSQLI_USE) { - $link = mysqli_connect($host, $user, $pass, $db); + $link = @mysqli_connect($host, $user, $pass, $db) or die('MySQL Host, User, Password, DB 정보에 오류가 있습니다.'); // 연결 오류 발생 시 스크립트 종료 if (mysqli_connect_errno()) { @@ -2217,7 +2219,10 @@ function get_checked($field, $value) function is_mobile() { - return preg_match('/'.G5_MOBILE_AGENT.'/i', $_SERVER['HTTP_USER_AGENT']); + if (isset($_SERVER['HTTP_USER_AGENT'])) + return preg_match('/'.G5_MOBILE_AGENT.'/i', $_SERVER['HTTP_USER_AGENT']); + else + return ''; } @@ -2344,8 +2349,9 @@ function delete_editor_thumbnail($contents) for($i=0; $i&1', $out, $return_var); + + if($return_var == 139) { + $isbinary = false; + break; + } + + for($i=0; $i&1', $out, $return_var); @@ -3001,6 +3060,9 @@ function get_search_string($stx) // XSS 관련 태그 제거 function clean_xss_tags($str, $check_entities=0, $is_remove_tags=0, $cur_str_len=0) { + // tab('\t'), formfeed('\f'), vertical tab('\v'), newline('\n'), carriage return('\r') 를 제거한다. + $str = preg_replace("#[\t\f\v\n\r]#", '', $str); + if( $is_remove_tags ){ $str = strip_tags($str); } @@ -3107,7 +3169,7 @@ function member_delete($mb_id) } // 회원자료는 정보만 없앤 후 아이디는 보관하여 다른 사람이 사용하지 못하도록 함 : 061025 - $sql = " update {$g5['member_table']} set mb_password = '', mb_level = 1, mb_email = '', mb_homepage = '', mb_tel = '', mb_hp = '', mb_zip1 = '', mb_zip2 = '', mb_addr1 = '', mb_addr2 = '', mb_birth = '', mb_sex = '', mb_signature = '', mb_memo = '".date('Ymd', G5_SERVER_TIME)." 삭제함\n".sql_real_escape_string($mb['mb_memo'])."' where mb_id = '{$mb_id}' "; + $sql = " update {$g5['member_table']} set mb_password = '', mb_level = 1, mb_email = '', mb_homepage = '', mb_tel = '', mb_hp = '', mb_zip1 = '', mb_zip2 = '', mb_addr1 = '', mb_addr2 = '', mb_addr3 = '', mb_point = 0, mb_profile = '', mb_birth = '', mb_sex = '', mb_signature = '', mb_memo = '".date('Ymd', G5_SERVER_TIME)." 삭제함\n".sql_real_escape_string($mb['mb_memo'])."', mb_certify = '', mb_adult = 0, mb_dupinfo = '' where mb_id = '{$mb_id}' "; sql_query($sql); @@ -3262,7 +3324,13 @@ function check_url_host($url, $msg='', $return_url=G5_URL, $is_redirect=false) if(!$msg) $msg = 'url에 타 도메인을 지정할 수 없습니다.'; - $p = @parse_url($url); + // KVE-2021-1277 Open Redirect 취약점 해결 + if (preg_match('#\\\0#', $url)) { + alert('url 에 올바르지 않은 값이 포함되어 있습니다.'); + } + + $url = urldecode($url); + $p = @parse_url(trim($url)); $host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']); $is_host_check = false; @@ -3282,10 +3350,10 @@ function check_url_host($url, $msg='', $return_url=G5_URL, $is_redirect=false) } } - if(stripos($url, 'http:') !== false) { - if(!isset($p['scheme']) || !$p['scheme'] || !isset($p['host']) || !$p['host']) - alert('url 정보가 올바르지 않습니다.', $return_url); - } + // if(stripos($url, 'http:') !== false) { + // if(!isset($p['scheme']) || !$p['scheme'] || !isset($p['host']) || !$p['host']) + // alert('url 정보가 올바르지 않습니다.', $return_url); + // } //php 5.6.29 이하 버전에서는 parse_url 버그가 존재함 //php 7.0.1 ~ 7.0.5 버전에서는 parse_url 버그가 존재함 diff --git a/lib/etc.lib.php b/lib/etc.lib.php new file mode 100644 index 000000000..41b48e1ed --- /dev/null +++ b/lib/etc.lib.php @@ -0,0 +1,13 @@ +제목'; + $str .= ''; + $str .= ''; + if ($is_admin) + $str .= ''; + + return run_replace('get_qa_sfl_select_options', $str, $sfl); +} + // 읽지 않은 메모 갯수 반환 function get_memo_not_read($mb_id, $add_where='') { diff --git a/lib/iteminfo.lib.php b/lib/iteminfo.lib.php new file mode 100644 index 000000000..111c52bf7 --- /dev/null +++ b/lib/iteminfo.lib.php @@ -0,0 +1,559 @@ +array( + "title"=>"의류", + "article"=>array( + "material"=>array("제품소재", "섬유의 조성 또는 혼용률을 백분율로 표시, 기능성인 경우 성적서 또는 허가서"), + "color"=>array("색상", ""), + "size"=>array("치수", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "caution"=>array("세탁방법 및 취급시 주의사항", ""), + "manufacturing_ym"=>array("제조연월", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "shoes"=>array( + "title"=>"구두/신발", + "article"=>array( + "material"=>array("제품소재", "운동화인 경우에는 겉감, 안감을 구분하여 표시"), + "color"=>array("색상", ""), + "size"=>array("치수-발길이", "해외사이즈 표기 시 국내사이즈 병행 표기 (mm)"), + "height"=>array("치수-굽높이", "굽 재료를 사용하는 여성화에 한함 (cm)"), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "caution"=>array("취급시 주의사항", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "bag"=>array( + "title"=>"가방", + "article"=>array( + "kind"=>array("종류", ""), + "material"=>array("소재", ""), + "color"=>array("색상", ""), + "size"=>array("크기", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "caution"=>array("취급시 주의사항", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "fashion"=>array( + "title"=>"패션잡화(모자/벨트/액세서리)", + "article"=>array( + "kind"=>array("종류", ""), + "material"=>array("소재", ""), + "size"=>array("치수", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "caution"=>array("취급시 주의사항", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "bedding"=>array( + "title"=>"침구류/커튼", + "article"=>array( + "material"=>array("제품소재", "(섬유의 조성 또는 혼용률을 백분율로 표시) 충전재를 사용한 제품은 충전재를 함께 표기"), + "color"=>array("색상", ""), + "size"=>array("치수", ""), + "component" =>array("제품구성", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "caution"=>array("세탁방법 및 취급시 주의사항", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "furniture"=>array( + "title"=>"가구(침대/소파/싱크대/DIY제품)", + "article"=>array( + "product_name"=>array("품명", ""), + "certification"=>array("KC 인증 필 유무", "(품질경영 및 공산품안전관리법 상 안전·품질표시대상공산품에 한함)"), + "color"=>array("색상", ""), + "component" =>array("구성품", ""), + "material"=>array("주요소재", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)
      구성품 별 제조자가 다른 경우 각 구성품의 제조자, 수입자"), + "madein"=>array("제조국", "구성품 별 제조국이 다른 경우 각 구성품의 제조국"), + "size"=>array("크기", ""), + "delivery"=>array("배송·설치비용", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "image_appliances"=>array( + "title"=>"영상가전 (TV류)", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "certification"=>array("전기용품 안전인증 필 유무", "전기용품안전관리법 상 안전인증대상전기용품, 자율안전확인대상전기용품, 공급자적합성확인대상전기용품에 한함"), + "rated_voltage"=>array("정격전압", "에너지이용합리화법 상 의무대상상품에 한함"), + "power_consumption"=>array("소비전력", "에너지이용합리화법 상 의무대상상품에 한함"), + "energy_efficiency"=>array("에너지효율등급", "에너지이용합리화법 상 의무대상상품에 한함"), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", "구성품 별 제조국이 다른 경우 각 구성품의 제조국"), + "size"=>array("크기", "형태포함"), + "display_specification"=>array("화면사양", "크기, 해상도, 화면비율 등"), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "home_appliances"=>array( + "title"=>"가정용전기제품(냉장고/세탁기/식기세척기/전자레인지)", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "certification"=>array("전기용품 안전인증 필 유무", "전기용품안전관리법 상 안전인증대상전기용품, 자율안전확인대상전기용품, 공급자적합성확인대상전기용품에 한함"), + "rated_voltage"=>array("정격전압", "에너지이용합리화법 상 의무대상상품에 한함"), + "power_consumption"=>array("소비전력", "에너지이용합리화법 상 의무대상상품에 한함"), + "energy_efficiency"=>array("에너지효율등급", "에너지이용합리화법 상 의무대상상품에 한함"), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "size"=>array("크기", "형태포함"), + "display_specification"=>array("화면사양", "크기, 해상도, 화면비율 등"), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "season_appliances"=>array( + "title"=>"계절가전(에어컨/온풍기)", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "certification"=>array("전기용품 안전인증 필 유무", "전기용품안전관리법 상 안전인증대상전기용품, 자율안전확인대상전기용품, 공급자적합성확인대상전기용품에 한함"), + "rated_voltage"=>array("정격전압", "에너지이용합리화법 상 의무대상상품에 한함"), + "power_consumption"=>array("소비전력", "에너지이용합리화법 상 의무대상상품에 한함"), + "energy_efficiency"=>array("에너지효율등급", "에너지이용합리화법 상 의무대상상품에 한함"), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "size"=>array("크기", "형태 및 실외기 포함"), + "area"=>array("냉난방면적", ""), + "installation_costs"=>array("추가설치비용", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "office_appliances"=>array( + "title"=>"사무용기기(컴퓨터/노트북/프린터)", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "certification"=>array("KCC 인증 필 유무", "전파법 상 인증대상상품에 한함, MIC 인증 필 혼용 가능"), + "rated_voltage"=>array("정격전압", "에너지이용합리화법 상 의무대상상품에 한함"), + "power_consumption"=>array("소비전력", "에너지이용합리화법 상 의무대상상품에 한함"), + "energy_efficiency"=>array("에너지효율등급", "에너지이용합리화법 상 의무대상상품에 한함"), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", "구성품 별 제조국이 다른 경우 각 구성품의 제조국"), + "size"=>array("크기", ""), + "weight"=>array("무게", "무게는 노트북에 한함"), + "specification"=>array("주요사양", "컴퓨터와 노트북의 경우 성능, 용량, 운영체제 포함여부 등 / 프린터의 경우 인쇄 속도 등"), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "optics_appliances"=>array( + "title"=>"광학기기(디지털카메라/캠코더)", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "certification"=>array("KCC 인증 필 유무", "전파법 상 인증대상상품에 한함, MIC 인증 필 혼용 가능"), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "size"=>array("크기", ""), + "weight"=>array("무게", ""), + "specification"=>array("주요사양", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "microelectronics"=>array( + "title"=>"소형전자(MP3/전자사전등)", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "certification"=>array("KCC 인증 필 유무", "전파법 상 인증대상상품에 한함, MIC 인증 필 혼용 가능"), + "rated_voltage"=>array("정격전압", ""), + "power_consumption"=>array("소비전력", ""), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "size"=>array("크기", ""), + "weight"=>array("무게", ""), + "specification"=>array("주요사양", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "mobile"=>array( + "title"=>"휴대폰", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "certification"=>array("KCC 인증 필 유무", "전파법 상 인증대상상품에 한함, MIC 인증 필 혼용 가능"), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "size"=>array("크기", ""), + "weight"=>array("무게", ""), + "telecom"=>array("이동통신사", ""), + "join_process"=>array("가입절차", ""), + "extra_burden"=>array("소비자의 추가적인 부담사항 ", "가입비, 유심카드 구입비 등 추가로 부담하여야 할 금액, 부가서비스, 의무사용기간, 위약금 등"), + "specification"=>array("주요사양", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "navigation"=>array( + "title"=>"네비게이션", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "certification"=>array("KCC 인증 필 유무", "전파법 상 인증대상상품에 한함, MIC 인증 필 혼용 가능"), + "rated_voltage"=>array("정격전압", ""), + "power_consumption"=>array("소비전력", ""), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "size"=>array("크기", ""), + "weight"=>array("무게", ""), + "specification"=>array("주요사양", ""), + "update_cost"=>array("맵 업데이트 비용", ""), + "freecost_period"=>array("무상기간", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "car"=>array( + "title"=>"자동차용품(자동차부품/기타자동차용품)", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "released_date"=>array("동일모델의 출시년월", ""), + "certification"=>array("자동차부품 자기인증 유무 ", "자동차 관리법 상 인증 대상 자동차 부품에 한함"), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", "구성품 별 제조국이 다른 경우 각 구성품의 제조국"), + "size"=>array("크기", ""), + "apply_model"=>array("적용차종", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "medical"=>array( + "title"=>"의료기기", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "license_number"=>array("의료기기법상 허가·신고 번호", "허가·신고 대상 의료기기에 한함"), + "advertising"=>array("광고사전심의필 유무", ""), + "certification"=>array("전기용품안전관리법상 KC 인증 필 유무 ", "안전인증 또는 자율안전확인 대상 전기용품에 한함"), + "rated_voltage"=>array("정격전압", "전기용품에 한함"), + "power_consumption"=>array("소비전력", "전기용품에 한함"), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "appliances_purpose"=>array("제품의 사용목적", ""), + "appliances_usage"=>array("제품의 사용목적", ""), + "display_specification"=>array("화면사양", "(크기, 해상도, 화면비율 등)"), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "kitchenware"=>array( + "title"=>"주방용품", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "material"=>array("재질", ""), + "component"=>array("구성품", ""), + "size"=>array("크기", ""), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "import_declaration"=>array("식품위생법에 따른 수입 신고", "식품위생법에 따른 수입 기구·용기의 경우 \"식품위생법에 따른 수입신고를 필함\"의 문구"), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "cosmetics"=>array( + "title"=>"화장품", + "article"=>array( + "capacity"=>array("용량 또는 중량", ""), + "specification"=>array("제품 주요사양", "피부타입, 색상(호, 번) 등"), + "expiration_date"=>array("사용기한 또는 개봉 후 사용기간", "개봉 후 사용기간을 기재할 경우에는 제조연월일을 병행표기"), + "usage"=>array("사용방법", ""), + "maker"=>array("제조자", ""), + "distributor"=>array("제조판매업자", ""), + "madein"=>array("제조국", ""), + "mainingredient"=>array("주요성분", "유기농 화장품의 경우 유기농 원료 함량 포함"), + "certification"=>array("식품의약품안전청 심사 필 유무", "기능성 화장품의 경우 화장품법에 따른 식품의약품안전청 심사 필 유무 (미백, 주름개선, 자외선차단 등)"), + "caution"=>array("사용할 때 주의사항", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "jewelry"=>array( + "title"=>"귀금속/보석/시계류", + "article"=>array( + "material"=>array("소재", ""), + "purity"=>array("순도", ""), + "band"=>array("밴드재질", "시계의 경우"), + "weight"=>array("중량", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", "원산지와 가공지 등이 다를 경우 함께 표기"), + "size"=>array("치수", ""), + "caution"=>array("착용 시 주의사항", ""), + "specification"=>array("주요사양", "귀금속, 보석류는 등급, 시계는 기능, 방수 등"), + "provide_warranty"=>array("보증서 제공여부", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("A/S 책임자와 전화번호", ""), + ) + ), + "food"=>array( + "title"=>"식품(농수산물)", + "article"=>array( + "weight"=>array("포장단위별 용량(중량)", ""), + "quantity"=>array("포장단위별 수량", ""), + "size"=>array("포장단위별 크기", ""), + "producer"=>array("생산자", "수입품의 경우 수입자를 함께 표기"), + "origin"=>array("원산지", "농수산물의 원산지 표시에 관한 법률에 따른 원산지"), + "manufacturing_ymd"=>array("제조연월일", "포장일 또는 생산연도"), + "expiration_date"=>array("유통기한 또는 품질유지기한", ""), + "law_content"=>array("관련법상 표시사항", "농산물 - 농산물품질관리법상 유전자변형농산물 표시, 지리적표시
      축산물 - 축산법에 따른 등급 표시, 쇠고기의 경우 이력관리에 따른 표시 유무
      수산물 - 수산물품질관리법상 유전자변형수산물 표시, 지리적표시
      수입식품에 해당하는 경우 \"식품위생법에 따른 수입신고를 필함\"의 문구"), + "product_composition"=>array("상품구성", ""), + "keep"=>array("보관방법 또는 취급방법", ""), + "as"=>array("소비자상담 관련 전화번호", ""), + ) + ), + "general_food"=>array( + "title"=>"가공식품", + "article"=>array( + "food_type"=>array("식품의 유형", ""), + "producer"=>array("생산자", ""), + "location"=>array("소재지", "수입품의 경우 수입자를 함께 표기"), + "manufacturing_ymd"=>array("제조연월일", ""), + "expiration_date"=>array("유통기한 또는 품질유지기한", ""), + "weight"=>array("포장단위별 용량(중량)", ""), + "quantity"=>array("포장단위별 수량", ""), + "ingredients"=>array("원재료명 및 함량", "농수산물의 원산지 표시에 관한 법률에 따른 원산지 표시 포함"), + "nutrition_component"=>array("영양성분", "식품위생법에 따른 영양성분 표시대상 식품에 한함"), + "genetically_modified"=>array("유전자재조합식품에 해당하는 경우의 표시", ""), + "baby_food"=>array("영유아식 또는 체중조절식품 등에 해당하는 경우 표시광고 사전심의필", ""), + "imported_food"=>array("수입식품에 해당하는 경우 “식품위생법에 따른 수입신고를 필함”의 문구", ""), + "as"=>array("소비자상담 관련 전화번호", ""), + ) + ), + "diet_food"=>array( + "title"=>"건강기능식품", + "article"=>array( + "food_type"=>array("식품의 유형", ""), + "producer"=>array("생산자", ""), + "location"=>array("소재지", "수입품의 경우 수입자를 함께 표기"), + "manufacturing_ymd"=>array("제조연월일", ""), + "expiration_date"=>array("유통기한 또는 품질유지기한", ""), + "waight"=>array("포장단위별 용량(중량)", ""), + "quantity"=>array("포장단위별 수량", ""), + "ingredients"=>array("원재료명 및 함량", "농수산물의 원산지 표시에 관한 법률에 따른 원산지 표시 포함"), + "nutrition"=>array("영양정보", ""), + "specification"=>array("기능정보", ""), + "intake"=>array("섭취량, 섭취방법 및 섭취 시 주의사항", ""), + "disease"=>array("질병의 예방 및 치료를 위한 의약품이 아니라는 내용의 표현", ""), + "genetically_modified"=>array("유전자재조합식품에 해당하는 경우의 표시", ""), + "display_ad"=>array("표시광고 사전심의필", ""), + "imported_food"=>array("수입식품에 해당하는 경우 \"건강기능식품에 관한 법률에 따른 수입신고를 필함\"의 문구", ""), + "as"=>array("소비자상담 관련 전화번호", ""), + ) + ), + "kids"=>array( + "title"=>"영유아용품", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "certification"=>array("KC 인증 필", "품질경영 및 공산품안전관리법 상 안전인증대상 또는 자율안전확인대상 공산품에 한함"), + "size"=>array("크기", ""), + "weight"=>array("중량", ""), + "color"=>array("색상", ""), + "material"=>array("재질", "섬유의 경우 혼용률"), + "age"=>array("사용연령", ""), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "caution"=>array("취급방법 및 취급시 주의사항, 안전표시 (주의, 경고 등)", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("소비자상담 관련 전화번호", ""), + ) + ), + "instrument"=>array( + "title"=>"악기", + "article"=>array( + "size"=>array("크기", ""), + "color"=>array("색상", ""), + "material"=>array("재질", ""), + "components"=>array("제품구성", ""), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "detailed_specifications"=>array("상품별 세부 사양", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("소비자상담 관련 전화번호", ""), + ) + ), + "sports"=>array( + "title"=>"스포츠용품", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "size"=>array("크기", ""), + "weight"=>array("중량", ""), + "color"=>array("색상", ""), + "material"=>array("재질", ""), + "components"=>array("제품구성", ""), + "released_date"=>array("동일모델의 출시년월", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "madein"=>array("제조국", ""), + "detailed_specifications"=>array("상품별 세부 사양", ""), + "warranty"=>array("품질보증기준", ""), + "as"=>array("소비자상담 관련 전화번호", ""), + ) + ), + "books"=>array( + "title"=>"서적", + "article"=>array( + "product_name"=>array("도서명", ""), + "author"=>array("저자", ""), + "publisher"=>array("출판사", ""), + "size"=>array("크기", "전자책의 경우 파일의 용량"), + "pages"=>array("쪽수", "전자책의 경우 제외"), + "components"=>array("제품구성", "전집 또는 세트일 경우 낱권 구성, CD 등"), + "publish_date"=>array("출간일", ""), + "description"=>array("목차 또는 책소개", ""), + ) + ), + "reserve"=>array( + "title"=>"호텔/펜션예약", + "article"=>array( + "location"=>array("국가 또는 지역명", ""), + "lodgment_type"=>array("숙소형태", ""), + "grade"=>array("등급", ""), + "room_type"=>array("객실타입", ""), + "room_capacity"=>array("사용가능인원", ""), + "extra_person_charge"=>array("인원 추가시 비용", ""), + "facilities"=>array("부대시설", ""), + "provided_service"=>array("제공서비스", "조식 등"), + "cancellation_policy"=>array("취소규정", "환불 위약금 등"), + "booking_contacts"=>array("예약담당 연락처", ""), + ) + ), + "travel"=>array( + "title"=>"여행패키지", + "article"=>array( + "travel_agency"=>array("여행사", ""), + "flight"=>array("이용항공편", ""), + "travel_period"=>array("여행기간", ""), + "schedule"=>array("일정", ""), + "maximum_people"=>array("총예정인원", ""), + "minimum_people"=>array("출발가능인원", ""), + "accomodation_info"=>array("숙박정보", ""), + "details"=>array("포함내역", "식사, 인솔자, 공연관람 등"), + "additional_charge"=>array("추가 경비 항목과 금액", "유류할증료, 공항이용료, 관광지 입장료, 안내원수수료, 식사비용, 선택사항 등"), + "cancellation_policy"=>array("취소규정", "환불, 위약금 등"), + "travel_warnings"=>array("해외여행의 경우 외교통상부가 지정하는 여행경보단계", ""), + "booking_contacts"=>array("예약담당 연락처", ""), + ) + ), + "airline_ticket"=>array( + "title"=>"항공권", + "article"=>array( + "charge_condition"=>array("요금조건", ""), + "round_trip"=>array("왕복·편도 여부", ""), + "expiration_date"=>array("유효기간", ""), + "restriction"=>array("제한사항", "출발일, 귀국일 변경가능 여부 등"), + "ticket_delivery_mean"=>array("티켓수령방법", ""), + "seat_type"=>array("좌석종류", ""), + "additional_charge"=>array("추가 경비 항목과 금액", "유류할증료, 공항이용료 등"), + "cancellation_policy"=>array("취소 규정", "환불, 위약금 등"), + "booking_contacts"=>array("예약담당 연락처", ""), + ) + ), + "rent_car"=>array( + "title"=>"자동차대여서비스(렌터카)", + "article"=>array( + "model"=>array("차종", ""), + "ownership_transfer"=>array("소유권 이전 조건", "소유권이 이전되는 경우에 한함"), + "additional_charge"=>array("추가 선택 시 비용", "자차면책제도, 내비게이션 등"), + "fuel_cost"=>array("차량 반환 시 연료대금 정산 방법", ""), + "vehicle_breakdown"=>array("차량의 고장·훼손 시 소비자 책임", ""), + "cancellation_policy"=>array("예약취소 또는 중도 해약 시 환불 기준", ""), + "as"=>array("소비자상담 관련 전화번호", ""), + ) + ), + "rental_water"=>array( + "title"=>"물품대여서비스(정수기,비데,공기청정기 등)", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "transfer_of_ownership"=>array("소유권 이전 조건", "소유권이 이전되는 경우에 한함"), + "maintenance"=>array("유지보수 조건", "점검·필터교환 주기, 추가 비용 등"), + "consumer_responsibility"=>array("상품의 고장·분실·훼손 시 소비자 책임", ""), + "refund"=>array("중도 해약 시 환불 기준", ""), + "specification"=>array("제품 사양", "용량, 소비전력 등"), + "as"=>array("소비자상담 관련 전화번호", ""), + ) + ), + "rental_etc"=>array( + "title"=>"물품대여서비스(서적,유아용품,행사용품 등)", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "transfer_of_ownership"=>array("소유권 이전 조건", "소유권이 이전되는 경우에 한함"), + "consumer_responsibility"=>array("상품의 고장·분실·훼손 시 소비자 책임", ""), + "refund"=>array("중도 해약 시 환불 기준", ""), + "as"=>array("소비자상담 관련 전화번호", ""), + ) + ), + "digital_contents"=>array( + "title"=>"디지털콘텐츠(음원,게임,인터넷강의 등)", + "article"=>array( + "producer"=>array("제작자 또는 공급자", ""), + "terms_of_use"=>array("이용조건", ""), + "use_period"=>array("이용기간", ""), + "product_offers"=>array("상품 제공 방식", "CD, 다운로드, 실시간 스트리밍 등"), + "minimum_system"=>array("최소 시스템 사양, 필수 소프트웨어", ""), + "transfer_of_ownership"=>array("소유권 이전 조건", "소유권이 이전되는 경우에 한함"), + "maintenance"=>array("청약철회 또는 계약의 해제·해지에 따른 효과", ""), + "as"=>array("소비자상담 관련 전화번호", ""), + ) + ), + "gift_card"=>array( + "title"=>"상품권/쿠폰", + "article"=>array( + "isseur"=>array("발행자", ""), + "expiration_date"=>array("유효기간", ""), + "terms_of_use"=>array("이용조건", "유효기간 경과 시 보상 기준, 사용제한품목 및 기간 등"), + "use_store"=>array("이용 가능 매장", ""), + "refund_policy"=>array("잔액 환급 조건", ""), + "as"=>array("소비자상담 관련 전화번호", ""), + ) + ), + "etc"=>array( + "title"=>"기타", + "article"=>array( + "product_name"=>array("품명", ""), + "model_name"=>array("모델명", ""), + "certified_by_law"=>array("법에 의한 인증·허가 등을 받았음을 확인할 수 있는 경우 그에 대한 사항", ""), + "origin"=>array("제조국 또는 원산지", ""), + "maker"=>array("제조자", "수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)"), + "as"=>array("A/S 책임자와 전화번호 또는 소비자상담 관련 전화번호", ""), + ) + ), +); \ No newline at end of file diff --git a/lib/latest.lib.php b/lib/latest.lib.php index 1d3613242..f21d80239 100644 --- a/lib/latest.lib.php +++ b/lib/latest.lib.php @@ -70,7 +70,7 @@ function latest($skin_dir='', $bo_table, $rows=10, $subject_len=40, $cache_time= } $list[$i] = get_list($row, $board, $latest_skin_url, $subject_len); - $list[$i]['first_file_thumb'] = (isset($row['wr_file']) && $row['wr_file']) ? get_board_file_db($bo_table, $row['wr_id'], 'bf_file, bf_content', "and bf_type between '1' and '3'", true) : array('bf_file'=>'', 'bf_content'=>''); + $list[$i]['first_file_thumb'] = (isset($row['wr_file']) && $row['wr_file']) ? get_board_file_db($bo_table, $row['wr_id'], 'bf_file, bf_content', "and bf_type in (1, 2, 3, 18) ", true) : array('bf_file'=>'', 'bf_content'=>''); $list[$i]['bo_table'] = $bo_table; // 썸네일 추가 if($options && is_string($options)) { diff --git a/lib/mailer.lib.php b/lib/mailer.lib.php index 229ed97d9..10a0fcc46 100644 --- a/lib/mailer.lib.php +++ b/lib/mailer.lib.php @@ -18,35 +18,48 @@ function mailer($fname, $fmail, $to, $subject, $content, $type=0, $file="", $cc= $result = run_replace('mailer', $fname, $fmail, $to, $subject, $content, $type, $file, $cc, $bcc); - if( isset($result['return']) ){ + if( is_array($result) && isset($result['return']) ){ return $result['return']; } - $mail = new PHPMailer(); // defaults to using php "mail()" - if (defined('G5_SMTP') && G5_SMTP) { - $mail->IsSMTP(); // telling the class to use SMTP - $mail->Host = G5_SMTP; // SMTP server - if(defined('G5_SMTP_PORT') && G5_SMTP_PORT) - $mail->Port = G5_SMTP_PORT; - } - $mail->CharSet = 'UTF-8'; - $mail->From = $fmail; - $mail->FromName = $fname; - $mail->Subject = $subject; - $mail->AltBody = ""; // optional, comment out and test - $mail->msgHTML($content); - $mail->addAddress($to); - if ($cc) - $mail->addCC($cc); - if ($bcc) - $mail->addBCC($bcc); - //print_r2($file); exit; - if ($file != "") { - foreach ($file as $f) { - $mail->addAttachment($f['path'], $f['name']); + $mail_send_result = false; + + try { + $mail = new PHPMailer(); // defaults to using php "mail()" + if (defined('G5_SMTP') && G5_SMTP) { + $mail->IsSMTP(); // telling the class to use SMTP + $mail->Host = G5_SMTP; // SMTP server + if(defined('G5_SMTP_PORT') && G5_SMTP_PORT) + $mail->Port = G5_SMTP_PORT; } + $mail->CharSet = 'UTF-8'; + $mail->From = $fmail; + $mail->FromName = $fname; + $mail->Subject = $subject; + $mail->AltBody = ""; // optional, comment out and test + $mail->msgHTML($content); + $mail->addAddress($to); + if ($cc) + $mail->addCC($cc); + if ($bcc) + $mail->addBCC($bcc); + //print_r2($file); exit; + if ($file != "") { + foreach ($file as $f) { + $mail->addAttachment($f['path'], $f['name']); + } + } + + $mail = run_replace('mail_options', $mail, $fname, $fmail, $to, $subject, $content, $type, $file, $cc, $bcc); + + $mail_send_result = $mail->send(); + + } catch (Exception $e) { } - return $mail->send(); + + run_event('mail_send_result', $mail_send_result, $mail, $to, $cc, $bcc); + + return $mail_send_result; } // 파일을 첨부함 diff --git a/lib/naverpay.lib.php b/lib/naverpay.lib.php new file mode 100644 index 000000000..902a2aedd --- /dev/null +++ b/lib/naverpay.lib.php @@ -0,0 +1,335 @@ +options = $options; + $this->send_cost = $send_cost; + } + + function get_sendcost() + { + global $g5, $default; + + $options = $this->options; + $send_cost = $this->send_cost; + $keys = $this->keys; + + $data = array(); + + if($send_cost == 1) + return array('type' => 'ONDELIVERY', 'cost' => 0); + + $cost = 0; + $cnt = 0; + $diff = 0; + $total_price = 0; + $diff_cost = 0; + + foreach($keys as $it_id) { + $it = get_shop_item($it_id, true); + if(!$it['it_id']) + continue; + + if($it['it_sc_type'] > 1 && $it['it_sc_method'] == 1) { // 착불 + $cnt++; + continue; + } + + $qty = 0; + $price = 0; + $opts = $options[$it_id]; + $uprice = get_price($it); + + foreach($opts as $opt) { + if($opt['type']) + $price += ((int)$opt['price'] * (int)$opt['qty']); + else + $price += (((int)$uprice + (int)$opt['price']) * (int)$opt['qty']); + + $qty += $opt['qty']; + } + + if($it['it_sc_type'] > 1) { + if($it['it_sc_type'] == 2) { // 조건부무료 + if($price >= $it['it_sc_minimum']) + $cost += 0; + else + $cost += $it['it_sc_price']; + } else if($it['it_sc_type'] == 3) { // 유료배송 + $cost += $it['it_sc_price']; + } else { // 수량별 부과 + if(!$it['it_sc_qty']) + $it['it_sc_qty'] = 1; + + $q = ceil((int)$qty / (int)$it['it_sc_qty']); + $cost += (int)$it['it_sc_price'] * $q; + } + } else if($it['it_sc_type'] == 1) { // 무료배송 + $cost += 0; + } else { + if($default['de_send_cost_case'] == '차등') { + $total_price += $price; + $diff++; + } else { + $cost += 0; + } + } + } + + if($default['de_send_cost_case'] == '차등' && $total_price >= 0 && $diff > 0) { + // 금액별차등 : 여러단계의 배송비 적용 가능 + $send_cost_limit = explode(";", $default['de_send_cost_limit']); + $send_cost_list = explode(";", $default['de_send_cost_list']); + + for ($k=0; $k 0) + return array('type' => 'ONDELIVERY', 'cost' => 0); + + if($cost > 0) + $data = array('type' => 'PAYED', 'cost' => $cost); + else + $data = array('type' => 'FREE', 'cost' => 0); + + return $data; + } + + function query() + { + global $g5, $default; + + $keys = array(); + $opts = array(); + + $item = ''; + $query = ''; + $total = 0; + $shipping = ''; + + $keys = array_unique(array_keys($this->options)); + $this->keys = $keys; + + foreach($keys as $it_id) { + $sql = " select * from {$g5['g5_shop_item_table']} where it_id = '$it_id' and it_use = '1' and it_soldout = '0' and it_tel_inq = '0' "; + $it = sql_fetch($sql); + if(!$it['it_id']) + continue; + + $opts = $this->options[$it_id]; + + if(empty($opts) || !is_array($opts)) + continue; + + $it_name = $it['it_name']; + $uprice = get_price($it); + $tprice = 0; + + foreach($opts as $opt) { + if($opt['type']) + $tprice = ((int)$opt['price'] * (int)$opt['qty']); + else + $tprice = (((int)$uprice + (int)$opt['price']) * (int)$opt['qty']); + + $item .= '&ITEM_ID='.urlencode($it_id); + if($it['ec_mall_pid']) + $item .= '&EC_MALL_PID='.urlencode($it['ec_mall_pid']); + $item .= '&ITEM_NAME='.urlencode($it_name); + $item .= '&ITEM_COUNT='.$opt['qty']; + $item .= '&ITEM_OPTION='.urlencode($opt['option']); + $item .= '&ITEM_TPRICE='.$tprice; + $item .= '&ITEM_UPRICE='.$uprice; + + $total += $tprice; + } + + } + + $sendcost = $this->get_sendcost(); + + if($sendcost['cost'] > 0) + $total += $sendcost['cost']; + + $this->total_price = $total; + + $shipping .= '&SHIPPING_TYPE='.$sendcost['type']; + $shipping .= '&SHIPPING_PRICE='.$sendcost['cost']; + if(defined('SHIPPING_ADDITIONAL_PRICE') && SHIPPING_ADDITIONAL_PRICE) + $shipping .= '&SHIPPING_ADDITIONAL_PRICE='.urlencode(SHIPPING_ADDITIONAL_PRICE); + + if($item) { + $na_co_val = isset($_COOKIE['NA_CO']) ? urlencode($_COOKIE['NA_CO']) : ''; + $query .= 'SHOP_ID='.urlencode($default['de_naverpay_mid']); + $query .= '&CERTI_KEY='.urlencode($default['de_naverpay_cert_key']); + $query .= $shipping; + $query .= '&BACK_URL='.urlencode(NAVERPAY_BACK_URL); + $query .= '&NAVER_INFLOW_CODE='.$na_co_val; + $query .= $item; + $query .= '&TOTAL_PRICE='.$total; + } + + return $query; + } +} + +function get_naverpay_item_image_url($it_id) +{ + global $g5; + + $row = get_shop_item($it_id, true); + + if(!$row['it_id']) + return ''; + + $url = ''; + + for($i=1;$i<=10; $i++) { + $file = G5_DATA_PATH.'/item/'.$row['it_img'.$i]; + if(is_file($file) && $row['it_img'.$i]) { + $size = @getimagesize($file); + if($size[2] < 1 || $size[2] > 3) + continue; + + $url = str_replace(G5_PATH, G5_URL, $file); + + if( isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ){ + $url = preg_replace('#^https:#', '', $url); + + $port_str = ':'.$_SERVER['SERVER_PORT']; + + if( strpos($url, $port_str) !== false ){ + $url = str_replace($port_str, '', $url); + } + } + + //TLS(SSL/HTTPS) 프로토콜 사용 시 네이버페이/네이버 쇼핑 서버가 해당 경로로 접근하여 데이터를 취득할 수 없으므로, 반드시 http 를 사용해야 함 + $url = (preg_match('#^http:#', $url) ? '' : 'http:').$url; + + break; + } + } + + return $url; +} + +function get_naverpay_item_stock($it_id) +{ + global $g5; + + $it = get_shop_item($it_id, true); + if(!$it['it_id'] || !$it['it_use'] || $it['it_soldout']) + return 0; + + // 옵션체크 + $sql = " select count(io_no) as cnt, sum(io_stock_qty) as qty from {$g5['g5_shop_item_option_table']} where it_id = '$it_id' and io_type = '0' and io_use = '1' "; + $row = sql_fetch($sql); + + if($row['cnt'] > 0) + return $row['qty']; + else + return $it['it_stock_qty']; +} + +function get_naverpay_item_option($it_id, $subject) +{ + global $g5; + + if(!$it_id || !$subject) + return ''; + + $sql = " select * from {$g5['g5_shop_item_option_table']} where io_type = '0' and it_id = '$it_id' and io_use = '1' order by io_no asc "; + $result = sql_query($sql); + if(!sql_num_rows($result)) + return ''; + + $str = ''; + $subj = explode(',', $subject); + $subj_count = count($subj); + + $option = ''; + + if($subj_count > 1) { + $options = array(); + + // 옵션항목 배열에 저장 + for($i=0; $row=sql_fetch_array($result); $i++) { + $osl_id = explode(chr(30), $row['io_id']); + + for($k=0; $k<$subj_count; $k++) { + if(!is_array($options[$k])) + $options[$k] = array(); + + if($osl_id[$k] && !in_array($osl_id[$k], $options[$k])) + $options[$k][] = $osl_id[$k]; + } + } + + // 옵션선택목록 만들기 + for($i=0; $i<$subj_count; $i++) { + $opt = $options[$i]; + $osl_count = count($opt); + if($osl_count) { + $option .= ''.PHP_EOL; + } + } + } else { + $option .= ''.PHP_EOL; + } + + return ''.$option.''; +} + +function get_naverpay_return_info($mb_id) +{ + global $default; + + $data = ''; + $address1 = trim($default['de_admin_company_addr']); + $address2 = ' '; + + $data .= ''; + $data .= ''; + $data .= ''; + $data .= ''; + $data .= ''; + $data .= ''; + $data .= ''; + + return $data; +} + +function return_error2json($str, $fld='error') +{ + $data = array(); + $data[$fld] = trim($str); + + die(json_encode($data)); +} \ No newline at end of file diff --git a/lib/shop.data.lib.php b/lib/shop.data.lib.php new file mode 100644 index 000000000..47911d1f5 --- /dev/null +++ b/lib/shop.data.lib.php @@ -0,0 +1,271 @@ +get('shop', $it_id, $add_query_key) : null; + + if( !$item ){ + $sql = " select * from {$g5['g5_shop_item_table']} where it_id = '{$it_id}' $add_query "; + $item = sql_fetch($sql); + + $g5_object->set('shop', $it_id, $item, $add_query_key); + } + + if( isset($item['it_basic']) ) { + $item['it_basic'] = conv_content($item['it_basic'], 1); + } + + if( ! isset($item['it_id']) ){ + $item['it_id'] = ''; + } + + return $item; +} + +function get_shop_item_with_category($it_id, $seo_title='', $add_query=''){ + + global $g5, $default; + + if( $seo_title ){ + $sql = " select a.*, b.ca_name, b.ca_use from {$g5['g5_shop_item_table']} a, {$g5['g5_shop_category_table']} b where a.it_seo_title = '".sql_real_escape_string(generate_seo_title($seo_title))."' and a.ca_id = b.ca_id $add_query"; + } else { + $sql = " select a.*, b.ca_name, b.ca_use from {$g5['g5_shop_item_table']} a, {$g5['g5_shop_category_table']} b where a.it_id = '$it_id' and a.ca_id = b.ca_id $add_query"; + } + + $item = sql_fetch($sql); + + if( isset($item['it_basic']) ) { + $item['it_basic'] = conv_content($item['it_basic'], 1); + } + + return $item; +} + +function get_shop_navigation_data($is_cache, $ca_id, $ca_id2='', $ca_id3=''){ + + $all_categories = get_shop_category_array($is_cache); + + $datas = array(); + + if( strlen($ca_id) >= 2 && $all_categories ){ + foreach((array) $all_categories as $category1 ){ + $datas[0][] = $category1['text']; + } + } + + $select_ca_id = $ca_id2 ? $ca_id2 : $ca_id; + $item_categories2 = $select_ca_id ? get_shop_category_by($is_cache, 'ca_id', $select_ca_id) : array(); + + if( strlen($select_ca_id) >= 4 && $item_categories2 ){ + foreach((array) $item_categories2 as $key=>$category2 ){ + if( $key === 'text' ) continue; + + $datas[1][] = $category2['text']; + } + } + + $select_ca_id = $ca_id3 ? $ca_id3 : $ca_id; + $item_categories3 = $select_ca_id ? get_shop_category_by($is_cache, 'ca_id', $select_ca_id) : array(); + + if( strlen($select_ca_id) >= 6 && $item_categories3 && isset($item_categories3[substr($select_ca_id,0,4)]) ){ + $sub_categories = $item_categories3[substr($select_ca_id,0,4)]; + + foreach((array) $sub_categories as $key=>$category3 ){ + if( $key === 'text' ) continue; + + $datas[2][] = $category3['text']; + } + } + + return $datas; +} + +function get_shop_category_by($is_cache, $case, $value){ + + if( $case === 'ca_id' ){ + $categories = get_shop_category_array($is_cache); + + $key = substr(preg_replace('/[^0-9a-z]/i', '', $value), 0, 2); + + if( isset($categories[$key]) ){ + return $categories[$key]; + } + } + + return array(); +} + +function get_shop_category_array($is_cache=false){ + + static $categories = array(); + + $categories = run_replace('get_shop_category_array', $categories, $is_cache); + + if( $is_cache && !empty($categories) ){ + return $categories; + } + + $result = sql_query(get_shop_category_sql('', 2)); + + for($i=0; $row=sql_fetch_array($result); $i++) { + + $row['url'] = shop_category_url($row['ca_id']); + $categories[$row['ca_id']]['text'] = $row; + + if( $row['ca_id'] ){ + $result2 = sql_query(get_shop_category_sql($row['ca_id'], 4)); + + for($j=0; $row2=sql_fetch_array($result2); $j++) { + + $row2['url'] = shop_category_url($row2['ca_id']); + $categories[$row['ca_id']][$row2['ca_id']]['text'] = $row2; + + if( $row2['ca_id'] ){ + $result3 = sql_query(get_shop_category_sql($row2['ca_id'], 6)); + for($k=0; $row3=sql_fetch_array($result3); $k++) { + + $row3['url'] = shop_category_url($row3['ca_id']); + $categories[$row['ca_id']][$row2['ca_id']][$row3['ca_id']]['text'] = $row3; + } + } //end if + } //end for + } //end if + } //end for + + return $categories; +} + +function get_shop_category_sql($ca_id, $len){ + global $g5; + + $sql = " select * from {$g5['g5_shop_category_table']} + where ca_use = '1' "; + if($ca_id) + $sql .= " and ca_id like '$ca_id%' "; + $sql .= " and length(ca_id) = '$len' order by ca_order, ca_id "; + + return $sql; +} + +function get_shop_member_coupon_count($mb_id='', $is_cache=false){ + global $g5, $member; + + static $cache = array(); + + $key = md5($mb_id); + + if( $is_cache && isset($cache[$key]) ){ + return $cache[$key]; + } + + if( !$mb_id ){ + $mb_id = $member['mb_id']; + } + + // 쿠폰 + $cp_count = 0; + $sql = " select cp_id + from {$g5['g5_shop_coupon_table']} + where mb_id IN ( '{$mb_id}', '전체회원' ) + and cp_start <= '".G5_TIME_YMD."' + and cp_end >= '".G5_TIME_YMD."' "; + $res = sql_query($sql); + + for($k=0; $cp=sql_fetch_array($res); $k++) { + if(!is_used_coupon($mb_id, $cp['cp_id'])) + $cp_count++; + } + + $cache[$key] = $cp_count; + + return $cp_count; +} + +// 상품리스트에서 옵션항목 +function get_shop_item_options($it_id, $subject, $no) +{ + global $g5; + + if(!$it_id || !$subject) + return ''; + + $sql = " select * from {$g5['g5_shop_item_option_table']} where io_type = '0' and it_id = '$it_id' and io_use = '1' order by io_no asc "; + $result = sql_query($sql); + if(!sql_num_rows($result)) + return ''; + + $str = ''; + $subj = explode(',', $subject); + $subj_count = count($subj); + + if($subj_count > 1) { + $options = array(); + + // 옵션항목 배열에 저장 + for($i=0; $row=sql_fetch_array($result); $i++) { + $opt_id = explode(chr(30), $row['io_id']); + + for($k=0; $k<$subj_count; $k++) { + if(! (isset($options[$k]) && is_array($options[$k]))) + $options[$k] = array(); + + if(isset($opt_id[$k]) && $opt_id[$k] && !in_array($opt_id[$k], $options[$k])) + $options[$k][] = $opt_id[$k]; + } + } + + // 옵션선택목록 만들기 + for($i=0; $i<$subj_count; $i++) { + $opt = $options[$i]; + $opt_count = count($opt); + $disabled = ''; + if($opt_count) { + $seq = $no.'_'.($i + 1); + if($i > 0) + $disabled = ' disabled="disabled"'; + + $str .= ''.PHP_EOL; + + $select = ''.PHP_EOL; + + $str .= $select.PHP_EOL; + } + } + } else { + $str .= ''.PHP_EOL; + + $select = ''.PHP_EOL; + + $str .= $select.PHP_EOL; + } + + return $str; +} \ No newline at end of file diff --git a/lib/shop.lib.php b/lib/shop.lib.php new file mode 100644 index 000000000..1d591621b --- /dev/null +++ b/lib/shop.lib.php @@ -0,0 +1,2800 @@ +run(); + + +유형+분류별로 노출하는 경우 상세 사용법 : 상품유형을 지정하는 것은 동일합니다. +$disp = new item_list(1); +// 사용할 스킨을 바꿉니다. +$disp->set_list_skin("type_user.skin.php"); +// 1단계분류를 20으로 시작되는 분류로 지정합니다. +$disp->set_category("20", 1); +echo $disp->run(); + + +분류별로 노출하는 경우 상세 사용법 +// type13.skin.php 스킨으로 3개씩 2줄을 폭 150 사이즈로 분류코드 30 으로 시작되는 상품을 노출합니다. +$disp = new item_list(0, "type13.skin.php", 3, 2, 150, 0, "30"); +echo $disp->run(); + + +이벤트로 노출하는 경우 상세 사용법 +// type13.skin.php 스킨으로 3개씩 2줄을 폭 150 사이즈로 상품을 노출합니다. +// 스킨의 경로는 스킨 파일의 절대경로를 지정합니다. +$disp = new item_list(0, G5_SHOP_SKIN_PATH.'/list.10.skin.php', 3, 2, 150, 0); +// 이벤트번호를 설정합니다. +$disp->set_event("12345678"); +echo $disp->run(); + +참고) 영카트4의 display_type 함수와 사용방법이 비슷한 class 입니다. + display_category 나 display_event 로 사용하기 위해서는 $type 값만 넘기지 않으면 됩니다. +*/ + +class item_list +{ + // 상품유형 : 기본적으로 1~5 까지 사용할수 있으며 0 으로 설정하는 경우 상품유형별로 노출하지 않습니다. + // 분류나 이벤트로 노출하는 경우 상품유형을 0 으로 설정하면 됩니다. + protected $type; + + protected $list_skin; + protected $list_mod; + protected $list_row; + protected $img_width; + protected $img_height; + + // 상품상세보기 경로 + protected $href = ""; + + // select 에 사용되는 필드 + protected $fields = "*"; + + // 분류코드로만 사용하는 경우 상품유형($type)을 0 으로 설정하면 됩니다. + protected $ca_id = ""; + protected $ca_id2 = ""; + protected $ca_id3 = ""; + + // 노출순서 + protected $order_by = "it_order, it_id desc"; + + // 상품의 이벤트번호를 저장합니다. + protected $event = ""; + + // 스킨의 기본 css 를 다른것으로 사용하고자 할 경우에 사용합니다. + protected $css = ""; + + // 상품의 사용여부를 따져 노출합니다. 0 인 경우 모든 상품을 노출합니다. + protected $use = 1; + + // 모바일에서 노출하고자 할 경우에 true 로 설정합니다. + protected $is_mobile = false; + + // 기본으로 보여지는 필드들 + protected $view_it_id = false; // 상품코드 + protected $view_it_img = true; // 상품이미지 + protected $view_it_name = true; // 상품명 + protected $view_it_basic = true; // 기본설명 + protected $view_it_price = true; // 판매가격 + protected $view_it_cust_price = false; // 소비자가 + protected $view_it_icon = false; // 아이콘 + protected $view_sns = false; // SNS + protected $view_star = false; // 별점 + + // 몇번째 class 호출인지를 저장합니다. + protected $count = 0; + + // true 인 경우 페이지를 구한다. + protected $is_page = false; + + // 페이지 표시를 위하여 총 상품수를 구합니다. + public $total_count = 0; + + // sql limit 의 시작 레코드 + protected $from_record = 0; + + // 외부에서 쿼리문을 넘겨줄 경우에 담아두는 변수 + protected $query = ""; + + // $type : 상품유형 (기본으로 1~5까지 사용) + // $list_skin : 상품리스트를 노출할 스킨을 설정합니다. 스킨위치는 skin/shop/쇼핑몰설정스킨/type??.skin.php + // $list_mod : 1줄에 몇개의 상품을 노출할지를 설정합니다. + // $list_row : 상품을 몇줄에 노출할지를 설정합니다. + // $img_width : 상품이미지의 폭을 설정합니다. + // $img_height : 상품이미지의 높이을 설정합니다. 0 으로 설정하는 경우 썸네일 이미지의 높이는 폭에 비례하여 생성합니다. + //function __construct($type=0, $list_skin='', $list_mod='', $list_row='', $img_width='', $img_height=0, $ca_id='') { + function __construct($list_skin='', $list_mod='', $list_row='', $img_width='', $img_height=0) { + $this->list_skin = $list_skin; + $this->list_mod = $list_mod; + $this->list_row = $list_row; + $this->img_width = $img_width; + $this->img_height = $img_height; + $this->set_href(G5_SHOP_URL.'/item.php?it_id='); + $this->count++; + } + + function set_type($type) { + $this->type = $type; + if ($type) { + $this->set_list_skin($this->list_skin); + $this->set_list_mod($this->list_mod); + $this->set_list_row($this->list_row); + $this->set_img_size($this->img_width, $this->img_height); + } + } + + // 분류코드로 검색을 하고자 하는 경우 아래와 같이 인수를 넘겨줍니다. + // 1단계 분류는 (분류코드, 1) + // 2단계 분류는 (분류코드, 2) + // 3단계 분류는 (분류코드, 3) + function set_category($ca_id, $level=1) { + if ($level == 2) { + $this->ca_id2 = $ca_id; + } else if ($level == 3) { + $this->ca_id3 = $ca_id; + } else { + $this->ca_id = $ca_id; + } + } + + // 이벤트코드를 인수로 넘기게 되면 해당 이벤트에 속한 상품을 노출합니다. + function set_event($ev_id) { + $this->event = $ev_id; + } + + // 리스트 스킨을 바꾸고자 하는 경우에 사용합니다. + // 리스트 스킨의 위치는 skin/shop/쇼핑몰설정스킨/type??.skin.php 입니다. + // 특별히 설정하지 않는 경우 상품유형을 사용하는 경우는 쇼핑몰설정 값을 그대로 따릅니다. + function set_list_skin($list_skin) { + global $default; + if ($this->is_mobile) { + $this->list_skin = $list_skin ? $list_skin : G5_MSHOP_SKIN_PATH.'/'.preg_replace('/[^A-Za-z0-9 _ .-]/', '', $default['de_mobile_type'.$this->type.'_list_skin']); + } else { + $this->list_skin = $list_skin ? $list_skin : G5_SHOP_SKIN_PATH.'/'.preg_replace('/[^A-Za-z0-9 _ .-]/', '', $default['de_type'.$this->type.'_list_skin']); + } + } + + // 1줄에 몇개를 노출할지를 사용한다. + // 특별히 설정하지 않는 경우 상품유형을 사용하는 경우는 쇼핑몰설정 값을 그대로 따릅니다. + function set_list_mod($list_mod) { + global $default; + if ($this->is_mobile) { + $this->list_mod = $list_mod ? $list_mod : $default['de_mobile_type'.$this->type.'_list_mod']; + } else { + $this->list_mod = $list_mod ? $list_mod : $default['de_type'.$this->type.'_list_mod']; + } + } + + // 몇줄을 노출할지를 사용한다. + // 특별히 설정하지 않는 경우 상품유형을 사용하는 경우는 쇼핑몰설정 값을 그대로 따릅니다. + function set_list_row($list_row) { + global $default; + if ($this->is_mobile) { + $this->list_row = $list_row ? $list_row : $default['de_mobile_type'.$this->type.'_list_row']; + } else { + $this->list_row = $list_row ? $list_row : $default['de_type'.$this->type.'_list_row']; + } + if (!$this->list_row) + $this->list_row = 1; + } + + // 노출이미지(썸네일생성)의 폭, 높이를 설정합니다. 높이를 0 으로 설정하는 경우 쎰네일 비율에 따릅니다. + // 특별히 설정하지 않는 경우 상품유형을 사용하는 경우는 쇼핑몰설정 값을 그대로 따릅니다. + function set_img_size($img_width, $img_height=0) { + global $default; + if ($this->is_mobile) { + $this->img_width = $img_width ? $img_width : $default['de_mobile_type'.$this->type.'_img_width']; + $this->img_height = $img_height ? $img_height : $default['de_mobile_type'.$this->type.'_img_height']; + } else { + $this->img_width = $img_width ? $img_width : $default['de_type'.$this->type.'_img_width']; + $this->img_height = $img_height ? $img_height : $default['de_type'.$this->type.'_img_height']; + } + } + + // 특정 필드만 select 하는 경우에는 필드명을 , 로 구분하여 "field1, field2, field3, ... fieldn" 으로 인수를 넘겨줍니다. + function set_fields($str) { + $this->fields = $str; + } + + // 특정 필드로 정렬을 하는 경우 필드와 정렬순서를 , 로 구분하여 "field1 desc, field2 asc, ... fieldn desc " 으로 인수를 넘겨줍니다. + function set_order_by($str) { + $this->order_by = $str; + } + + // 사용하는 상품외에 모든 상품을 노출하려면 0 을 인수로 넘겨줍니다. + function set_use($use) { + $this->use = $use; + } + + // 모바일로 사용하려는 경우 true 를 인수로 넘겨줍니다. + function set_mobile($mobile=true) { + $this->is_mobile = $mobile; + } + + // 스킨에서 특정 필드를 노출하거나 하지 않게 할수 있습니다. + // 가령 소비자가는 처음에 노출되지 않도록 설정되어 있지만 노출을 하려면 + // ("it_cust_price", true) 와 같이 인수를 넘겨줍니다. + // 이때 인수로 넘겨주는 값은 스킨에 정의된 필드만 가능하다는 것입니다. + function set_view($field, $view=true) { + $this->{"view_".$field} = $view; + } + + // anchor 태그에 하이퍼링크를 다른 주소로 걸거나 아예 링크를 걸지 않을 수 있습니다. + // 인수를 "" 공백으로 넘기면 링크를 걸지 않습니다. + function set_href($href) { + $this->href = $href; + } + + // ul 태그의 css 를 교체할수 있다. "sct sct_abc" 를 인수로 넘기게 되면 + // 기존의 ul 태그에 걸린 css 는 무시되며 인수로 넘긴 css 가 사용됩니다. + function set_css($css) { + $this->css = $css; + } + + // 페이지를 노출하기 위해 true 로 설정할때 사용합니다. + function set_is_page($is_page) { + $this->is_page = $is_page; + } + + // select ... limit 의 시작값 + function set_from_record($from_record) { + $this->from_record = $from_record; + } + + // 외부에서 쿼리문을 넘겨줄 경우에 담아둡니다. + function set_query($query) { + $this->query = $query; + } + + // class 에 설정된 값으로 최종 실행합니다. + function run() { + + global $g5, $config, $member, $default; + + $list = array(); + + if ($this->query) { + + $sql = $this->query; + $result = sql_query($sql); + $this->total_count = @sql_num_rows($result); + + } else { + + $where = array(); + if ($this->use) { + $where[] = " it_use = '1' "; + } + + if ($this->type) { + $where[] = " it_type{$this->type} = '1' "; + } + + if ($this->ca_id || $this->ca_id2 || $this->ca_id3) { + $where_ca_id = array(); + if ($this->ca_id) { + $where_ca_id[] = " ca_id like '{$this->ca_id}%' "; + } + if ($this->ca_id2) { + $where_ca_id[] = " ca_id2 like '{$this->ca_id2}%' "; + } + if ($this->ca_id3) { + $where_ca_id[] = " ca_id3 like '{$this->ca_id3}%' "; + } + $where[] = " ( " . implode(" or ", $where_ca_id) . " ) "; + } + + if ($this->order_by) { + $sql_order = " order by {$this->order_by} "; + } + + if ($this->event) { + $sql_select = " select {$this->fields} "; + $sql_common = " from `{$g5['g5_shop_event_item_table']}` a left join `{$g5['g5_shop_item_table']}` b on (a.it_id = b.it_id) "; + $where[] = " a.ev_id = '{$this->event}' "; + } else { + $sql_select = " select {$this->fields} "; + $sql_common = " from `{$g5['g5_shop_item_table']}` "; + } + $sql_where = " where " . implode(" and ", $where); + $sql_limit = " limit " . $this->from_record . " , " . ($this->list_mod * $this->list_row); + + $sql = $sql_select . $sql_common . $sql_where . $sql_order . $sql_limit; + $result = sql_query($sql); + + if ($this->is_page) { + $sql2 = " select count(*) as cnt " . $sql_common . $sql_where; + $row2 = sql_fetch($sql2); + $this->total_count = $row2['cnt']; + } + } + + if( isset($result) && $result ){ + while ($row=sql_fetch_array($result)) { + + if( isset($row['it_seo_title']) && ! $row['it_seo_title'] ){ + shop_seo_title_update($row['it_id']); + } + + $row['it_basic'] = conv_content($row['it_basic'], 1); + $list[] = $row; + } + + if(function_exists('sql_data_seek')){ + sql_data_seek($result, 0); + } + } + + $file = $this->list_skin; + + if ($this->list_skin == "") { + return $this->count."번 item_list() 의 스킨파일이 지정되지 않았습니다."; + } else if (!file_exists($file)) { + return $file." 파일을 찾을 수 없습니다."; + } else { + ob_start(); + $list_mod = $this->list_mod; + include($file); + $content = ob_get_contents(); + ob_end_clean(); + return $content; + } + } +} + +// 장바구니 건수 검사 +function get_cart_count($cart_id) +{ + global $g5, $default; + + $sql = " select count(ct_id) as cnt from {$g5['g5_shop_cart_table']} where od_id = '$cart_id' "; + $row = sql_fetch($sql); + $cnt = (int)$row['cnt']; + return $cnt; +} + + +// 이미지를 얻는다 +function get_image($img, $width=0, $height=0, $img_id='') +{ + global $g5, $default; + + $full_img = G5_DATA_PATH.'/item/'.$img; + + if (file_exists($full_img) && $img) + { + if (!$width) + { + $size = getimagesize($full_img); + $width = $size[0]; + $height = $size[1]; + } + $str = ' 3) + continue; + + $filename = basename($file); + $filepath = dirname($file); + $img_width = $size[0]; + $img_height = $size[1]; + + break; + } + } + + if($img_width && !$height) { + $height = round(($width * $img_height) / $img_width); + } + + if($filename) { + //thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_height, $is_create, $is_crop=false, $crop_mode='center', $is_sharpen=true, $um_value='80/0.5/3') + $thumb = thumbnail($filename, $filepath, $filepath, $width, $height, false, $is_crop, 'center', false, $um_value='80/0.5/3'); + } + + if($thumb) { + $file_url = str_replace(G5_PATH, G5_URL, $filepath.'/'.$thumb); + $img = ''.$img_alt.''.$img.''; + + return run_replace('get_it_image_tag', $img, $thumb, $it_id, $width, $height, $anchor, $img_id, $img_alt, $is_crop); +} + +// 상품이미지 썸네일 생성 +function get_it_thumbnail($img, $width, $height=0, $id='', $is_crop=false) +{ + $str = ''; + + if ( $replace_tag = run_replace('get_it_thumbnail_tag', $str, $img, $width, $height, $id, $is_crop) ){ + return $replace_tag; + } + + $file = G5_DATA_PATH.'/item/'.$img; + if(is_file($file)) + $size = @getimagesize($file); + + if (! (isset($size) && is_array($size))) + return ''; + + if($size[2] < 1 || $size[2] > 3) + return ''; + + $img_width = $size[0]; + $img_height = $size[1]; + $filename = basename($file); + $filepath = dirname($file); + + if($img_width && !$height) { + $height = round(($width * $img_height) / $img_width); + } + + $thumb = thumbnail($filename, $filepath, $filepath, $width, $height, false, $is_crop, 'center', false, $um_value='80/0.5/3'); + + if($thumb) { + $file_url = str_replace(G5_PATH, G5_URL, $filepath.'/'.$thumb); + $str = ' 3) + continue; + + $filepath = $file; + break; + } + + if($filepath) + $str = str_replace(G5_PATH, G5_URL, $filepath); + else + $str = G5_SHOP_URL.'/img/no_image.gif'; + + return $str; +} + + +// 상품의 재고 (창고재고수량 - 주문대기수량) +function get_it_stock_qty($it_id) +{ + global $g5; + + $sql = " select it_stock_qty from {$g5['g5_shop_item_table']} where it_id = '$it_id' "; + $row = sql_fetch($sql); + $jaego = (int)$row['it_stock_qty']; + + // 재고에서 빼지 않았고 주문인것만 + $sql = " select SUM(ct_qty) as sum_qty + from {$g5['g5_shop_cart_table']} + where it_id = '$it_id' + and io_id = '' + and ct_stock_use = 0 + and ct_status in ('주문', '입금', '준비') "; + $row = sql_fetch($sql); + $daegi = (int)$row['sum_qty']; + + return $jaego - $daegi; +} + + +// 옵션의 재고 (창고재고수량 - 주문대기수량) +function get_option_stock_qty($it_id, $io_id, $type) +{ + global $g5; + + $sql = " select io_stock_qty + from {$g5['g5_shop_item_option_table']} + where it_id = '$it_id' and io_id = '$io_id' and io_type = '$type' and io_use = '1' "; + $row = sql_fetch($sql); + $jaego = (int)$row['io_stock_qty']; + + // 재고에서 빼지 않았고 주문인것만 + $sql = " select SUM(ct_qty) as sum_qty + from {$g5['g5_shop_cart_table']} + where it_id = '$it_id' + and io_id = '$io_id' + and io_type = '$type' + and ct_stock_use = 0 + and ct_status in ('주문', '입금', '준비') "; + $row = sql_fetch($sql); + $daegi = (int)$row['sum_qty']; + + return $jaego - $daegi; +} + + +// 큰 이미지 +function get_large_image($img, $it_id, $btn_image=true) +{ + global $g5; + + if (file_exists(G5_DATA_PATH.'/item/'.$img) && $img != '') + { + $size = getimagesize(G5_DATA_PATH.'/item/'.$img); + $width = $size[0]; + $height = $size[1]; + $str = ''; + if ($btn_image) + $str .= '큰이미지'; + } + else + $str = ''; + return $str; +} + + +// 금액 표시 +function display_price($price, $tel_inq=false) +{ + if ($tel_inq) + $price = '전화문의'; + else + $price = number_format($price, 0).'원'; + + return $price; +} + + +// 금액표시 +// $it : 상품 배열 +function get_price($it) +{ + global $member; + + if ($it['it_tel_inq']) return '전화문의'; + + $price = $it['it_price']; + + return (int)$price; +} + + +// 포인트 표시 +function display_point($point) +{ + return number_format($point, 0).'점'; +} + + +// 포인트를 구한다 +function get_point($amount, $point) +{ + return (int)($amount * $point / 100); +} + + +// 상품이미지 업로드 +function it_img_upload($srcfile, $filename, $dir) +{ + if($filename == '') + return ''; + + $size = @getimagesize($srcfile); + if($size[2] < 1 || $size[2] > 3) + return ''; + + //php파일도 getimagesize 에서 Image Type Flag 를 속일수 있다 + if (!preg_match('/\.(gif|jpe?g|png)$/i', $filename)) + return ''; + + if(!is_dir($dir)) { + @mkdir($dir, G5_DIR_PERMISSION); + @chmod($dir, G5_DIR_PERMISSION); + } + + $pattern = "/[#\&\+\-%@=\/\\:;,'\"\^`~\|\!\?\*\$#<>\(\)\[\]\{\}]/"; + + $filename = preg_replace("/\s+/", "", $filename); + $filename = preg_replace( $pattern, "", $filename); + + $filename = preg_replace_callback("/[가-힣]+/", '_callback_it_img_upload', $filename); + + $filename = preg_replace( $pattern, "", $filename); + $prepend = ''; + + // 동일한 이름의 파일이 있으면 파일명 변경 + if(is_file($dir.'/'.$filename)) { + for($i=0; $i<20; $i++) { + $prepend = str_replace('.', '_', microtime(true)).'_'; + + if(is_file($dir.'/'.$prepend.$filename)) { + usleep(mt_rand(100, 10000)); + continue; + } else { + break; + } + } + } + + $filename = $prepend.$filename; + + upload_file($srcfile, $filename, $dir); + + $file = str_replace(G5_DATA_PATH.'/item/', '', $dir.'/'.$filename); + + return $file; +} + +function _callback_it_img_upload($matches){ + return isset($matches[0]) ? base64_encode($matches[0]) : ''; +} + +// 파일을 업로드 함 +function upload_file($srcfile, $destfile, $dir) +{ + if ($destfile == "") return false; + // 업로드 한후 , 퍼미션을 변경함 + @move_uploaded_file($srcfile, $dir.'/'.$destfile); + @chmod($dir.'/'.$destfile, G5_FILE_PERMISSION); + return true; +} + + +function message($subject, $content, $align="left", $width="450") +{ + $str = " + + + + + + + + + + +
      $subject
      + + + + +
      $content
      +
      +
      + "; + return $str; +} + + +// 시간이 비어 있는지 검사 +function is_null_time($datetime) +{ + // 공란 0 : - 제거 + //$datetime = ereg_replace("[ 0:-]", "", $datetime); // 이 함수는 PHP 5.3.0 에서 배제되고 PHP 6.0 부터 사라집니다. + $datetime = preg_replace("/[ 0:-]/", "", $datetime); + if ($datetime == "") + return true; + else + return false; +} + + +// 출력유형, 스킨파일, 1라인이미지수, 총라인수, 이미지폭, 이미지높이 +// 1.02.01 $ca_id 추가 +//function display_type($type, $skin_file, $list_mod, $list_row, $img_width, $img_height, $ca_id="") +function display_type($type, $list_skin='', $list_mod='', $list_row='', $img_width='', $img_height='', $ca_id='') +{ + global $member, $g5, $config, $default; + + if (!$default["de_type{$type}_list_use"]) return ""; + + $list_skin = $list_skin ? $list_skin : $default["de_type{$type}_list_skin"]; + $list_mod = $list_mod ? $list_mod : $default["de_type{$type}_list_mod"]; + $list_row = $list_row ? $list_row : $default["de_type{$type}_list_row"]; + $img_width = $img_width ? $img_width : $default["de_type{$type}_img_width"]; + $img_height = $img_height ? $img_height : $default["de_type{$type}_img_height"]; + + // 상품수 + $items = $list_mod * $list_row; + + // 1.02.00 + // it_order 추가 + $sql = " select * from {$g5['g5_shop_item_table']} where it_use = '1' and it_type{$type} = '1' "; + if ($ca_id) $sql .= " and ca_id like '$ca_id%' "; + $sql .= " order by it_order, it_id desc limit $items "; + $result = sql_query($sql); + /* + if (!sql_num_rows($result)) { + return false; + } + */ + + //$file = G5_SHOP_PATH.'/'.$skin_file; + $file = G5_SHOP_SKIN_PATH.'/'.$list_skin; + if (!file_exists($file)) { + return G5_SHOP_SKIN_URL.'/'.$list_skin.' 파일을 찾을 수 없습니다.'; + } else { + $td_width = (int)(100 / $list_mod); + ob_start(); + include $file; + $content = ob_get_contents(); + ob_end_clean(); + return $content; + } +} + + +// 모바일 유형별 상품 출력 +function mobile_display_type($type, $skin_file, $list_row, $img_width, $img_height, $ca_id="") +{ + global $member, $g5, $config; + + // 상품수 + $items = $list_row; + + // 1.02.00 + // it_order 추가 + $sql = " select * from {$g5['g5_shop_item_table']} where it_use = '1' and it_type{$type} = '1' "; + if ($ca_id) $sql .= " and ca_id like '$ca_id%' "; + $sql .= " order by it_order, it_id desc limit $items "; + $result = sql_query($sql); + /* + if (!sql_num_rows($result)) { + return false; + } + */ + + $file = G5_MSHOP_PATH.'/'.$skin_file; + if (!file_exists($file)) { + echo $file.' 파일을 찾을 수 없습니다.'; + } else { + //$td_width = (int)(100 / $list_mod); + include $file; + } +} + + +// 분류별 출력 +// 스킨파일번호, 1라인이미지수, 총라인수, 이미지폭, 이미지높이 , 분류번호 +function display_category($no, $list_mod, $list_row, $img_width, $img_height, $ca_id="") +{ + global $member, $g5; + + // 상품수 + $items = $list_mod * $list_row; + + $sql = " select * from {$g5['g5_shop_item_table']} where it_use = '1'"; + if ($ca_id) + $sql .= " and ca_id LIKE '{$ca_id}%' "; + $sql .= " order by it_order, it_id desc limit $items "; + $result = sql_query($sql); + if (!sql_num_rows($result)) { + return false; + } + + $file = G5_SHOP_PATH.'/maintype'.$no.'.inc.php'; + if (!file_exists($file)) { + echo $file.' 파일을 찾을 수 없습니다.'; + } else { + $td_width = (int)(100 / $list_mod); + include $file; + } +} + + +// 별 +function get_star($score) +{ + $star = round($score); + if ($star > 5) $star = 5; + else if ($star < 0) $star = 0; + + return $star; +} + + +// 별 이미지 +function get_star_image($it_id) +{ + global $g5; + + $sql = "select (SUM(is_score) / COUNT(*)) as score from {$g5['g5_shop_item_use_table']} where it_id = '$it_id' and is_confirm = 1 "; + $row = sql_fetch($sql); + + return (int)get_star($row['score']); +} + + +// 메일 보내는 내용을 HTML 형식으로 만든다. +function email_content($str) +{ + global $g5; + + $s = ""; + $s .= "메일\n"; + $s .= "\n"; + $s .= $str; + $s .= "\n"; + $s .= ""; + + return $s; +} + + +// 타임스탬프 형식으로 넘어와야 한다. +// 시작시간, 종료시간 +function gap_time($begin_time, $end_time) +{ + $gap = $end_time - $begin_time; + $time['days'] = (int)($gap / 86400); + $time['hours'] = (int)(($gap - ($time['days'] * 86400)) / 3600); + $time['minutes'] = (int)(($gap - ($time['days'] * 86400 + $time['hours'] * 3600)) / 60); + $time['seconds'] = (int)($gap - ($time['days'] * 86400 + $time['hours'] * 3600 + $time['minutes'] * 60)); + return $time; +} + + +// 공란없이 이어지는 문자 자르기 (wayboard 참고 (way.co.kr)) +function continue_cut_str($str, $len=80) +{ + /* + $pattern = "[^ \n<>]{".$len."}"; + return eregi_replace($pattern, "\\0\n", $str); + */ + $pattern = "/[^ \n<>]{".$len."}/"; + return preg_replace($pattern, "\\0\n", $str); +} + + +// 제목별로 컬럼 정렬하는 QUERY STRING +// $type 이 1이면 반대 +function title_sort($col, $type=0) +{ + global $sort1, $sort2; + global $_SERVER; + global $page; + global $doc; + + $q1 = 'sort1='.$col; + if ($type) { + $q2 = 'sort2=desc'; + if ($sort1 == $col) { + if ($sort2 == 'desc') { + $q2 = 'sort2=asc'; + } + } + } else { + $q2 = 'sort2=asc'; + if ($sort1 == $col) { + if ($sort2 == 'asc') { + $q2 = 'sort2=desc'; + } + } + } + #return "$_SERVER[SCRIPT_NAME]?$q1&$q2&page=$page"; + return "{$_SERVER['SCRIPT_NAME']}?$q1&$q2&page=$page"; +} + +// 세션값을 체크하여 이쪽에서 온것이 아니면 메인으로 +function session_check() +{ + global $g5; + + if (!trim(get_session('ss_uniqid'))) + gotourl(G5_SHOP_URL); +} + +// 상품 선택옵션 +function get_item_options($it_id, $subject, $is_div='', $is_first_option_title='') +{ + global $g5; + + if(!$it_id || !$subject) + return ''; + + $sql = " select * from {$g5['g5_shop_item_option_table']} where io_type = '0' and it_id = '$it_id' and io_use = '1' order by io_no asc "; + $result = sql_query($sql); + if(!sql_num_rows($result)) + return ''; + + $str = ''; + $subj = explode(',', $subject); + $subj_count = count($subj); + + if($subj_count > 1) { + $options = array(); + + // 옵션항목 배열에 저장 + for($i=0; $row=sql_fetch_array($result); $i++) { + $opt_id = explode(chr(30), $row['io_id']); + + for($k=0; $k<$subj_count; $k++) { + if(! (isset($options[$k]) && is_array($options[$k]))) + $options[$k] = array(); + + if(isset($opt_id[$k]) && $opt_id[$k] && !in_array($opt_id[$k], $options[$k])) + $options[$k][] = $opt_id[$k]; + } + } + + // 옵션선택목록 만들기 + for($i=0; $i<$subj_count; $i++) { + $opt = $options[$i]; + $opt_count = count($opt); + $disabled = ''; + if($opt_count) { + $seq = $i + 1; + if($i > 0) + $disabled = ' disabled="disabled"'; + + if($is_div === 'div') { + $str .= '
      '.PHP_EOL; + $str .= ''.PHP_EOL; + } else { + $str .= ''.PHP_EOL; + $str .= ''.PHP_EOL; + } + + $select = ''.PHP_EOL; + + if($is_div === 'div') { + $str .= ''.$select.''.PHP_EOL; + $str .= '
      '.PHP_EOL; + } else { + $str .= ''.$select.''.PHP_EOL; + $str .= ''.PHP_EOL; + } + } + } + } else { + if($is_div === 'div') { + $str .= '
      '.PHP_EOL; + $str .= ''.PHP_EOL; + } else { + $str .= ''.PHP_EOL; + $str .= ''.PHP_EOL; + } + + $select = ''.PHP_EOL; + + if($is_div === 'div') { + $str .= ''.$select.''.PHP_EOL; + $str .= '
      '.PHP_EOL; + } else { + $str .= ''.$select.''.PHP_EOL; + $str .= ''.PHP_EOL; + } + + } + + return $str; +} + +// 상품 추가옵션 +function get_item_supply($it_id, $subject, $is_div='', $is_first_option_title='') +{ + global $g5; + + if(!$it_id || !$subject) + return ''; + + $sql = " select * from {$g5['g5_shop_item_option_table']} where io_type = '1' and it_id = '$it_id' and io_use = '1' order by io_no asc "; + $result = sql_query($sql); + if(!sql_num_rows($result)) + return ''; + + $str = ''; + + $subj = explode(',', $subject); + $subj_count = count($subj); + $options = array(); + + // 옵션항목 배열에 저장 + for($i=0; $row=sql_fetch_array($result); $i++) { + $opt_id = explode(chr(30), $row['io_id']); + + if($opt_id[0] && !array_key_exists($opt_id[0], $options)) + $options[$opt_id[0]] = array(); + + if(strlen($opt_id[1])) { + if($row['io_price'] >= 0) + $price = '  + '.number_format($row['io_price']).'원'; + else + $price = '   '.number_format($row['io_price']).'원'; + $io_stock_qty = get_option_stock_qty($it_id, $row['io_id'], $row['io_type']); + + if($io_stock_qty < 1) + $soldout = '  [품절]'; + else + $soldout = ''; + + $options[$opt_id[0]][] = ''; + } + } + + // 옵션항목 만들기 + for($i=0; $i<$subj_count; $i++) { + $opt = (isset($subj[$i]) && isset($options[$subj[$i]])) ? $options[$subj[$i]] : array(); + $opt_count = count($opt); + if($opt_count) { + $seq = $i + 1; + if($is_div === 'div') { + $str .= '
      '.PHP_EOL; + $str .= ''.PHP_EOL; + } else { + $str .= ''.PHP_EOL; + $str .= ''.PHP_EOL; + } + + $first_option_title = $is_first_option_title ? $subj[$i] : '선택'; + + $select = ''.PHP_EOL; + + if($is_div === 'div') { + $str .= ''.$select.''.PHP_EOL; + $str .= '
      '.PHP_EOL; + } else { + $str .= ''.$select.''.PHP_EOL; + $str .= ''.PHP_EOL; + } + } + } + + return $str; +} + +function print_item_options($it_id, $cart_id) +{ + global $g5; + + $sql = " select ct_option, ct_qty, io_price + from {$g5['g5_shop_cart_table']} where it_id = '$it_id' and od_id = '$cart_id' order by io_type asc, ct_id asc "; + $result = sql_query($sql); + + $str = ''; + for($i=0; $row=sql_fetch_array($result); $i++) { + if($i == 0) + $str .= '
        '.PHP_EOL; + $price_plus = ''; + if($row['io_price'] >= 0) + $price_plus = '+'; + $str .= '
      • '.get_text($row['ct_option']).' '.$row['ct_qty'].'개 ('.$price_plus.display_price($row['io_price']).')
      • '.PHP_EOL; + } + + if($i > 0) + $str .= '
      '; + + return $str; +} + + +// 일자형식변환 +function date_conv($date, $case=1) +{ + if ($case == 1) { // 년-월-일 로 만들어줌 + $date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "\\1-\\2-\\3", $date); + } else if ($case == 2) { // 년월일 로 만들어줌 + $date = preg_replace("/-/", "", $date); + } + + return $date; +} + + +// 배너출력 +function display_banner($position, $skin='') +{ + global $g5; + + if (!$position) $position = '왼쪽'; + if (!$skin) $skin = 'boxbanner.skin.php'; + + $skin_path = G5_SHOP_SKIN_PATH.'/'.$skin; + if(G5_IS_MOBILE) + $skin_path = G5_MSHOP_SKIN_PATH.'/'.$skin; + + if(file_exists($skin_path)) { + // 접속기기 + $sql_device = " and ( bn_device = 'both' or bn_device = 'pc' ) "; + if(G5_IS_MOBILE) + $sql_device = " and ( bn_device = 'both' or bn_device = 'mobile' ) "; + + // 배너 출력 + $sql = " select * from {$g5['g5_shop_banner_table']} where '".G5_TIME_YMDHIS."' between bn_begin_time and bn_end_time $sql_device and bn_position = '$position' order by bn_order, bn_id desc "; + $result = sql_query($sql); + + include $skin_path; + } else { + echo '

      '.str_replace(G5_PATH.'/', '', $skin_path).'파일이 존재하지 않습니다.

      '; + } +} + + +// 1.00.02 +// 파일번호, 이벤트번호, 1라인이미지수, 총라인수, 이미지폭, 이미지높이 +// 1.02.01 $ca_id 추가 +function display_event($no, $event, $list_mod, $list_row, $img_width, $img_height, $ca_id="") +{ + global $member, $g5; + + // 상품수 + $items = $list_mod * $list_row; + + // 1.02.00 + // b.it_order 추가 + $sql = " select b.* from {$g5['g5_shop_event_item_table']} a, {$g5['g5_shop_item_table']} b where a.it_id = b.it_id and b.it_use = '1' and a.ev_id = '$event' "; + if ($ca_id) $sql .= " and ca_id = '$ca_id' "; + $sql .= " order by b.it_order, a.it_id desc limit $items "; + $result = sql_query($sql); + if (!sql_num_rows($result)) { + return false; + } + + $file = G5_SHOP_PATH.'/maintype'.$no.'.inc.php'; + if (!file_exists($file)) { + echo $file.' 파일을 찾을 수 없습니다.'; + } else { + $td_width = (int)(100 / $list_mod); + include $file; + } +} + + +function get_yn($val, $case='') +{ + switch ($case) { + case '1' : $result = ($val > 0) ? 'Y' : 'N'; break; + default : $result = ($val > 0) ? '예' : '아니오'; + } + return $result; +} + + +// 상품명과 건수를 반환 +function get_goods($cart_id) +{ + global $g5; + + // 상품명만들기 + $row = sql_fetch(" select a.it_id, b.it_name from {$g5['g5_shop_cart_table']} a, {$g5['g5_shop_item_table']} b where a.it_id = b.it_id and a.od_id = '$cart_id' order by ct_id limit 1 "); + // 상품명에 "(쌍따옴표)가 들어가면 오류 발생함 + $goods['it_id'] = $row['it_id']; + $goods['full_name']= $goods['name'] = addslashes($row['it_name']); + // 특수문자제거 + $goods['full_name'] = preg_replace ("/[ #\&\+\-%@=\/\\\:;,\.'\"\^`~\_|\!\?\*$#<>()\[\]\{\}]/i", "", $goods['full_name']); + + // 상품건수 + $row = sql_fetch(" select count(*) as cnt from {$g5['g5_shop_cart_table']} where od_id = '$cart_id' "); + $cnt = $row['cnt'] - 1; + if ($cnt) + $goods['full_name'] .= ' 외 '.$cnt.'건'; + $goods['count'] = $row['cnt']; + + return $goods; +} + + +// 패턴의 내용대로 해당 디렉토리에서 정렬하여 '.PHP_EOL; + } + } else { + $field .= ''.PHP_EOL; + } + } + + return $field; +} + +// 주문요청기록 로그를 남깁니다. +function add_order_post_log($msg='', $code='error'){ + global $g5, $member; + + if( empty($_POST) ) return; + + $post_data = base64_encode(serialize($_POST)); + $od_id = get_session('ss_order_id'); + + if( $code === 'delete' ){ + sql_query(" delete from {$g5['g5_shop_post_log_table']} where (oid = '$od_id' and mb_id = '{$member['mb_id']}' and ol_code != 'error') OR ol_datetime < '".date('Y-m-d H:i:s', strtotime('-15 day', G5_SERVER_TIME))."' ", false); + return; + } + + if ( $code === 'error' ) { + $result = sql_query("describe `{$g5['g5_shop_post_log_table']}`"); + while ($row = sql_fetch_array($result)){ + if( $row['Field'] === 'ol_msg' && $row['Type'] === 'varchar(255)' ){ + sql_query("ALTER TABLE `{$g5['g5_shop_post_log_table']}` MODIFY ol_msg TEXT NOT NULL;", false); + sql_query("ALTER TABLE `{$g5['g5_shop_post_log_table']}` DROP PRIMARY KEY;", false); + sql_query("ALTER TABLE `{$g5['g5_shop_post_log_table']}` ADD `log_id` int(11) NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (`log_id`);", false); + break; + } + } + } + + $sql = "insert into `{$g5['g5_shop_post_log_table']}` + set oid = '$od_id', + mb_id = '{$member['mb_id']}', + post_data = '$post_data', + ol_code = '$code', + ol_msg = '".addslashes($msg)."', + ol_datetime = '".G5_TIME_YMDHIS."', + ol_ip = '{$_SERVER['REMOTE_ADDR']}'"; + + if( $result = sql_query($sql, false) ){ + sql_query(" delete from {$g5['g5_shop_post_log_table']} where ol_datetime < '".date('Y-m-d H:i:s', strtotime('-15 day', G5_SERVER_TIME))."' ", false); + } else { + if(!sql_query(" DESC {$g5['g5_shop_post_log_table']} ", false)) { + sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['g5_shop_post_log_table']}` ( + `log_id` int(11) NOT NULL AUTO_INCREMENT, + `oid` bigint(20) unsigned NOT NULL, + `mb_id` varchar(255) NOT NULL DEFAULT '', + `post_data` text NOT NULL, + `ol_code` varchar(255) NOT NULL DEFAULT '', + `ol_msg` text NOT NULL, + `ol_datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `ol_ip` varchar(25) NOT NULL DEFAULT '', + PRIMARY KEY (`log_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8; ", false); + } + } +} + +//이니시스의 삼성페이 또는 L.pay 결제 또는 카카오페이 가 활성화 되어 있는지 체크합니다. +function is_inicis_simple_pay(){ + global $default; + + if ( $default['de_samsung_pay_use'] || $default['de_inicis_lpay_use'] || $default['de_inicis_kakaopay_use'] ){ + return true; + } + + return false; +} + +//이니시스의 취소된 주문인지 또는 삼성페이 또는 L.pay 또는 이니시스 카카오페이 결제인지 확인합니다. +function is_inicis_order_pay($type){ + global $default, $g5; + + if( $default['de_pg_service'] === 'inicis' && get_session('P_TID') ){ + $tid = preg_replace('/[^A-Za-z0-9_\-]/', '', get_session('P_TID')); + $sql = "select P_TID from `{$g5['g5_shop_inicis_log_table']}` where P_TID = '$tid' and P_STATUS = 'cancel' "; + + $row = sql_fetch($sql); + + if(isset($row['P_TID']) && $row['P_TID']){ + alert("이미 취소된 주문입니다.", G5_SHOP_URL); + } + } + + if( in_array($type, array('삼성페이', 'lpay', 'inicis_kakaopay') ) ){ + return true; + } + + return false; +} + +function get_item_images_info($it, $size=array(), $image_width, $image_height){ + + if( !(is_array($it) && $it) ) return array(); + $images = array(); + + for($i=1; $i<=10; $i++) { + if(!$it['it_img'.$i]) continue; + $file = G5_DATA_PATH.'/item/'.$it['it_img'.$i]; + if( $is_exists = run_replace('is_exists_item_file', is_file($file), $it, $i) ){ + $thumb = get_it_thumbnail($it['it_img'.$i], $image_width, $image_height); + $attr = (isset($size[0]) && isset($size[1]) && $size[0] && $size[1]) ? 'width="'.$size[0].'" height="'.$size[1].'" ' : ''; + $imageurl = G5_DATA_URL.'/item/'.$it['it_img'.$i]; + $infos = array( + 'thumb'=>$thumb, + 'imageurl'=>$imageurl, + 'imagehtml'=>''.get_text($it['it_name']).'', + ); + $images[$i] = run_replace('get_image_by_item', $infos, $it, $i, $size); + } + } + return $images; +} + +//결제방식 이름을 체크하여 치환 대상인 문자열은 따로 리턴합니다. +function check_pay_name_replace($payname, $od=array(), $is_client=0){ + + if( $payname === 'lpay' ){ + return 'L.pay'; + } else if($payname === 'inicis_kakaopay'){ + return '카카오페이(KG이니시스)'; + } else if($payname === '신용카드'){ + if(isset($od['od_bank_account']) && $od['od_bank_account'] === '카카오머니'){ + return $payname.'(카카오페이)'; + } + } else if($payname === '간편결제'){ + + $add_str = $is_client ? '('.$payname.')' : ''; + + if( isset($od['od_pg']) && $od['od_pg'] === 'lg' ){ + return 'PAYNOW'; + } else if( isset($od['od_pg']) && $od['od_pg'] === 'inicis' ){ + return 'KPAY'; + } else if( isset($od['od_pg']) && $od['od_pg'] === 'kcp' ){ + if( isset($od['od_other_pay_type']) && $od['od_other_pay_type'] === 'OT16' ){ + return '네이버페이_NHNKCP'.$add_str; + } else if( isset($od['od_other_pay_type']) && ($od['od_other_pay_type'] === 'OT13' || $od['od_other_pay_type'] === 'NHNKCP_KAKAOMONEY') ){ + return '카카오페이_NHNKCP'.$add_str; + } + + return 'PAYCO'.$add_str; + } + } + + return $payname; +} + +// 다운로드한 쿠폰인지 +function is_coupon_downloaded($mb_id, $cz_id) +{ + global $g5; + + if(!$mb_id) + return false; + + $sql = " select count(*) as cnt from {$g5['g5_shop_coupon_table']} where mb_id = '$mb_id' and cz_id = '$cz_id' "; + $row = sql_fetch($sql); + + return ($row['cnt'] > 0); +} + +//============================================================================== +// 쇼핑몰 라이브러리 모음 끝 +//==============================================================================; \ No newline at end of file diff --git a/lib/shop.uri.lib.php b/lib/shop.uri.lib.php new file mode 100644 index 000000000..3e46838d6 --- /dev/null +++ b/lib/shop.uri.lib.php @@ -0,0 +1,225 @@ + 1 && ! preg_match('/^(list|type)\-([^\/]+)/i', $no) ){ + $item = get_shop_item($no, true); + $segments[2] = (isset($item['it_seo_title']) && $item['it_seo_title']) ? urlencode($item['it_seo_title']).'/' : urlencode($no); + } else { + $segments[2] = urlencode($no); + } + + if($query_string) { + // If the first character of the query string is '&', replace it with '?'. + if(substr($query_string, 0, 1) == '&') { + $add_query = preg_replace("/\&/", "?", $query_string, 1); + } else { + $add_query = '?'. $query_string; + } + } + } else { + + if( preg_match('/^list\-([^\/]+)/i', $no) ){ + $url = G5_SHOP_URL. '/list.php?ca_id='.urlencode($no); + } else if( preg_match('/^type\-([^\/]+)/i', $no) ){ + $url = G5_SHOP_URL. '/listtype.php?type='.urlencode($no); + } else { + $url = G5_SHOP_URL. '/item.php?it_id='.urlencode($no); + } + + if($query_string) { + $url .= ($no ? '?' : '&'). $query_string; + } + + $segments[0] = $url; + } + + return implode('/', $segments).$add_query; +} + +function shop_short_url_clean($string_url, $url, $page_name, $array_page_names){ + + global $config, $g5; + + if( $config['cf_bbs_rewrite'] && stripos($string_url, G5_SHOP_URL) !== false && in_array($page_name, array('item', 'list', 'listtype')) ){ + + parse_str($url['query'], $vars); + + $allow_param_keys = array('it_id'=>'', 'ca_id'=>'', 'type'=>''); + + $s = array('shop_dir'=>G5_SHOP_DIR); + + foreach( $allow_param_keys as $key=>$v ){ + if( !isset($vars[$key]) || empty($vars[$key]) ) continue; + + $key_value = $vars[$key]; + + if( $key === 'ca_id' ){ + $key_value = 'list-'.$vars[$key]; + } else if ( $key === 'type' ){ + $key_value = 'type-'.$vars[$key]; + } + + $s[$key] = $key_value; + } + + if( $config['cf_bbs_rewrite'] > 1 && $page_name === 'item' && (isset($s['it_id']) && $s['it_id']) ){ + $get_item = get_shop_item($s['it_id'], true); + + if( $get_item['it_seo_title'] ){ + unset($s['it_id']); + $s['it_seo_title'] = urlencode($get_item['it_seo_title']).'/'; + } + } + + $fragment = isset($url['fragment']) ? '#'.$url['fragment'] : ''; + + $host = G5_URL; + + if( isset($url['host']) ){ + + $array_file_paths = run_replace('url_clean_page_paths', array('/'.G5_SHOP_DIR.'/item.php', '/'.G5_SHOP_DIR.'/list.php', '/'.G5_SHOP_DIR.'/listtype.php')); + + $str_path = isset($url['path']) ? $url['path'] : ''; + $http = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') ? 'https://' : 'http://'; + $port = (isset($url['port']) && ($url['port']!==80 || $url['port']!==443)) ? ':'.$url['port'] : ''; + $host = $http.$url['host'].$port.str_replace($array_file_paths, '', $str_path); + } + + $add_param = ''; + + if( $result = array_diff_key($vars, $allow_param_keys ) ){ + $add_param = '?'.http_build_query($result,'','&'); + } + + if( $add_qry ){ + $add_param .= $add_param ? '&'.$add_qry : '?'.$add_qry; + } + + foreach($s as $k => $v) { $return_url .= '/'.$v; } + + return $host.$return_url.$add_param.$fragment; + } + + return $string_url; +} + +function add_shop_nginx_conf_rules($rules, $get_path_url, $base_path, $return_string=false){ + + $add_rules = array(); + + $add_rules[] = "rewrite ^{$base_path}shop/list-([0-9a-z]+)$ {$base_path}".G5_SHOP_DIR."/list.php?ca_id=$1&rewrite=1 break;"; + $add_rules[] = "rewrite ^{$base_path}shop/type-([0-9a-z]+)$ {$base_path}".G5_SHOP_DIR."/listtype.php?type=$1&rewrite=1 break;"; + $add_rules[] = "rewrite ^{$base_path}shop/([0-9a-zA-Z_\-]+)$ {$base_path}".G5_SHOP_DIR."/item.php?it_id=$1&rewrite=1 break;"; + $add_rules[] = "rewrite ^{$base_path}shop/([^/]+)/$ {$base_path}".G5_SHOP_DIR."/item.php?it_seo_title=$1&rewrite=1 break;"; + + return implode("\n", $add_rules).$rules; + +} + +function add_shop_mod_rewrite_rules($rules, $get_path_url, $base_path, $return_string=false){ + + $add_rules = array(); + + $add_rules[] = 'RewriteRule ^shop/list-([0-9a-z]+)$ '.G5_SHOP_DIR.'/list.php?ca_id=$1&rewrite=1 [QSA,L]'; + $add_rules[] = 'RewriteRule ^shop/type-([0-9a-z]+)$ '.G5_SHOP_DIR.'/listtype.php?type=$1&rewrite=1 [QSA,L]'; + $add_rules[] = 'RewriteRule ^shop/([0-9a-zA-Z_\-]+)$ '.G5_SHOP_DIR.'/item.php?it_id=$1&rewrite=1 [QSA,L]'; + $add_rules[] = 'RewriteRule ^shop/([^/]+)/$ '.G5_SHOP_DIR.'/item.php?it_seo_title=$1&rewrite=1 [QSA,L]'; + + return implode("\n", $add_rules).$rules; + +} + +function add_shop_admin_dbupgrade($is_check){ + global $g5; + + // 내용 관리 짧은 주소 + $sql = " SHOW COLUMNS FROM `{$g5['g5_shop_item_table']}` LIKE 'it_seo_title' "; + $row = sql_fetch($sql); + + if( !$row ){ + sql_query("ALTER TABLE `{$g5['g5_shop_item_table']}` + ADD `it_seo_title` varchar(200) NOT NULL DEFAULT '' AFTER `it_name`, + ADD INDEX `it_seo_title` (`it_seo_title`); + ", false); + + $is_check = true; + } + + return $is_check; + +} + +function shop_exist_check_seo_title($seo_title, $type, $shop_item_table, $it_id){ + + $sql = "select it_seo_title FROM {$shop_item_table} WHERE it_seo_title = '".sql_real_escape_string($seo_title)."' AND it_id <> '$it_id' limit 1"; + $row = sql_fetch($sql, false); + + if( isset($row['it_seo_title']) && $row['it_seo_title'] ){ + return 'is_exists'; + } + + return ''; +} + +function shop_seo_title_update($it_id, $is_edit=false){ + global $g5; + + $shop_item_cache = $is_edit ? false : true; + $item = get_shop_item($it_id, $shop_item_cache); + + if( (! $item['it_seo_title'] || $is_edit) && $item['it_name'] ){ + $it_seo_title = exist_seo_title_recursive('shop', generate_seo_title($item['it_name']), $g5['g5_shop_item_table'], $item['it_id']); + + if( isset($item['it_seo_title']) && $it_seo_title !== $item['it_seo_title'] ){ + $sql = " update `{$g5['g5_shop_item_table']}` set it_seo_title = '{$it_seo_title}' where it_id = '{$item['it_id']}' "; + sql_query($sql); + } + } +} \ No newline at end of file diff --git a/lib/thumbnail.lib.php b/lib/thumbnail.lib.php index f983100ff..7b71bc9de 100644 --- a/lib/thumbnail.lib.php +++ b/lib/thumbnail.lib.php @@ -85,7 +85,7 @@ function get_file_thumbnail($file){ if( ! is_array($file) ) return ''; - if( preg_match('/(\.jpg|\.jpeg|\.gif|\.png|\.bmp)$/i', $file['file']) && $contents = run_replace('get_file_thumbnail_tags', '', $file) ){ + if( preg_match('/(\.jpg|\.jpeg|\.gif|\.png|\.bmp|\.webp)$/i', $file['file']) && $contents = run_replace('get_file_thumbnail_tags', '', $file) ){ return $contents; } else if ($file['view']) { return get_view_thumbnail($file['view']); @@ -108,6 +108,8 @@ function get_view_thumbnail($contents, $thumb_width=0) if(empty($matches)) return $contents; + $extensions = array(1=>'gif', 2=>'jpg', 3=>'png', 18=>'webp'); + for($i=0; $i 3) // gif, jpg, png 에 대해서만 적용 - return; + + $extensions = array(1 => 'gif', 2 => 'jpg', 3 => 'png', 18 => 'webp'); + $file_ext = $extensions[$size[2]]; // 파일 확장자 + if (!$file_ext) return; + + // gif, jpg, png, webp 에 대해서만 적용 + // if ( !(isset($size[2]) && ($size[2] == 1 || $size[2] == 2 || $size[2] == 3 || $size[2] == 18)) ) + // return; + + // $extensions 배열에 없는 확장자 라면 썸네일 만들지 않음 + // if (!in_array($file_ext, $extensions)) + // return; if (!is_dir($target_path)) { @mkdir($target_path, G5_DIR_PERMISSION); @@ -240,16 +256,19 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h return ''; // Animated GIF는 썸네일 생성하지 않음 - if($size[2] == 1) { + if($file_ext === 'gif') { if(is_animated_gif($source_file)) return basename($source_file); + } else if ($file_ext === 'webp') { + if(is_animated_webp($source_file)) + return basename($source_file); } - $ext = array(1 => 'gif', 2 => 'jpg', 3 => 'png'); $thumb_filename = preg_replace("/\.[^\.]+$/i", "", $filename); // 확장자제거 - $thumb_file = "$target_path/thumb-{$thumb_filename}_{$thumb_width}x{$thumb_height}.".$ext[$size[2]]; - + // $thumb_file = "$target_path/thumb-{$thumb_filename}_{$thumb_width}x{$thumb_height}.".$ext[$size[2]]; + $thumb_file = "$target_path/thumb-{$thumb_filename}_{$thumb_width}x{$thumb_height}.".$file_ext; + $thumb_time = @filemtime($thumb_file); $source_time = @filemtime($source_file); @@ -263,10 +282,10 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h $src = null; $degree = 0; - if ($size[2] == 1) { + if ($file_ext === 'gif') { $src = @imagecreatefromgif($source_file); $src_transparency = @imagecolortransparent($src); - } else if ($size[2] == 2) { + } else if ($file_ext === 'jpg') { $src = @imagecreatefromjpeg($source_file); if(function_exists('exif_read_data')) { @@ -298,9 +317,12 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h } } } - } else if ($size[2] == 3) { + } else if ($file_ext === 'png') { $src = @imagecreatefrompng($source_file); @imagealphablending($src, true); + } else if ($file_ext === 'webp') { + $src = @imagecreatefromwebp($source_file); + @imagealphablending($src, true); } else { return; } @@ -363,10 +385,10 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h $dst = imagecreatetruecolor($dst_w, $dst_h); - if($size[2] == 3) { + if($file_ext === 'png') { imagealphablending($dst, false); imagesavealpha($dst, true); - } else if($size[2] == 1) { + } else if($file_ext === 'gif') { $palletsize = imagecolorstotal($src); if($src_transparency >= 0 && $src_transparency < $palletsize) { $transparent_color = imagecolorsforindex($src, $src_transparency); @@ -391,12 +413,12 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h } } - if($size[2] == 3) { + if($file_ext === 'png') { $bgcolor = imagecolorallocatealpha($dst, 0, 0, 0, 127); imagefill($dst, 0, 0, $bgcolor); imagealphablending($dst, false); imagesavealpha($dst, true); - } else if($size[2] == 1) { + } else if($file_ext === 'gif') { $palletsize = imagecolorstotal($src); if($src_transparency >= 0 && $src_transparency < $palletsize) { $transparent_color = imagecolorsforindex($src, $src_transparency); @@ -474,12 +496,12 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h } } - if($size[2] == 3) { + if($file_ext === 'png') { $bgcolor = imagecolorallocatealpha($dst, 0, 0, 0, 127); imagefill($dst, 0, 0, $bgcolor); imagealphablending($dst, false); imagesavealpha($dst, true); - } else if($size[2] == 1) { + } else if($file_ext === 'gif') { $palletsize = imagecolorstotal($src); if($src_transparency >= 0 && $src_transparency < $palletsize) { $transparent_color = imagecolorsforindex($src, $src_transparency); @@ -502,22 +524,24 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h UnsharpMask($dst, $val[0], $val[1], $val[2]); } - if($size[2] == 1) { + if($file_ext === 'gif') { imagegif($dst, $thumb_file); - } else if($size[2] == 3) { + } else if($file_ext === 'png') { if(!defined('G5_THUMB_PNG_COMPRESS')) $png_compress = 5; else $png_compress = G5_THUMB_PNG_COMPRESS; imagepng($dst, $thumb_file, $png_compress); - } else { + } else if ($file_ext === 'jpg') { if(!defined('G5_THUMB_JPG_QUALITY')) $jpg_quality = 90; else $jpg_quality = G5_THUMB_JPG_QUALITY; imagejpeg($dst, $thumb_file, $jpg_quality); + } else if ($file_ext === 'webp') { + imagewebp($dst, $thumb_file); } chmod($thumb_file, G5_FILE_PERMISSION); // 추후 삭제를 위하여 파일모드 변경 @@ -695,6 +719,22 @@ and the roundoff errors in the Gaussian blur process, are welcome. } +// 움직이는 webp 파일인지 검사한다. +// 출처) https://stackoverflow.com/questions/45190469/how-to-identify-whether-webp-image-is-static-or-animated?answertab=votes#tab-top +function is_animated_webp($filename) { + $contents = file_get_contents($filename); + $where = strpos($contents, "ANMF"); + if ($where !== false){ + // animated + $is_animated = true; + } + else{ + // non animated + $is_animated = false; + } + return $is_animated; +} + function is_animated_gif($filename) { static $cache = array(); diff --git a/lib/uri.lib.php b/lib/uri.lib.php index 5561cd839..e1443ea8c 100644 --- a/lib/uri.lib.php +++ b/lib/uri.lib.php @@ -193,7 +193,7 @@ function correct_goto_url($url){ return $url; } -function generate_seo_title($string, $wordLimit=G5_SEO_TITEL_WORD_CUT){ +function generate_seo_title($string, $wordLimit=G5_SEO_TITLE_WORD_CUT){ $separator = '-'; if($wordLimit != 0){ diff --git a/mobile/head.php b/mobile/head.php index 120655238..eea8aabe7 100644 --- a/mobile/head.php +++ b/mobile/head.php @@ -68,6 +68,9 @@ include_once(G5_LIB_PATH.'/popular.lib.php'); if ($i == 0) { ?>
    • 메뉴 준비 중입니다.
      관리자모드 > 환경설정 > 메뉴설정에서 설정하세요.
    • + +
    • 쇼핑몰
    • +
    • FAQ
    • diff --git a/mobile/newwin.inc.php b/mobile/newwin.inc.php index 4e1c051fc..e4965783a 100644 --- a/mobile/newwin.inc.php +++ b/mobile/newwin.inc.php @@ -1,9 +1,15 @@ diff --git a/mobile/shop/_common.php b/mobile/shop/_common.php new file mode 100644 index 000000000..0d3fe190d --- /dev/null +++ b/mobile/shop/_common.php @@ -0,0 +1,19 @@ +\'\"\\\'\\\"\%\=\(\)\s]/", "", $sort); +} else { + $sort = ''; +} + +if (isset($_REQUEST['sortodr'])) { + $sortodr = preg_match("/^(asc|desc)$/i", $sortodr) ? $sortodr : ''; +} else { + $sortodr = ''; +} + +if (!defined('G5_USE_SHOP') || !G5_USE_SHOP) + die('

      쇼핑몰 설치 후 이용해 주십시오.

      '); +define('_SHOP_', true); \ No newline at end of file diff --git a/mobile/shop/_head.php b/mobile/shop/_head.php new file mode 100644 index 000000000..f5355ec44 --- /dev/null +++ b/mobile/shop/_head.php @@ -0,0 +1,3 @@ + + + + + +
      + +
      + + +
      + + +
      + + +
        + '; + $a2 = ''; + $image_width = 65; + $image_height = 65; + $image = get_it_image($row['it_id'], $image_width, $image_height); + + $it_name = $a1 . stripslashes($row['it_name']) . $a2; + $it_options = print_item_options($row['it_id'], $s_cart_id); + if($it_options) { + $mod_options = ''; + // $it_name .= ; + } + + // 배송비 + switch($row['ct_send_cost']) + { + case 1: + $ct_send_cost = '착불'; + break; + case 2: + $ct_send_cost = '무료'; + break; + default: + $ct_send_cost = '선불'; + break; + } + + // 조건부무료 + if($row['it_sc_type'] == 2) { + $sendcost = get_item_sendcost($row['it_id'], $sum['price'], $sum['qty'], $s_cart_id); + + if($sendcost == 0) + $ct_send_cost = '무료'; + } + + $point = $sum['point']; + $sell_price = $sum['price']; + ?> + +
      • + + + +
        +
        + + +
        +
        +
        +
        +
        +
        +
        + 판매가 + 수량 + 배송비 + 적립포인트 +
        +
        소계
        +
      • + + 장바구니에 담긴 상품이 없습니다.'; + } else { + // 배송비 계산 + $send_cost = get_sendcost($s_cart_id, 0); + } + ?> +
      + +
      + + +
      + + + + +
      + 0 || $send_cost > 0) { + ?> +
      + 0) { // 배송비가 0 보다 크다면 (있다면) ?> +
      배송비
      +
      + + + 0) { ?> +
      포인트
      +
      +
      총계
      +
      + +
      + + +
      +
      총계 +
      + + + + +
      + + + + + +
      + + + + + +
    '.PHP_EOL; + else + echo '

    등록된 분류가 없습니다.

    '.PHP_EOL; + ?> +
    + + + + +
    +
    + diff --git a/mobile/shop/coupon.php b/mobile/shop/coupon.php new file mode 100644 index 000000000..8cf39c903 --- /dev/null +++ b/mobile/shop/coupon.php @@ -0,0 +1,81 @@ += '".G5_TIME_YMD."' + order by cp_no "; +$result = sql_query($sql); +?> + + +
    +

    +
      + '.$row['cp_price'].' %'; + else + $cp_price = ''.number_format($row['cp_price']).' 원'; + + $cp_count++; + ?> +
    • +
      +
      + +
      +
      + + ~ +
      +
    • + 사용할 수 있는 쿠폰이 없습니다.'; + ?> +
    + +
    +
    + +이벤트 관리
    '; +?> + +
    + + +'.conv_content($ev['ev_head_html'], 1).'
    '; + +// 상품 출력순서가 있다면 +if ($sort != "") + $order_by = $sort.' '.$sortodr.' , b.it_order, b.it_id desc'; +else + $order_by = 'b.it_order, b.it_id desc'; + +if ($skin) { + $skin = preg_replace('#\.+(\/|\\\)#', '', $skin); + $ev['ev_skin'] = $skin; +} + + +define('G5_SHOP_CSS_URL', G5_MSHOP_SKIN_URL); + +// 리스트 유형별로 출력 +$list_file = G5_SHOP_SKIN_PATH."/{$ev['ev_mobile_skin']}"; +if (file_exists($list_file)) +{ + include G5_MSHOP_SKIN_PATH.'/list.sort.skin.php'; + + // 총몇개 = 한줄에 몇개 * 몇줄 + $items = $ev['ev_mobile_list_mod'] * $ev['ev_mobile_list_row']; + // 페이지가 없으면 첫 페이지 (1 페이지) + if ($page < 1) $page = 1; + // 시작 레코드 구함 + $from_record = ($page - 1) * $items; + + $list = new item_list(G5_MSHOP_SKIN_PATH.'/'.$ev['ev_mobile_skin'], $ev['ev_mobile_list_mod'], $ev['ev_mobile_list_row'], $ev['ev_mobile_img_width'], $ev['ev_mobile_img_height']); + $list->set_event($ev['ev_id']); + $list->set_is_page(true); + $list->set_mobile(true); + $list->set_order_by($order_by); + $list->set_from_record($from_record); + $list->set_view('it_img', true); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_cust_price', false); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + echo $list->run(); + + // where 된 전체 상품수 + $total_count = $list->total_count; + // 전체 페이지 계산 + $total_page = ceil($total_count / $items); +} +else +{ + echo '
    '.$ev['ev_mobile_skin'].' 파일을 찾을 수 없습니다.
    관리자에게 알려주시면 감사하겠습니다.
    '; +} + + +?> + + +'.conv_content($ev['ev_tail_html'], 1).''; +?> + + + + + + + + + + + + +
    +

    히트상품

    + set_mobile(true); + $list->set_type(1); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + echo $list->run(); + ?> +
    + + + + + +
    +

    추천상품

    + set_mobile(true); + $list->set_type(2); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + echo $list->run(); + ?> +
    + + + + +
    +

    최신상품

    + set_mobile(true); + $list->set_type(3); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + echo $list->run(); + ?> +
    + + + +
    +

    인기상품

    + set_mobile(true); + $list->set_type(4); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_cust_price', false); + $list->set_view('it_price', true); + $list->set_view('it_icon', false); + $list->set_view('sns', false); + echo $list->run(); + ?> +
    + + + +
    +

    할인상품

    + set_mobile(true); + $list->set_type(5); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_cust_price', false); + $list->set_view('it_price', true); + $list->set_view('it_icon', false); + $list->set_view('sns', false); + echo $list->run(); + ?> +
    + + + + + + + + +
    + +
    + +쇼핑몰 설치 후 이용해 주십시오.

    '); +define('_SHOP_', true); \ No newline at end of file diff --git a/mobile/shop/inicis/orderform.1.php b/mobile/shop/inicis/orderform.1.php new file mode 100644 index 000000000..c9e8210a3 --- /dev/null +++ b/mobile/shop/inicis/orderform.1.php @@ -0,0 +1,59 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/mobile/shop/inicis/orderform.2.php b/mobile/shop/inicis/orderform.2.php new file mode 100644 index 000000000..63a618fa3 --- /dev/null +++ b/mobile/shop/inicis/orderform.2.php @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + +
    + + + 취소 +
    \ No newline at end of file diff --git a/mobile/shop/inicis/orderform.3.php b/mobile/shop/inicis/orderform.3.php new file mode 100644 index 000000000..b090a888d --- /dev/null +++ b/mobile/shop/inicis/orderform.3.php @@ -0,0 +1,2 @@ + $it_stock_qty) + $error .= "{$row['ct_option']} 의 재고수량이 부족합니다. 현재고수량 : $it_stock_qty 개\\n\\n"; + } + + if($i == 0) + alert('장바구니가 비어 있습니다.', G5_SHOP_URL.'/cart.php'); + + if ($error != "") + { + $error .= "결제진행이 중단 되었습니다."; + alert($error, G5_SHOP_URL.'/cart.php'); + } +} + +if($p_status !== '00') { + alert('오류 : '.iconv_utf8($p_rmesg1).' 코드 : '.$p_status, $page_return_url); +} else { + $post_data = array( + 'P_MID' => $default['de_inicis_mid'], + 'P_TID' => $p_tid + ); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_PORT, 443); + curl_setopt($ch, CURLOPT_URL, $p_req_url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $return = curl_exec($ch); + + if(!$return) + alert('KG이니시스와 통신 오류로 결제등록 요청을 완료하지 못했습니다.\\n결제등록 요청을 다시 시도해 주십시오.', $page_return_url); + + // 결과를 배열로 변환 + parse_str($return, $ret); + $PAY = array_map('trim', $ret); + $PAY = array_map('strip_tags', $PAY); + $PAY = array_map('get_search_string', $PAY); + + if($PAY['P_STATUS'] != '00') + alert('오류 : '.iconv_utf8($PAY['P_RMESG1']).' 코드 : '.$PAY['P_STATUS'], $page_return_url); + + // TID, AMT 를 세션으로 주문완료 페이지 전달 + $hash = md5($PAY['P_TID'].$PAY['P_MID'].$PAY['P_AMT']); + set_session('P_TID', $PAY['P_TID']); + set_session('P_AMT', $PAY['P_AMT']); + set_session('P_HASH', $hash); +} + +$params = array(); + +//개인결제 +if(isset($data['pp_id']) && !empty($data['pp_id'])) { + // 개인결제 정보 + $pp_check = false; + $sql = " select * from {$g5['g5_shop_personalpay_table']} where pp_id = '{$PAY['P_OID']}' and pp_tno = '{$PAY['P_TID']}' and pp_use = '1' "; + $pp = sql_fetch($sql); + + if( !$pp['pp_tno'] && $data['pp_id'] == $oid ){ + $res_cd = $PAY['P_STATUS']; + $pp_id = $oid; + + $exclude = array('res_cd', 'P_HASH', 'P_TYPE', 'P_AUTH_DT', 'P_VACT_BANK', 'LGD_PAYKEY', 'pp_id', 'good_mny', 'pp_name', 'pp_email', 'pp_hp', 'pp_settle_case'); + + foreach($data as $key=>$v) { + if( !in_array($key, $exclude) ){ + $_POST[$key] = $params[$key] = clean_xss_tags(strip_tags($v)); + } + } + + $good_mny = isset($PAY['P_AMT']) ? $PAY['P_AMT'] : 0; + $pp_name = clean_xss_tags($data['pp_name']); + $pp_email = clean_xss_tags($data['pp_email']); + $pp_hp = clean_xss_tags($data['pp_hp']); + $pp_settle_case = clean_xss_tags($data['pp_settle_case']); + + $_POST['P_HASH'] = $hash; + $_POST['P_AUTH_NO'] = isset($PAY['P_AUTH_NO']) ? $PAY['P_AUTH_NO'] : ''; + $_POST['pp_id'] = isset($PAY['P_OID']) ? $PAY['P_OID'] : ''; + $_POST['good_mny'] = isset($PAY['P_AMT']) ? $PAY['P_AMT'] : 0; + + $_POST['P_TYPE'] = isset($PAY['P_TYPE']) ? $PAY['P_TYPE'] : ''; + $_POST['P_AUTH_DT'] = isset($PAY['P_AUTH_DT']) ? $PAY['P_AUTH_DT'] : ''; + $_POST['P_HPP_CORP'] = isset($PAY['P_HPP_CORP']) ? $PAY['P_HPP_CORP'] : ''; + $_POST['P_APPL_NUM'] = isset($PAY['P_APPL_NUM']) ? $PAY['P_APPL_NUM'] : ''; + $_POST['P_VACT_NUM'] = isset($PAY['P_VACT_NUM']) ? $PAY['P_VACT_NUM'] : ''; + $_POST['P_VACT_NAME'] = isset($PAY['P_VACT_NAME']) ? iconv_utf8($PAY['P_VACT_NAME']) : ''; + $_POST['P_VACT_BANK'] = (isset($PAY['P_VACT_BANK_CODE']) && isset($BANK_CODE[$PAY['P_VACT_BANK_CODE']])) ? $BANK_CODE[$PAY['P_VACT_BANK_CODE']] : ''; + $_POST['P_CARD_ISSUER'] = isset($CARD_CODE[$PAY['P_CARD_ISSUER_CODE']]) ? $CARD_CODE[$PAY['P_CARD_ISSUER_CODE']] : ''; + $_POST['P_UNAME'] = isset($PAY['P_UNAME']) ? iconv_utf8($PAY['P_UNAME']) : ''; + + include_once( G5_MSHOP_PATH.'/personalpayformupdate.php' ); + } + +} else { + // 상점 결제 + $exclude = array('res_cd', 'P_HASH', 'P_TYPE', 'P_AUTH_DT', 'P_VACT_BANK', 'P_AUTH_NO'); + + foreach($data as $key=>$value) { + if(!empty($exclude) && in_array($key, $exclude)) + continue; + + if(is_array($value)) { + foreach($value as $k=>$v) { + $_POST[$key][$k] = $params[$key][$k] = clean_xss_tags(strip_tags($v)); + } + } else { + $_POST[$key] = $params[$key] = clean_xss_tags(strip_tags($value)); + } + } + + $res_cd = $_POST['res_cd'] = isset($PAY['P_STATUS']) ? $PAY['P_STATUS'] : ''; + $P_HASH = $_POST['P_HASH'] = $hash; + $P_TYPE = $_POST['P_TYPE'] = isset($PAY['P_TYPE']) ? $PAY['P_TYPE'] : ''; + $P_AUTH_DT = $_POST['P_AUTH_DT'] = isset($PAY['P_AUTH_DT']) ? $PAY['P_AUTH_DT'] : ''; + $P_AUTH_NO = $_POST['P_AUTH_NO'] = isset($PAY['P_AUTH_NO']) ? $PAY['P_AUTH_NO'] : ''; + $P_HPP_CORP = $_POST['P_HPP_CORP'] = isset($PAY['P_HPP_CORP']) ? $PAY['P_HPP_CORP'] : ''; + $P_APPL_NUM = $_POST['P_APPL_NUM'] = isset($PAY['P_APPL_NUM']) ? $PAY['P_APPL_NUM'] : ''; + $P_VACT_NUM = $_POST['P_VACT_NUM'] = isset($PAY['P_VACT_NUM']) ? $PAY['P_VACT_NUM'] : ''; + $P_VACT_NAME = $_POST['P_VACT_NAME'] = isset($PAY['P_VACT_NAME']) ? iconv_utf8($PAY['P_VACT_NAME']) : ''; + $P_VACT_BANK = $_POST['P_VACT_BANK'] = (isset($PAY['P_VACT_BANK_CODE']) && isset($BANK_CODE[$PAY['P_VACT_BANK_CODE']])) ? $BANK_CODE[$PAY['P_VACT_BANK_CODE']] : ''; + // $P_CARD_ISSUER = $_POST['P_CARD_ISSUER'] = isset($CARD_CODE[$PAY['P_CARD_ISSUER_CODE']]) ? $CARD_CODE[$PAY['P_CARD_ISSUER_CODE']] : ''; + $P_CARD_ISSUER = $_POST['P_CARD_ISSUER'] = isset($CARD_CODE[$PAY['P_FN_CD1']]) ? $CARD_CODE[$PAY['P_FN_CD1']] : ''; + $P_UNAME = $_POST['P_UNAME'] = isset($PAY['P_UNAME']) ? iconv_utf8($PAY['P_UNAME']) : ''; + + $check_keys = array('od_name', 'od_tel', 'od_pwd', 'od_hp', 'od_zip', 'od_addr1', 'od_addr2', 'od_addr3', 'od_addr_jibeon', 'od_email', 'ad_default', 'ad_subject', 'od_hope_date', 'od_b_name', 'od_b_tel', 'od_b_hp', 'od_b_zip', 'od_b_addr1', 'od_b_addr2', 'od_b_addr3', 'od_b_addr_jibeon', 'od_memo', 'od_settle_case', 'max_temp_point', 'od_temp_point', 'od_send_cost', 'od_send_cost2', 'od_bank_account', 'od_deposit_name', 'od_test', 'od_ip'); + + foreach($check_keys as $key){ + $$key = isset($params[$key]) ? $params[$key] : ''; + } + + include_once( G5_MSHOP_PATH.'/orderformupdate.php' ); +} +exit; \ No newline at end of file diff --git a/mobile/shop/inicis/pay_result.php b/mobile/shop/inicis/pay_result.php new file mode 100644 index 000000000..d514a86e6 --- /dev/null +++ b/mobile/shop/inicis/pay_result.php @@ -0,0 +1,50 @@ +'.PHP_EOL; + +echo make_order_field($data, $exclude); + +echo ''.PHP_EOL; +echo ''.PHP_EOL; +echo ''.PHP_EOL; +echo ''.PHP_EOL; +echo ''.PHP_EOL; +echo ''.PHP_EOL; + +echo ''.PHP_EOL; +?> + + + + + +()\[\]\{\}]/i", "", $_POST['P_OID']) : ''; + $P_FN_CD1 = isset($_POST['P_FN_CD1']) ? $_POST['P_FN_CD1'] : ''; + $P_FN_CD2 = isset($_POST['P_FN_CD2']) ? $_POST['P_FN_CD2'] : ''; + $P_FN_NM = isset($_POST['P_FN_NM']) ? $_POST['P_FN_NM'] : ''; + $P_AMT = isset($_POST['P_AMT']) ? $_POST['P_AMT'] : ''; + $P_UNAME = isset($_POST['P_UNAME']) ? $_POST['P_UNAME'] : ''; + $P_RMESG1 = isset($_POST['P_RMESG1']) ? $_POST['P_RMESG1'] : ''; + $P_RMESG2 = isset($_POST['P_RMESG2']) ? $_POST['P_RMESG2'] : ''; + $P_NOTI = isset($_POST['P_NOTI']) ? $_POST['P_NOTI'] : ''; + $P_AUTH_NO = isset($_POST['P_AUTH_NO']) ? $_POST['P_AUTH_NO'] : ''; + $P_SRC_CODE = isset($_POST['P_SRC_CODE']) ? $_POST['P_SRC_CODE'] : ''; + + include_once(G5_MSHOP_PATH.'/settle_inicis.inc.php'); + + if(! ($default['de_pg_service'] === 'inicis' && $default['de_inicis_mid'] === $P_MID)){ + echo "FAIL"; + return; + } + + // 결과 incis log 테이블 기록 + if($P_TYPE == 'BANK' || $P_SRC_CODE == 'A') { + + if(!sql_query(" select post_data from {$g5['g5_shop_inicis_log_table']} limit 1 ", false)) { + sql_query(" ALTER TABLE `{$g5['g5_shop_inicis_log_table']}` + ADD `post_data` text NOT NULL AFTER `P_RMESG1`, + ADD `is_mail_send` tinyint(4) NOT NULL DEFAULT '1' AFTER `post_data` ", false); + } + + $sql = " insert into {$g5['g5_shop_inicis_log_table']} + set oid = '$P_OID', + P_TID = '$P_TID', + P_MID = '$P_MID', + P_AUTH_DT = '$P_AUTH_DT', + P_STATUS = '$P_STATUS', + P_TYPE = '$P_TYPE', + P_OID = '$P_OID', + P_FN_NM = '".iconv_utf8($P_FN_NM)."', + P_AUTH_NO = '$P_AUTH_NO', + P_AMT = '$P_AMT', + P_RMESG1 = '".iconv_utf8($P_RMESG1)."', + post_data = '".base64_encode(serialize($_POST))."', + is_mail_send = 0 "; + sql_query($sql, false); + } + + if( $P_STATUS == "00" && $P_TID && $P_MID && $P_TYPE != "VBANK" ){ + + // 주문이 있는지 체크 + $sql = "select count(od_id) as cnt from {$g5['g5_shop_order_table']} where od_id = '$P_OID' and od_tno = '$P_TID' "; + $exist_order = sql_fetch($sql); + + if( !$exist_order['cnt'] ){ + //주문정보를 insert 합니다. + + $sql = " select * from {$g5['g5_shop_order_data_table']} where od_id = '$P_OID' "; + $od = sql_fetch($sql); + $data = unserialize(base64_decode($od['dt_data'])); + + //개인결제 + if(isset($data['pp_id']) && !empty($data['pp_id'])) { + + // 개인결제 정보 + $pp_check = false; + $sql = " select * from {$g5['g5_shop_personalpay_table']} where pp_id = '$P_OID' and pp_tno = '$P_TID' and pp_use = '1' "; + $pp = sql_fetch($sql); + + if( !$pp['pp_tno'] && $data['pp_id'] == $P_OID ){ + + $res_cd = $P_STATUS; + $pp_id = $P_OID; + + $exclude = array('res_cd', 'P_HASH', 'P_TYPE', 'P_AUTH_DT', 'P_VACT_BANK', 'LGD_PAYKEY', 'pp_id', 'good_mny', 'pp_name', 'pp_email', 'pp_hp', 'pp_settle_case'); + + $params = array(); + + foreach($data as $key=>$v) { + if( !in_array($key, $exclude) ){ + $_POST[$key] = $params[$key] = clean_xss_tags(strip_tags($v)); + } + } + + $good_mny = $P_AMT; + $pp_name = clean_xss_tags($data['pp_name']); + $pp_email = clean_xss_tags($data['pp_email']); + $pp_hp = clean_xss_tags($data['pp_hp']); + $pp_settle_case = clean_xss_tags($data['pp_settle_case']); + + set_session('P_TID', $P_TID); + set_session('P_AMT', $P_AMT); + $_POST['P_HASH'] = md5(get_session('P_TID').$default['de_inicis_mid'].$P_AMT); + $_POST['P_AUTH_NO'] = $P_AUTH_NO; + $_POST['pp_id'] = $P_OID; + $_POST['good_mny'] = $P_AMT; + $is_noti_pay = true; + + $sql = " select pp_time from {$g5['g5_shop_personalpay_table']} where pp_id = '$P_OID' and pp_use = '1' "; + $pp_time = sql_fetch($sql); + + set_session('ss_personalpay_id', $P_OID); + set_session('ss_personalpay_hash', md5($P_OID.$P_AMT.$pp_time['pp_time'])); + + include_once( G5_MSHOP_PATH.'/personalpayformupdate.php' ); + + if( !$order_id ){ + echo "FAIL"; + } else { + $sql = " delete from {$g5['g5_shop_inicis_log_table']} where (oid = '$P_OID' and P_TID = '$P_TID') OR substr(P_AUTH_DT, 1, 8) < '".date('Ymd', strtotime('-1 month', G5_SERVER_TIME))."' "; + sql_query( $sql , false); + } + } + + //상품주문 + } else { + + if($od && isset($data['it_id']) && !empty($data['it_id'])) { + + $PAY = array( + 'oid' => $P_OID, + 'P_TID' => $P_TID, + 'P_MID' => $P_MID, + 'P_AUTH_DT' => $P_AUTH_DT, + 'P_STATUS' => $P_STATUS, + 'P_TYPE' => $P_TYPE, + 'P_OID' => $P_OID, + 'P_FN_NM' => iconv_utf8($P_FN_NM), + 'P_AUTH_NO' => $P_AUTH_NO, + 'P_AMT' => $P_AMT, + 'P_RMESG1' => iconv_utf8($P_RMESG1) + ); + + // TID, AMT 를 세션으로 주문완료 페이지 전달 + $hash = md5($PAY['P_TID'].$PAY['P_MID'].$PAY['P_AMT']); + set_session('P_TID', $PAY['P_TID']); + set_session('P_AMT', $PAY['P_AMT']); + set_session('P_HASH', $hash); + set_session('ss_order_id', $P_OID); + + $params = array(); + $exclude = array('res_cd', 'P_HASH', 'P_TYPE', 'P_AUTH_DT', 'P_VACT_BANK', 'P_AUTH_NO'); + + foreach($data as $key=>$value) { + if(!empty($exclude) && in_array($key, $exclude)) + continue; + + if(is_array($value)) { + foreach($value as $k=>$v) { + $_POST[$key][$k] = $params[$key][$k] = clean_xss_tags(strip_tags($v)); + } + } else { + $_POST[$key] = $params[$key] = clean_xss_tags(strip_tags($value)); + } + } + + if( !empty($params['sw_direct']) && !empty($params['post_cart_id']) ){ + set_session('ss_direct', $params['sw_direct']); + set_session('ss_cart_direct', $params['post_cart_id']); + } else if ( $params['post_cart_id'] ){ + set_session('ss_cart_id', $params['post_cart_id']); + } + + try { + unset($params['sw_direct']); + unset($params['post_cart_id']); + } catch (Exception $e) { + } + + $_POST['res_cd'] = $params['res_cd'] = $PAY['P_STATUS']; + $_POST['P_HASH'] = $params['P_HASH'] = $hash; + $_POST['P_TYPE'] = $params['P_TYPE'] = $PAY['P_TYPE']; + $_POST['P_AUTH_DT'] = $params['P_AUTH_DT'] = $PAY['P_AUTH_DT']; + $_POST['P_VACT_BANK'] = $params['P_VACT_BANK'] = $PAY['P_FN_NM']; + $_POST['P_AUTH_NO'] = $params['P_AUTH_NO'] = $PAY['P_AUTH_NO']; + + $check_keys = array('od_name', 'od_tel', 'od_pwd', 'od_hp', 'od_zip', 'od_addr1', 'od_addr2', 'od_addr3', 'od_addr_jibeon', 'od_email', 'ad_default', 'ad_subject', 'od_hope_date', 'od_b_name', 'od_b_tel', 'od_b_hp', 'od_b_zip', 'od_b_addr1', 'od_b_addr2', 'od_b_addr3', 'od_b_addr_jibeon', 'od_memo', 'od_settle_case', 'max_temp_point', 'od_temp_point', 'od_send_cost', 'od_send_cost2', 'od_bank_account', 'od_deposit_name', 'od_test', 'od_ip'); + + foreach($check_keys as $key){ + $$key = isset($params[$key]) ? $params[$key] : ''; + } + + $od_send_cost = (int) $od_send_cost; + $od_send_cost2 = (int) $od_send_cost2; + $ad_default = (int) $ad_default; + + if( $od['mb_id'] ){ + $is_member = true; + $member = get_member($od['mb_id']); + } + + $is_noti_pay = true; + include_once( G5_MSHOP_PATH.'/orderformupdate.php' ); + + if( !$order_id ){ + echo "FAIL"; + } else { + $sql = " delete from {$g5['g5_shop_inicis_log_table']} where (oid = '$P_OID' and P_TID = '$P_TID') OR substr(P_AUTH_DT, 1, 8) < '".date('Ymd', strtotime('-1 month', G5_SERVER_TIME))."' "; + sql_query( $sql , false); + } + } + + } + } + } + + //WEB 방식의 경우 가상계좌 채번 결과 무시 처리 + //(APP 방식의 경우 해당 내용을 삭제 또는 주석 처리 하시기 바랍니다.) + if($P_TYPE == "VBANK") //결제수단이 가상계좌이며 + { + if($P_STATUS != "02") //입금통보 "02" 가 아니면(가상계좌 채번 : 00 또는 01 경우) + { + echo "OK"; + return; + } + + // 입금결과 처리 + $sql = " select pp_id, od_id from {$g5['g5_shop_personalpay_table']} where pp_id = '$P_OID' and pp_tno = '$P_TID' "; + $row = sql_fetch($sql); + + $result = false; + $receipt_time = $P_AUTH_DT; + + if($row['pp_id']) { + // 개인결제 UPDATE + $sql = " update {$g5['g5_shop_personalpay_table']} + set pp_receipt_price = '$P_AMT', + pp_receipt_time = '$receipt_time' + where pp_id = '$P_OID' + and pp_tno = '$P_TID' "; + sql_query($sql, false); + + if($row['od_id']) { + // 주문서 UPDATE + $receipt_time = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/", "\\1-\\2-\\3 \\4:\\5:\\6", $receipt_time); + $sql = " update {$g5['g5_shop_order_table']} + set od_receipt_price = od_receipt_price + '$P_AMT', + od_receipt_time = '$receipt_time', + od_shop_memo = concat(od_shop_memo, \"\\n개인결제 ".$row['pp_id']." 로 결제완료 - ".$receipt_time."\") + where od_id = '{$row['od_id']}' "; + $result = sql_query($sql, FALSE); + } + } else { + // 주문서 UPDATE + $sql = " update {$g5['g5_shop_order_table']} + set od_receipt_price = '$P_AMT', + od_receipt_time = '$receipt_time' + where od_id = '$P_OID' + and od_tno = '$P_TID' "; + $result = sql_query($sql, FALSE); + } + + if($result) { + if($row['od_id']) + $od_id = $row['od_id']; + else + $od_id = $P_OID; + + // 주문정보 체크 + $sql = " select count(od_id) as cnt + from {$g5['g5_shop_order_table']} + where od_id = '$od_id' + and od_status = '주문' "; + $row = sql_fetch($sql); + + if($row['cnt'] == 1) { + // 미수금 정보 업데이트 + $info = get_order_info($od_id); + + $sql = " update {$g5['g5_shop_order_table']} + set od_misu = '{$info['od_misu']}' "; + if($info['od_misu'] == 0) + $sql .= " , od_status = '입금' "; + $sql .= " where od_id = '$od_id' "; + sql_query($sql, FALSE); + + // 장바구니 상태변경 + if($info['od_misu'] == 0) { + $sql = " update {$g5['g5_shop_cart_table']} + set ct_status = '입금' + where od_id = '$od_id' "; + sql_query($sql, FALSE); + } + } + } + + if($result) { + echo "OK"; + return; + } else { + echo "FAIL"; + return; + } + } + + $PageCall_time = date("H:i:s"); + + $value = array( + "PageCall time" => $PageCall_time, + "P_TID" => $P_TID, + "P_MID" => $P_MID, + "P_AUTH_DT" => $P_AUTH_DT, + "P_STATUS" => $P_STATUS, + "P_TYPE" => $P_TYPE, + "P_OID" => $P_OID, + "P_FN_CD1" => $P_FN_CD1, + "P_FN_CD2" => $P_FN_CD2, + "P_FN_NM" => $P_FN_NM, + "P_AMT" => $P_AMT, + "P_UNAME" => $P_UNAME, + "P_RMESG1" => $P_RMESG1, + "P_RMESG2" => $P_RMESG2, + "P_NOTI" => $P_NOTI, + "P_AUTH_NO" => $P_AUTH_NO, + "P_SRC_CODE" => $P_SRC_CODE + ); + + // 결제처리에 관한 로그 기록 + //writeLog($value); + + /*********************************************************************************** + ' 위에서 상점 데이터베이스에 등록 성공유무에 따라서 성공시에는 "OK"를 이니시스로 실패시는 "FAIL" 을 + ' 리턴하셔야합니다. 아래 조건에 데이터베이스 성공시 받는 FLAG 변수를 넣으세요 + ' (주의) OK를 리턴하지 않으시면 이니시스 지불 서버는 "OK"를 수신할때까지 계속 재전송을 시도합니다 + ' 기타 다른 형태의 echo "" 는 하지 않으시기 바랍니다 + '***********************************************************************************/ + + echo 'OK'; + +} + +function writeLog($msg) +{ + $file = G5_SHOP_PATH."/inicis/log/noti_input_".date("Ymd").".log"; + + if(!($fp = fopen($path.$file, "a+"))) return 0; + + ob_start(); + print_r($msg); + $ob_msg = ob_get_contents(); + ob_clean(); + + if(fwrite($fp, " ".$ob_msg."\n") === FALSE) + { + fclose($fp); + return 0; + } + fclose($fp); + return 1; +} \ No newline at end of file diff --git a/mobile/shop/item.php b/mobile/shop/item.php new file mode 100644 index 000000000..5d95f05ee --- /dev/null +++ b/mobile/shop/item.php @@ -0,0 +1,227 @@ + 0) { + for ($i=1; $i<=$tv_idx; $i++) { + if (get_session("ss_tv[$i]") == $it_id) { + $saved = true; + break; + } + } +} + +if (!$saved) { + $tv_idx++; + set_session("ss_tv_idx", $tv_idx); + set_session("ss_tv[$tv_idx]", $it_id); +} +// 오늘 본 상품 저장 끝 + +// 조회수 증가 +if (get_cookie('ck_it_id') != $it_id) { + sql_query(" update {$g5['g5_shop_item_table']} set it_hit = it_hit + 1 where it_id = '$it_id' "); // 1증가 + set_cookie("ck_it_id", $it_id, 3600); // 1시간동안 저장 +} + +// 이전 상품보기 +$sql = " select it_id, it_name from {$g5['g5_shop_item_table']} + where it_id > '$it_id' + and SUBSTRING(ca_id,1,4) = '".substr($it['ca_id'],0,4)."' + and it_use = '1' + order by it_id asc + limit 1 "; +$row = sql_fetch($sql); +if (isset($row['it_id']) && $row['it_id']) { + $prev_title = '이전상품 '.$row['it_name'].''; + $prev_href = ''; + $prev_href2 = ''; +} else { + $prev_title = ''; + $prev_href = ''; + $prev_href2 = ''; +} + +// 다음 상품보기 +$sql = " select it_id, it_name from {$g5['g5_shop_item_table']} + where it_id < '$it_id' + and SUBSTRING(ca_id,1,4) = '".substr($it['ca_id'],0,4)."' + and it_use = '1' + order by it_id desc + limit 1 "; +$row = sql_fetch($sql); +if (isset($row['it_id']) && $row['it_id']) { + $next_title = '다음 상품 '.$row['it_name'].''; + $next_href = ''; + $next_href2 = ''; +} else { + $next_title = ''; + $next_href = ''; + $next_href2 = ''; +} + +// 관리자가 확인한 사용후기의 개수를 얻음 +$sql = " select count(*) as cnt from `{$g5['g5_shop_item_use_table']}` where it_id = '{$it_id}' and is_confirm = '1' "; +$row = sql_fetch($sql); +$item_use_count = $row['cnt']; + +// 상품문의의 개수를 얻음 +$sql = " select count(*) as cnt from `{$g5['g5_shop_item_qa_table']}` where it_id = '{$it_id}' "; +$row = sql_fetch($sql); +$item_qa_count = $row['cnt']; + +if ($default['de_mobile_rel_list_use']) { + // 관련상품의 개수를 얻음 + $sql = " select count(*) as cnt + from {$g5['g5_shop_item_relation_table']} a + left join {$g5['g5_shop_item_table']} b on (a.it_id2=b.it_id) + where a.it_id = '{$it['it_id']}' and b.it_use='1' "; + $row = sql_fetch($sql); + $item_relation_count = $row['cnt']; +} + +// 상품품절체크 +if(G5_SOLDOUT_CHECK) + $is_soldout = is_soldout($it['it_id'], true); + +// 주문가능체크 +$is_orderable = true; +if(!$it['it_use'] || $it['it_tel_inq'] || $is_soldout) + $is_orderable = false; + +if($is_orderable) { + if(defined('G5_THEME_USE_OPTIONS_TRTD') && G5_THEME_USE_OPTIONS_TRTD){ + $option_item = get_item_options($it['it_id'], $it['it_option_subject'], ''); + $supply_item = get_item_supply($it['it_id'], $it['it_supply_subject'], ''); + } else { + // 선택 옵션 ( 기존의 tr td 태그로 가져오려면 'div' 를 '' 로 바꾸거나 또는 지워주세요 ) + $option_item = get_item_options($it['it_id'], $it['it_option_subject'], 'div'); + + // 추가 옵션 ( 기존의 tr td 태그로 가져오려면 'div' 를 '' 로 바꾸거나 또는 지워주세요 ) + $supply_item = get_item_supply($it['it_id'], $it['it_supply_subject'], 'div'); + } + + // 상품 선택옵션 수 + $option_count = 0; + if($it['it_option_subject']) { + $temp = explode(',', $it['it_option_subject']); + $option_count = count($temp); + } + + // 상품 추가옵션 수 + $supply_count = 0; + if($it['it_supply_subject']) { + $temp = explode(',', $it['it_supply_subject']); + $supply_count = count($temp); + } +} + +// 스킨경로 +$skin_dir = G5_MSHOP_SKIN_PATH; +$ca_dir_check = true; + +if($it['it_mobile_skin']) { + if(preg_match('#^theme/(.+)$#', $it['it_mobile_skin'], $match)) + $skin_dir = G5_THEME_MOBILE_PATH.'/'.G5_SKIN_DIR.'/shop/'.$match[1]; + else + $skin_dir = G5_MOBILE_PATH.'/'.G5_SKIN_DIR.'/shop/'.$it['it_mobile_skin']; + + if(is_dir($skin_dir)) { + $form_skin_file = $skin_dir.'/item.form.skin.php'; + + if(is_file($form_skin_file)) + $ca_dir_check = false; + } +} + +if($ca_dir_check) { + if($ca['ca_mobile_skin_dir']) { + if(preg_match('#^theme/(.+)$#', $ca['ca_mobile_skin_dir'], $match)) + $skin_dir = G5_THEME_MOBILE_PATH.'/'.G5_SKIN_DIR.'/shop/'.$match[1]; + else + $skin_dir = G5_MOBILE_PATH.'/'.G5_SKIN_DIR.'/shop/'.$ca['ca_mobile_skin_dir']; + + if(is_dir($skin_dir)) { + $form_skin_file = $skin_dir.'/item.form.skin.php'; + + if(!is_file($form_skin_file)) + $skin_dir = G5_MSHOP_SKIN_PATH; + } else { + $skin_dir = G5_MSHOP_SKIN_PATH; + } + } +} + +define('G5_SHOP_CSS_URL', str_replace(G5_PATH, G5_URL, $skin_dir)); + +$g5['title'] = $it['it_name'].' > '.$it['ca_name']; +$naverpay_button_js = ''; + +include_once(G5_MSHOP_PATH.'/_head.php'); +include_once(G5_SHOP_PATH.'/settle_naverpay.inc.php'); + +// 상단 HTML +echo '
    '.conv_content($it['it_mobile_head_html'], 1).'
    '; +?> + + + + + + + +
    + + + +
    + + + + + + +
    + +
    +
    + + + +
    +

    + +
    + + + +
    +
      +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    + +
    +
    + + 창닫기 +
    + +
    + +
    + + + + 'ApproveReq', + 'ApproveRes' => 'ApproveRes', + 'approve' => 'approve', + 'approveResponse' => 'approveResponse', + 'AccessCredentialType' => 'AccessCredentialType', + 'BaseRequestType' => 'BaseRequestType', + 'BaseResponseType' => 'BaseResponseType', + 'ErrorType' => 'ErrorType', + ); + + var $chatsetType; + var $accessCredentialType; + var $baseRequestType; + var $approveReq; + var $approveResponse; + var $resCD; + var $resMsg; + + + public function PayService( $wsdl = "", $options = array() ) + { + foreach( self::$classmap as $key => $value ) + { + if ( !isset( $options[ 'classmap' ][ $key ] ) ) + { + $options[ 'classmap' ][ $key ] = $value; + } + } + + parent::__construct( $wsdl, $options ); + + $accessCredentialType = null; + $baseRequestType = null; + $approveReq = null; + $resCD = "95XX"; + $resMsg = "연동 오류"; + } + + public function setCharSet( $charsetType ) + { + $this->chatsetType = $charsetType; + } + + public function setAccessCredentialType( $accessLicense, + $signature, + $timestamp ) + { + $this->accessCredentialType = new AccessCredentialType(); + + $this->accessCredentialType->accessLicense = $accessLicense; + $this->accessCredentialType->signature = $signature; + $this->accessCredentialType->timestamp = $timestamp; + } + + public function setBaseRequestType( $detailLevel, + $requestApp, + $requestID, + $userAgent, + $version ) + { + $this->baseRequestType = new BaseRequestType(); + + $this->baseRequestType->detailLevel = $detailLevel; + $this->baseRequestType->requestApp = $requestApp; + $this->baseRequestType->requestID = $requestID; + $this->baseRequestType->userAgent = $userAgent; + $this->baseRequestType->version = $version; + } + + public function setApproveReq( $escrow, + $orderID, + $paymentAmount, + $paymentMethod, + $productName, + $returnUrl, + $siteCode ) + { + $this->approveReq = new ApproveReq(); + + $productName_utf8 = ( $this->chatsetType == "euc-kr" ) ? iconv( "EUC-KR", "UTF-8", $productName ) : $productName; + + $this->approveReq->accessCredentialType = $this->accessCredentialType; + $this->approveReq->baseRequestType = $this->baseRequestType; + $this->approveReq->escrow = $escrow; + $this->approveReq->orderID = $orderID; + $this->approveReq->paymentAmount = $paymentAmount; + $this->approveReq->paymentMethod = $paymentMethod; + $this->approveReq->productName = $productName_utf8; + $this->approveReq->returnUrl = $returnUrl; + $this->approveReq->siteCode = $siteCode; + } + + public function approve() + { + $approve = new approve(); + + $approve->req = $this->approveReq; + + $this->approveResponse = $this->__soapCall( "approve", array( $approve ), + array( 'uri' => 'http://webservice.act.webpay.service.kcp.kr', + 'soapaction' => '' + ) + ); + + $this->resCD = $this->approveResponse->return->baseResponseType->error->code; + $this->resMsg = $this->approveResponse->return->baseResponseType->error->message; + + return $this->approveResponse->return; + } +} \ No newline at end of file diff --git a/mobile/shop/kcp/KCPPaymentService.wsdl b/mobile/shop/kcp/KCPPaymentService.wsdl new file mode 100644 index 000000000..2d6a4ee00 --- /dev/null +++ b/mobile/shop/kcp/KCPPaymentService.wsdl @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/shop/kcp/_common.php b/mobile/shop/kcp/_common.php new file mode 100644 index 000000000..7c37c6ca3 --- /dev/null +++ b/mobile/shop/kcp/_common.php @@ -0,0 +1,6 @@ +쇼핑몰 설치 후 이용해 주십시오.

    '); +define('_SHOP_', true); \ No newline at end of file diff --git a/mobile/shop/kcp/approval_key.js b/mobile/shop/kcp/approval_key.js new file mode 100644 index 000000000..c9a99fb10 --- /dev/null +++ b/mobile/shop/kcp/approval_key.js @@ -0,0 +1,112 @@ + var isIE = false; + var req01_AJAX; + var READY_STATE_UNINITIALIZED = 0; + var READY_STATE_LOADING = 1; + var READY_STATE_LOADED = 2; + var READY_STATE_INTERACTIVE = 3; + var READY_STATE_COMPLETE = 4; + var PayUrl =""; + + + function displayElement( targetObj, targetText, targetColor ) + { + if ( targetObj.childNodes.length > 0 ) + { + targetObj.replaceChild( document.createTextNode( targetText ), targetObj.childNodes[ 0 ] ); + } else + { + targetObj.appendChild( document.createTextNode( targetText ) ); + } + targetObj.style.color = targetColor; + } + + function clearElement( targetObj ) + { + for ( i = ( targetObj.childNodes.length - 1 ); i >= 0; i-- ) + { + targetObj.removeChild( targetObj.childNodes[ i ] ); + } + } + + function initRequest() + { + if ( window.XMLHttpRequest ) + { + return new XMLHttpRequest(); + } else if ( window.ActiveXObject ) + { + isIE = true; + return new ActiveXObject( "Microsoft.XMLHTTP" ); + } + } + + function sendRequest( url ) + { + req01_AJAX = null; + req01_AJAX = initRequest(); + + if ( req01_AJAX ) + { + req01_AJAX.onreadystatechange = process_AJAX; + req01_AJAX.open( "POST", url, true ); + req01_AJAX.send( null ); + } + } + + function kcp_AJAX() + { + var url = "./order_approval.php"; + var form = document.sm_form; + var params = "?site_cd=" + form.site_cd.value + + "&ordr_idxx=" + form.ordr_idxx.value + + "&good_mny=" + form.good_mny.value + + "&pay_method=" + form.pay_method.value + + "&escw_used=" + form.escw_used.value + + "&good_name=" + form.good_name.value + + "&Ret_URL=" + form.Ret_URL.value; + sendRequest( url + params ); + } + + function process_AJAX() + { + if ( req01_AJAX.readyState == READY_STATE_COMPLETE ) + { + if ( req01_AJAX.status == 200 ) + { + var result = null; + + if ( req01_AJAX.responseText != null ) + { + var txt = req01_AJAX.responseText.split(","); + + if( txt[0].replace(/^\s*/,'').replace(/\s*$/,'') == '0000' ) + { + document.getElementById("approval").value = txt[1].replace(/^\s*/,'').replace(/\s*$/,''); + PayUrl = txt[2].replace(/^\s*/,'').replace(/\s*$/,''); + //alert("성공적으로 거래가 등록 되었습니다."); + call_pay_form(); + } + else + { + alert("실패 되었습니다.[" + txt[3].replace(/^\s*/,'').replace(/\s*$/,'') + "]"); + } + } + } + else + { + alert( req01_AJAX.responseText ); + } + } + else if ( req01_AJAX.readyState == READY_STATE_UNINITIALIZED ) + { + } + else if ( req01_AJAX.readyState == READY_STATE_LOADING ) + { + } + else if ( req01_AJAX.readyState == READY_STATE_LOADED ) + { + } + else if ( req01_AJAX.readyState == READY_STATE_INTERACTIVE ) + { + } + } \ No newline at end of file diff --git a/mobile/shop/kcp/easypay_form.1.php b/mobile/shop/kcp/easypay_form.1.php new file mode 100644 index 000000000..bd978e9de --- /dev/null +++ b/mobile/shop/kcp/easypay_form.1.php @@ -0,0 +1,107 @@ + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/mobile/shop/kcp/easypay_form.2.php b/mobile/shop/kcp/easypay_form.2.php new file mode 100644 index 000000000..cb7a79715 --- /dev/null +++ b/mobile/shop/kcp/easypay_form.2.php @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mobile/shop/kcp/order_approval.php b/mobile/shop/kcp/order_approval.php new file mode 100644 index 000000000..e6e79880d --- /dev/null +++ b/mobile/shop/kcp/order_approval.php @@ -0,0 +1,53 @@ + +setCharSet( $charSetType ); + + $payService->setAccessCredentialType( $accessLicense, $signature, $timestamp ); + $payService->setBaseRequestType( $detailLevel, $requestApp, $requestID, $userAgent, $version ); + $payService->setApproveReq( $escrow, $orderID, $paymentAmount, $paymentMethod, $productName, $returnUrl, $siteCode ); + + $approveRes = $payService->approve(); + + printf( "%s,%s,%s,%s", $payService->resCD, $approveRes->approvalKey, + $approveRes->payUrl, $payService->resMsg ); + + } + catch (SoapFault $ex ) + { + printf( "%s,%s,%s,%s", "95XX", "", "", "연동 오류 (PHP SOAP 모듈 설치 필요)" ); + } \ No newline at end of file diff --git a/mobile/shop/kcp/order_approval_form.php b/mobile/shop/kcp/order_approval_form.php new file mode 100644 index 000000000..7dad46432 --- /dev/null +++ b/mobile/shop/kcp/order_approval_form.php @@ -0,0 +1,403 @@ + + + + +스마트폰 웹 결제창 + + + + + + + + + + + + + + + + +
    + +'.PHP_EOL; + + echo make_order_field($data, $exclude); + + foreach($_POST as $key=>$value) { + echo ''.PHP_EOL; + } + + echo ''.PHP_EOL; +} +?> + +
    + + + + + + + +'; +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    결제가 실패한 경우 아래 돌아가기 버튼을 클릭해주세요.

    + 돌아가기 +
    + +
    + + + + + diff --git a/mobile/shop/kcp/orderform.1.php b/mobile/shop/kcp/orderform.1.php new file mode 100644 index 000000000..c5789db5d --- /dev/null +++ b/mobile/shop/kcp/orderform.1.php @@ -0,0 +1,102 @@ + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/mobile/shop/kcp/orderform.2.php b/mobile/shop/kcp/orderform.2.php new file mode 100644 index 000000000..bb46177dc --- /dev/null +++ b/mobile/shop/kcp/orderform.2.php @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + 취소 +
    + + + + + +
    +

    에스크로 안내

    +
    + + + + + + + + +
    +
    + 에스크로(escrow) 제도란? +
    상거래 시에, 판매자와 구매자의 사이에 신뢰할 수 있는 중립적인 제삼자(여기서는 KCP)가 중개하여 + 금전 또는 물품을 거래를 하도록 하는 것, 또는 그러한 서비스를 말한다. 거래의 안전성을 확보하기 위해 이용된다. + (2006.4.1 전자상거래 소비자보호법에 따른 의무 시행) +

    + 현금 거래에만 해당(에스크로 결제를 선택했을 경우에만 해당)되며, + 신용카드로 구매하는 거래, 배송이 필요하지 않은 재화 등을 구매하는 거래(컨텐츠 등)에는 해당되지 않는다. +
    +
    +
    + + 가입사실확인 + +
    +
    + + + + \ No newline at end of file diff --git a/mobile/shop/kcp/pp_ax_hub.php b/mobile/shop/kcp/pp_ax_hub.php new file mode 100644 index 000000000..bc091650b --- /dev/null +++ b/mobile/shop/kcp/pp_ax_hub.php @@ -0,0 +1,286 @@ +mf_clear(); + /* ------------------------------------------------------------------------------ */ + /* = 02. 인스턴스 생성 및 초기화 END = */ + /* ============================================================================== */ + + + /* ============================================================================== */ + /* = 03. 처리 요청 정보 설정 = */ + /* = -------------------------------------------------------------------------- = */ + + /* = -------------------------------------------------------------------------- = */ + /* = 03-1. 승인 요청 = */ + /* = -------------------------------------------------------------------------- = */ + if ( $req_tx == "pay" ) + { + $post_enc_data = isset($_POST["enc_data"]) ? $_POST["enc_data"] : ''; + $post_enc_info = isset($_POST["enc_info"]) ? $_POST["enc_info"] : ''; + + $c_PayPlus->mf_set_encx_data( $post_enc_data, $post_enc_info ); + } + + /* = -------------------------------------------------------------------------- = */ + /* = 03-2. 취소/매입 요청 = */ + /* = -------------------------------------------------------------------------- = */ + else if ( $req_tx == "mod" ) + { + $tran_cd = "00200000"; + + $c_PayPlus->mf_set_modx_data( "tno", $tno ); // KCP 원거래 거래번호 + $c_PayPlus->mf_set_modx_data( "mod_type", $mod_type ); // 원거래 변경 요청 종류 + $c_PayPlus->mf_set_modx_data( "mod_ip", $cust_ip ); // 변경 요청자 IP + $c_PayPlus->mf_set_modx_data( "mod_desc", $mod_desc ); // 변경 사유 + } + /* ------------------------------------------------------------------------------ */ + /* = 03. 처리 요청 정보 설정 END = */ + /* ============================================================================== */ + + + + /* ============================================================================== */ + /* = 04. 실행 = */ + /* = -------------------------------------------------------------------------- = */ + if ( $tran_cd != "" ) + { + $c_PayPlus->mf_do_tx( $trace_no, $g_conf_home_dir, $g_conf_site_cd, $g_conf_site_key, $tran_cd, "", + $g_conf_gw_url, $g_conf_gw_port, "payplus_cli_slib", $ordr_idxx, + $cust_ip, $g_conf_log_level, 0, 0, $g_conf_key_dir, $g_conf_log_dir ); // 응답 전문 처리 + + $res_cd = $c_PayPlus->m_res_cd; // 결과 코드 + $res_msg = $c_PayPlus->m_res_msg; // 결과 메시지 + } + else + { + $c_PayPlus->m_res_cd = "9562"; + $c_PayPlus->m_res_msg = "연동 오류|tran_cd값이 설정되지 않았습니다."; + } + + if ($res_cd != '0000') + { + $res_msg = iconv("euc-kr", "utf-8", $res_msg); + + /* + echo ""; + */ + if(isset($_POST['pp_id']) && $_POST['pp_id']) { + $page_return_url = G5_SHOP_URL.'/personalpayform.php?pp_id='.get_session('ss_personalpay_id'); + } else { + $page_return_url = G5_SHOP_URL.'/orderform.php'; + if(get_session('ss_direct')) + $page_return_url .= '?sw_direct=1'; + } + + alert("$res_cd : $res_msg", $page_return_url); + exit; + } + + + /* = -------------------------------------------------------------------------- = */ + /* = 04. 실행 END = */ + /* ============================================================================== */ + + + /* ============================================================================== */ + /* = 05. 승인 결과 값 추출 = */ + /* = -------------------------------------------------------------------------- = */ + if ( $req_tx == "pay" ) + { + if( $res_cd == "0000" ) + { + $tno = $c_PayPlus->mf_get_res_data( "tno" ); // KCP 거래 고유 번호 + $amount = $c_PayPlus->mf_get_res_data( "amount" ); // KCP 실제 거래 금액 + $pnt_issue = $c_PayPlus->mf_get_res_data( "pnt_issue" ); // 결제 포인트사 코드 + + /* = -------------------------------------------------------------------------- = */ + /* = 05-1. 신용카드 승인 결과 처리 = */ + /* = -------------------------------------------------------------------------- = */ + if ( $use_pay_method == "100000000000" ) + { + $card_cd = $c_PayPlus->mf_get_res_data( "card_cd" ); // 카드사 코드 + $card_name = $c_PayPlus->mf_get_res_data( "card_name" ); // 카드 종류 + $app_time = $c_PayPlus->mf_get_res_data( "app_time" ); // 승인 시간 + $app_no = $c_PayPlus->mf_get_res_data( "app_no" ); // 승인 번호 + $noinf = $c_PayPlus->mf_get_res_data( "noinf" ); // 무이자 여부 ( 'Y' : 무이자 ) + $quota = $c_PayPlus->mf_get_res_data( "quota" ); // 할부 개월 수 + $od_other_pay_type = $c_PayPlus->mf_get_res_data( "card_other_pay_type" ); // 간편결제유형 + + $kcp_pay_method = $c_PayPlus->mf_get_res_data( "pay_method" ); // 카카오페이 결제수단 + // 카드 코드는 PACA, 카카오머니 코드는 PAKM + + if( $kcp_pay_method == "PAKM" ){ // 카카오머니 + $card_mny = $kakaomny_mny = $c_PayPlus->mf_get_res_data( "kakaomny_mny" ); + $app_time = $app_kakaomny_time = $c_PayPlus->mf_get_res_data( "app_kakaomny_time" ); + $od_other_pay_type = 'NHNKCP_KAKAOMONEY'; + } + } + + /* = -------------------------------------------------------------------------- = */ + /* = 05-2. 계좌이체 승인 결과 처리 = */ + /* = -------------------------------------------------------------------------- = */ + if ( $use_pay_method == "010000000000" ) + { + $app_time = $c_PayPlus->mf_get_res_data( "app_time" ); // 승인시간 + $bank_name = $c_PayPlus->mf_get_res_data( "bank_name" ); // 은행명 + $bank_code = $c_PayPlus->mf_get_res_data( "bank_code" ); // 은행코드 + } + + /* = -------------------------------------------------------------------------- = */ + /* = 05-3. 가상계좌 승인 결과 처리 = */ + /* = -------------------------------------------------------------------------- = */ + if ( $use_pay_method == "001000000000" ) + { + $bankname = $c_PayPlus->mf_get_res_data( "bankname" ); // 입금할 은행 이름 + $depositor = $c_PayPlus->mf_get_res_data( "depositor" ); // 입금할 계좌 예금주 + $account = $c_PayPlus->mf_get_res_data( "account" ); // 입금할 계좌 번호 + } + + /* = -------------------------------------------------------------------------- = */ + /* = 05-4. 포인트 승인 결과 처리 = */ + /* = -------------------------------------------------------------------------- = */ + if ( $use_pay_method == "000100000000" ) + { + $pt_idno = $c_PayPlus->mf_get_res_data( "pt_idno" ); // 결제 및 인증 아이디 + $pnt_amount = $c_PayPlus->mf_get_res_data( "pnt_amount" ); // 적립금액 or 사용금액 + $pnt_app_time = $c_PayPlus->mf_get_res_data( "pnt_app_time" ); // 승인시간 + $pnt_app_no = $c_PayPlus->mf_get_res_data( "pnt_app_no" ); // 승인번호 + $add_pnt = $c_PayPlus->mf_get_res_data( "add_pnt" ); // 발생 포인트 + $use_pnt = $c_PayPlus->mf_get_res_data( "use_pnt" ); // 사용가능 포인트 + $rsv_pnt = $c_PayPlus->mf_get_res_data( "rsv_pnt" ); // 적립 포인트 + } + + /* = -------------------------------------------------------------------------- = */ + /* = 05-5. 휴대폰 승인 결과 처리 = */ + /* = -------------------------------------------------------------------------- = */ + if ( $use_pay_method == "000010000000" ) + { + $app_time = $c_PayPlus->mf_get_res_data( "hp_app_time" ); // 승인 시간 + $commid = $c_PayPlus->mf_get_res_data( "commid" ); // 통신사 코드 + $mobile_no = $c_PayPlus->mf_get_res_data( "mobile_no" ); // 휴대폰 번호 + } + + /* = -------------------------------------------------------------------------- = */ + /* = 05-6. 상품권 승인 결과 처리 = */ + /* = -------------------------------------------------------------------------- = */ + if ( $use_pay_method == "000000001000" ) + { + $app_time = $c_PayPlus->mf_get_res_data( "tk_app_time" ); // 승인 시간 + $tk_van_code = $c_PayPlus->mf_get_res_data( "tk_van_code" ); // 발급사 코드 + $tk_app_no = $c_PayPlus->mf_get_res_data( "tk_app_no" ); // 승인 번호 + } + + /* = -------------------------------------------------------------------------- = */ + /* = 05-7. 현금영수증 결과 처리 = */ + /* = -------------------------------------------------------------------------- = */ + $cash_authno = $c_PayPlus->mf_get_res_data( "cash_authno" ); // 현금 영수증 승인 번호 + $cash_authno = $c_PayPlus->mf_get_res_data( "cash_authno" ); // 현금 영수증 승인 번호 + $cash_tr_code = $c_PayPlus->mf_get_res_data( "cash_tr_code" ); // 현금영수증 등록구분 + + /* = -------------------------------------------------------------------------- = */ + /* = 05-8. 에스크로 여부 결과 처리 = */ + /* = -------------------------------------------------------------------------- = */ + $escw_yn = $c_PayPlus->mf_get_res_data( "escw_yn" ); // 에스크로 여부 + } + } + /* = -------------------------------------------------------------------------- = */ + /* = 05. 승인 결과 처리 END = */ + /* ============================================================================== */; \ No newline at end of file diff --git a/mobile/shop/kcp/pp_ax_hub_cancel.php b/mobile/shop/kcp/pp_ax_hub_cancel.php new file mode 100644 index 000000000..891ff1aec --- /dev/null +++ b/mobile/shop/kcp/pp_ax_hub_cancel.php @@ -0,0 +1,53 @@ +mf_clear(); + + $tran_cd = "00200000"; + + $c_PayPlus->mf_set_modx_data( "tno", $tno ); // KCP 원거래 거래번호 + $c_PayPlus->mf_set_modx_data( "mod_type", "STSC" ); // 원거래 변경 요청 종류 + $c_PayPlus->mf_set_modx_data( "mod_ip", $cust_ip ); // 변경 요청자 IP + $c_PayPlus->mf_set_modx_data( "mod_desc", $cancel_msg ); // 변경 사유 + + $c_PayPlus->mf_do_tx( "", $g_conf_home_dir, $g_conf_site_cd, + $g_conf_site_key, $tran_cd, "", + $g_conf_gw_url, $g_conf_gw_port, "payplus_cli_slib", + $ordr_idxx, $cust_ip, $g_conf_log_level, + 0, 0 ); + + $res_cd = $c_PayPlus->m_res_cd; + $res_msg = $c_PayPlus->m_res_msg; + } + } +} // End of [res_cd = "0000"] +/* ============================================================================== */ + +// locale 설정 초기화 +setlocale(LC_CTYPE, ''); \ No newline at end of file diff --git a/mobile/shop/kcp/pp_ax_hub_lib.php b/mobile/shop/kcp/pp_ax_hub_lib.php new file mode 100644 index 000000000..e3b6e89dc --- /dev/null +++ b/mobile/shop/kcp/pp_ax_hub_lib.php @@ -0,0 +1,296 @@ +m_payx_common = ""; + $this->m_payx_card = ""; + $this->m_ordr_data = ""; + $this->m_rcvr_data = ""; + $this->m_escw_data = ""; + $this->m_modx_data = ""; + $this->m_encx_data = ""; + $this->m_encx_info = ""; + } + + function mf_init( $mode ) + { + if ( $mode == "1" ) + { + if ( !extension_loaded( 'pp_cli_dl_php' ) ) + { + dl( "pp_cli_dl_php.so" ); + } + } + } + + function mf_clear() + { + $this->m_payx_common = ""; + $this->m_payx_card = ""; + $this->m_ordr_data = ""; + $this->m_rcvr_data = ""; + $this->m_escw_data = ""; + $this->m_modx_data = ""; + $this->m_encx_data = ""; + $this->m_encx_info = ""; + } + + function mf_gen_trace_no( $site_cd, $ip, $mode ) + { + if ( $mode == "1" ) + { + $trace_no = lfPP_CLI_DL__gen_trace_no( $site_cd, $ip ); + } + else + { + $trace_no = ""; + } + + return $trace_no; + } + + /* -------------------------------------------------------------------- */ + /* - FUNC : ENC DATA 정보 설정 함수 - */ + /* -------------------------------------------------------------------- */ + function mf_set_payx_common_data( $name, $val ) + { + if ( $val != "" ) + { + $this->m_payx_common .= ( $name . '=' . $val . chr( 31 ) ); + } + } + + function mf_set_payx_card_data( $name, $val ) + { + if ( $val != "" ) + { + $this->m_payx_card .= ( $name . '=' . $val . chr( 31 ) ); + } + } + + function mf_set_ordr_data( $name, $val ) + { + if ( $val != "" ) + { + $this->m_ordr_data .= ( $name . '=' . $val . chr( 31 ) ); + } + } + + function mf_set_rcvr_data( $name, $val ) + { + if ( $val != "" ) + { + $this->m_rcvr_data .= ( $name . '=' . $val . chr( 31 ) ); + } + } + + function mf_set_escw_data( $name, $val ) + { + if ( $val != "" ) + { + $this->m_escw_data .= ( $name . '=' . $val . chr( 29 ) ); + } + } + + function mf_set_modx_data( $name, $val ) + { + if ( $val != "" ) + { + $this->m_modx_data .= ( $name . '=' . $val . chr( 31 ) ); + } + } + + function mf_set_encx_data( $encx_data, $encx_info ) + { + $this->m_encx_data = $encx_data; + $this->m_encx_info = $encx_info; + } + + /* -------------------------------------------------------------------- */ + /* - FUNC : 지불 처리 함수 - */ + /* -------------------------------------------------------------------- */ + function mf_do_tx( $trace_no, $home_dir, $site_cd, + $site_key, $tx_cd, $pub_key_str, + $pa_url, $pa_port, $user_agent, + $ordr_idxx, $cust_ip, + $log_level, $opt, $mode, + $key_dir, $log_dir) + { + $payx_data = $this->mf_get_payx_data(); + + $ordr_data = $this->mf_get_data( "ordr_data", $this->m_ordr_data ); + $rcvr_data = $this->mf_get_data( "rcvr_data", $this->m_rcvr_data ); + $escw_data = $this->mf_get_data( "escw_data", $this->m_escw_data ); + $modx_data = $this->mf_get_data( "mod_data", $this->m_modx_data ); + + if ( $mode == "1" ) + { + $res_data = lfPP_CLI_DL__do_tx_2( $trace_no, $home_dir, $site_cd, + $site_key, $tx_cd, $pub_key_str, + $pa_url, $pa_port, $user_agent, + $ordr_idxx, + $payx_data, $ordr_data, + $rcvr_data, $escw_data, + $modx_data, + $this->m_encx_data, $this->m_encx_info, + $log_level, $opt ); + } + else + { + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') + { + $bin_exe = $home_dir.'/bin/pp_cli_exe '; + + $res_data = $this->mf_exec($bin_exe . "\"". + "site_cd=" . $site_cd . "," . + "site_key=" . $site_key . "," . + "tx_cd=" . $tx_cd . "," . + "pa_url=" . $pa_url . "," . + "pa_port=" . $pa_port . "," . + "ordr_idxx=" . $ordr_idxx . "," . + "enc_data=" . $this->m_encx_data . "," . + "enc_info=" . $this->m_encx_info . "," . + "trace_no=" . $trace_no . "," . + "cust_ip=" . $cust_ip . "," . + "key_path=" . $key_dir . "," . + "log_path=" . $log_dir . "," . + "log_level=" . $log_level . "," . + "plan_data=" . $payx_data . + $ordr_data . + $rcvr_data . + $escw_data . + $modx_data . + "\"") ; + } + else + { + if(PHP_INT_MAX == 2147483647) // 32-bit + $bin_exe = $home_dir.'/bin/pp_cli'; + else + $bin_exe = $home_dir.'/bin/pp_cli_x64'; + + $res_data = $this->mf_exec( $bin_exe, + "-h", + "home=" . $home_dir . "," . + "site_cd=" . $site_cd . "," . + "site_key=" . $site_key . "," . + "tx_cd=" . $tx_cd . "," . + "pa_url=" . $pa_url . "," . + "pa_port=" . $pa_port . "," . + "ordr_idxx=" . $ordr_idxx . "," . + "payx_data=" . $payx_data . "," . + "ordr_data=" . $ordr_data . "," . + "rcvr_data=" . $rcvr_data . "," . + "escw_data=" . $escw_data . "," . + "modx_data=" . $modx_data . "," . + "enc_data=" . $this->m_encx_data . "," . + "enc_info=" . $this->m_encx_info . "," . + "trace_no=" . $trace_no . "," . + "cust_ip=" . $cust_ip . "," . + "log_path=" . $log_dir . "," . + "log_level=" . $log_level . "," . + "opt=" . $opt . "" ); + } + + if ( $res_data == "" ) + { + $res_data = "res_cd=9502" . chr( 31 ) . "res_msg=연동 모듈 호출 오류"; + } + } + + parse_str( str_replace( chr( 31 ), "&", $res_data ), $this->m_res_data ); + + $this->m_res_cd = $this->m_res_data[ "res_cd" ]; + $this->m_res_msg = $this->m_res_data[ "res_msg" ]; + } + + /* -------------------------------------------------------------------- */ + /* - FUNC : 처리 결과 값을 리턴하는 함수 - */ + /* -------------------------------------------------------------------- */ + function mf_get_res_data( $name ) + { + return isset($this->m_res_data[$name]) ? $this->m_res_data[$name] : ''; + } + + function mf_get_payx_data() + { + $my_data = ''; + if ( $this->m_payx_common != "" || $this->m_payx_card != "" ) + { + $my_data = "payx_data="; + } + + if ( $this->m_payx_common != "" ) + { + $my_data .= "common=" . $this->m_payx_common . chr( 30 ); + } + + if ( $this->m_payx_card != "" ) + { + $my_data .= ( "card=" . $this->m_payx_card . chr( 30 ) ); + } + + return $my_data; + } + + function mf_get_data( $data_name, $data ) + { + if ( $data != "" ) + { + $my_data = $data_name . "=" . $data; + } + else + { + $my_data = ""; + } + + return $my_data; + } + + function mf_exec() + { + $arg = func_get_args(); + + if ( is_array( $arg[0] ) ) $arg = $arg[0]; + + $exec_cmd = array_shift( $arg ); + + foreach($arg as $i) + { + $exec_cmd .= " " . escapeshellarg( $i ); + } + + $rt = exec( $exec_cmd ); + + return $rt; + } + } \ No newline at end of file diff --git a/mobile/shop/kcp/real_KCPPaymentService.wsdl b/mobile/shop/kcp/real_KCPPaymentService.wsdl new file mode 100644 index 000000000..6a463bb32 --- /dev/null +++ b/mobile/shop/kcp/real_KCPPaymentService.wsdl @@ -0,0 +1,145 @@ + + + + KCP Payment Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/shop/largeimage.php b/mobile/shop/largeimage.php new file mode 100644 index 000000000..4e8d23878 --- /dev/null +++ b/mobile/shop/largeimage.php @@ -0,0 +1,26 @@ +'.str_replace(G5_PATH.'/', '', $skin).'파일이 존재하지 않습니다.

    '; + +include_once(G5_PATH.'/tail.sub.php'); \ No newline at end of file diff --git a/mobile/shop/lg/_common.php b/mobile/shop/lg/_common.php new file mode 100644 index 000000000..7c37c6ca3 --- /dev/null +++ b/mobile/shop/lg/_common.php @@ -0,0 +1,6 @@ +쇼핑몰 설치 후 이용해 주십시오.

    '); +define('_SHOP_', true); \ No newline at end of file diff --git a/mobile/shop/lg/cancel_url.php b/mobile/shop/lg/cancel_url.php new file mode 100644 index 000000000..a459731d6 --- /dev/null +++ b/mobile/shop/lg/cancel_url.php @@ -0,0 +1,3 @@ + + +사용자가 ISP(국민/BC) 카드결제을 중단하였습니다. \ No newline at end of file diff --git a/mobile/shop/lg/mispwapurl.php b/mobile/shop/lg/mispwapurl.php new file mode 100644 index 000000000..79e1f1360 --- /dev/null +++ b/mobile/shop/lg/mispwapurl.php @@ -0,0 +1,19 @@ + + +
    + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/mobile/shop/lg/orderform.2.php b/mobile/shop/lg/orderform.2.php new file mode 100644 index 000000000..055618c13 --- /dev/null +++ b/mobile/shop/lg/orderform.2.php @@ -0,0 +1,20 @@ + + + + + + + + + + + + + +
    + + + 취소 +
    \ No newline at end of file diff --git a/mobile/shop/lg/orderform.3.php b/mobile/shop/lg/orderform.3.php new file mode 100644 index 000000000..b090a888d --- /dev/null +++ b/mobile/shop/lg/orderform.3.php @@ -0,0 +1,2 @@ + + +'.PHP_EOL; + +echo make_order_field($data, $exclude); + +echo ''.PHP_EOL; +echo ''.PHP_EOL; + +echo ''.PHP_EOL; +?> + +
    +
    + + 주문완료 중입니다. 잠시만 기다려 주십시오. +
    +
    + + + + 계약정보 -> 상점정보관리에서 확인하실수 있습니다) + * + * MD5 해쉬데이터 암호화 검증을 위해 + * LG유플러스에서 발급한 상점키(MertKey)를 환경설정 파일(lgdacom/conf/mall.conf)에 반드시 입력하여 주시기 바랍니다. + */ + +$xpay = new XPay($configPath, $CST_PLATFORM); + +// Mert Key 설정 +$xpay->set_config_value('t'.$LGD_MID, $config['cf_lg_mert_key']); +$xpay->set_config_value($LGD_MID, $config['cf_lg_mert_key']); + +$xpay->Init_TX($LGD_MID); +$LGD_HASHDATA = md5($LGD_MID.$LGD_OID.$LGD_AMOUNT.$LGD_TIMESTAMP.$xpay->config[$LGD_MID]); +$LGD_CUSTOM_PROCESSTYPE = "TWOTR"; +/* + ************************************************* + * 2. MD5 해쉬암호화 (수정하지 마세요) - END + ************************************************* + */ +$CST_WINDOW_TYPE = "submit"; // 수정불가 +$payReqMap['CST_PLATFORM'] = $CST_PLATFORM; // 테스트, 서비스 구분 +$payReqMap['CST_WINDOW_TYPE'] = $CST_WINDOW_TYPE; // 수정불가 +$payReqMap['CST_MID'] = $CST_MID; // 상점아이디 +$payReqMap['LGD_MID'] = $LGD_MID; // 상점아이디 +$payReqMap['LGD_OID'] = $LGD_OID; // 주문번호 +$payReqMap['LGD_BUYER'] = $LGD_BUYER; // 구매자 +$payReqMap['LGD_PRODUCTINFO'] = $LGD_PRODUCTINFO; // 상품정보 +$payReqMap['LGD_AMOUNT'] = $LGD_AMOUNT; // 결제금액 +$payReqMap['LGD_BUYEREMAIL'] = $LGD_BUYEREMAIL; // 구매자 이메일 +$payReqMap['LGD_CUSTOM_SKIN'] = $LGD_CUSTOM_SKIN; // 결제창 SKIN +$payReqMap['LGD_CUSTOM_PROCESSTYPE'] = $LGD_CUSTOM_PROCESSTYPE; // 트랜잭션 처리방식 +$payReqMap['LGD_TIMESTAMP'] = $LGD_TIMESTAMP; // 타임스탬프 +$payReqMap['LGD_HASHDATA'] = $LGD_HASHDATA; // MD5 해쉬암호값 +$payReqMap['LGD_RETURNURL'] = $LGD_RETURNURL; // 응답수신페이지 +$payReqMap['LGD_VERSION'] = "PHP_SmartXPay_1.0"; // 버전정보 (삭제하지 마세요) +$payReqMap['LGD_CUSTOM_FIRSTPAY'] = $LGD_CUSTOM_FIRSTPAY; // 디폴트 결제수단 +$payReqMap['LGD_CUSTOM_SWITCHINGTYPE'] = "SUBMIT"; // 신용카드 카드사 인증 페이지 연동 방식 +$payReqMap['LGD_ENCODING'] = "UTF-8"; +$payReqMap['LGD_ENCODING_NOTEURL'] = "UTF-8"; +$payReqMap['LGD_ENCODING_RETURNURL'] = "UTF-8"; +$payReqMap['LGD_TAXFREEAMOUNT'] = $LGD_TAXFREEAMOUNT; +$payReqMap['LGD_CASHRECEIPTYN'] = $LGD_CASHRECEIPTYN; +$payReqMap['LGD_BUYERPHONE'] = $LGD_BUYERPHONE; +$payReqMap['LGD_BUYERID'] = $LGD_BUYERID; +$payReqMap['LGD_EASYPAY_ONLY'] = $LGD_EASYPAY_ONLY; + +/* +**************************************************** +* 안드로이드폰 신용카드 ISP(국민/BC)결제에만 적용 (시작)* +**************************************************** + +(주의)LGD_CUSTOM_ROLLBACK 의 값을 "Y"로 넘길 경우, LG U+ 전자결제에서 보낸 ISP(국민/비씨) 승인정보를 고객서버의 note_url에서 수신시 "OK" 리턴이 안되면 해당 트랜잭션은 무조건 롤백(자동취소)처리되고, +LGD_CUSTOM_ROLLBACK 의 값 을 "C"로 넘길 경우, 고객서버의 note_url에서 "ROLLBACK" 리턴이 될 때만 해당 트랜잭션은 롤백처리되며 그외의 값이 리턴되면 정상 승인완료 처리됩니다. +만일, LGD_CUSTOM_ROLLBACK 의 값이 "N" 이거나 null 인 경우, 고객서버의 note_url에서 "OK" 리턴이 안될시, "OK" 리턴이 될 때까지 3분간격으로 2시간동안 승인결과를 재전송합니다. +*/ + +$payReqMap['LGD_CUSTOM_ROLLBACK'] = ""; // 비동기 ISP에서 트랜잭션 처리여부 +$payReqMap['LGD_KVPMISPNOTEURL'] = $LGD_KVPMISPNOTEURL; // 비동기 ISP(ex. 안드로이드) 승인결과를 받는 URL +$payReqMap['LGD_KVPMISPWAPURL'] = $LGD_KVPMISPWAPURL; // 비동기 ISP(ex. 안드로이드) 승인완료후 사용자에게 보여지는 승인완료 URL +$payReqMap['LGD_KVPMISPCANCELURL'] = $LGD_KVPMISPCANCELURL; // ISP 앱에서 취소시 사용자에게 보여지는 취소 URL + +/* +**************************************************** +* 안드로이드폰 신용카드 ISP(국민/BC)결제에만 적용 (끝) * +**************************************************** +*/ + +// 안드로이드 에서 신용카드 적용 ISP(국민/BC)결제에만 적용 (선택) +// $payReqMap['LGD_KVPMISPAUTOAPPYN'] = "Y"; +// Y: 안드로이드에서 ISP신용카드 결제시, 고객사에서 'App To App' 방식으로 국민, BC카드사에서 받은 결제 승인을 받고 고객사의 앱을 실행하고자 할때 사용 + +// 가상계좌(무통장) 결제연동을 하시는 경우 할당/입금 결과를 통보받기 위해 반드시 LGD_CASNOTEURL 정보를 LG 유플러스에 전송해야 합니다 . +$payReqMap['LGD_CASNOTEURL'] = $LGD_CASNOTEURL; // 가상계좌 NOTEURL + +// 계좌이체 파라미터 +//$payReqMap['LGD_MTRANSFERWAPURL'] = $LGD_MTRANSFERWAPURL; +//$payReqMap['LGD_MTRANSFERCANCELURL'] = $LGD_MTRANSFERCANCELURL; +$payReqMap['LGD_MTRANSFERNOTEURL'] = $LGD_MTRANSFERNOTEURL; +$payReqMap['LGD_MTRANSFERAUTOAPPYN'] = $LGD_MTRANSFERAUTOAPPYN; + +//Return URL에서 인증 결과 수신 시 셋팅될 파라미터 입니다.*/ +$payReqMap['LGD_RESPCODE'] = ""; +$payReqMap['LGD_RESPMSG'] = ""; +$payReqMap['LGD_PAYKEY'] = ""; + +$_SESSION['PAYREQ_MAP'] = $payReqMap; + +$g5['title'] = '토스페이먼츠 eCredit서비스 결제'; +$g5['body_script'] = ' onload="launchCrossPlatform();"'; +include_once(G5_PATH.'/head.sub.php'); +?> + + + + + + + + +
    + $value) { + echo'"'; + } +?> +
    + + + + + + +
    + + '.conv_content($ca['ca_mobile_head_html'], 1).'
    '; + + $cate_skin = $skin_dir.'/listcategory.skin.php'; + if(!is_file($cate_skin)) + $cate_skin = G5_MSHOP_SKIN_PATH.'/listcategory.skin.php'; + include $cate_skin; + + // 테마미리보기 베스트상품 재설정 + if(defined('_THEME_PREVIEW_') && _THEME_PREVIEW_ === true) { + if(isset($theme_config['ca_mobile_list_best_mod'])) + $theme_config['ca_mobile_list_best_mod'] = (isset($tconfig['ca_mobile_list_best_mod']) && $tconfig['ca_mobile_list_best_mod']) ? $tconfig['ca_mobile_list_best_mod'] : 0; + if(isset($theme_config['ca_mobile_list_best_row'])) + $theme_config['ca_mobile_list_best_row'] = (isset($tconfig['ca_mobile_list_best_row']) && $tconfig['ca_mobile_list_best_row']) ? $tconfig['ca_mobile_list_best_row'] : 0; + } + + // 분류 Best Item + $list_mod = (isset($theme_config['ca_mobile_list_best_mod']) && $theme_config['ca_mobile_list_best_mod']) ? (int)$theme_config['ca_mobile_list_best_mod'] : $ca['ca_mobile_list_mod']; + $list_row = (isset($theme_config['ca_mobile_list_best_row']) && $theme_config['ca_mobile_list_best_row']) ? (int)$theme_config['ca_mobile_list_best_row'] : $ca['ca_mobile_list_row']; + $limit = $list_mod * $list_row; + $best_skin = G5_MSHOP_SKIN_PATH.'/list.best.10.skin.php'; + + $sql = " select * + from {$g5['g5_shop_item_table']} + where ( ca_id like '$ca_id%' or ca_id2 like '$ca_id%' or ca_id3 like '$ca_id%' ) + and it_use = '1' + and it_type4 = '1' + order by it_order, it_id desc + limit 0, $limit "; + + $list = new item_list($best_skin, $list_mod, $list_row, $ca['ca_mobile_img_width'], $ca['ca_mobile_img_height']); + $list->set_query($sql); + $list->set_mobile(true); + $list->set_view('it_img', true); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_price', true); + echo $list->run(); + + // 상품 출력순서가 있다면 + if ($sort != "") + $order_by = $sort.' '.$sortodr.' , it_order, it_id desc'; + else + $order_by = 'it_order, it_id desc'; + + $error = '

    등록된 상품이 없습니다.

    '; + + // 리스트 스킨 + $skin_file = is_include_path_check($skin_dir.'/'.$ca['ca_mobile_skin']) ? $skin_dir.'/'.$ca['ca_mobile_skin'] : $skin_dir.'/list.10.skin.php'; + + if (file_exists($skin_file)) { + + echo '
    '; + + $sort_skin = $skin_dir.'/list.sort.skin.php'; + if(!is_file($sort_skin)) + $sort_skin = G5_MSHOP_SKIN_PATH.'/list.sort.skin.php'; + include $sort_skin; + + // 상품 보기 타입 변경 버튼 + $sub_skin = $skin_dir.'/list.sub.skin.php'; + if(!is_file($sub_skin)) + $sub_skin = G5_MSHOP_SKIN_PATH.'/list.sub.skin.php'; + + if(is_file($sub_skin)){ + include $sub_skin; + } + + echo '
    '; + + // 총몇개 + $items = $ca['ca_mobile_list_mod'] * $ca['ca_mobile_list_row']; + // 페이지가 없으면 첫 페이지 (1 페이지) + if ($page < 1) $page = 1; + // 시작 레코드 구함 + $from_record = ($page - 1) * $items; + + $list = new item_list($skin_file, $ca['ca_mobile_list_mod'], $ca['ca_mobile_list_row'], $ca['ca_mobile_img_width'], $ca['ca_mobile_img_height']); + $list->set_category($ca['ca_id'], 1); + $list->set_category($ca['ca_id'], 2); + $list->set_category($ca['ca_id'], 3); + $list->set_is_page(true); + $list->set_mobile(true); + $list->set_order_by($order_by); + $list->set_from_record($from_record); + $list->set_view('it_img', true); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_price', true); + $list->set_view('sns', true); + $list->set_view('it_icon', true); + echo $list->run(); + + // where 된 전체 상품수 + $total_count = $list->total_count; + } + else + { + echo '
    '.str_replace(G5_PATH.'/', '', $skin_file).' 파일을 찾을 수 없습니다.
    관리자에게 알려주시면 감사하겠습니다.
    '; + } + ?> + + 0 && $total_count > $items) { + $qstr1 .= 'ca_id='.$ca_id; + $qstr1 .='&sort='.$sort.'&sortodr='.$sortodr; + $ajax_url = G5_SHOP_URL.'/ajax.list.php?'.$qstr1.'&use_sns=1'; + ?> +
    +

    로딩이미지
    잠시만 기다려주세요.

    +
    + +
    +
    + + + '.conv_content($ca['ca_mobile_tail_html'], 1).''; + ?> + + +\n"; \ No newline at end of file diff --git a/mobile/shop/listtype.php b/mobile/shop/listtype.php new file mode 100644 index 000000000..7e6eff45f --- /dev/null +++ b/mobile/shop/listtype.php @@ -0,0 +1,78 @@ +\'\"\\\'\\\"\%\=\(\)\s]/", "", $_REQUEST['type']) : ''; +if ($type == 1) $g5['title'] = '히트상품'; +else if ($type == 2) $g5['title'] = '추천상품'; +else if ($type == 3) $g5['title'] = '최신상품'; +else if ($type == 4) $g5['title'] = '인기상품'; +else if ($type == 5) $g5['title'] = '세일상품'; +else + alert('상품유형이 아닙니다.'); + +include_once(G5_MSHOP_PATH.'/_head.php'); + +// 한페이지에 출력하는 이미지수 = $list_mod * $list_row +// 모바일에서는 계산된 이미지수가 중요함 +$list_mod = $default['de_mobile_listtype_list_mod']; // 한줄에 이미지 몇개씩 출력? 단, 모바일환경에서는 사용되지 않음. +$list_row = $default['de_mobile_listtype_list_row']; // 한 페이지에 몇라인씩 출력? + +$img_width = $default['de_mobile_listtype_img_width']; // 출력이미지 폭 +$img_height = $default['de_mobile_listtype_img_height']; // 출력이미지 높이 +?> +
    +set_type($type); + $list->set_list_skin($list_file); + $list->set_list_mod($list_mod); + $list->set_list_row($list_row); + $list->set_img_size($img_width, $img_height); + $list->set_is_page(true); + $list->set_mobile(true); + $list->set_order_by($order_by); + $list->set_from_record($from_record); + echo $list->run(); + + // where 된 전체 상품수 + $total_count = $list->total_count; + // 전체 페이지 계산 + $total_page = ceil($total_count / $items); +} +else +{ + echo '
    '.$skin.' 파일을 찾을 수 없습니다.
    관리자에게 알려주시면 감사하겠습니다.
    '; +} +?> +
    + + + + +
    + +
    +

    회원정보 개요

    +
    + 님 + +
    +
      +
    • + 보유쿠폰 + +
    • +
    • + 보유포인트 + +
    • +
    +
    +
    + 연락처 + +
    +
    + E-Mail + +
    +
    + 최종접속일시 + +
    +
    + 회원가입일시 + +
    +
    + 주소 + +
    +
    +
    + +
    + + + +
    +

    최근 주문내역

    + + 더보기 +
    + +
    +

    최근 위시리스트

    + +
      + + +
    • +
      +
      + + +
      +
    • + + 보관 내역이 없습니다.'; + ?> +
    + 더보기 +
    + +
    + + + + + +
    +
    +

    배송지 목록

    + +
    +
      + +
    • +
      + + + + + +
      +
      +
      +
      +
      /
      +
      +
      + + + 삭제 + > + +
      +
    • + +
    +
    + +
    + + +
    +
    +
    + + + + + + + +
    + + +
      + 0) + $good_info .= chr(30); + $good_info .= "seq=".($i+1).chr(31); + $good_info .= "ordr_numb={$od_id}_".sprintf("%04d", $i).chr(31); + $good_info .= "good_name=".addslashes($row['it_name']).chr(31); + $good_info .= "good_cntx=".$row['ct_qty'].chr(31); + $good_info .= "good_amtx=".$row['ct_price'].chr(31); + } + + $a1 = ''; + $a2 = ''; + $image_width = 80; + $image_height = 80; + $image = get_it_image($row['it_id'], $image_width, $image_height); + + $it_name = $a1 . stripslashes($row['it_name']) . $a2; + $it_options = print_item_options($row['it_id'], $s_cart_id); + + + // 복합과세금액 + if($default['de_tax_flag_use']) { + if($row['it_notax']) { + $comm_free_mny += $sum['price']; + } else { + $tot_tax_mny += $sum['price']; + } + } + + $point = $sum['point']; + $sell_price = $sum['price']; + + $cp_button = ''; + // 쿠폰 + if($is_member) { + $cp_count = 0; + + $sql = " select cp_id + from {$g5['g5_shop_coupon_table']} + where mb_id IN ( '{$member['mb_id']}', '전체회원' ) + and cp_start <= '".G5_TIME_YMD."' + and cp_end >= '".G5_TIME_YMD."' + and cp_minimum <= '$sell_price' + and ( + ( cp_method = '0' and cp_target = '{$row['it_id']}' ) + OR + ( cp_method = '1' and ( cp_target IN ( '{$row['ca_id']}', '{$row['ca_id2']}', '{$row['ca_id3']}' ) ) ) + ) "; + $res = sql_query($sql); + + for($k=0; $cp=sql_fetch_array($res); $k++) { + if(is_used_coupon($member['mb_id'], $cp['cp_id'])) + continue; + + $cp_count++; + } + + if($cp_count) { + $cp_button = '
      '; + $it_cp_count++; + } + } + + // 배송비 + switch($row['ct_send_cost']) + { + case 1: + $ct_send_cost = '착불'; + break; + case 2: + $ct_send_cost = '무료'; + break; + default: + $ct_send_cost = '선불'; + break; + } + + // 조건부무료 + if($row['it_sc_type'] == 2) { + $sendcost = get_item_sendcost($row['it_id'], $sum['price'], $sum['qty'], $s_cart_id); + + if($sendcost == 0) + $ct_send_cost = '무료'; + } + ?> + +
    • + + + + + + + + +
      + +
      +
      + +
      +
      +
      + +
      + 판매가 + 수량 + 배송비 + 적립포인트 + +
      +
      주문금액
      + +
    • + + 장바구니에 담긴 상품이 없습니다.'; + alert('장바구니가 비어 있습니다.', G5_SHOP_URL.'/cart.php'); + } else { + // 배송비 계산 + $send_cost = get_sendcost($s_cart_id); + } + + // 복합과세처리 + if($default['de_tax_flag_use']) { + $comm_tax_mny = round(($tot_tax_mny + $send_cost) / 1.1); + $comm_vat_mny = ($tot_tax_mny + $send_cost) - $comm_tax_mny; + } + ?> +
    + + + + + +
    +
    +
    주문
    +
    + 0) { ?> +
    쿠폰
    +
    0 원
    + +
    배송비
    +
    + +
    포인트
    +
    +
    총계
    +
    + + 원 +
    +
    +
    + + + + +
    + + + +
    +
    + + + + + + + + + + +
    +

    주문하시는 분

    + +
    +
      +
    • + + +
    • + + +
    • + + + + 영,숫자 3~20자 (주문서 조회시 필요) + +
    • + + +
    • + + +
    • +
    • + + +
    • +
    • + 주소 + + + + + + + + + + +
      + +
    • +
    • + + +
    • + + +
    • + + + 이후로 배송 바랍니다. + +
    • + +
    +
    +
    + +
    +

    받으시는 분

    + +
    +
      + '.PHP_EOL; + $addr_list .= ''.PHP_EOL; + + // 기본배송지 + $sql = " select * + from {$g5['g5_shop_order_address_table']} + where mb_id = '{$member['mb_id']}' + and ad_default = '1' "; + $row = sql_fetch($sql); + if(isset($row['ad_id']) && $row['ad_id']) { + $val1 = $row['ad_name'].$sep.$row['ad_tel'].$sep.$row['ad_hp'].$sep.$row['ad_zip1'].$sep.$row['ad_zip2'].$sep.$row['ad_addr1'].$sep.$row['ad_addr2'].$sep.$row['ad_addr3'].$sep.$row['ad_jibeon'].$sep.$row['ad_subject']; + $addr_list .= '
      '.PHP_EOL; + $addr_list .= ''.PHP_EOL; + } + + // 최근배송지 + $sql = " select * + from {$g5['g5_shop_order_address_table']} + where mb_id = '{$member['mb_id']}' + and ad_default = '0' + order by ad_id desc + limit 1 "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + $val1 = $row['ad_name'].$sep.$row['ad_tel'].$sep.$row['ad_hp'].$sep.$row['ad_zip1'].$sep.$row['ad_zip2'].$sep.$row['ad_addr1'].$sep.$row['ad_addr2'].$sep.$row['ad_addr3'].$sep.$row['ad_jibeon'].$sep.$row['ad_subject']; + $val2 = ''; + $addr_list .= '
      '.PHP_EOL.$val2.PHP_EOL; + } + + $addr_list .= '
      '.PHP_EOL; + $addr_list .= ''.PHP_EOL; + + $addr_list .='배송지목록'; + } else { + // 주문자와 동일 + $addr_list .= ''.PHP_EOL; + $addr_list .= ''.PHP_EOL; + } + ?> +
    • + 배송지선택 +
      +
    • + +
    • + + + + + +
    • + +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + 주소 + + + + + + + + + + +
    • +
    • + + +
    • +
    +
    +
    + + + + + = '".G5_TIME_YMD."' + and cp_minimum <= '$tot_sell_price' "; + $res = sql_query($sql); + + for($k=0; $cp=sql_fetch_array($res); $k++) { + if(is_used_coupon($member['mb_id'], $cp['cp_id'])) + continue; + + $oc_cnt++; + } + + if($send_cost > 0) { + // 배송비쿠폰 + $sql = " select cp_id + from {$g5['g5_shop_coupon_table']} + where mb_id IN ( '{$member['mb_id']}', '전체회원' ) + and cp_method = '3' + and cp_start <= '".G5_TIME_YMD."' + and cp_end >= '".G5_TIME_YMD."' + and cp_minimum <= '$tot_sell_price' "; + $res = sql_query($sql); + + for($k=0; $cp=sql_fetch_array($res); $k++) { + if(is_used_coupon($member['mb_id'], $cp['cp_id'])) + continue; + + $sc_cnt++; + } + } + } + ?> + +
    +

    결제정보 입력

    + + +
    + + + 0) { ?> + + + + + + + + + + 0) { ?> + + + + + + + + + + + + + + + + + + +
    주문할인쿠폰 + + +
    주문할인금액0
    배송비할인쿠폰 + + +
    배송비할인금액0
    총 주문금액
    추가배송비0원 (지역에 따라 추가되는 도선료 등의 배송비입니다.)
    +
    + + 무통장입금 이외의 결제 수단으로 결제하시는 경우 포인트를 적립해드리지 않습니다.

    '; + + $multi_settle = 0; + $checked = ''; + + $escrow_title = ""; + if ($default['de_escrow_use']) { + $escrow_title = "에스크로 "; + } + + if ($is_kakaopay_use || $default['de_bank_use'] || $default['de_vbank_use'] || $default['de_iche_use'] || $default['de_card_use'] || $default['de_hp_use'] || $default['de_easy_pay_use'] || is_inicis_simple_pay()) { + echo '
      '; + } + + // 카카오페이 + if($is_kakaopay_use) { + $multi_settle++; + echo '
    • '.PHP_EOL; + $checked = ''; + } + + // 무통장입금 사용 + if ($default['de_bank_use']) { + $multi_settle++; + echo '
    • '.PHP_EOL; + $checked = ''; + } + + // 가상계좌 사용 + if ($default['de_vbank_use']) { + $multi_settle++; + echo '
    • '.PHP_EOL; + $checked = ''; + } + + // 계좌이체 사용 + if ($default['de_iche_use']) { + $multi_settle++; + echo '
    • '.PHP_EOL; + $checked = ''; + } + + // 휴대폰 사용 + if ($default['de_hp_use']) { + $multi_settle++; + echo '
    • '.PHP_EOL; + $checked = ''; + } + + // 신용카드 사용 + if ($default['de_card_use']) { + $multi_settle++; + echo '
    • '.PHP_EOL; + $checked = ''; + } + + $easypay_prints = array(); + + // PG 간편결제 + if($default['de_easy_pay_use']) { + switch($default['de_pg_service']) { + case 'lg': + $pg_easy_pay_name = 'PAYNOW'; + break; + case 'inicis': + $pg_easy_pay_name = 'KPAY'; + break; + default: + $pg_easy_pay_name = 'PAYCO'; + break; + } + + $multi_settle++; + + if($default['de_pg_service'] === 'kcp' && isset($default['de_easy_pay_services']) && $default['de_easy_pay_services']){ + $de_easy_pay_service_array = explode(',', $default['de_easy_pay_services']); + if( in_array('nhnkcp_payco', $de_easy_pay_service_array) ){ + $easypay_prints['nhnkcp_payco'] = '
    • '; + } + if( in_array('nhnkcp_naverpay', $de_easy_pay_service_array) ){ + $easypay_prints['nhnkcp_naverpay'] = '
    • '; + } + if( in_array('nhnkcp_kakaopay', $de_easy_pay_service_array) ){ + $easypay_prints['nhnkcp_kakaopay'] = '
    • '; + } + } else { + $easypay_prints[strtolower($pg_easy_pay_name)] = '
    • '; + } + } + + if( ! isset($easypay_prints['nhnkcp_naverpay']) && function_exists('is_use_easypay') && is_use_easypay('global_nhnkcp') ){ + $easypay_prints['nhnkcp_naverpay'] = '
    • '; + } + + if($easypay_prints) { + $multi_settle++; + echo run_replace('shop_orderform_easypay_buttons', implode(PHP_EOL, $easypay_prints), $easypay_prints, $multi_settle); + } + + //이니시스 삼성페이 + if($default['de_samsung_pay_use']) { + echo '
    • '.PHP_EOL; + $checked = ''; + } + + //이니시스 Lpay + if($default['de_inicis_lpay_use']) { + echo '
    • '.PHP_EOL; + $checked = ''; + } + + //이니시스 카카오페이 + if($default['de_inicis_kakaopay_use']) { + echo '
    • '.PHP_EOL; + $checked = ''; + } + + echo '
    '; + + $temp_point = 0; + // 회원이면서 포인트사용이면 + if ($is_member && $config['cf_use_point']) + { + // 포인트 결제 사용 포인트보다 회원의 포인트가 크다면 + if ($member['mb_point'] >= $default['de_settle_min_point']) + { + $temp_point = (int)$default['de_settle_max_point']; + + if($temp_point > (int)$tot_sell_price) + $temp_point = (int)$tot_sell_price; + + if($temp_point > (int)$member['mb_point']) + $temp_point = (int)$member['mb_point']; + + $point_unit = (int)$default['de_settle_point_unit']; + $temp_point = (int)((int)($temp_point / $point_unit) * $point_unit); + + echo '
    '; + echo '
    '; + echo '
    보유포인트'.display_point($member['mb_point']).'최대사용가능포인트'.display_point($temp_point).'
    '; + echo '
    '; + $multi_settle++; + } + } + + if ($default['de_bank_use']) { + // 은행계좌를 배열로 만든후 + $str = explode("\n", trim($default['de_bank_account'])); + if (count($str) <= 1) + { + $bank_account = ''.$str[0].PHP_EOL; + } + else + { + $bank_account = ''.PHP_EOL; + } + echo ''; + } + + if ($default['de_bank_use'] || $default['de_vbank_use'] || $default['de_iche_use'] || $default['de_card_use'] || $default['de_hp_use'] || $default['de_easy_pay_use'] || is_inicis_simple_pay() ) { + echo '
    '; + } + + if ($multi_settle == 0) + echo '

    결제할 방법이 없습니다.
    운영자에게 알려주시면 감사하겠습니다.

    '; + ?> +
    + + + + + + +
    + + + +
    + + + \ No newline at end of file diff --git a/mobile/shop/orderformupdate.php b/mobile/shop/orderformupdate.php new file mode 100644 index 000000000..ad0d12442 --- /dev/null +++ b/mobile/shop/orderformupdate.php @@ -0,0 +1,987 @@ + $it_stock_qty) + $error .= "{$row['ct_option']} 의 재고수량이 부족합니다. 현재고수량 : $it_stock_qty 개\\n\\n"; +} + +if($i == 0) { + if(function_exists('add_order_post_log')) add_order_post_log('장바구니가 비어 있습니다.'); + alert('장바구니가 비어 있습니다.\\n\\n이미 주문하셨거나 장바구니에 담긴 상품이 없는 경우입니다.', G5_SHOP_URL.'/cart.php'); +} + +if ($error != "") +{ + $error .= "다른 고객님께서 {$od_name}님 보다 먼저 주문하신 경우입니다. 불편을 끼쳐 죄송합니다."; + if(function_exists('add_order_post_log')) add_order_post_log($error); + alert($error, $page_return_url); +} + +$i_price = isset($_POST['od_price']) ? (int) $_POST['od_price'] : 0; +$i_send_cost = isset($_POST['od_send_cost']) ? (int) $_POST['od_send_cost'] : 0; +$i_send_cost2 = isset($_POST['od_send_cost2']) ? (int) $_POST['od_send_cost2'] : 0; +$i_send_coupon = isset($_POST['od_send_coupon']) ? abs((int) $_POST['od_send_coupon']) : 0; +$i_temp_point = isset($_POST['od_temp_point']) ? (int) $_POST['od_temp_point'] : 0; + + +// 주문금액이 상이함 +$sql = " select SUM(IF(io_type = 1, (io_price * ct_qty), ((ct_price + io_price) * ct_qty))) as od_price, + COUNT(distinct it_id) as cart_count + from {$g5['g5_shop_cart_table']} where od_id = '$tmp_cart_id' and ct_select = '1' "; +$row = sql_fetch($sql); +$tot_ct_price = $row['od_price']; +$cart_count = $row['cart_count']; +$tot_od_price = $tot_ct_price; + +// 쿠폰금액계산 +$tot_cp_price = $tot_it_cp_price = $tot_od_cp_price = 0; +if($is_member) { + // 상품쿠폰 + $it_cp_cnt = (isset($_POST['cp_id']) && is_array($_POST['cp_id'])) ? count($_POST['cp_id']) : 0; + $arr_it_cp_prc = array(); + for($i=0; $i<$it_cp_cnt; $i++) { + $cid = isset($_POST['cp_id'][$i]) ? $_POST['cp_id'][$i] : ''; + $it_id = isset($_POST['it_id'][$i]) ? safe_replace_regex($_POST['it_id'][$i], 'it_id') : ''; + $sql = " select cp_id, cp_method, cp_target, cp_type, cp_price, cp_trunc, cp_minimum, cp_maximum + from {$g5['g5_shop_coupon_table']} + where cp_id = '$cid' + and mb_id IN ( '{$member['mb_id']}', '전체회원' ) + and cp_start <= '".G5_TIME_YMD."' + and cp_end >= '".G5_TIME_YMD."' + and cp_method IN ( 0, 1 ) "; + $cp = sql_fetch($sql); + if(! (isset($cp['cp_id']) && $cp['cp_id'])) + continue; + + // 사용한 쿠폰인지 + if(is_used_coupon($member['mb_id'], $cp['cp_id'])) + continue; + + // 분류할인인지 + if($cp['cp_method']) { + $sql2 = " select it_id, ca_id, ca_id2, ca_id3 + from {$g5['g5_shop_item_table']} + where it_id = '$it_id' "; + $row2 = sql_fetch($sql2); + + if(!$row2['it_id']) + continue; + + if($row2['ca_id'] != $cp['cp_target'] && $row2['ca_id2'] != $cp['cp_target'] && $row2['ca_id3'] != $cp['cp_target']) + continue; + } else { + if($cp['cp_target'] != $it_id) + continue; + } + + // 상품금액 + $sql = " select SUM( IF(io_type = '1', io_price * ct_qty, (ct_price + io_price) * ct_qty)) as sum_price + from {$g5['g5_shop_cart_table']} + where od_id = '$tmp_cart_id' + and it_id = '$it_id' + and ct_select = '1' "; + $ct = sql_fetch($sql); + $item_price = $ct['sum_price']; + + if($cp['cp_minimum'] > $item_price) + continue; + + $dc = 0; + if($cp['cp_type']) { + $dc = floor(($item_price * ($cp['cp_price'] / 100)) / $cp['cp_trunc']) * $cp['cp_trunc']; + } else { + $dc = $cp['cp_price']; + } + + if($cp['cp_maximum'] && $dc > $cp['cp_maximum']) + $dc = $cp['cp_maximum']; + + if($item_price < $dc) + continue; + + $tot_it_cp_price += $dc; + $arr_it_cp_prc[$it_id] = $dc; + } + + $tot_od_price -= $tot_it_cp_price; + + // 주문쿠폰 + if(isset($_POST['od_cp_id']) && $_POST['od_cp_id']) { + $sql = " select cp_id, cp_type, cp_price, cp_trunc, cp_minimum, cp_maximum + from {$g5['g5_shop_coupon_table']} + where cp_id = '{$_POST['od_cp_id']}' + and mb_id IN ( '{$member['mb_id']}', '전체회원' ) + and cp_start <= '".G5_TIME_YMD."' + and cp_end >= '".G5_TIME_YMD."' + and cp_method = '2' "; + $cp = sql_fetch($sql); + + // 사용한 쿠폰인지 + $cp_used = is_used_coupon($member['mb_id'], $cp['cp_id']); + + $dc = 0; + if(!$cp_used && $cp['cp_id'] && ($cp['cp_minimum'] <= $tot_od_price)) { + if($cp['cp_type']) { + $dc = floor(($tot_od_price * ($cp['cp_price'] / 100)) / $cp['cp_trunc']) * $cp['cp_trunc']; + } else { + $dc = $cp['cp_price']; + } + + if($cp['cp_maximum'] && $dc > $cp['cp_maximum']) + $dc = $cp['cp_maximum']; + + if($tot_od_price < $dc) + die('Order coupon error.'); + + $tot_od_cp_price = $dc; + $tot_od_price -= $tot_od_cp_price; + } + } + + $tot_cp_price = $tot_it_cp_price + $tot_od_cp_price; +} + +if ((int)($row['od_price'] - $tot_cp_price) !== $i_price) { + if(function_exists('add_order_post_log')) add_order_post_log('쿠폰금액 최종 계산 Error.'); + die("Error."); +} + +// 배송비가 상이함 +$send_cost = get_sendcost($tmp_cart_id); + +$tot_sc_cp_price = 0; +if($is_member && $send_cost > 0) { + // 배송쿠폰 + if(isset($_POST['sc_cp_id']) && $_POST['sc_cp_id']) { + $sql = " select cp_id, cp_type, cp_price, cp_trunc, cp_minimum, cp_maximum + from {$g5['g5_shop_coupon_table']} + where cp_id = '{$_POST['sc_cp_id']}' + and mb_id IN ( '{$member['mb_id']}', '전체회원' ) + and cp_start <= '".G5_TIME_YMD."' + and cp_end >= '".G5_TIME_YMD."' + and cp_method = '3' "; + $cp = sql_fetch($sql); + + // 사용한 쿠폰인지 + $cp_used = is_used_coupon($member['mb_id'], $cp['cp_id']); + + $dc = 0; + if(!$cp_used && $cp['cp_id'] && ($cp['cp_minimum'] <= $tot_od_price)) { + if($cp['cp_type']) { + $dc = floor(($send_cost * ($cp['cp_price'] / 100)) / $cp['cp_trunc']) * $cp['cp_trunc']; + } else { + $dc = $cp['cp_price']; + } + + if($cp['cp_maximum'] && $dc > $cp['cp_maximum']) + $dc = $cp['cp_maximum']; + + if($dc > $send_cost) + $dc = $send_cost; + + $tot_sc_cp_price = $dc; + } + } +} + +if ((int)($send_cost - $tot_sc_cp_price) !== (int)($i_send_cost - $i_send_coupon)) { + if(function_exists('add_order_post_log')) add_order_post_log('배송비 최종 계산 Error..'); + die("Error.."); +} + +// 추가배송비가 상이함 +$od_b_zip = preg_replace('/[^0-9]/', '', $od_b_zip); +$od_b_zip1 = substr($od_b_zip, 0, 3); +$od_b_zip2 = substr($od_b_zip, 3); +$zipcode = $od_b_zip1 . $od_b_zip2; +$sql = " select sc_id, sc_price from {$g5['g5_shop_sendcost_table']} where sc_zip1 <= '$zipcode' and sc_zip2 >= '$zipcode' "; +$tmp = sql_fetch($sql); +if(! (isset($tmp['sc_id']) && $tmp['sc_id'])) + $send_cost2 = 0; +else + $send_cost2 = (int)$tmp['sc_price']; + +if($send_cost2 !== $i_send_cost2) { + if(function_exists('add_order_post_log')) add_order_post_log('추가배송비 최종 계산 Error...'); + die("Error..."); +} + +// 결제포인트가 상이함 +// 회원이면서 포인트사용이면 +$temp_point = 0; +if ($is_member && $config['cf_use_point']) +{ + if($member['mb_point'] >= $default['de_settle_min_point']) { + $temp_point = (int)$default['de_settle_max_point']; + + if($temp_point > (int)$tot_od_price) + $temp_point = (int)$tot_od_price; + + if($temp_point > (int)$member['mb_point']) + $temp_point = (int)$member['mb_point']; + + $point_unit = (int)$default['de_settle_point_unit']; + $temp_point = (int)((int)($temp_point / $point_unit) * $point_unit); + } +} + +if (($i_temp_point > (int)$temp_point || $i_temp_point < 0) && $config['cf_use_point']) { + if(function_exists('add_order_post_log')) add_order_post_log('포인트 최종 계산 Error....'); + die("Error...."); +} + +if ($od_temp_point) +{ + if ($member['mb_point'] < $od_temp_point) { + if(function_exists('add_order_post_log')) add_order_post_log('회원님의 포인트가 부족하여 포인트로 결제 할 수 없습니다.'); + alert('회원님의 포인트가 부족하여 포인트로 결제 할 수 없습니다.', $page_return_url); + } +} + +$i_price = $i_price + $i_send_cost + $i_send_cost2 - $i_temp_point - $i_send_coupon; +$order_price = $tot_od_price + $send_cost + $send_cost2 - $tot_sc_cp_price - $od_temp_point; + +$od_status = '주문'; +$od_tno = ''; +if ($od_settle_case == "무통장") +{ + $od_receipt_point = $i_temp_point; + $od_receipt_price = 0; + $od_misu = $i_price - $od_receipt_price; + if($od_misu == 0) { + $od_status = '입금'; + $od_receipt_time = G5_TIME_YMDHIS; + } + $tno = $od_receipt_time = $od_app_no = ''; +} +else if ($od_settle_case == "계좌이체") +{ + switch($default['de_pg_service']) { + case 'lg': + include G5_SHOP_PATH.'/lg/xpay_result.php'; + break; + case 'inicis': + include G5_MSHOP_PATH.'/inicis/pay_result.php'; + break; + default: + include G5_MSHOP_PATH.'/kcp/pp_ax_hub.php'; + $bank_name = iconv("cp949", "utf-8", $bank_name); + break; + } + + $od_tno = $tno; + $od_receipt_price = $amount; + $od_receipt_point = $i_temp_point; + $od_receipt_time = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/", "\\1-\\2-\\3 \\4:\\5:\\6", $app_time); + $od_deposit_name = $od_name; + $od_bank_account = $bank_name; + $pg_price = $amount; + $od_misu = $i_price - $od_receipt_price; + if($od_misu == 0) + $od_status = '입금'; +} +else if ($od_settle_case == "가상계좌") +{ + switch($default['de_pg_service']) { + case 'lg': + include G5_SHOP_PATH.'/lg/xpay_result.php'; + break; + case 'inicis': + include G5_MSHOP_PATH.'/inicis/pay_result.php'; + break; + default: + include G5_MSHOP_PATH.'/kcp/pp_ax_hub.php'; + $bankname = iconv("cp949", "utf-8", $bankname); + $depositor = iconv("cp949", "utf-8", $depositor); + break; + } + + $od_receipt_point = $i_temp_point; + $od_tno = $tno; + $od_app_no = $app_no; + $od_receipt_price = 0; + $od_bank_account = $bankname.' '.$account; + $od_deposit_name = $depositor; + $pg_price = $amount; + $od_misu = $i_price - $od_receipt_price; + $od_receipt_time = ''; +} +else if ($od_settle_case == "휴대폰") +{ + switch($default['de_pg_service']) { + case 'lg': + include G5_SHOP_PATH.'/lg/xpay_result.php'; + break; + case 'inicis': + include G5_MSHOP_PATH.'/inicis/pay_result.php'; + break; + default: + include G5_MSHOP_PATH.'/kcp/pp_ax_hub.php'; + break; + } + + $od_tno = $tno; + $od_receipt_price = $amount; + $od_receipt_point = $i_temp_point; + $od_receipt_time = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/", "\\1-\\2-\\3 \\4:\\5:\\6", $app_time); + $od_bank_account = $commid.' '.$mobile_no; + $pg_price = $amount; + $od_misu = $i_price - $od_receipt_price; + if($od_misu == 0) + $od_status = '입금'; +} +else if ($od_settle_case == "신용카드") +{ + switch($default['de_pg_service']) { + case 'lg': + include G5_SHOP_PATH.'/lg/xpay_result.php'; + break; + case 'inicis': + include G5_MSHOP_PATH.'/inicis/pay_result.php'; + break; + default: + include G5_MSHOP_PATH.'/kcp/pp_ax_hub.php'; + $card_name = iconv("cp949", "utf-8", $card_name); + break; + } + + $od_tno = $tno; + $od_app_no = $app_no; + $od_receipt_price = $amount; + $od_receipt_point = $i_temp_point; + $od_receipt_time = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/", "\\1-\\2-\\3 \\4:\\5:\\6", $app_time); + $od_bank_account = $card_name; + $pg_price = $amount; + $od_misu = $i_price - $od_receipt_price; + if($od_misu == 0) + $od_status = '입금'; +} +else if ($od_settle_case == "간편결제") +{ + switch($default['de_pg_service']) { + case 'lg': + include G5_SHOP_PATH.'/lg/xpay_result.php'; + break; + case 'inicis': + include G5_MSHOP_PATH.'/inicis/pay_result.php'; + break; + default: + include G5_MSHOP_PATH.'/kcp/pp_ax_hub.php'; + $card_name = iconv("cp949", "utf-8", $card_name); + break; + } + + $od_tno = $tno; + $od_app_no = $app_no; + $od_receipt_price = $amount; + $od_receipt_point = $i_temp_point; + $od_receipt_time = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/", "\\1-\\2-\\3 \\4:\\5:\\6", $app_time); + $od_bank_account = $card_name; + $pg_price = $amount; + $od_misu = $i_price - $od_receipt_price; + if($od_misu == 0) + $od_status = '입금'; +} +else if ( is_inicis_order_pay($od_settle_case) ) //이니시스의 삼성페이 또는 L.pay 또는 이니시스 카카오페이 +{ + // 이니시스에서만 지원 + include G5_MSHOP_PATH.'/inicis/pay_result.php'; + + $od_tno = $tno; + $od_app_no = $app_no; + $od_receipt_price = $amount; + $od_receipt_point = $i_temp_point; + $od_receipt_time = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/", "\\1-\\2-\\3 \\4:\\5:\\6", $app_time); + $od_bank_account = $card_name; + $pg_price = $amount; + $od_misu = $i_price - $od_receipt_price; + if($od_misu == 0) + $od_status = '입금'; +} +else if ($od_settle_case == "KAKAOPAY") +{ + include G5_SHOP_PATH.'/kakaopay/kakaopay_result.php'; + + $od_tno = $tno; + $od_app_no = $app_no; + $od_receipt_price = $amount; + $od_receipt_point = $i_temp_point; + $od_receipt_time = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/", "\\1-\\2-\\3 \\4:\\5:\\6", $app_time); + $od_bank_account = $card_name; + $pg_price = $amount; + $od_misu = $i_price - $od_receipt_price; + if($od_misu == 0) + $od_status = '입금'; +} +else +{ + die("od_settle_case Error!!!"); +} + +$od_pg = $default['de_pg_service']; +if($od_settle_case == 'KAKAOPAY') + $od_pg = 'KAKAOPAY'; + +// 주문금액과 결제금액이 일치하는지 체크 +if($tno) { + if((int)$order_price !== (int)$pg_price) { + $cancel_msg = '결제금액 불일치'; + switch($od_pg) { + case 'lg': + include G5_SHOP_PATH.'/lg/xpay_cancel.php'; + break; + case 'inicis': + include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; + break; + case 'KAKAOPAY': + $_REQUEST['TID'] = $tno; + $_REQUEST['Amt'] = $amount; + $_REQUEST['CancelMsg'] = $cancel_msg; + $_REQUEST['PartialCancelCode'] = 0; + include G5_SHOP_PATH.'/kakaopay/kakaopay_cancel.php'; + break; + default: + include G5_SHOP_PATH.'/kcp/pp_ax_hub_cancel.php'; + break; + } + + if(function_exists('add_order_post_log')) add_order_post_log($cancel_msg); + die("Receipt Amount Error"); + } +} + +if ($is_member) { + $od_pwd = $member['mb_password']; +} else { + $post_od_pwd = isset($_POST['od_pwd']) ? $_POST['od_pwd'] : sha1(rand()); + $od_pwd = get_encrypt_string($_POST['od_pwd']); +} + +// 주문번호를 얻는다. +$od_id = get_session('ss_order_id'); + +if( !$od_id ){ + if(function_exists('add_order_post_log')) add_order_post_log('주문번호가 없습니다.'); + die("주문번호가 없습니다."); +} + +$od_escrow = 0; +if(isset($escw_yn) && $escw_yn == 'Y') + $od_escrow = 1; + +// 복합과세 금액 +$od_tax_mny = round($i_price / 1.1); +$od_vat_mny = $i_price - $od_tax_mny; +$od_free_mny = 0; +if($default['de_tax_flag_use']) { + $od_tax_mny = isset($_POST['comm_tax_mny']) ? (int) $_POST['comm_tax_mny'] : 0; + $od_vat_mny = isset($_POST['comm_vat_mny']) ? (int) $_POST['comm_vat_mny'] : 0; + $od_free_mny = isset($_POST['comm_free_mny']) ? (int) $_POST['comm_free_mny'] : 0; +} + +$od_email = get_email_address($od_email); +$od_name = clean_xss_tags($od_name); +$od_tel = clean_xss_tags($od_tel); +$od_hp = clean_xss_tags($od_hp); +$od_zip = preg_replace('/[^0-9]/', '', $od_zip); +$od_zip1 = substr($od_zip, 0, 3); +$od_zip2 = substr($od_zip, 3); +$od_addr1 = clean_xss_tags($od_addr1); +$od_addr2 = clean_xss_tags($od_addr2); +$od_addr3 = clean_xss_tags($od_addr3); +$od_addr_jibeon = preg_match("/^(N|R)$/", $od_addr_jibeon) ? $od_addr_jibeon : ''; +$od_b_name = clean_xss_tags($od_b_name); +$od_b_tel = clean_xss_tags($od_b_tel); +$od_b_hp = clean_xss_tags($od_b_hp); +$od_b_addr1 = clean_xss_tags($od_b_addr1); +$od_b_addr2 = clean_xss_tags($od_b_addr2); +$od_b_addr3 = clean_xss_tags($od_b_addr3); +$od_b_addr_jibeon = preg_match("/^(N|R)$/", $od_b_addr_jibeon) ? $od_b_addr_jibeon : ''; +$od_memo = clean_xss_tags($od_memo); +$od_deposit_name = clean_xss_tags($od_deposit_name); +$od_tax_flag = $default['de_tax_flag_use']; + +// 주문서에 입력 +$sql = " insert {$g5['g5_shop_order_table']} + set od_id = '$od_id', + mb_id = '{$member['mb_id']}', + od_pwd = '$od_pwd', + od_name = '$od_name', + od_email = '$od_email', + od_tel = '$od_tel', + od_hp = '$od_hp', + od_zip1 = '$od_zip1', + od_zip2 = '$od_zip2', + od_addr1 = '$od_addr1', + od_addr2 = '$od_addr2', + od_addr3 = '$od_addr3', + od_addr_jibeon = '$od_addr_jibeon', + od_b_name = '$od_b_name', + od_b_tel = '$od_b_tel', + od_b_hp = '$od_b_hp', + od_b_zip1 = '$od_b_zip1', + od_b_zip2 = '$od_b_zip2', + od_b_addr1 = '$od_b_addr1', + od_b_addr2 = '$od_b_addr2', + od_b_addr3 = '$od_b_addr3', + od_b_addr_jibeon = '$od_b_addr_jibeon', + od_deposit_name = '$od_deposit_name', + od_memo = '$od_memo', + od_cart_count = '$cart_count', + od_cart_price = '$tot_ct_price', + od_cart_coupon = '$tot_it_cp_price', + od_send_cost = '$od_send_cost', + od_send_coupon = '$tot_sc_cp_price', + od_send_cost2 = '$od_send_cost2', + od_coupon = '$tot_od_cp_price', + od_receipt_price = '$od_receipt_price', + od_receipt_point = '$od_receipt_point', + od_bank_account = '$od_bank_account', + od_receipt_time = '$od_receipt_time', + od_misu = '$od_misu', + od_pg = '$od_pg', + od_tno = '$od_tno', + od_app_no = '$od_app_no', + od_escrow = '$od_escrow', + od_tax_flag = '$od_tax_flag', + od_tax_mny = '$od_tax_mny', + od_vat_mny = '$od_vat_mny', + od_free_mny = '$od_free_mny', + od_status = '$od_status', + od_shop_memo = '', + od_hope_date = '$od_hope_date', + od_time = '".G5_TIME_YMDHIS."', + od_mobile = '1', + od_ip = '$REMOTE_ADDR', + od_settle_case = '$od_settle_case', + od_other_pay_type = '$od_other_pay_type', + od_test = '{$default['de_card_test']}' + "; +$result = sql_query($sql, false); + +// 정말로 insert 가 되었는지 한번더 체크한다. +$exists_sql = "select od_id, od_tno, od_ip from {$g5['g5_shop_order_table']} where od_id = '$od_id'"; +$exists_order = sql_fetch($exists_sql); + +if(! $result && (isset($exists_order['od_id']) && $od_id && $exists_order['od_id'] === $od_id)) { + if(isset($exists_order['od_tno']) && $exists_order['od_tno']){ + //이미 상품이 주문되었다면 리다이렉트 + exists_inicis_shop_order($od_id, array(), $exists_order['od_time'], $REMOTE_ADDR); + goto_url(G5_SHOP_URL); + } +} + +// 주문정보 입력 오류시 결제 취소 +if(! $result || ! (isset($exists_order['od_id']) && $od_id && $exists_order['od_id'] === $od_id)) { + if($tno) { + $cancel_msg = '주문정보 입력 오류 : '.$sql; + switch($od_pg) { + case 'lg': + include G5_SHOP_PATH.'/lg/xpay_cancel.php'; + break; + case 'inicis': + include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; + break; + case 'KAKAOPAY': + $_REQUEST['TID'] = $tno; + $_REQUEST['Amt'] = $amount; + $_REQUEST['CancelMsg'] = $cancel_msg; + $_REQUEST['PartialCancelCode'] = 0; + include G5_SHOP_PATH.'/kakaopay/kakaopay_cancel.php'; + break; + default: + include G5_SHOP_PATH.'/kcp/pp_ax_hub_cancel.php'; + break; + } + } + + // 관리자에게 오류 알림 메일발송 + $error = 'order'; + include G5_SHOP_PATH.'/ordererrormail.php'; + + if(function_exists('add_order_post_log')) add_order_post_log($cancel_msg); + // 주문삭제 + sql_query(" delete from {$g5['g5_shop_order_table']} where od_id = '$od_id' ", false); + + die('

    고객님의 주문 정보를 처리하는 중 오류가 발생해서 주문이 완료되지 않았습니다.

    '.strtoupper($od_pg).'를 이용한 전자결제(신용카드, 계좌이체, 가상계좌 등)은 자동 취소되었습니다.'); +} + +// 장바구니 상태변경 +// 신용카드로 주문하면서 신용카드 포인트 사용하지 않는다면 포인트 부여하지 않음 +$cart_status = $od_status; +$sql_card_point = ""; +if ($od_receipt_price > 0 && !$default['de_card_point']) { + $sql_card_point = " , ct_point = '0' "; +} +$sql = "update {$g5['g5_shop_cart_table']} + set od_id = '$od_id', + ct_status = '$cart_status' + $sql_card_point + where od_id = '$tmp_cart_id' + and ct_select = '1' "; +$result = sql_query($sql, false); + +// 주문정보 입력 오류시 결제 취소 +if(!$result) { + if($tno) { + $cancel_msg = '주문상태 변경 오류'; + switch($od_pg) { + case 'lg': + include G5_SHOP_PATH.'/lg/xpay_cancel.php'; + break; + case 'inicis': + include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; + break; + case 'KAKAOPAY': + $_REQUEST['TID'] = $tno; + $_REQUEST['Amt'] = $amount; + $_REQUEST['CancelMsg'] = $cancel_msg; + $_REQUEST['PartialCancelCode'] = 0; + include G5_SHOP_PATH.'/kakaopay/kakaopay_cancel.php'; + break; + default: + include G5_SHOP_PATH.'/kcp/pp_ax_hub_cancel.php'; + break; + } + } + + // 관리자에게 오류 알림 메일발송 + $error = 'status'; + include G5_SHOP_PATH.'/ordererrormail.php'; + + if(function_exists('add_order_post_log')) add_order_post_log($cancel_msg); + // 주문삭제 + sql_query(" delete from {$g5['g5_shop_order_table']} where od_id = '$od_id' "); + + die('

    고객님의 주문 정보를 처리하는 중 오류가 발생해서 주문이 완료되지 않았습니다.

    '.strtoupper($od_pg).'를 이용한 전자결제(신용카드, 계좌이체, 가상계좌 등)은 자동 취소되었습니다.'); +} + +// 회원이면서 포인트를 사용했다면 포인트 테이블에 사용을 추가 +if ($is_member && $od_receipt_point) + insert_point($member['mb_id'], (-1) * $od_receipt_point, "주문번호 $od_id 결제"); + +$od_memo = nl2br(htmlspecialchars2(stripslashes($od_memo))) . " "; + +// 쿠폰사용내역기록 +if($is_member) { + $it_cp_cnt = (isset($_POST['cp_id']) && is_array($_POST['cp_id'])) ? count($_POST['cp_id']) : 0; + for($i=0; $i<$it_cp_cnt; $i++) { + $cid = isset($_POST['cp_id'][$i]) ? $_POST['cp_id'][$i] : ''; + $cp_it_id = isset($_POST['it_id'][$i]) ? safe_replace_regex($_POST['it_id'][$i], 'it_id') : ''; + $cp_prc = isset($arr_it_cp_prc[$cp_it_id]) ? (int) $arr_it_cp_prc[$cp_it_id] : 0; + + if(trim($cid)) { + $sql = " insert into {$g5['g5_shop_coupon_log_table']} + set cp_id = '$cid', + mb_id = '{$member['mb_id']}', + od_id = '$od_id', + cp_price = '$cp_prc', + cl_datetime = '".G5_TIME_YMDHIS."' "; + sql_query($sql); + } + + // 쿠폰사용금액 cart에 기록 + $sql = " update {$g5['g5_shop_cart_table']} + set cp_price = '$cp_prc' + where od_id = '$od_id' + and it_id = '$cp_it_id' + and ct_select = '1' + order by ct_id asc + limit 1 "; + sql_query($sql); + } + + if(isset($_POST['od_cp_id']) && $_POST['od_cp_id']) { + $sql = " insert into {$g5['g5_shop_coupon_log_table']} + set cp_id = '{$_POST['od_cp_id']}', + mb_id = '{$member['mb_id']}', + od_id = '$od_id', + cp_price = '$tot_od_cp_price', + cl_datetime = '".G5_TIME_YMDHIS."' "; + sql_query($sql); + } + + if(isset($_POST['sc_cp_id']) && $_POST['sc_cp_id']) { + $sql = " insert into {$g5['g5_shop_coupon_log_table']} + set cp_id = '{$_POST['sc_cp_id']}', + mb_id = '{$member['mb_id']}', + od_id = '$od_id', + cp_price = '$tot_sc_cp_price', + cl_datetime = '".G5_TIME_YMDHIS."' "; + sql_query($sql); + } +} + + +include_once(G5_SHOP_PATH.'/ordermail1.inc.php'); +include_once(G5_SHOP_PATH.'/ordermail2.inc.php'); + +// SMS BEGIN -------------------------------------------------------- +// 주문고객과 쇼핑몰관리자에게 SMS 전송 +if($config['cf_sms_use'] && ($default['de_sms_use2'] || $default['de_sms_use3'])) { + $is_sms_send = (function_exists('is_sms_send')) ? is_sms_send('orderformupdate') : false; + + if($is_sms_send) { + $sms_contents = array($default['de_sms_cont2'], $default['de_sms_cont3']); + $recv_numbers = array($od_hp, $default['de_sms_hp']); + $send_numbers = array($default['de_admin_company_tel'], $default['de_admin_company_tel']); + + $sms_count = 0; + $sms_messages = array(); + + for($s=0; $s $recv_number, 'send' => $send_number, 'cont' => $sms_content); + $sms_count++; + } + } + + // 무통장 입금 때 고객에게 계좌정보 보냄 + if($od_settle_case == '무통장' && $default['de_sms_use2'] && $od_misu > 0) { + $sms_content = $od_name."님의 입금계좌입니다.\n금액:".number_format($od_misu)."원\n계좌:".$od_bank_account."\n".$default['de_admin_company_name']; + + $recv_number = preg_replace("/[^0-9]/", "", $od_hp); + $send_number = preg_replace("/[^0-9]/", "", $default['de_admin_company_tel']); + + $sms_messages[] = array('recv' => $recv_number, 'send' => $send_number, 'cont' => $sms_content); + $sms_count++; + } + + // SMS 전송 + if($sms_count > 0) { + if($config['cf_sms_type'] == 'LMS') { + include_once(G5_LIB_PATH.'/icode.lms.lib.php'); + + $port_setting = get_icode_port_type($config['cf_icode_id'], $config['cf_icode_pw']); + + // SMS 모듈 클래스 생성 + if($port_setting !== false) { + $SMS = new LMS; + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting); + + for($s=0; $sAdd($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount); + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } + } else { + include_once(G5_LIB_PATH.'/icode.sms.lib.php'); + + $SMS = new SMS; // SMS 연결 + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + + for($s=0; $sAdd($recv_number, $send_number, $config['cf_icode_id'], $sms_content, ""); + } + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } + } +} +// SMS END -------------------------------------------------------- + + +// orderview 에서 사용하기 위해 session에 넣고 +$uid = md5($od_id.G5_TIME_YMDHIS.$REMOTE_ADDR); +set_session('ss_orderview_uid', $uid); + +// 주문 정보 임시 데이터 삭제 +$sql = " delete from {$g5['g5_shop_order_data_table']} where od_id = '$od_id' and dt_pg = '$od_pg' "; +sql_query($sql); + +if( $od_pg == 'inicis' && $od_tno ){ + $sql = "delete from {$g5['g5_shop_inicis_log_table']} where oid = '$od_id' and P_TID = '$od_tno' "; + sql_query($sql, false); +} + +if(function_exists('add_order_post_log')) add_order_post_log('', 'delete'); + +// 주문번호제거 +set_session('ss_order_id', ''); + +// 기존자료 세션에서 제거 +if (get_session('ss_direct')) + set_session('ss_cart_direct', ''); + +// 배송지처리 +if($is_member) { + $sql = " select * from {$g5['g5_shop_order_address_table']} + where mb_id = '{$member['mb_id']}' + and ad_name = '$od_b_name' + and ad_tel = '$od_b_tel' + and ad_hp = '$od_b_hp' + and ad_zip1 = '$od_b_zip1' + and ad_zip2 = '$od_b_zip2' + and ad_addr1 = '$od_b_addr1' + and ad_addr2 = '$od_b_addr2' + and ad_addr3 = '$od_b_addr3' "; + $row = sql_fetch($sql); + + // 기본배송지 체크 + if($ad_default) { + $sql = " update {$g5['g5_shop_order_address_table']} + set ad_default = '0' + where mb_id = '{$member['mb_id']}' "; + sql_query($sql); + } + + $ad_subject = clean_xss_tags($ad_subject); + + if($row['ad_id']){ + $sql = " update {$g5['g5_shop_order_address_table']} + set ad_default = '$ad_default', + ad_subject = '$ad_subject', + ad_jibeon = '$od_b_addr_jibeon' + where mb_id = '{$member['mb_id']}' + and ad_id = '{$row['ad_id']}' "; + } else { + $sql = " insert into {$g5['g5_shop_order_address_table']} + set mb_id = '{$member['mb_id']}', + ad_subject = '$ad_subject', + ad_default = '$ad_default', + ad_name = '$od_b_name', + ad_tel = '$od_b_tel', + ad_hp = '$od_b_hp', + ad_zip1 = '$od_b_zip1', + ad_zip2 = '$od_b_zip2', + ad_addr1 = '$od_b_addr1', + ad_addr2 = '$od_b_addr2', + ad_addr3 = '$od_b_addr3', + ad_jibeon = '$od_b_addr_jibeon' "; + } + + sql_query($sql); +} + +$is_noti_pay = isset($is_noti_pay) ? $is_noti_pay : false; + +if( $is_noti_pay ){ + $order_id = $od_id; + return; +} + +goto_url(G5_SHOP_URL.'/orderinquiryview.php?od_id='.$od_id.'&uid='.$uid); \ No newline at end of file diff --git a/mobile/shop/orderinquiry.php b/mobile/shop/orderinquiry.php new file mode 100644 index 000000000..a346ae3a6 --- /dev/null +++ b/mobile/shop/orderinquiry.php @@ -0,0 +1,93 @@ + + +

    +

    주문서번호 링크를 누르시면 주문상세내역을 조회하실 수 있습니다.

    + + + + +
    + + + + + + +
    +
      + 1) + $ct_name .= ' 외 '.($ct2['cnt'] - 1).'건'; + + switch($row['od_status']) { + case '주문': + $od_status = '입금확인중'; + break; + case '입금': + $od_status = '입금완료'; + break; + case '준비': + $od_status = '상품준비중'; + break; + case '배송': + $od_status = '상품배송'; + break; + case '완료': + $od_status = '배송완료'; + break; + default: + $od_status = '주문취소'; + break; + } + + $od_invoice = ''; + if($row['od_delivery_company'] && $row['od_invoice']) + $od_invoice = ' '.get_text($row['od_delivery_company']).' '.get_text($row['od_invoice']).''; + + $uid = md5($row['od_id'].$row['od_time'].$row['od_ip']); + ?> + +
    • +
      + + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      + +
      +
    • + + 주문 내역이 없습니다.'; + ?> +
    +
    diff --git a/mobile/shop/orderinquiryview.php b/mobile/shop/orderinquiryview.php new file mode 100644 index 000000000..63c54028a --- /dev/null +++ b/mobile/shop/orderinquiryview.php @@ -0,0 +1,713 @@ +'.PHP_EOL; + } else { + echo ''.PHP_EOL; + } +} +?> + +
    + +
    주문번호
    + +
    +

    주문하신 상품

    + + +
      + +
    • + + + +
      +
      + +
      + + 상태 + +
      +
      +
      + 판매가 + 수량 + 배송비 + 적립포인트 + +
      +
      + 주문금액 +
      + + +
    • + 0 && $st_count1 == $st_count2) + $custom_cancel = true; + ?> +
    + +
    + 상품 상태 설명 +
    +
    +
    주문
    +
    주문이 접수되었습니다.
    +
    입금
    +
    입금(결제)이 완료 되었습니다.
    +
    준비
    +
    상품 준비 중입니다.
    +
    배송
    +
    상품 배송 중입니다.
    +
    완료
    +
    상품 배송이 완료 되었습니다.
    +
    +
    +
    + +
    + + +
    +
    +
    주문총액
    +
    + + 0) { ?> +
    상품할인
    +
    + + + 0) { ?> +
    결제할인
    +
    + + + 0) { ?> +
    배송비
    +
    + + + 0) { ?> +
    배송비할인
    +
    + + + 0) { ?> +
    추가배송비
    +
    + + + 0) { ?> +
    취소금액
    +
    + + +
    적립포인트
    +
    + +
    총계
    +
    + +
    +
    +
    + +
    +

    결제/배송 정보

    + $od['od_cancel_price'])) { + $wanbul = " (완불)"; + $misu = false; // 미수금 없음 + } + else + { + $wanbul = display_price($receipt_price); + } + + // 결제정보처리 + if($od['od_receipt_price'] > 0) + $od_receipt_price = display_price($od['od_receipt_price']); + else + $od_receipt_price = '아직 입금되지 않았거나 입금정보를 입력하지 못하였습니다.'; + + $app_no_subj = ''; + $disp_bank = true; + $disp_receipt = false; + if($od['od_settle_case'] == '신용카드' || $od['od_settle_case'] == 'KAKAOPAY' || is_inicis_order_pay($od['od_settle_case']) ) { + $app_no_subj = '승인번호'; + $app_no = $od['od_app_no']; + $disp_bank = false; + $disp_receipt = true; + } else if($od['od_settle_case'] == '간편결제') { + $app_no_subj = '승인번호'; + $app_no = $od['od_app_no']; + $disp_bank = false; + } else if($od['od_settle_case'] == '휴대폰') { + $app_no_subj = '휴대폰번호'; + $app_no = $od['od_bank_account']; + $disp_bank = false; + $disp_receipt = true; + } else if($od['od_settle_case'] == '가상계좌' || $od['od_settle_case'] == '계좌이체') { + $app_no_subj = '거래번호'; + $app_no = $od['od_tno']; + + if( function_exists('shop_is_taxsave') && $misu_price == 0 && shop_is_taxsave($od, true) === 2 ){ + $disp_receipt = true; + } + } + ?> + +
    +

    결제정보

    + +
    + + + + + + + + + + + + + + + + + + + 0) + { + ?> + + + + + + + + + + + + + + + + + + + + + + + + 0) + { + ?> + + + + + + 0) + { + ?> + + + + + + + + + + + +
    주문번호
    주문일시
    결제방식
    결제금액
    결제일시
    입금자명
    입금계좌
    영수증 + + 영수증 출력 + + 영수증 출력 + + 영수증 출력 + +
    포인트사용
    환불 금액
    현금영수증 + + 현금영수증 확인하기 + + 현금영수증을 발급하시려면 클릭하십시오. + +
    +
    +
    + +
    +

    주문하신 분

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    이 름
    전화번호
    핸드폰
    주 소
    E-mail
    +
    + +
    + +
    +

    받으시는 분

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    이 름
    전화번호
    핸드폰
    주 소
    희망배송일
    전하실 말씀
    +
    +
    + +
    +

    배송정보

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    배송회사
    운송장번호
    배송일시
    아직 배송하지 않았거나 배송정보를 입력하지 못하였습니다.
    +
    +
    +
    + +
    +

    결제합계

    + +
      +
    • + 총 구매액 + +
    • + 0) { + echo '
    • '; + echo '미결제액'.PHP_EOL; + echo ''.display_price($misu_price).''; + echo '
    • '; + } + ?> +
    • + 결제액 + + +
      +

      포인트 결제

      +

      실결제

      +
      + +
    • +
    +
    + +
    +

    주문취소

    + + + +
    +
    + + + + + + + +
    +
    + +

    주문 취소, 반품, 품절된 내역이 있습니다.

    + +
    + + 0 && $default['de_card_test'] && $is_admin && $od['od_pg'] == 'kcp') { + preg_match("/\s{1}([^\s]+)\s?/", $od['od_bank_account'], $matchs); + $deposit_no = trim($matchs[1]); + ?> +

    관리자가 가상계좌 테스트를 한 경우에만 보입니다.

    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    모의입금처리
    +
    + +
    +
    +
    + + +
    + + + + + + +
    + + personalpay.skin.php 파일을 찾을 수 없습니다.
    관리자에게 알려주시면 감사하겠습니다.

    '; + } + + echo get_paging($config['cf_mobile_pages'], $page, $total_page, $_SERVER['SCRIPT_NAME'].'?'.$qstr.'&page='); + ?> +
    + + + + +
    + +
    + +
    +
    + +
    +

    개인결제정보

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    상세내용
    결제금액
    +
    + + '; + echo '결제방법 선택'; + echo '
      '; + } + + // 가상계좌 사용 + if ($default['de_vbank_use']) { + $multi_settle++; + echo '
    • '.PHP_EOL; + $checked = ''; + } + + // 계좌이체 사용 + if ($default['de_iche_use']) { + $multi_settle++; + echo '
    • '.PHP_EOL; + $checked = ''; + } + + // 휴대폰 사용 + if ($default['de_hp_use']) { + $multi_settle++; + echo '
    • '.PHP_EOL; + $checked = ''; + } + + // 신용카드 사용 + if ($default['de_card_use']) { + $multi_settle++; + echo '
    • '.PHP_EOL; + $checked = ''; + } + + if ($default['de_vbank_use'] || $default['de_iche_use'] || $default['de_card_use'] || $default['de_hp_use']) { + echo '
    '; + echo ''; + + } + ?> + + 결제할 방법이 없습니다.
    운영자에게 알려주시면 감사하겠습니다.

    '; + ?> +
    + + + + +
    + + +
    + + \ No newline at end of file diff --git a/mobile/shop/personalpayformupdate.php b/mobile/shop/personalpayformupdate.php new file mode 100644 index 000000000..21a8a8454 --- /dev/null +++ b/mobile/shop/personalpayformupdate.php @@ -0,0 +1,270 @@ +$sql

    " . sql_error_info() . "

    error file : {$_SERVER['SCRIPT_NAME']}"); +} + +// 주문번호가 있으면 결제정보 반영 +if($pp_receipt_price > 0 && $pp['pp_id'] && $pp['od_id']) { + $od_escrow = 0; + if($escw_yn == 'Y') + $od_escrow = 1; + + $sql = " update {$g5['g5_shop_order_table']} + set od_receipt_price = od_receipt_price + '$pp_receipt_price', + od_receipt_time = '$pp_receipt_time', + od_pg = '$pp_pg', + od_tno = '$pp_tno', + od_app_no = '$app_no', + od_escrow = '$od_escrow', + od_settle_case = '$pp_settle_case', + od_deposit_name = '$pp_deposit_name', + od_bank_account = '$pp_bank_account', + od_shop_memo = concat(od_shop_memo, \"\\n개인결제 ".$pp['pp_id']." 로 결제완료 - ".$pp_receipt_time."\") + where od_id = '{$pp['od_id']}' "; + $result = sql_query($sql, false); + + // 결제정보 입력 오류시 결제 취소 + if(!$result) { + $cancel_msg = '결제정보 입력 오류'; + switch($default['de_pg_service']) { + case 'lg': + include G5_SHOP_PATH.'/lg/xpay_cancel.php'; + break; + case 'inicis': + include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; + break; + default: + include G5_SHOP_PATH.'/kcp/pp_ax_hub_cancel.php'; + break; + } + + die("

    $sql

    " . sql_error_info() . "

    error file : {$_SERVER['SCRIPT_NAME']}"); + } + + // 미수금 정보 업데이트 + $info = get_order_info($pp['od_id']); + + $sql = " update {$g5['g5_shop_order_table']} + set od_misu = '{$info['od_misu']}' "; + if($info['od_misu'] == 0) + $sql .= " , od_status = '입금' "; + $sql .= " where od_id = '{$pp['od_id']}' "; + sql_query($sql, FALSE); + + // 장바구니 상태변경 + if($info['od_misu'] == 0) { + $sql = " update {$g5['g5_shop_cart_table']} + set ct_status = '입금' + where od_id = '{$pp['od_id']}' "; + sql_query($sql, FALSE); + } +} + +// 주문 정보 임시 데이터 삭제 +$sql = " delete from {$g5['g5_shop_order_data_table']} where od_id = '{$pp['pp_id']}' and dt_pg = '$pp_pg' "; +sql_query($sql); + +// 개인결제번호제거 +set_session('ss_personalpay_id', ''); +set_session('ss_personalpay_hash', ''); + +$uid = md5($pp['pp_id'].$pp['pp_time'].$_SERVER['REMOTE_ADDR']); +set_session('ss_personalpay_uid', $uid); + +$is_noti_pay = isset($is_noti_pay) ? $is_noti_pay : false; + +if( $is_noti_pay ){ + $order_id = $pp['pp_id']; + return; +} + +goto_url(G5_SHOP_URL.'/personalpayresult.php?pp_id='.$pp['pp_id'].'&uid='.$uid); \ No newline at end of file diff --git a/mobile/shop/personalpayresult.php b/mobile/shop/personalpayresult.php new file mode 100644 index 000000000..4655814e2 --- /dev/null +++ b/mobile/shop/personalpayresult.php @@ -0,0 +1,316 @@ +'.PHP_EOL; + } else { + echo ''.PHP_EOL; + } +} +?> + +

    + +

    개인결제번호

    + +
    +

    결제 정보

    + 0) + $pp_receipt_price = display_price($pp['pp_receipt_price']); + else + $pp_receipt_price = '아직 입금되지 않았거나 입금정보를 입력하지 못하였습니다.'; + + $app_no_subj = ''; + $disp_bank = true; + $disp_receipt = false; + if($pp['pp_settle_case'] == '신용카드') { + $app_no_subj = '승인번호'; + $app_no = $pp['pp_app_no']; + $disp_bank = false; + $disp_receipt = true; + } else if($pp['pp_settle_case'] == '휴대폰') { + $app_no_subj = '휴대폰번호'; + $app_no = $pp['pp_bank_account']; + $disp_bank = false; + $disp_receipt = true; + } else if($pp['pp_settle_case'] == '가상계좌' || $pp['pp_settle_case'] == '계좌이체') { + $app_no_subj = '거래번호'; + $app_no = $pp['pp_tno']; + } + ?> + +
    +

    결제정보

    + +
    + + + + + + + + + + + + + + + + + 0) { ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0) + $is_cash_receipt = false; + } + + // 미수금이 없고 현금일 경우에만 현금영수증을 발급 할 수 있습니다. + if ($is_cash_receipt && $misu_price == 0 && $pp['pp_receipt_price'] && ($pp['pp_settle_case'] == '계좌이체' || $pp['pp_settle_case'] == '가상계좌')) { + ?> + + + + + + +
    주문번호
    결제방식
    결제금액
    결제일시
    입금자명
    입금계좌
    영수증 + + 영수증 출력 + + 영수증 출력 + + +
    현금영수증 + + 현금영수증 확인하기 + + 현금영수증을 발급하시려면 클릭하십시오. + +
    +
    +
    +
    + +
    +

    결제합계

    + +
      +
    • + 총 주문액 + +
    • + 0) { + echo '
    • '; + echo '미결제액'.PHP_EOL; + echo ''.display_price($misu_price).''; + echo '
    • '; + } + ?> +
    • + 결제액 + +
    • +
    +
    + + +

    관리자가 가상계좌 테스트를 한 경우에만 보입니다.

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    모의입금처리
    +
    + +
    +
    +
    + + +
    + + + + \ No newline at end of file diff --git a/mobile/shop/samsungpay/orderform.1.php b/mobile/shop/samsungpay/orderform.1.php new file mode 100644 index 000000000..a91eb6198 --- /dev/null +++ b/mobile/shop/samsungpay/orderform.1.php @@ -0,0 +1,34 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/mobile/shop/samsungpay/orderform.2.php b/mobile/shop/samsungpay/orderform.2.php new file mode 100644 index 000000000..0f47acbaf --- /dev/null +++ b/mobile/shop/samsungpay/orderform.2.php @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mobile/shop/samsungpay/orderform.3.php b/mobile/shop/samsungpay/orderform.3.php new file mode 100644 index 000000000..1d2effef5 --- /dev/null +++ b/mobile/shop/samsungpay/orderform.3.php @@ -0,0 +1,2 @@ +\'\"\\\'\\\"\%\=\(\)\s]/", "", $qsort); +} else { + $qsort = ''; +} +if (isset($_GET['qorder'])) { + $qorder = preg_match("/^(asc|desc)$/i", $qorder) ? $qorder : ''; +} else { + $qorder = ''; +} + +if(!($qname || $qexplan || $qid || $qbasic)) + $search_all = true; + +// 검색범위 checkbox 처리 +$qname_check = false; +$qexplan_check = false; +$qid_check = false; +$qbasic_check = false; + +if($search_all) { + $qname_check = true; + $qexplan_check = true; + $qid_check = true; + $qbasic_check = true; +} else { + if($qname) + $qname_check = true; + if($qexplan) + $qexplan_check = true; + if($qid) + $qid_check = true; + if($qbasic) + $qbasic_check = true; +} + +if ($q) { + $arr = explode(" ", $q); + $detail_where = array(); + for ($i=0; $iset_query(" select * $sql_common $sql_where {$order_by} limit $from_record, $items "); +} + +if(!file_exists($search_skin)) { + echo str_replace(G5_PATH.'/', '', $search_skin).' 스킨 파일이 존재하지 않습니다.'; +} else { + include_once($search_skin); +} + +include_once(G5_MSHOP_PATH.'/_tail.php'); \ No newline at end of file diff --git a/mobile/shop/settle_inicis.inc.php b/mobile/shop/settle_inicis.inc.php new file mode 100644 index 000000000..503e165c7 --- /dev/null +++ b/mobile/shop/settle_inicis.inc.php @@ -0,0 +1,114 @@ + '기업은행', + '04' => '국민은행', + '05' => '외환은행', + '07' => '수협중앙회', + '11' => '농협중앙회', + '20' => '우리은행', + '23' => 'SC 제일은행', + '31' => '대구은행', + '32' => '부산은행', + '34' => '광주은행', + '37' => '전북은행', + '39' => '경남은행', + '53' => '한국씨티은행', + '71' => '우체국', + '81' => '하나은행', + '88' => '신한은행', + '89' => '케이뱅크', + '90' => '카카오뱅크', + '92' => '토스뱅크', + 'D1' => '동양종합금융증권', + 'D2' => '현대증권', + 'D3' => '미래에셋증권', + 'D4' => '한국투자증권', + 'D5' => '우리투자증권', + 'D6' => '하이투자증권', + 'D7' => 'HMC 투자증권', + 'D8' => 'SK 증권', + 'D9' => '대신증권', + 'DA' => '하나대투증권', + 'DB' => '굿모닝신한증권', + 'DC' => '동부증권', + 'DD' => '유진투자증권', + 'DE' => '메리츠증권', + 'DF' => '신영증권' +); + +$CARD_CODE = array( + '01' => '외환', + '03' => '롯데', + '04' => '현대', + '06' => '국민', + '11' => 'BC', + '12' => '삼성', + '14' => '신한', + '15' => '한미', + '16' => 'NH', + '17' => '하나 SK', + '21' => '해외비자', + '22' => '해외마스터', + '23' => 'JCB', + '24' => '해외아멕스', + '25' => '해외다이너스', + '93' => '토스머니', + '94' => 'SSG머니', + '97' => '카카오머니', + '98' => '페이코' +); + +$PAY_METHOD = array( + 'ISP' => '신용카드', + 'CARD' => '신용카드', + 'BANK' => '계좌이체', + 'MOBILE' => '휴대폰', + 'VBANK' => '가상계좌' +); + +//신용카드 포인트 결제에 관한 옵션 ( 신청해야 함 ) +$inicis_cardpoint = $default['de_inicis_cartpoint_use'] ? '&cp_yn=Y' : ''; + +// 신용카드 상점 부담 무이자 옵션 +// 예) BC 2,3,6개월, 국민 3,6개월, 삼성 6,9개월 무이자 : 11-2:3:6^06-3:6^12-3:6:4 +//$inicis_cardpoint .= ''; // &merc_noint=Y&noint_quota=카드사코드-개월:개월^추가카드사코드-개월:개월:개월 형식으로 설정 + +$noti_url = G5_MSHOP_URL.'/inicis/settle_common.php'; +$next_url = G5_MSHOP_URL.'/inicis/pay_approval.php'; +$return_url = G5_MSHOP_URL.'/inicis/pay_return.php?oid='; \ No newline at end of file diff --git a/mobile/shop/settle_kcp.inc.php b/mobile/shop/settle_kcp.inc.php new file mode 100644 index 000000000..d4d4c7aa5 --- /dev/null +++ b/mobile/shop/settle_kcp.inc.php @@ -0,0 +1,67 @@ +config[$key] = $val; + } +} + +/* + * 1. 기본결제 인증요청 정보 변경 + * + * 기본정보를 변경하여 주시기 바랍니다.(파라미터 전달시 POST를 사용하세요) + */ +$CST_PLATFORM = $default['de_card_test'] ? 'test' : 'service'; //LG유플러스 결제 서비스 선택(test:테스트, service:서비스) +$CST_MID = 'si_'.$config['cf_lg_mid']; //상점아이디(LG유플러스으로 부터 발급받으신 상점아이디를 입력하세요) + //테스트 아이디는 't'를 반드시 제외하고 입력하세요. +$LGD_MID = (('test' == $CST_PLATFORM) ? 't' : '').$CST_MID; //상점아이디(자동생성) +$LGD_TIMESTAMP = date('YmdHis'); //타임스탬프 +$LGD_BUYERIP = $_SERVER['REMOTE_ADDR']; //구매자IP +$LGD_BUYERID = ''; //구매자ID +$LGD_CUSTOM_SKIN = 'SMART_XPAY2'; //상점정의 결제창 스킨 (red, purple, yellow) +$LGD_MERTKEY = ''; //상점MertKey(mertkey는 상점관리자 -> 계약정보 -> 상점정보관리에서 확인하실수 있습니다) + +$configPath = G5_LGXPAY_PATH.'/lgdacom'; //LG유플러스에서 제공한 환경파일("/conf/lgdacom.conf") 위치 지정. + +/* + * 가상계좌(무통장) 결제 연동을 하시는 경우 아래 LGD_CASNOTEURL 을 설정하여 주시기 바랍니다. + */ +$LGD_CASNOTEURL = G5_SHOP_URL.'/settle_lg_common.php'; \ No newline at end of file diff --git a/mobile/shop/shop.head.php b/mobile/shop/shop.head.php new file mode 100644 index 000000000..ac62acb74 --- /dev/null +++ b/mobile/shop/shop.head.php @@ -0,0 +1,125 @@ + + + +
    +

    + + + + + +
    + +
    + + + 마이페이지 + 장바구니 + +
    +
    + +
    + +
    + + + + + + + +
    + +
    +

    뒤로

    +
    + +
    +

    정보

    + + +

    + 회사명 + 주소
    + 사업자 등록번호
    + 대표 + 전화 + 팩스
    + + 통신판매업신고번호
    + 개인정보 보호책임자 + + 부가통신사업신고번호 '.$default['de_admin_buga_no'].''; ?>
    + Copyright © 2001-2013 . All Rights Reserved. +

    + + PC 버전 + +
    + + + + + + + +
    + +
    + + + +
      + + +
    • +
      +
      + + + + +
      + + 품절 + +
      + + +
      + + + + + + +
      + 삭제 +
      + +
    • + 위시리스트가 비었습니다.'; + ?> +
    + +
    + + +
    +
    +
    + + + +', 0); +?> + +
    +

    +
      + +
    • + "; + if ($list[$i]['is_notice']) + echo "".$list[$i]['subject'].""; + else + echo $list[$i]['subject']; + + if ($list[$i]['comment_cnt']) + + // if ($list[$i]['link']['count']) { echo "[{$list[$i]['link']['count']}]"; } + // if ($list[$i]['file']['count']) { echo "<{$list[$i]['file']['count']}>"; } + + if (isset($list[$i]['icon_new'])) echo " " . $list[$i]['icon_new']; + //if (isset($list[$i]['icon_hot'])) echo " " . $list[$i]['icon_hot']; + //if (isset($list[$i]['icon_file'])) echo " " . $list[$i]['icon_file']; + //if (isset($list[$i]['icon_link'])) echo " " . $list[$i]['icon_link']; + //if (isset($list[$i]['icon_secret'])) echo " " . $list[$i]['icon_secret']; + + echo ""; + + ?> +
    • + + +
    • 게시물이 없습니다.
    • + +
    + 전체보기 +
    diff --git a/mobile/skin/latest/shop_basic/style.css b/mobile/skin/latest/shop_basic/style.css new file mode 100644 index 000000000..14aa0c43a --- /dev/null +++ b/mobile/skin/latest/shop_basic/style.css @@ -0,0 +1,14 @@ +@charset "utf-8"; + +/* 최근게시물 스킨 (latest) */ +.lt {position:relative;margin:40px 10px 20px;border:1px solid #dde7e9;background:#fff;position:relative} +.lt h2{font-size:1.25em;padding:10px 15px;line-height:27px;border-bottom:1px solid #e8e8e8;margin:0;text-align:left} +.lt ul {margin:0 0 10px;padding:0 15px;list-style:none} +.lt li{text-align:left;margin:0 0 1px;line-height:40px;;border-top:1px solid #e5ecee} +.lt li:first-child{border-top:0} +.lt li i{color:#9da4bc} +.lt li .fa-heart{color:#ff0000} +.lt li .new_icon{display:inline-block;padding: 0 3px;line-height:15px ;font-size:0.92em;color:#fff;background:#c56bed} +.lt li .cnt_cmt{color:#48a3d5} +.lt .empty_li {text-align:center;padding:50px 0;color:#555} +.lt .more_btn {position:absolute;top:10px;right:10px;line-height:25px;border:1px solid #d1d7e5;padding:0 8px;border-radius:3px;color:#3a8afd;} \ No newline at end of file diff --git a/mobile/skin/member/basic/login.skin.php b/mobile/skin/member/basic/login.skin.php index 7efdb31f4..a53a15af2 100644 --- a/mobile/skin/member/basic/login.skin.php +++ b/mobile/skin/member/basic/login.skin.php @@ -32,11 +32,81 @@ add_stylesheet('', + + + + + + + + +
    +

    비회원 구매

    + +

    + 비회원으로 주문하시는 경우 포인트는 지급하지 않습니다. +

    + +
    + +
    + + + + + + + +
    + + +
    +

    비회원 주문조회

    + +
    + 비회원 주문조회 + +
    + + + + + + + +
    +
    + +
    +

    메일로 발송해드린 주문서의 주문번호 및 주문 시 입력하신 비밀번호를 정확히 입력해주십시오.

    +
    + +
    + + + + + ', 0); +?> + +
    +
    + + + + + + + +
    +

    (필수) 추가 개인정보처리방침 안내

    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    추가 개인정보처리방침 안내
    목적
    항목보유기간
    이용자 식별 및 본인여부 확인
    생년월일, 암호화된 개인식별부호(CI)회원 탈퇴 시까지
    +
    +
    + +
    + + +
    +
    + +
    +

    인증수단 선택하기

    + +
    + '; + if ($config['cf_cert_simple']) { + echo '' . PHP_EOL; + } + if ($config['cf_cert_hp']) + echo '' . PHP_EOL; + if ($config['cf_cert_ipin']) + echo '' . PHP_EOL; + echo '
    '; + echo '' . PHP_EOL; + } + ?> +
    + + + + + + \ No newline at end of file diff --git a/mobile/skin/member/basic/password_lost.skin.php b/mobile/skin/member/basic/password_lost.skin.php index 10ccb24a8..e9e40bcd8 100644 --- a/mobile/skin/member/basic/password_lost.skin.php +++ b/mobile/skin/member/basic/password_lost.skin.php @@ -3,44 +3,116 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 add_stylesheet('', 0); -?> + +if($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipin'] || $config['cf_cert_hp'])) { ?> + + -
    -

    아이디 / 비밀번호 찾기

    +
    +

    이메일로 찾기

    회원가입 시 등록하신 이메일 주소를 입력해 주세요.
    해당 이메일로 아이디와 비밀번호 정보를 보내드립니다.

    - + +
    - -
    - - -
    -
    -
    -
    + + +
    + +
    + +
    + +
    +

    본인인증으로 찾기

    +
    + + + + + + + + + +
    +
    + + + + \ No newline at end of file diff --git a/mobile/skin/member/basic/password_reset.skin.php b/mobile/skin/member/basic/password_reset.skin.php new file mode 100644 index 000000000..f7dfafdaa --- /dev/null +++ b/mobile/skin/member/basic/password_reset.skin.php @@ -0,0 +1,39 @@ +', 0); +?> + + +
    +
    +
    +
    +

    새로운 비밀번호를 입력해주세요.

    + +
    + 회원 아이디 : + + + + +
    +
    + +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/mobile/skin/member/basic/register.skin.php b/mobile/skin/member/basic/register.skin.php index 7f2c508ec..5fb762a94 100644 --- a/mobile/skin/member/basic/register.skin.php +++ b/mobile/skin/member/basic/register.skin.php @@ -14,7 +14,7 @@ add_stylesheet('',
    -

    회원가입약관 및 개인정보처리방침안내의 내용에 동의하셔야 회원가입 하실 수 있습니다.

    +

    회원가입약관 및 개인정보 수집 및 이용의 내용에 동의하셔야 회원가입 하실 수 있습니다.

    @@ -31,10 +31,10 @@ add_stylesheet('',
    -

    개인정보처리방침안내

    +

    개인정보 수집 및 이용

    - + @@ -49,7 +49,7 @@ add_stylesheet('', - + @@ -64,7 +64,7 @@ add_stylesheet('',
    - +
    @@ -84,7 +84,7 @@ add_stylesheet('', } if (!f.agree2.checked) { - alert("개인정보처리방침안내의 내용에 동의하셔야 회원가입 하실 수 있습니다."); + alert("개인정보 수집 및 이용의 내용에 동의하셔야 회원가입 하실 수 있습니다."); f.agree2.focus(); return false; } diff --git a/mobile/skin/member/basic/register_form.skin.php b/mobile/skin/member/basic/register_form.skin.php index 1ccc9a7a5..90f33137b 100644 --- a/mobile/skin/member/basic/register_form.skin.php +++ b/mobile/skin/member/basic/register_form.skin.php @@ -3,14 +3,12 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 add_stylesheet('', 0); +add_javascript('', 0); +if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipin'] || $config['cf_cert_hp'])) + add_javascript('', 0); ?>
    - - - - - @@ -28,18 +26,18 @@ add_stylesheet('',

    사이트 이용정보 입력

    • - - placeholder="아이디"> + + placeholder="아이디 (필수)"> 영문자, 숫자, _ 만 입력 가능. 최소 3자이상 입력하세요.
    • - - placeholder="비밀번호"> + + placeholder="비밀번호 (필수)">
    • - - placeholder="비밀번호확인"> + + placeholder="비밀번호확인 (필수)">
    @@ -47,50 +45,70 @@ add_stylesheet('',

    개인정보 입력

      -
    • - - class="frm_input full_input " placeholder="이름"> - 아이핀 본인확인'.PHP_EOL; - if($config['cf_cert_hp']) - echo ''.PHP_EOL; +
    • + 간편인증'.PHP_EOL; + } + if($config['cf_cert_hp']) + echo ''.PHP_EOL; + if ($config['cf_cert_ipin']) + echo ''.PHP_EOL; + echo '(필수)'; echo ''.PHP_EOL; } ?> - - 아이핀 본인확인 후에는 이름이 자동 입력되고 휴대폰 본인확인 후에는 이름과 휴대폰번호가 자동 입력되어 수동으로 입력할수 없게 됩니다. -
      본인확인성인인증 완료
      - + +
    • +
    • + + class="frm_input full_input " placeholder="이름 (필수)"> +
    • - + 공백없이 한글,영문,숫자만 입력 가능 (한글2자, 영문4자 이상)
      닉네임을 바꾸시면 앞으로 일 이내에는 변경 할 수 없습니다.
      - +
    • - + @@ -98,29 +116,29 @@ add_stylesheet('', - +
    • - - " maxlength="255" placeholder="홈페이지"> + + " maxlength="255" placeholder="홈페이지 (필수)">
    • - - " maxlength="20" placeholder="전화번호"> + + " maxlength="20" placeholder="전화번호 (필수)">
    • - +
    • - - - class="frm_input full_input " maxlength="20" placeholder="휴대폰번호"> - + + + class="frm_input full_input " maxlength="20" placeholder="휴대폰번호 (필수)"> + @@ -130,13 +148,13 @@ add_stylesheet('',
    • - 주소필수 - - class="frm_input " size="5" maxlength="6" placeholder="우편번호"> + 주소 (필수) + + class="frm_input " size="5" maxlength="6" placeholder="우편번호">
      - - class="frm_input frm_address " size="50" placeholder="주소">
      + + class="frm_input frm_address " size="50" placeholder="주소">

      @@ -154,8 +172,8 @@ add_stylesheet('',
      • - - + +
      • @@ -275,28 +293,44 @@ add_stylesheet('', + diff --git a/mobile/skin/outlogin/shop_basic/style.css b/mobile/skin/outlogin/shop_basic/style.css new file mode 100644 index 000000000..c1bd1cc40 --- /dev/null +++ b/mobile/skin/outlogin/shop_basic/style.css @@ -0,0 +1,33 @@ +@charset "utf-8"; +.ol {position:relative;margin:0 0 10px;position:relative} +#ol_before h2 {width:0;height:0;overflow:hidden} +#ol_after h2 {width:0;height:0;overflow:hidden} + +#ol_before{background:#212020;;color:#fff;padding-left:10px;} +#ol_before .ol_before_link{display:inline-block;margin:10px 3px;} +#ol_before .ol_before_link a{display:inline-block;padding:0 10px;line-height:33px;border-radius:3px} +#ol_before .ol_before_link .login{color:#fff;background:#3a8afd;line-height:35px} +#ol_before .ol_before_link .join{color:#fff;border:1px solid #787878} + +#ol_after_hd{background:#212020;margin-bottom:10px;padding:15px 10px 15px 70px;text-align:left;position:relative;color:#fff;line-height:20px;} +#ol_after_hd .nickname{color:#fff;display:block} +#ol_after_hd strong {color:#3a8afd} +#ol_after_hd .point{color:#c7d4e6;font-size:0.92em} +#ol_after_hd .profile_img{display:inline-block;position:absolute;top:15px;left:15px} +#ol_after_hd .profile_img img{border-radius:50%;width:40px;height:40px} +#ol_after_info{position:absolute;bottom:0;right:-5px;text-align:center;background:#212020;width:20px;height:20px;line-height:20px;color:#fff;font-size:13px;border-radius:50%} + +#ol_after_private {margin:10px 0 ;padding:0;list-style:none;} +#ol_after_private:after {display:block;visibility:hidden;clear:both;content:""} +#ol_after_private li {position:relative;float:left;width:50%;} +#ol_after_private li:first-child{border-right:1px solid #efefef} +#ol_after_private a {color:#333;line-height:43px;background:#fff;display:block;border-bottom:1px solid #ddd;text-align:center;padding:0 10px 0 40px;text-align:left} +#ol_after_private i{position:absolute;top:0;left:0;font-size:15px;line-height:43px;width:40px;text-align:center;color:#a5a8ac} +#ol_after_private strong{position:absolute;top:12px;right:10px;font-size:0.846em;padding:0 5px;background:#37bc9b;color:#fff;line-height:20px;border-radius:35px} +#ol_after_private .win_coupon strong{background:#a352c1} + +#ol_after_btn {position:absolute;top:20px;right:40px} +#ol_after_btn a{display:inline-block;padding:0 10px;line-height:28px;font-weight:bold;border:1px solid #787878;background:none;color:#fff;vertical-align:top;border-radius:3px} +#ol_after_btn .btn_admin {display:inline-block;padding:0 10px;border:0;text-align:center;margin:0;line-height:30px;background:#ff0000} + +#ol_after_logout{background:#fff;color:#555} diff --git a/mobile/skin/poll/basic/style.css b/mobile/skin/poll/basic/style.css index 784f66cdd..8a046860c 100644 --- a/mobile/skin/poll/basic/style.css +++ b/mobile/skin/poll/basic/style.css @@ -1,36 +1,5 @@ @charset "utf-8"; -/* ### 기본 스타일 커스터마이징 시작 ### */ -#poll a.btn_admin {} /* 관리자 전용 버튼 */ -#poll a.btn_admin:focus, #poll a.btn_admin:hover {} - -/* 폼 테이블 */ -#poll .tbl_frm table {} -#poll .tbl_frm .frm_address {} -#poll .tbl_frm .frm_file {} -#poll .tbl_frm .frm_info {} - -#poll .tbl_frm01 {} -#poll .tbl_frm01 caption {} -#poll .tbl_frm01 th {} -#poll .tbl_frm01 td {} -#poll .tbl_frm01 textarea, #poll .frm_input {} -#poll .tbl_frm01 textarea {} -#poll .tbl_frm01 a {} - -#poll .required, #poll textarea.required {} - -#poll .btn_confirm {} /* 서식단계 진행 */ -#poll .btn_submit {} -#poll .btn_cancel {} -#poll .btn_frmline {} /* 우편번호검색버튼 등 */ -#poll .win_btn {} /* 새창용 */ -#poll .win_btn a {} -#poll .win_btn button {} -#poll .win_btn input {} - -/* ### 기본 스타일 커스터마이징 끝 ### */ - /* 설문조사 스킨 */ #poll {background:#fff;border:1px solid #dde7e9;margin:15px 10px} #poll header {position:relative;padding:15px;border-bottom:1px solid #dde7e9} diff --git a/mobile/skin/qa/basic/list.skin.php b/mobile/skin/qa/basic/list.skin.php index 6d3b8cd3c..2f102f5e2 100644 --- a/mobile/skin/qa/basic/list.skin.php +++ b/mobile/skin/qa/basic/list.skin.php @@ -115,6 +115,11 @@ add_stylesheet('', 0); 게시물 검색 + + + diff --git a/mobile/skin/qa/basic/style.css b/mobile/skin/qa/basic/style.css index add0d9d45..4b0f4eebb 100644 --- a/mobile/skin/qa/basic/style.css +++ b/mobile/skin/qa/basic/style.css @@ -136,7 +136,8 @@ #bo_sch {background:#fff;border:1px solid #d0d3db;position:relative;margin:10px} #bo_sch:after {display:block;visibility:hidden;clear:both;content:""} #bo_sch legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} -#bo_sch .sch_input {float:left;width:100%;height:38px;border:0;padding:0;background-color:transparent;padding:0 0 0 10px} +#bo_sch select {border:0;height:38px;border-right:1px solid #f8f8f8;float:left;width:30%} +#bo_sch .sch_input {height:38px;border:0;padding:0;background-color:transparent;float:left;width:70%;padding:0 40px 0 10px} #bo_sch .sch_btn {height:38px;position:absolute;top:0;right:0;border:0;width:40px;background:none;font-size:15px} diff --git a/mobile/skin/shop/basic/boxbanner.skin.php b/mobile/skin/shop/basic/boxbanner.skin.php new file mode 100644 index 000000000..67053166b --- /dev/null +++ b/mobile/skin/shop/basic/boxbanner.skin.php @@ -0,0 +1,43 @@ +', 0); +?> + +

        쇼핑몰 배너

        '.PHP_EOL; +?> + + diff --git a/mobile/skin/shop/basic/boxtodayview.skin.php b/mobile/skin/shop/basic/boxtodayview.skin.php new file mode 100644 index 000000000..9598fc41e --- /dev/null +++ b/mobile/skin/shop/basic/boxtodayview.skin.php @@ -0,0 +1,96 @@ +', 0); +?> + + +
        +

        오늘 본 상품

        + + + '.PHP_EOL; + echo '
      • '.PHP_EOL; + echo '
        '; + echo $img; + echo '
        '.PHP_EOL; + echo '
      • '.PHP_EOL; + + $tv_tot_count++; + } + if ($tv_tot_count > 0) echo '
      '.PHP_EOL; + ?> +
      + + + + + +

      없음

      + +
    + + + \ No newline at end of file diff --git a/mobile/skin/shop/basic/couponzone.10.skin.php b/mobile/skin/shop/basic/couponzone.10.skin.php new file mode 100644 index 000000000..4518253a9 --- /dev/null +++ b/mobile/skin/shop/basic/couponzone.10.skin.php @@ -0,0 +1,202 @@ +', 0); +?> + +
    +

    다운로드 쿠폰

    +

    회원이시라면 쿠폰 다운로드 후 바로 사용하실 수 있습니다.

    + + '.get_text($row3['it_name']).''; + $coupon_info_class = 'cp_2'; + break; + case '1': + $sql3 = " select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '{$row['cp_target']}' "; + $row3 = sql_fetch($sql3); + $cp_target = '카테고리할인'; + $cp_link = ''.get_text($row3['ca_name']).''; + $coupon_info_class = 'cp_1'; + break; + case '2': + $cp_link = $cp_target = '주문금액할인'; + $coupon_info_class = 'cp_3'; + break; + case '3': + $cp_link = $cp_target = '배송비할인'; + $coupon_info_class = 'cp_4'; + break; + } + + // 다운로드 쿠폰인지 + $disabled = ''; + if(is_coupon_downloaded($member['mb_id'], $row['cz_id'])) + $disabled = ' disabled'; + + // $row['cp_type'] 값이 있으면 % 이며 없으면 원 입니다. + $print_cp_price = $row['cp_type'] ? ''.$row['cp_price'].' %' : ''.number_format($row['cp_price']).' 원'; + + $coupon .= '
  • '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.$subj.''.PHP_EOL; + $coupon .= '
    '.$subj.'
    '.$print_cp_price.'
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '적용'.PHP_EOL; + $coupon .= '
    +

    '.$cp_target.'

    +
      +
    • 적용 : '.$cp_link.'
    • '; + + if( $row['cp_minimum'] ){ // 쿠폰에 최소주문금액이 있다면 + $coupon .= '
    • 최소주문금액 : '.number_format($row['cp_minimum']).'
    • '; + } + + $coupon .= '
    + +
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    기한다운로드 후 '.number_format($row['cz_period']).'일
    '.PHP_EOL; + //cp_1 카테고리할인 + //cp_2 개별상품할인 + //cp_3 주문금액할인 + //cp_4 배송비할인 + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
  • '.PHP_EOL; + } + + if($coupon) + echo '
      '.PHP_EOL.$coupon.'
    '.PHP_EOL; + else + echo '

    사용할 수 있는 쿠폰이 없습니다.

    '; + ?> +
    + +
    +

    포인트 쿠폰

    +

    보유하신 회원 포인트를 쿠폰으로 교환하실 수 있습니다.

    + + '.get_text($row3['it_name']).''; + $cp_target = '개별상품할인'; + $coupon_info_class = 'cp_2'; + break; + case '1': + $sql3 = " select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '{$row['cp_target']}' "; + $row3 = sql_fetch($sql3); + $cp_link = ''.get_text($row3['ca_name']).''; + $cp_target = '카테고리할인'; + $coupon_info_class = 'cp_1'; + break; + case '2': + $cp_link = $cp_target = '주문금액할인'; + $coupon_info_class = 'cp_3'; + break; + case '3': + $cp_link = $cp_target = '배송비할인'; + $coupon_info_class = 'cp_4'; + break; + } + + // 다운로드 쿠폰인지 + $disabled = ''; + if(is_coupon_downloaded($member['mb_id'], $row['cz_id'])) + $disabled = ' disabled'; + + // $row['cp_type'] 값이 있으면 % 이며 없으면 원 입니다. + $print_cp_price = $row['cp_type'] ? ''.$row['cp_price'].' %' : ''.number_format($row['cp_price']).' 원'; + + $coupon .= '
  • '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.$subj.''.PHP_EOL; + $coupon .= '
    '.$subj.'
    '.$print_cp_price.'
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '적용'.PHP_EOL; + $coupon .= '
    +

    '.$cp_target.'

    +
      +
    • 적용 : '.$cp_link.'
    • '; + + if( $row['cp_minimum'] ){ // 쿠폰에 최소주문금액이 있다면 + $coupon .= '
    • 최소주문금액 : '.number_format($row['cp_minimum']).'
    • '; + } + + $coupon .= '
    + +
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    기한다운로드 후 '.number_format($row['cz_period']).'일
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
  • '.PHP_EOL; + } + + if($coupon) + echo '
      '.PHP_EOL.$coupon.'
    '.PHP_EOL; + else + echo '

    사용할 수 있는 쿠폰이 없습니다.

    '; + ?> +
    + + \ No newline at end of file diff --git a/mobile/skin/shop/basic/img/arr_down01.gif b/mobile/skin/shop/basic/img/arr_down01.gif new file mode 100644 index 000000000..7c2f73c2e Binary files /dev/null and b/mobile/skin/shop/basic/img/arr_down01.gif differ diff --git a/mobile/skin/shop/basic/img/arr_up01.gif b/mobile/skin/shop/basic/img/arr_up01.gif new file mode 100644 index 000000000..beaff5f4c Binary files /dev/null and b/mobile/skin/shop/basic/img/arr_up01.gif differ diff --git a/mobile/skin/shop/basic/img/best_btn.gif b/mobile/skin/shop/basic/img/best_btn.gif new file mode 100644 index 000000000..eee0d0c29 Binary files /dev/null and b/mobile/skin/shop/basic/img/best_btn.gif differ diff --git a/mobile/skin/shop/basic/img/btn_next.gif b/mobile/skin/shop/basic/img/btn_next.gif new file mode 100644 index 000000000..eb714a33b Binary files /dev/null and b/mobile/skin/shop/basic/img/btn_next.gif differ diff --git a/mobile/skin/shop/basic/img/btn_next.png b/mobile/skin/shop/basic/img/btn_next.png new file mode 100644 index 000000000..4021e6ca0 Binary files /dev/null and b/mobile/skin/shop/basic/img/btn_next.png differ diff --git a/mobile/skin/shop/basic/img/btn_prev.gif b/mobile/skin/shop/basic/img/btn_prev.gif new file mode 100644 index 000000000..cdc83748f Binary files /dev/null and b/mobile/skin/shop/basic/img/btn_prev.gif differ diff --git a/mobile/skin/shop/basic/img/btn_prev.png b/mobile/skin/shop/basic/img/btn_prev.png new file mode 100644 index 000000000..f455793e1 Binary files /dev/null and b/mobile/skin/shop/basic/img/btn_prev.png differ diff --git a/mobile/skin/shop/basic/img/del_btn.gif b/mobile/skin/shop/basic/img/del_btn.gif new file mode 100644 index 000000000..6a576483a Binary files /dev/null and b/mobile/skin/shop/basic/img/del_btn.gif differ diff --git a/mobile/skin/shop/basic/img/facebook.png b/mobile/skin/shop/basic/img/facebook.png new file mode 100644 index 000000000..cf737d633 Binary files /dev/null and b/mobile/skin/shop/basic/img/facebook.png differ diff --git a/mobile/skin/shop/basic/img/gplus.png b/mobile/skin/shop/basic/img/gplus.png new file mode 100644 index 000000000..8ab2fa6bc Binary files /dev/null and b/mobile/skin/shop/basic/img/gplus.png differ diff --git a/mobile/skin/shop/basic/img/icon_best.gif b/mobile/skin/shop/basic/img/icon_best.gif new file mode 100644 index 000000000..508f48f5e Binary files /dev/null and b/mobile/skin/shop/basic/img/icon_best.gif differ diff --git a/mobile/skin/shop/basic/img/icon_cp.gif b/mobile/skin/shop/basic/img/icon_cp.gif new file mode 100644 index 000000000..61a3d233c Binary files /dev/null and b/mobile/skin/shop/basic/img/icon_cp.gif differ diff --git a/mobile/skin/shop/basic/img/icon_discount.gif b/mobile/skin/shop/basic/img/icon_discount.gif new file mode 100644 index 000000000..d5bda31d4 Binary files /dev/null and b/mobile/skin/shop/basic/img/icon_discount.gif differ diff --git a/mobile/skin/shop/basic/img/icon_hit.gif b/mobile/skin/shop/basic/img/icon_hit.gif new file mode 100644 index 000000000..3712ed10f Binary files /dev/null and b/mobile/skin/shop/basic/img/icon_hit.gif differ diff --git a/mobile/skin/shop/basic/img/icon_new.gif b/mobile/skin/shop/basic/img/icon_new.gif new file mode 100644 index 000000000..bf0ebd832 Binary files /dev/null and b/mobile/skin/shop/basic/img/icon_new.gif differ diff --git a/mobile/skin/shop/basic/img/icon_rec.gif b/mobile/skin/shop/basic/img/icon_rec.gif new file mode 100644 index 000000000..8a6a6c4a7 Binary files /dev/null and b/mobile/skin/shop/basic/img/icon_rec.gif differ diff --git a/mobile/skin/shop/basic/img/icon_secret.gif b/mobile/skin/shop/basic/img/icon_secret.gif new file mode 100644 index 000000000..c04899f14 Binary files /dev/null and b/mobile/skin/shop/basic/img/icon_secret.gif differ diff --git a/mobile/skin/shop/basic/img/icon_soldout.gif b/mobile/skin/shop/basic/img/icon_soldout.gif new file mode 100644 index 000000000..cd8ca8b7a Binary files /dev/null and b/mobile/skin/shop/basic/img/icon_soldout.gif differ diff --git a/mobile/skin/shop/basic/img/item_bg.gif b/mobile/skin/shop/basic/img/item_bg.gif new file mode 100644 index 000000000..d6a4d1cbe Binary files /dev/null and b/mobile/skin/shop/basic/img/item_bg.gif differ diff --git a/mobile/skin/shop/basic/img/item_btn.png b/mobile/skin/shop/basic/img/item_btn.png new file mode 100644 index 000000000..0d112766d Binary files /dev/null and b/mobile/skin/shop/basic/img/item_btn.png differ diff --git a/mobile/skin/shop/basic/img/loading.gif b/mobile/skin/shop/basic/img/loading.gif new file mode 100644 index 000000000..93dc39709 Binary files /dev/null and b/mobile/skin/shop/basic/img/loading.gif differ diff --git a/mobile/skin/shop/basic/img/mainlist_btn.gif b/mobile/skin/shop/basic/img/mainlist_btn.gif new file mode 100644 index 000000000..1c634018e Binary files /dev/null and b/mobile/skin/shop/basic/img/mainlist_btn.gif differ diff --git a/mobile/skin/shop/basic/img/personal.jpg b/mobile/skin/shop/basic/img/personal.jpg new file mode 100644 index 000000000..6c21f566a Binary files /dev/null and b/mobile/skin/shop/basic/img/personal.jpg differ diff --git a/mobile/skin/shop/basic/img/prd_icon.png b/mobile/skin/shop/basic/img/prd_icon.png new file mode 100644 index 000000000..83c7ad03b Binary files /dev/null and b/mobile/skin/shop/basic/img/prd_icon.png differ diff --git a/mobile/skin/shop/basic/img/sbmn_bg.gif b/mobile/skin/shop/basic/img/sbmn_bg.gif new file mode 100644 index 000000000..f8afed770 Binary files /dev/null and b/mobile/skin/shop/basic/img/sbmn_bg.gif differ diff --git a/mobile/skin/shop/basic/img/sct_bg_toright.gif b/mobile/skin/shop/basic/img/sct_bg_toright.gif new file mode 100644 index 000000000..0d180544f Binary files /dev/null and b/mobile/skin/shop/basic/img/sct_bg_toright.gif differ diff --git a/mobile/skin/shop/basic/img/sns_fb.png b/mobile/skin/shop/basic/img/sns_fb.png new file mode 100644 index 000000000..9d8904804 Binary files /dev/null and b/mobile/skin/shop/basic/img/sns_fb.png differ diff --git a/mobile/skin/shop/basic/img/sns_fb_s.png b/mobile/skin/shop/basic/img/sns_fb_s.png new file mode 100644 index 000000000..1ce297731 Binary files /dev/null and b/mobile/skin/shop/basic/img/sns_fb_s.png differ diff --git a/mobile/skin/shop/basic/img/sns_goo.png b/mobile/skin/shop/basic/img/sns_goo.png new file mode 100644 index 000000000..75b523e04 Binary files /dev/null and b/mobile/skin/shop/basic/img/sns_goo.png differ diff --git a/mobile/skin/shop/basic/img/sns_goo_s.png b/mobile/skin/shop/basic/img/sns_goo_s.png new file mode 100644 index 000000000..74235887d Binary files /dev/null and b/mobile/skin/shop/basic/img/sns_goo_s.png differ diff --git a/mobile/skin/shop/basic/img/sns_kakao.png b/mobile/skin/shop/basic/img/sns_kakao.png new file mode 100644 index 000000000..18c9f18c3 Binary files /dev/null and b/mobile/skin/shop/basic/img/sns_kakao.png differ diff --git a/mobile/skin/shop/basic/img/sns_kakao_s.png b/mobile/skin/shop/basic/img/sns_kakao_s.png new file mode 100644 index 000000000..838b9697e Binary files /dev/null and b/mobile/skin/shop/basic/img/sns_kakao_s.png differ diff --git a/mobile/skin/shop/basic/img/sns_twt.png b/mobile/skin/shop/basic/img/sns_twt.png new file mode 100644 index 000000000..bf10f5bad Binary files /dev/null and b/mobile/skin/shop/basic/img/sns_twt.png differ diff --git a/mobile/skin/shop/basic/img/sns_twt_s.png b/mobile/skin/shop/basic/img/sns_twt_s.png new file mode 100644 index 000000000..53f691a62 Binary files /dev/null and b/mobile/skin/shop/basic/img/sns_twt_s.png differ diff --git a/mobile/skin/shop/basic/img/twitter.png b/mobile/skin/shop/basic/img/twitter.png new file mode 100644 index 000000000..8fbf0914b Binary files /dev/null and b/mobile/skin/shop/basic/img/twitter.png differ diff --git a/mobile/skin/shop/basic/img/use_reply.png b/mobile/skin/shop/basic/img/use_reply.png new file mode 100644 index 000000000..14a3908ad Binary files /dev/null and b/mobile/skin/shop/basic/img/use_reply.png differ diff --git a/mobile/skin/shop/basic/item.form.skin.php b/mobile/skin/shop/basic/item.form.skin.php new file mode 100644 index 000000000..592b75791 --- /dev/null +++ b/mobile/skin/shop/basic/item.form.skin.php @@ -0,0 +1,693 @@ +', 0); +add_javascript('', 10); +?> + + + + + + + + + + + + +
    + '; + $thumb_img .= ''.$thumb.''; + $thumb_img .= ''.PHP_EOL; + } + if ($thumb_img) + { + echo '
    '.PHP_EOL; + echo '
      '.PHP_EOL; + echo $thumb_img; + echo '
    '.PHP_EOL; + echo '
    '.PHP_EOL; + echo '
    '; + } + ?> + +
    +

    상품간략정보 및 구매기능

    +
    + +

    + +

    상품 선택옵션 개, 추가옵션

    + + +
    + + 고객평점 + + 사용후기 + + +
    + 위시리스트 + +
    + + + + + + 추천하기 +
    +
    +
    + + +
    +
    개인정보처리방침안내개인정보 수집 및 이용
    목적이용자 식별 및 본인여부 확인
    아이디, 이름, 비밀번호아이디, 이름, 비밀번호 회원 탈퇴 시까지
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */ + ?> + + + + + + + + 배송비결제'; + $sc_method = ''; + } + else + $sc_method = '주문시 결제'; + } + ?> + + + + + + + + + + + + + + + + + +
    제조사
    원산지
    브랜드
    모델
    판매가격판매중지
    판매가격전화문의
    시중가격
    판매가격 + + +
    재고수량
    포인트 + +
    최소구매수량
    최대구매수량
    +
    +
    + + +
    + '.$prev_title; + $next_title = $next_title.' '; + + echo $prev_href.$prev_title.$prev_href2; + echo $next_href.$next_title.$next_href2; + } else { + echo '이 분류에 등록된 다른 상품이 없습니다.'; + } + ?> + 확대보기 +
    + + + + +
    + +
    + +
    +
    + +
    +

    선택옵션

    +
    + +
    +
    + + + +
    +

    추가옵션

    +
    + + +
    +
    + + + +
    + +
      +
    • + + + + + +
      + +
      +
      + + + + + +0원 +
      +
    • +
    + + +
    + +
    + + + +

    상품의 재고가 부족하여 구매할 수 없습니다.

    + +
    + + + + + + 재입고알림 + + 위시리스트 + + + +
    +
    + +
    + + + +
    +
      +
    • +
    • +
    • +
    • +
    +
      + + +
    • +

      상품 정보

      + + +

      상품 상세설명

      +
      + +
      + + + +

      상품 정보 고시

      + + + $val) { + $ii_title = $info_array[$key][0]; + $ii_value = $val; + ?> + + + + + + +
      + + 상품 정보 고시 정보가 올바르게 저장되지 않았습니다.
      config.php 파일의 G5_ESCAPE_FUNCTION 설정을 addslashes 로
      변경하신 후 관리자 > 상품정보 수정에서 상품 정보를 다시 저장해주세요.

      '; + } + } + } //if + ?> +
    • + + +
    • +

      사용후기

      +
      +
    • + + + +
    • +

      상품문의

      +
      +
    • + + + + +
    • +

      배송/교환정보

      + +
      +

      배송정보

      + +
      + + + + + +
      +

      교환/반품

      + + +
      + + +
    • +
    +
    + +
    + + + +
    +

    관련상품

    +
    + set_query($sql); + echo $list->run(); + ?> +
    +
    + + + + + + \ No newline at end of file diff --git a/mobile/skin/shop/basic/iteminfo.change.skin.php b/mobile/skin/shop/basic/iteminfo.change.skin.php new file mode 100644 index 000000000..7e49022b3 --- /dev/null +++ b/mobile/skin/shop/basic/iteminfo.change.skin.php @@ -0,0 +1,11 @@ +', 0); +?> + +

    교환/반품

    +
    + +
    \ No newline at end of file diff --git a/mobile/skin/shop/basic/iteminfo.delivery.skin.php b/mobile/skin/shop/basic/iteminfo.delivery.skin.php new file mode 100644 index 000000000..00895309d --- /dev/null +++ b/mobile/skin/shop/basic/iteminfo.delivery.skin.php @@ -0,0 +1,18 @@ +', 0); +?> + +

    배송정보

    + +
    + +
    + +

    교환/반품

    + +
    + +
    \ No newline at end of file diff --git a/mobile/skin/shop/basic/iteminfo.info.skin.php b/mobile/skin/shop/basic/iteminfo.info.skin.php new file mode 100644 index 000000000..c024423af --- /dev/null +++ b/mobile/skin/shop/basic/iteminfo.info.skin.php @@ -0,0 +1,57 @@ +', 0); +?> + +

    상품설명

    + +
    + +
    + +
    + + + +
    + +
    + + + +

    상품 정보 고시

    + +
      + $val) { + $ii_title = $info_array[$key][0]; + $ii_value = $val; + ?> +
    • + + +
    • + +
    + + 상품 정보 고시 정보가 올바르게 저장되지 않았습니다.
    config.php 파일의 G5_ESCAPE_FUNCTION 설정을 addslashes 로
    변경하신 후 관리자 > 상품정보 수정에서 상품 정보를 다시 저장해주세요.

    '; + } + } + } //if + ?> + +
    + \ No newline at end of file diff --git a/mobile/skin/shop/basic/iteminfo.itemqa.skin.php b/mobile/skin/shop/basic/iteminfo.itemqa.skin.php new file mode 100644 index 000000000..21e622eaf --- /dev/null +++ b/mobile/skin/shop/basic/iteminfo.itemqa.skin.php @@ -0,0 +1,7 @@ +', 0); + +goto_url(shop_item_url($it_id).'#sit_qa'); \ No newline at end of file diff --git a/mobile/skin/shop/basic/iteminfo.itemuse.skin.php b/mobile/skin/shop/basic/iteminfo.itemuse.skin.php new file mode 100644 index 000000000..fc9f4947f --- /dev/null +++ b/mobile/skin/shop/basic/iteminfo.itemuse.skin.php @@ -0,0 +1,7 @@ +', 0); + +goto_url(shop_item_url($it_id).'#sit_use'); \ No newline at end of file diff --git a/mobile/skin/shop/basic/iteminfo.relation.skin.php b/mobile/skin/shop/basic/iteminfo.relation.skin.php new file mode 100644 index 000000000..9a877ea99 --- /dev/null +++ b/mobile/skin/shop/basic/iteminfo.relation.skin.php @@ -0,0 +1,66 @@ +', 0); +?> + +

    관련상품

    + +
    + set_mobile(true); + $list->set_query($sql); + $list->set_view('sns', true); + echo $list->run(); + ?> +
    + + \ No newline at end of file diff --git a/mobile/skin/shop/basic/itemqa.skin.php b/mobile/skin/shop/basic/itemqa.skin.php new file mode 100644 index 000000000..9e80154c4 --- /dev/null +++ b/mobile/skin/shop/basic/itemqa.skin.php @@ -0,0 +1,151 @@ +', 0); +?> + + + + + +
    + + '; + + if($is_admin || $member['mb_id' ] == $row['mb_id']) { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } else { + $iq_question = '비밀글로 보호된 문의입니다.'; + $is_secret = true; + } + } else { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } + $iq_time = substr($row['iq_time'], 2, 8); + + $hash = md5($row['iq_id'].$row['iq_time'].$row['iq_ip']); + + $iq_stats = ''; + $iq_style = ''; + $iq_answer = ''; + + if ($row['iq_answer']) + { + $iq_answer = get_view_thumbnail(conv_content($row['iq_answer'], 1), $thumbnail_width); + $iq_stats = '답변완료'; + $iq_style = 'sit_qaa_done'; + $is_answer = true; + } else { + $iq_stats = '답변대기'; + $iq_style = 'sit_qaa_yet'; + $iq_answer = '답변이 등록되지 않았습니다.'; + $is_answer = false; + } + + if ($i == 0) echo '
      '; + ?> + +
    1. + +
      +
      작성자
      +
      +
      작성일
      +
      +
      상태
      +
      +
      + +
      +
      +
      + Q + 문의내용 + +
      + +
      + A + 답변 + +
      + +
      + + + + +
      +
    2. + + 0) echo '
    '; + + if (!$i) echo '

    상품문의가 없습니다.

    '; + ?> +
    + + + + + \ No newline at end of file diff --git a/mobile/skin/shop/basic/itemqaform.skin.php b/mobile/skin/shop/basic/itemqaform.skin.php new file mode 100644 index 000000000..0fb5e2989 --- /dev/null +++ b/mobile/skin/shop/basic/itemqaform.skin.php @@ -0,0 +1,59 @@ +', 0); +?> + + +
    +

    상품문의 쓰기

    + +
    + + + + + +
    +
      +
    • + 옵션 + > + +
    • +
    • + + 이메일을 입력하시면 답변 등록 시 답변이 이메일로 전송됩니다. +
    • +
    • + + 휴대폰번호를 입력하시면 답변 등록 시 답변등록 알림이 SMS로 전송됩니다. +
    • +
    • + + +
    • +
    • + + +
    • +
    +
    + +
    + + +
    +
    +
    + + + \ No newline at end of file diff --git a/mobile/skin/shop/basic/itemqalist.skin.php b/mobile/skin/shop/basic/itemqalist.skin.php new file mode 100644 index 000000000..dbc384332 --- /dev/null +++ b/mobile/skin/shop/basic/itemqalist.skin.php @@ -0,0 +1,144 @@ +', 0); +?> + + + + +
    +
    +
    + + + + + + +
    + 전체보기 +
    +
    + +
    + + + + '; + + if($is_admin || $member['mb_id' ] == $row['mb_id']) { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } else { + $iq_question = '비밀글로 보호된 문의입니다.'; + $is_secret = true; + } + } else { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } + + $it_href = shop_item_url($row['it_id']); + + if ($row['iq_answer']) + { + $iq_answer = get_view_thumbnail(conv_content($row['iq_answer'], 1), $thumbnail_width); + $iq_stats = '답변완료'; + $iq_style = 'sit_qaa_done'; + $is_answer = true; + } else { + $iq_stats = '답변대기'; + $iq_style = 'sit_qaa_yet'; + $iq_answer = '답변이 등록되지 않았습니다.'; + $is_answer = false; + } + + if ($i == 0) echo '
      '; + ?> +
    1. + + +
      +

      +
      + 작성자 + + 작성일 + +
      +
      + + + +
      + +
    2. + 0) echo '
    '; + if ($i == 0) echo '

    자료가 없습니다.

    '; + ?> +
    + + + + + \ No newline at end of file diff --git a/mobile/skin/shop/basic/itemuse.skin.php b/mobile/skin/shop/basic/itemuse.skin.php new file mode 100644 index 000000000..8f6d5e3da --- /dev/null +++ b/mobile/skin/shop/basic/itemuse.skin.php @@ -0,0 +1,133 @@ +', 0); +?> + + + + + + +
    + + '; + ?> + +
  • + +
    +
    작성자
    +
    +
    작성일
    +
    +
    선호도
    +
    별<?php echo $is_star; ?>개
    +
    + + +
  • + + 0) echo ''; + + if (!$i) echo '

    사용후기가 없습니다.

    '; + ?> +
    + + + + + \ No newline at end of file diff --git a/mobile/skin/shop/basic/itemuseform.skin.php b/mobile/skin/shop/basic/itemuseform.skin.php new file mode 100644 index 000000000..f0761fac0 --- /dev/null +++ b/mobile/skin/shop/basic/itemuseform.skin.php @@ -0,0 +1,77 @@ +', 0); +?> + + +
    +

    사용후기 쓰기

    + +
    + + + + + +
    +
      +
    • + + +
    • +
    • + 내용 + +
    • +
    • + 평가 +
        +
      • + > + + +
      • +
      • + > + + +
      • +
      • + > + + +
      • +
      • + > + + +
      • +
      • + > + + +
      • +
      +
    • +
    +
    + +
    + + +
    + +
    +
    + + + \ No newline at end of file diff --git a/mobile/skin/shop/basic/itemuselist.skin.php b/mobile/skin/shop/basic/itemuselist.skin.php new file mode 100644 index 000000000..2cf91f729 --- /dev/null +++ b/mobile/skin/shop/basic/itemuselist.skin.php @@ -0,0 +1,158 @@ +', 0); +?> + + + + +
    +
    +
    + + + + + +
    + 전체보기 +
    +
    + +
    + + + '; + ?> +
  • + + +
    +
    + 평가점수별<?php echo $star; ?>개 +
    + +
    + + +
    +
    +
    +

    사용후기

    +
    +
    + +
    +
    작성자
    +
    +
    작성일
    +
    +
    +
    + +
    + +

    + + 평가점수별<?php echo $star; ?>개 +

    +
    + +
    + + +
    +
    +

    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    + +
    + 작성자 + + 작성일 + +
    +
    +
  • + + 0) echo ''; + if ($i == 0) echo '

    자료가 없습니다.

    '; + ?> +
    + + + + + \ No newline at end of file diff --git a/mobile/skin/shop/basic/largeimage.skin.php b/mobile/skin/shop/basic/largeimage.skin.php new file mode 100644 index 000000000..3ed05184a --- /dev/null +++ b/mobile/skin/shop/basic/largeimage.skin.php @@ -0,0 +1,91 @@ +', 0); +?> + +
    +

    상품 이미지 새창 보기

    + +
    + + + + <?php echo $row['it_name']; ?> + + + +
    + + 0) { + echo '
      '; + foreach($thumbnails as $key=>$val) { + echo '
    • '.$val.'
    • '; + } + echo '
    '; + } + ?> + +
    + +
    +
    + + \ No newline at end of file diff --git a/mobile/skin/shop/basic/list.10.skin.php b/mobile/skin/shop/basic/list.10.skin.php new file mode 100644 index 000000000..b5fe1d8da --- /dev/null +++ b/mobile/skin/shop/basic/list.10.skin.php @@ -0,0 +1,189 @@ +', 0); + +// 장바구니 또는 위시리스트 ajax 스크립트 +add_javascript('', 10); +?> + + + + + + + + +ca_id && isset($_COOKIE['ck_itemlist'.$this->ca_id.'_type'])) ? $_COOKIE['ck_itemlist'.$this->ca_id.'_type'] : ''; +if(!$is_gallery_list){ + $is_gallery_list = 'gallery'; +} +$li_width = ($is_gallery_list === 'gallery') ? intval(100 / $this->list_mod) : 100; +$li_width_style = ' style="width:'.$li_width.'%;"'; +$ul_sct_class = ($is_gallery_list === 'gallery') ? 'sct_10' : 'sct_10_list'; + +$i = 0; +foreach((array) $list as $row){ + if( empty($row) ) continue; + + $item_link_href = shop_item_url($row['it_id']); // 상품링크 + $star_score = $row['it_use_avg'] ? (int) get_star($row['it_use_avg']) : ''; //사용자후기 평균별점 + $is_soldout = is_soldout($row['it_id'], true); // 품절인지 체크 + + if ($i == 0) { + if ($this->css) { + echo "
      css}\">\n"; + } else { + echo "
        \n"; + } + } + + + if($i % $this->list_mod == 0) + $li_clear = ' sct_clear'; + else + $li_clear = ''; + + echo "
      • \n"; + + if ($this->href) { + echo "\n"; + } + + // 사용후기 평점표시 + if ($this->view_star && $star_score) { + echo "
        고객평점\"별점
        \n"; + } + + if ($this->view_it_id) { + echo "
        <".stripslashes($row['it_id']).">
        \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
        ".stripslashes($row['it_basic'])."
        \n"; + } + if ($this->view_it_price) { + echo "
        \n"; + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + echo "
        \n"; + } + + // 위시리스트 + 공유 버튼 시작 { + echo "
        \n"; + echo "\n"; + if ($this->view_sns) { + echo "\n"; + } + echo "
        "; + if ($this->view_sns) { + $sns_top = $this->img_height + 10; + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
        "; + echo "

        SNS 공유

        "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_MSHOP_SKIN_URL.'/img/facebook.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_MSHOP_SKIN_URL.'/img/twitter.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_MSHOP_SKIN_URL.'/img/gplus.png'); + echo get_sns_share_link('kakaotalk', $sns_url, $sns_title, G5_MSHOP_SKIN_URL.'/img/sns_kakao.png'); + echo ""; + echo "
        \n"; + } + echo "
        "; + echo "
        \n"; + echo "
        \n"; + // } 위시리스트 + 공유 버튼 끝 + + + echo "
        \n"; + + if ($this->view_it_icon) { + echo "
        ".item_icon($row)."
        \n"; + } + echo "
      • \n"; + + $i++; +} + +if ($i > 0) echo "
      \n"; + +if($i == 0) echo "

      등록된 상품이 없습니다.

      \n"; +?> + + + + +', 0); +?> + +total_count > 0) { + $li_width = intval(100 / $this->list_mod); + $li_width_style = ' style="width:'.$li_width.'%;"'; + $k = 1; + $slide_btn = ''; + + for ($i=0; $row=sql_fetch_array($result); $i++) { + $is_soldout = is_soldout($row['it_id'], true); // 품절인지 체크 + + if($i == 0) { + echo ''.PHP_EOL; + echo '
      '.PHP_EOL; + echo '

      베스트상품

      '.PHP_EOL; + echo '
      '.PHP_EOL; + echo '
      '.PHP_EOL; + echo '
        '.PHP_EOL; + } + + if($i > 0 && ($i % $this->list_mod == 0)) { + echo '
      '.PHP_EOL; + echo ''.PHP_EOL; + echo '
      '.PHP_EOL; + echo '
      '.$slide_btn.'
      '.PHP_EOL; + echo '
      '.PHP_EOL; + echo '
      '.PHP_EOL; + } +?> + + + +', 0); +?> + + +
      +

      상품 정렬

      + + +
      + + + \ No newline at end of file diff --git a/mobile/skin/shop/basic/list.sub.skin.php b/mobile/skin/shop/basic/list.sub.skin.php new file mode 100644 index 000000000..940e9bedf --- /dev/null +++ b/mobile/skin/shop/basic/list.sub.skin.php @@ -0,0 +1,12 @@ +', 0); +?> + +
        +
      • +
      • +
      + diff --git a/mobile/skin/shop/basic/listcategory.skin.php b/mobile/skin/shop/basic/listcategory.skin.php new file mode 100644 index 000000000..7f0213773 --- /dev/null +++ b/mobile/skin/shop/basic/listcategory.skin.php @@ -0,0 +1,36 @@ +'.$row['ca_name'].' '.$row2['cnt'].''; + $exists = true; +} + +if ($exists) { + + // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 + add_stylesheet('', 0); +?> + + + + + +', 0); + +// 장바구니 또는 위시리스트 ajax 스크립트 +add_javascript('', 10); +?> + + + + + + + + +list_mod); +$li_width_style = ' style="width:'.$li_width.'%;"'; +$i=0; + +foreach((array) $list as $row){ + + if( empty($row) ) continue; + + $item_link_href = shop_item_url($row['it_id']); + $star_score = $row['it_use_avg'] ? (int) get_star($row['it_use_avg']) : ''; + $is_soldout = is_soldout($row['it_id'], true); // 품절인지 체크 + + if ($i == 0) { + if ($this->css) { + echo "'.PHP_EOL; + else + echo '

      등록된 분류가 없습니다.

      '.PHP_EOL; + ?> + + + + diff --git a/shop/coupon.php b/shop/coupon.php new file mode 100644 index 000000000..89a0ab5ec --- /dev/null +++ b/shop/coupon.php @@ -0,0 +1,85 @@ += '".G5_TIME_YMD."' + order by cp_no "; +$result = sql_query($sql); +?> + + +
      +

      +
        + +
      • +
        + + +
        +
        + + ~ +
        +
      • + 사용할 수 있는 쿠폰이 없습니다.'; + ?> +
      + +
      + += '".G5_TIME_YMD."' "; + +$sql_order = " order by cz_id desc "; + +add_javascript('', 100); + +$g5['title'] = '쿠폰존'; +include_once(G5_SHOP_PATH.'/_head.php'); + +if (!G5_IS_MOBILE && $is_admin) + echo ''; + +if(G5_IS_MOBILE) { + define('G5_SHOP_CSS_URL', G5_MSHOP_SKIN_URL); + $skin_file = G5_MSHOP_SKIN_PATH.'/couponzone.10.skin.php'; +} else { + define('G5_SHOP_CSS_URL', G5_SHOP_SKIN_URL); + $skin_file = G5_SHOP_SKIN_PATH.'/couponzone.10.skin.php'; +} + +if (is_file($skin_file)) { + include_once($skin_file); + +} else { + echo '
      '.str_replace(G5_PATH.'/', '', $skin_file).' 파일을 찾을 수 없습니다.
      관리자에게 알려주시면 감사하겠습니다.
      '; +} + +include_once(G5_SHOP_PATH.'/_tail.php'); \ No newline at end of file diff --git a/shop/event.php b/shop/event.php new file mode 100644 index 000000000..b56c68a52 --- /dev/null +++ b/shop/event.php @@ -0,0 +1,120 @@ +이벤트 관리'; +?> + + + + + +'; + +// 상단 HTML +echo '
      '.conv_content($ev['ev_head_html'], 1).'
      '; + +// 상품 출력순서가 있다면 +if ($sort != "") + $order_by = $sort.' '.$sortodr.' , b.it_order, b.it_id desc'; +else + $order_by = 'b.it_order, b.it_id desc'; + +if ($skin) { + $skin = preg_replace('#\.+(\/|\\\)#', '', $skin); + $ev['ev_skin'] = $skin; +} + +define('G5_SHOP_CSS_URL', G5_SHOP_SKIN_URL); + +// 리스트 유형별로 출력 +$list_file = G5_SHOP_SKIN_PATH."/{$ev['ev_skin']}"; +if (file_exists($list_file)) +{ + + echo '
      '; + include G5_SHOP_SKIN_PATH.'/list.sort.skin.php'; + + // 상품 보기 타입 변경 버튼 + include G5_SHOP_SKIN_PATH.'/list.sub.skin.php'; + + echo '
      '; + + // 총몇개 = 한줄에 몇개 * 몇줄 + $items = $ev['ev_list_mod'] * $ev['ev_list_row']; + // 페이지가 없으면 첫 페이지 (1 페이지) + if ($page < 1) $page = 1; + // 시작 레코드 구함 + $from_record = ($page - 1) * $items; + + $list = new item_list(G5_SHOP_SKIN_PATH.'/'.$ev['ev_skin'], $ev['ev_list_mod'], $ev['ev_list_row'], $ev['ev_img_width'], $ev['ev_img_height']); + $list->set_event($ev['ev_id']); + $list->set_is_page(true); + $list->set_order_by($order_by); + $list->set_from_record($from_record); + $list->set_view('it_img', true); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_cust_price', false); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + echo $list->run(); + + // where 된 전체 상품수 + $total_count = $list->total_count; + // 전체 페이지 계산 + $total_page = ceil($total_count / $items); +} +else +{ + echo '
      '.$ev['ev_skin'].' 파일을 찾을 수 없습니다.
      관리자에게 알려주시면 감사하겠습니다.
      '; +} +?> + + + +'.conv_content($ev['ev_tail_html'], 1).''; + +$timg = G5_DATA_PATH.'/event/'.$ev_id.'_t'; +if (file_exists($timg)) + echo '
      '; +?> + + + + + + + + + + + + +
      +
      +

      히트상품

      +
      + set_type(1); + $list->set_view('it_img', true); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_basic', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + $list->set_view('star', true); + echo $list->run(); + ?> +
      + + + + + + +
      +
      +

      최신상품

      +
      + set_type(3); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_basic', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + $list->set_view('star', true); + echo $list->run(); + ?> +
      + + + + + +
      +
      +

      추천상품

      +
      + set_type(2); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_basic', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + $list->set_view('star', true); + echo $list->run(); + ?> +
      + + + + + + + +
      +
      +

      할인상품

      +
      + set_type(5); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_basic', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + $list->set_view('star', true); + echo $list->run(); + ?> +
      + + + + \ No newline at end of file diff --git a/shop/inicis/escrow.register.php b/shop/inicis/escrow.register.php new file mode 100644 index 000000000..33c1ae801 --- /dev/null +++ b/shop/inicis/escrow.register.php @@ -0,0 +1,114 @@ + 'korex', + '아주택배' => 'ajutb', + 'KT로지스' => 'ktlogistics', + '현대택배' => 'hyundai', + 'CJ대한통운' => 'cjgls', + '한진택배' => 'hanjin', + '트라넷' => 'tranet', + '하나로택배' => 'Hanaro', + '사가와익스프레스' => 'Sagawa', + 'SEDEX' => 'sedex', + 'KGB택배' => 'kgbls', + '로젠택배' => 'kgb', + 'KG옐로우캡택배' => 'yellow', + '삼성HTH' => 'hth', + '동부택배' => 'dongbu', + '우체국' => 'EPOST', + '우편등기' => 'registpost', + '기타택배' => '9999' +); + +$dlv_exName = $escrow_corp; +$dlv_exCode = $exCode[$dlv_exName]; +if(!$dlv_exCode) + $dlv_exCode = '9999'; + +/********************* + * 3. 지불 정보 설정 * + *********************/ +$inipay->SetField("tid", $escrow_tno); // 거래아이디 +$inipay->SetField("mid", $default['de_inicis_mid']); // 상점아이디 +/************************************************************************************************** + * admin 은 키패스워드 변수명입니다. 수정하시면 안됩니다. 1111의 부분만 수정해서 사용하시기 바랍니다. + * 키패스워드는 상점관리자 페이지(https://iniweb.inicis.com)의 비밀번호가 아닙니다. 주의해 주시기 바랍니다. + * 키패스워드는 숫자 4자리로만 구성됩니다. 이 값은 키파일 발급시 결정됩니다. + * 키패스워드 값을 확인하시려면 상점측에 발급된 키파일 안의 readme.txt 파일을 참조해 주십시오. + **************************************************************************************************/ +$inipay->SetField("admin", $default['de_inicis_admin_key']); // 키패스워드(상점아이디에 따라 변경) +$inipay->SetField("type", "escrow"); // 고정 (절대 수정 불가) +$inipay->SetField("escrowtype", "dlv"); // 고정 (절대 수정 불가) +$inipay->SetField("dlv_ip", getenv("REMOTE_ADDR")); // 고정 + +$inipay->SetField("oid", $oid); +$inipay->SetField("soid", "1"); +//$inipay->SetField("dlv_date", $dlv_date); +//$inipay->SetField("dlv_time", $dlv_time); +$inipay->SetField("dlv_report", $EscrowType); +$inipay->SetField("dlv_invoice", $invoice); +$inipay->SetField("dlv_name", $member['mb_id']); + +$inipay->SetField("dlv_excode", $dlv_exCode); +$inipay->SetField("dlv_exname", $dlv_exName); +$inipay->SetField("dlv_charge", $dlv_charge); + +$inipay->SetField("dlv_invoiceday", G5_TIME_YMDHIS); +$inipay->SetField("dlv_sendname", $sendName); +$inipay->SetField("dlv_sendpost", $sendPost); +$inipay->SetField("dlv_sendaddr1", $sendAddr1); +$inipay->SetField("dlv_sendaddr2", $sendAddr2); +$inipay->SetField("dlv_sendtel", $sendTel); + +$inipay->SetField("dlv_recvname", $recvName); +$inipay->SetField("dlv_recvpost", $recvPost); +$inipay->SetField("dlv_recvaddr", $recvAddr); +$inipay->SetField("dlv_recvtel", $recvTel); + +$inipay->SetField("dlv_goodscode", $goodsCode); +$inipay->SetField("dlv_goods", $goods); +$inipay->SetField("dlv_goodscnt", $goodCnt); +$inipay->SetField("price", $price); +$inipay->SetField("dlv_reserved1", $reserved1); +$inipay->SetField("dlv_reserved2", $reserved2); +$inipay->SetField("dlv_reserved3", $reserved3); + +$inipay->SetField("pgn", $pgn); + +/********************* + * 3. 배송 등록 요청 * + *********************/ +$inipay->startAction(); + + +/********************** + * 4. 배송 등록 결과 * + **********************/ + + $tid = $inipay->GetResult("tid"); // 거래번호 + $resultCode = $inipay->GetResult("ResultCode"); // 결과코드 ("00"이면 지불 성공) + $resultMsg = $inipay->GetResult("ResultMsg"); // 결과내용 (지불결과에 대한 설명) + $dlv_date = $inipay->GetResult("DLV_Date"); + $dlv_time = $inipay->GetResult("DLV_Time"); \ No newline at end of file diff --git a/shop/inicis/inipay_cancel.php b/shop/inicis/inipay_cancel.php new file mode 100644 index 000000000..094fcc538 --- /dev/null +++ b/shop/inicis/inipay_cancel.php @@ -0,0 +1,63 @@ +SetField("type", "cancel"); // 고정 + if( $default['de_inicis_admin_key'] ){ + $inipay->SetField("mid", $mid); + $inipay->SetField("admin", $default['de_inicis_admin_key']); + } + $inipay->SetField("tid", $TID); // 고정 + $inipay->SetField("cancelmsg", "DB FAIL"); // 취소사유 + $inipay->startAction(); + if($inipay->GetResult('ResultCode') == "00") + { + $inipay->MakeTXErrMsg(MERCHANT_DB_ERR,"Merchant DB FAIL"); + } +} \ No newline at end of file diff --git a/shop/inicis/inistdpay_result.php b/shop/inicis/inistdpay_result.php new file mode 100644 index 000000000..96feac3a0 --- /dev/null +++ b/shop/inicis/inistdpay_result.php @@ -0,0 +1,214 @@ +makeHash(signKey, "sha256"); // 가맹점 확인을 위한 signKey를 해시값으로 변경 (SHA-256방식 사용) + $mKey = hash("sha256", $signKey); + + //##################### + // 2.signature 생성 + //##################### + $signParam['authToken'] = $authToken; // 필수 + $signParam['timestamp'] = $timestamp; // 필수 + // signature 데이터 생성 (모듈에서 자동으로 signParam을 알파벳 순으로 정렬후 NVP 방식으로 나열해 hash) + $signature = $util->makeSignature($signParam); + + + //##################### + // 3.API 요청 전문 생성 + //##################### + $authMap['mid'] = $mid; // 필수 + $authMap['authToken'] = $authToken; // 필수 + $authMap['signature'] = $signature; // 필수 + $authMap['timestamp'] = $timestamp; // 필수 + $authMap['charset'] = $charset; // default=UTF-8 + $authMap['format'] = $format; // default=XML + //if(null != notiUrl && notiUrl.length() > 0){ + // authMap.put("notiUrl" ,notiUrl); + //} + + + try { + + $httpUtil = new HttpClient(); + + //##################### + // 4.API 통신 시작 + //##################### + + $authResultString = ""; + if ($httpUtil->processHTTP($authUrl, $authMap)) { + $authResultString = $httpUtil->body; + } else { + echo "Http Connect Error\n"; + echo $httpUtil->errormsg; + + throw new Exception("Http Connect Error"); + } + + //############################################################ + //5.API 통신결과 처리(***가맹점 개발수정***) + //############################################################ + + $resultMap = json_decode($authResultString, true); + + $tid = $resultMap['tid']; + $oid = preg_replace('/[^A-Za-z0-9\-_]/', '', $resultMap['MOID']); + + /************************* 결제보안 추가 2016-05-18 START ****************************/ + $secureMap['mid'] = $mid; //mid + $secureMap['tstamp'] = $timestamp; //timestemp + $secureMap['MOID'] = $resultMap['MOID']; //MOID + $secureMap['TotPrice'] = $resultMap['TotPrice']; //TotPrice + + // signature 데이터 생성 + $secureSignature = $util->makeSignatureAuth($secureMap); + /************************* 결제보안 추가 2016-05-18 END ****************************/ + + $sql = " select * from {$g5['g5_shop_order_data_table']} where od_id = '$oid' "; + $row = sql_fetch($sql); + + $data = isset($row['dt_data']) ? unserialize(base64_decode($row['dt_data'])) : array(); + + if(isset($data['pp_id']) && $data['pp_id']) { + $page_return_url = G5_SHOP_URL.'/personalpayform.php?pp_id='.$data['pp_id']; + } else { + $page_return_url = G5_SHOP_URL.'/orderform.php'; + if(get_session('ss_direct')) + $page_return_url .= '?sw_direct=1'; + } + + if ((strcmp('0000', $resultMap['resultCode']) == 0) && (strcmp($secureSignature, $resultMap['authSignature']) == 0) ) { //결제보안 추가 2016-05-18 + /* * *************************************************************************** + * 여기에 가맹점 내부 DB에 결제 결과를 반영하는 관련 프로그램 코드를 구현한다. + + [중요!] 승인내용에 이상이 없음을 확인한 뒤 가맹점 DB에 해당건이 정상처리 되었음을 반영함 + 처리중 에러 발생시 망취소를 한다. + * **************************************************************************** */ + + //최종결제요청 결과 성공 DB처리 + $tno = $resultMap['tid']; + $amount = $resultMap['TotPrice']; + $app_time = $resultMap['applDate'].$resultMap['applTime']; + $pay_method = $resultMap['payMethod']; + $pay_type = $PAY_METHOD[$pay_method]; + $depositor = isset($resultMap['VACT_InputName']) ? $resultMap['VACT_InputName'] : ''; + $commid = ''; + $mobile_no = isset($resultMap['HPP_Num']) ? $resultMap['HPP_Num'] : ''; + $app_no = isset($resultMap['applNum']) ? $resultMap['applNum'] : ''; + $card_name = isset($resultMap['CARD_Code']) ? $CARD_CODE[$resultMap['CARD_Code']] : ''; + switch($pay_type) { + case '계좌이체': + $bank_name = isset($BANK_CODE[$resultMap['ACCT_BankCode']]) ? $BANK_CODE[$resultMap['ACCT_BankCode']] : ''; + if ($default['de_escrow_use'] == 1) + $escw_yn = 'Y'; + break; + case '가상계좌': + $bankname = isset($BANK_CODE[$resultMap['VACT_BankCode']]) ? $BANK_CODE[$resultMap['VACT_BankCode']] : ''; + $account = $resultMap['VACT_Num'].' '.$resultMap['VACT_Name']; + $app_no = $resultMap['VACT_Num']; + if ($default['de_escrow_use'] == 1) + $escw_yn = 'Y'; + break; + default: + break; + } + + $inicis_pay_result = true; + + } else { + $s = '(오류코드:'.$resultMap['resultCode'].') '.$resultMap['resultMsg']; + alert($s, $page_return_url); + } + + // 수신결과를 파싱후 resultCode가 "0000"이면 승인성공 이외 실패 + // 가맹점에서 스스로 파싱후 내부 DB 처리 후 화면에 결과 표시 + // payViewType을 popup으로 해서 결제를 하셨을 경우 + // 내부처리후 스크립트를 이용해 opener의 화면 전환처리를 하세요 + //throw new Exception("강제 Exception"); + } catch (Exception $e) { + // $s = $e->getMessage() . ' (오류코드:' . $e->getCode() . ')'; + //#################################### + // 실패시 처리(***가맹점 개발수정***) + //#################################### + //---- db 저장 실패시 등 예외처리----// + $s = $e->getMessage() . ' (오류코드:' . $e->getCode() . ')'; + echo $s; + + //##################### + // 망취소 API + //##################### + + $netcancelResultString = ""; // 망취소 요청 API url(고정, 임의 세팅 금지) + if ($httpUtil->processHTTP($netCancel, $authMap)) { + $netcancelResultString = $httpUtil->body; + } else { + echo "Http Connect Error\n"; + echo $httpUtil->errormsg; + + throw new Exception("Http Connect Error"); + } + + echo "## 망취소 API 결과 ##"; + + $netcancelResultString = str_replace("<", "<", $$netcancelResultString); + $netcancelResultString = str_replace(">", ">", $$netcancelResultString); + + echo "
      ", $netcancelResultString . "
      "; + // 취소 결과 확인 + } + } else { + + //############# + // 인증 실패시 + //############# + echo "
      "; + echo "####인증실패####"; + + ob_start(); + var_dump($_REQUEST); + $debug_msg = ob_get_contents(); + ob_clean(); + + echo "
      " . strip_tags($debug_msg) . "
      "; + } +} catch (Exception $e) { + $s = $e->getMessage() . ' (오류코드:' . $e->getCode() . ')'; + echo $s; +} + +if( !$inicis_pay_result ){ + die("

      결제 에러가 일어났습니다. 에러 이유는 위와 같습니다."); +} \ No newline at end of file diff --git a/shop/inicis/inistdpay_return.php b/shop/inicis/inistdpay_return.php new file mode 100644 index 000000000..f76af7b13 --- /dev/null +++ b/shop/inicis/inistdpay_return.php @@ -0,0 +1,77 @@ +()\[\]\{\}]/i", "", strip_tags($_POST['orderNumber'])) : 0; +$session_order_num = get_session('ss_order_inicis_id'); + +if( !$orderNumber ){ + alert("주문번호가 없습니다."); +} + +$sql = " select * from {$g5['g5_shop_order_data_table']} where od_id = '$orderNumber' "; +$row = sql_fetch($sql); + +if( empty($row) ){ + alert("임시 주문정보가 저장되지 않았습니다."); +} + +$data = unserialize(base64_decode($row['dt_data'])); + +$params = array(); +$var_datas = array(); + +foreach($data as $key=>$value) { + if(is_array($value)) { + foreach($value as $k=>$v) { + $_POST[$key][$k] = $params[$key][$k] = clean_xss_tags(strip_tags($v)); + } + } else { + $_POST[$key] = $params[$key] = clean_xss_tags(strip_tags($value)); + } +} + +if(isset($data['pp_id']) && $data['pp_id']) { //개인결제 + + foreach($params as $key=>$value){ + + if( in_array($key, array('pp_name', 'pp_email', 'pp_hp', 'pp_settle_case')) ){ + + $var_datas[$key] = $value; + + $$key = $value; + } + + } + + include_once(G5_SHOP_PATH.'/personalpayformupdate.php'); + +} else { //상점주문 + + foreach($params as $key=>$value){ + + if( in_array($key, array('od_price', 'od_name', 'od_tel', 'od_hp', 'od_email', 'od_memo', 'od_settle_case', 'max_temp_point', 'od_temp_point', 'od_bank_account', 'od_deposit_name', 'od_test', 'od_ip', 'od_zip', 'od_addr1', 'od_addr2', 'od_addr3', 'od_addr_jibeon', 'od_b_name', 'od_b_tel', 'od_b_hp', 'od_b_addr1', 'od_b_addr2', 'od_b_addr3', 'od_b_addr_jibeon', 'od_b_zip', 'od_send_cost', 'od_send_cost2', 'od_hope_date')) ){ + + $var_datas[$key] = $value; + + $$key = $value; + } + + } + + $od_send_cost = (int) $_POST['od_send_cost']; + $od_send_cost2 = (int) $_POST['od_send_cost2']; + + include_once(G5_SHOP_PATH.'/orderformupdate.php'); +} \ No newline at end of file diff --git a/shop/inicis/key/.htaccess b/shop/inicis/key/.htaccess new file mode 100644 index 000000000..e42f31a18 --- /dev/null +++ b/shop/inicis/key/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all \ No newline at end of file diff --git a/shop/inicis/key/INIpayTest/keypass.enc b/shop/inicis/key/INIpayTest/keypass.enc new file mode 100644 index 000000000..d6583cb9a --- /dev/null +++ b/shop/inicis/key/INIpayTest/keypass.enc @@ -0,0 +1 @@ +pm/4rSNJdLw= diff --git a/shop/inicis/key/INIpayTest/mcert.pem b/shop/inicis/key/INIpayTest/mcert.pem new file mode 100644 index 000000000..00ce5d78a --- /dev/null +++ b/shop/inicis/key/INIpayTest/mcert.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICmzCCAgQCAQAwDQYJKoZIhvcNAQEEBQAwgZUxCzAJBgNVBAYTAktSMRUwEwYD +VQQIDAzrjIDtlZzrr7zqta0xDTALBgNVBAcTBG51bGwxGjAYBgNVBAoMESjso7wp +7J2064uI7Iuc7IqkMQswCQYDVQQLEwJFQzETMBEGA1UEAxMKSU5JcGF5VGVzdDEi +MCAGCgmSJomT8ixkAQMUEmx5dGFrNzFAaW5pY2lzLmNvbTAeFw0wNDAzMTUxMDAx +MjNaFw0wNTAzMTUxMDAxMjNaMIGVMQswCQYDVQQGEwJLUjEVMBMGA1UECAwM64yA +7ZWc66+86rWtMQ0wCwYDVQQHEwRudWxsMRowGAYDVQQKDBEo7KO8KeydtOuLiOyL +nOyKpDELMAkGA1UECxMCRUMxEzARBgNVBAMTCklOSXBheVRlc3QxIjAgBgoJkiaJ +k/IsZAEDFBJseXRhazcxQGluaWNpcy5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0A +MIGJAoGBAP6a/WaRyDMxHDgKHtahbZTnv+cayR0b052y2sCAGdgMc6CK0GxyvudV +KR7mltKhexur/ikaPKXXApK+SlXUvwNS7pdQ13BTNCeLlEg0WLjGoVi9n96AcjR/ +QqlmkFaVAQQe9X95uwAcCoIrkErrpFJNPhppTXfsPH8YpzegogPnAgMBAAEwDQYJ +KoZIhvcNAQEEBQADgYEAvmKuNAD7oPxOfRxj1EyBrKt2YdrhzMTvZXz7IIGCeKf0 +tsAKiuxuh20i6zWbD4N+twZvDYG23DFBsLb5Iw3pft5RK9OOVZJ8+ChAaDFHBa4a +RzLDmsdD9NsF7UfYb0KXFUnZMTW5ZKirWUq21MdQiqVNhuLs0zy2hAqABBwhICk= +-----END CERTIFICATE----- diff --git a/shop/inicis/key/INIpayTest/mpriv.pem b/shop/inicis/key/INIpayTest/mpriv.pem new file mode 100644 index 000000000..39f960a71 --- /dev/null +++ b/shop/inicis/key/INIpayTest/mpriv.pem @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,1E6B60D94624128F + ++9VjCYsbhvQIrQVWRmTV1dBc3HpHbjDrnwEu8znuxO9dgN7ZKKahSOo/iZv9tzWr +SpEnbaGiRivO7/jTfJxgcy7wqjV+jYiwpBzL640JdOditUMoIxx3Rzxq+Dheuz13 +1dwt6f3d11zzXjIA5eQQXf1dBTjNCrxhAHqtHccWc5eP1QScQA+KdDAT+vQ6qTVq +aZOI+7BkfWt5YMYBienXwEZSK5ZJ0GU91xSwDApIwsq7E7JGBExPIXGJeZ/RDAVN +sKuO5Ny0JBNJN2Lym39Nb9lF0sKAedMiQNfaEnRqG37fh4H1ONo9NTYilENCIrg6 +tgYw/G9FrY8UvNLBsdUEUSV3bSqlRXZxP2TcPPrpYVbYZ1CQAH3fhVjAo9dpSNeI +KuGv3x+JAkuJ+SjhANUU+ChOm27tF7scUxDTfwzTGfyB3P1UFHDwf0nWMU5cuJRY +1+DLxEVL9FaZmonf5SZdf14Ln8a0cVdm+5rujFpFecSaw9K6gNFUvu6qF6CLx9/O +UgcL90Ga+EvMG1iWyCFGvbr53r4i776JG+rVergIcgT5winvYpKiOS9AOV5NXPPI +ev5PCXmDbnalmK6IrgrV0bAJD3d+NcN9JGFSx+GYKlw4OTrz/hxxuojPW6em4cfi +mEIl5JIiLoC2BqM+Jcs8UMq0TOS8Pcki4O05H9Juws5nh6+d5d2p2BcvkXc+SWF7 +ClfjMZDaniMzPZr1dQj5XFZwptN6jATYL/4u1CpXYKi3N6TwHbOtQD/2l4e+DNPR +JsSAW8ftyLAK0QJUTLhvA9Np9pzmO4hE7LfeRKBKpoU2PwKyXoO+PA== +-----END RSA PRIVATE KEY----- diff --git a/shop/inicis/key/INIpayTest/readme.txt b/shop/inicis/key/INIpayTest/readme.txt new file mode 100644 index 000000000..d7174692a --- /dev/null +++ b/shop/inicis/key/INIpayTest/readme.txt @@ -0,0 +1,10 @@ +Ű 3 - mcert.pem, mpriv.pem, keypass.enc - +"key/{̵}/" Ͻ α׷ ҽ + ݿϽʽÿ(޴ ). + +̵ : INIpayTest +Űн : 1111 + Ʈ н : 1111 + + Ʈ https://iniweb.inicis.com̸, +α ̵ ̵Դϴ. diff --git a/shop/inicis/key/index.php b/shop/inicis/key/index.php new file mode 100644 index 000000000..e69de29bb diff --git a/shop/inicis/key/iniescrow0/keypass.enc b/shop/inicis/key/iniescrow0/keypass.enc new file mode 100644 index 000000000..e4205d8ef --- /dev/null +++ b/shop/inicis/key/iniescrow0/keypass.enc @@ -0,0 +1 @@ +pm/4rSNJdLw= diff --git a/shop/inicis/key/iniescrow0/mcert.pem b/shop/inicis/key/iniescrow0/mcert.pem new file mode 100644 index 000000000..77304aebd --- /dev/null +++ b/shop/inicis/key/iniescrow0/mcert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICnTCCAgYCAQAwDQYJKoZIhvcNAQEEBQAwgZYxCzAJBgNVBAYTAktSMRUwEwYD +VQQIDAzrjIDtlZzrr7zqta0xDTALBgNVBAcTBG51bGwxGjAYBgNVBAoMESjso7wp +7J2064uI7Iuc7IqkMQswCQYDVQQLEwJFQzETMBEGA1UEAxMKaW5pZXNjcm93MDEj +MCEGCgmSJomT8ixkAQMUE2RkYWVtaXJpQGluaWNpcy5jb20wHhcNMDgwMTE2MDQ0 +MTU1WhcNMDkwMTE1MDQ0MTU1WjCBljELMAkGA1UEBhMCS1IxFTATBgNVBAgMDOuM +gO2VnOuvvOq1rTENMAsGA1UEBxMEbnVsbDEaMBgGA1UECgwRKOyjvCnsnbTri4js +i5zsiqQxCzAJBgNVBAsTAkVDMRMwEQYDVQQDEwppbmllc2Nyb3cwMSMwIQYKCZIm +iZPyLGQBAxQTZGRhZW1pcmlAaW5pY2lzLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEAxElWzHNgDFZpwNvPGbWtA0PKTDPfeP1r7xE/k2n2XMzBFQFxbjSC +EBKbQzFRVbNJv4Jyon/OzlywSR3A1DYMm5Oy9Vh3OOrH2FiYxMXClp7MynnmFEug +ysHuYOHlMnoEfI5k8h9hIXlYbRFDLdY7IxVzqkaYJ37HX01Apuxo8sUCAwEAATAN +BgkqhkiG9w0BAQQFAAOBgQCPrVeBW8+anq3CORMYU5TX1tfrYeCzLFH2hkDJF0Rr +1xWxgjhdFZxtBtYSbxr3UKFe6/EWrlv7k37LoM8ORYcNZun+Rd1jz5xwTOjLBTsd +UGwgUpgBLB1z9GoZgaeJJOm7BFUE0Jp7laI0zWkpWeova2RUT1PODnQMvRNi2d88 +vQ== +-----END CERTIFICATE----- diff --git a/shop/inicis/key/iniescrow0/mpriv.pem b/shop/inicis/key/iniescrow0/mpriv.pem new file mode 100644 index 000000000..ba54f77b2 --- /dev/null +++ b/shop/inicis/key/iniescrow0/mpriv.pem @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,FBB268FC75417BD4 + +G4/3WRZg/9peL3ym0S2LsTWvFkSCT/Co+qcCeKBunQ1UPH/pVyQjW0oxtmjBpBfp +YFNJmc5mEhwV30uKXLEYP6bhpHKlLDQWv926+UBIkSZ4cOkm9JNZUETlb+tlSgIN +i5l5KLaX198rGlQAEYX+TxTaxlfXxoBiXkoqxs64Jn0RApy1SPTXKjLffXHP2Yk5 +q3jOZ4z4REdnmkH5NYuRHz6cyRr4XdmvPFMwBpzOL08go6yToYfYRvyO4hf2T1Kl +ug1ws6e1HNSm1t3PrZP2kj1oIQef80/DQf9eu1mOP0VQD1GlQSydt2+kAdEBba4d +FIlpO3oGCbCB1UhBOBCllFlXvd4sqj1inZhHS/g9R0vAwAPVpsssXYnWL2qnb+zj +gfSyk+ao56sOBIwhyFXX9IdLcFKMGVQDrxZhDxVieStwk9iVK4zGZW+clS+TzFY7 +8qPDP53vXenumSnVq11Mj5gKwJzy40wGm61bQR1B5ldJJW7978Njahh0T0ZCxu48 +n5H0FbVu9wrILehWxEI5IrXAAGbRYDlurSSvHtOX1qL0WvJa4EQD9De3u8kqD3Yx +soKJqII277UQBpPuyyE+eP1F+7i4cQdfCU31sK1LMz/wiJxRrG1CiOpV1FH22ABy +vxAh1gpTRgYHvNVWG37P9rYbrW2UcM4cjhbgOzTLhrThxteAgosaXWowc/lcobSB +G444RQXVPZEetqt2In2kBr7UmE2WuvM0CrC6sD336K2t0q/5HLPLntGozdadZ4F5 +OS8Oi8I9Ygiqwz95JSUaOfETGZ6RpGRJXL9ysimBeEDuQmQ2lxtkZA== +-----END RSA PRIVATE KEY----- diff --git a/shop/inicis/key/iniescrow0/readme.txt b/shop/inicis/key/iniescrow0/readme.txt new file mode 100644 index 000000000..f4b770416 --- /dev/null +++ b/shop/inicis/key/iniescrow0/readme.txt @@ -0,0 +1,19 @@ + +please read this README.TXT file + +ZIP file contains following 3 files. + - mcert.pem + - mpriv.pem + - keypass.enc + +Copy these 3 files to directory [key/iniescrow0]. + +Merchant ID : iniescrow0 +Key Password : 1111 +Admin Password: 1111 + +please visit https://iniweb.inicis.com +for your Merchant Administration. +This site provides your payment transaction details and account details by calculation period. + +You can also log on this site using your Merchant ID(iniescrow0). diff --git a/shop/inicis/key/keypass.enc b/shop/inicis/key/keypass.enc new file mode 100644 index 000000000..e4205d8ef --- /dev/null +++ b/shop/inicis/key/keypass.enc @@ -0,0 +1 @@ +pm/4rSNJdLw= diff --git a/shop/inicis/key/mcert.pem b/shop/inicis/key/mcert.pem new file mode 100644 index 000000000..70baf94e5 --- /dev/null +++ b/shop/inicis/key/mcert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICtDCCAhwCAQAwDQYJKoZIhvcNAQEEBQAwgaExCzAJBgNVBAYTAktSMRUwEwYD +VQQIDAzrjIDtlZzrr7zqta0xDTALBgNVBAcTBG51bGwxJTAjBgNVBAoMHFNL7Luk +666k64uI7LyA7J207IWY7KaIKOyjvCkxCzAJBgNVBAsTAkVDMRMwEQYDVQQDEwpD +eXdvcmxkMDE0MSMwIQYKCZImiZPyLGQBAxQTc3VuZ21vY2tAaW5pY2lzLmNvbTAe +Fw0wNzExMTIwNjExMzBaFw0wODExMTEwNjExMzBaMIGhMQswCQYDVQQGEwJLUjEV +MBMGA1UECAwM64yA7ZWc66+86rWtMQ0wCwYDVQQHEwRudWxsMSUwIwYDVQQKDBxT +S+y7pOuupOuLiOy8gOydtOyFmOymiCjso7wpMQswCQYDVQQLEwJFQzETMBEGA1UE +AxMKQ3l3b3JsZDAxNDEjMCEGCgmSJomT8ixkAQMUE3N1bmdtb2NrQGluaWNpcy5j +b20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAV0zuTBHq1SZWArRHCNz1jlU +WUyTK3Gv6BGq3J6Tly/o6g51Nbjcu2TYMXLIhMgsqDPeJzOnXbSvnh3FWgAMcFm/ +EZEs9oKw+jkiPfIEeSc7KZThqDm1oG4FgJZrXim6Y3jlLLaW1h0WyapCV2u60759 +LX8YzmmFmUuXGZOb5s7DAgMBAAEwDQYJKoZIhvcNAQEEBQADgYIAAN4AumokztkK +z5UBScG4Ccvu3nwcuFlCqzDUm9xnZyfy96RIjTJjVelkLwk6NFPqbDEyDLmHm6fe +Zus+fvZBKQAyHigfuS/RVitcup52OkWCZerbcWsziX8Pzqb/MHu19Elt+y/QYe5x +ysyIsZn47Bp+7kbQtlMjJecXGEFfmoi1 +-----END CERTIFICATE----- diff --git a/shop/inicis/key/mpriv.pem b/shop/inicis/key/mpriv.pem new file mode 100644 index 000000000..3d30395f3 --- /dev/null +++ b/shop/inicis/key/mpriv.pem @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,6B92FB59B7AB8A00 + +NSplji6yUKrk1LXAid9TcBIOSkA+oE+5b52s7GaebioGsGSMIW7RrK8VHWlTOpxs +GnFkTNg3ALZucdhYiAdm6vzaGmmJogoPnmpevs2JIDl3rkgcQH0AVU6nkKg9EcuP +QP/2DknfqzNO46fTMjUIRSrJ7AauDz6836Mm3GVNl7cA42ecM7xHSVK3ZvCvpTrJ +A9ik1zWZbzCIKg/mgMJkHu8xO8K9GKQAY1OM0KxK+oqS/Txmi6RplCHlrTAR+Ahb +J3W8vG3tCu6orlczvPYEnB0a1E/dycDPziBFm6nVAk8cb+yPbZnl/Nqfu6nvPsSx +iJYJR9YZ6L5i/IIhBc8tjNWeDB1KLsXZY41B//D/pjr9nfFUcJex8uPpOA0+GnGz +EhDT8j/WMylgAxKKIYjFqE7HnMQ+n+ZZqLKO6JLdu3HHNz0QC7nz/SZtEMw/of4e +1DlFHDTLTg0vJxwuLSBHVQN3H7SiFbxc/U5UmZEEVPprwbS9m0ok9JmBdfCv8iqu +vuJiYc3HCdJaTRu0U3fJM33yr//BrZxXw0RjABePprcQDf590Vws8tygc/L5voF6 +lw8JYXuWKuRn4soNKwhrLL9YvQ0FNy1ITS2MpKGNYRPp5l3YCKO19y1dLMwrA33k +SL1laFxrXLDaaE7MJZ8VD9hIymnn0aivtJHelW9DNoWJdI/DgTNKRhgT2TWBqR09 +VVCCKF3RLAQMvOFq/49A68px8/xHKxd6pYis/l8BONlZBMYRyIgjZ0IU81pmvHm+ +8UphsgRGx1ZvNtP0ApnTMF9DdpPN6vkxmpDWTe93HWJTp3TV1wyZPA== +-----END RSA PRIVATE KEY----- diff --git a/shop/inicis/key/pgcert.pem b/shop/inicis/key/pgcert.pem new file mode 100644 index 000000000..745cd7c38 --- /dev/null +++ b/shop/inicis/key/pgcert.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDcTCCAtqgAwIBAgIBHjANBgkqhkiG9w0BAQQFADCBiDELMAkGA1UEBhMCS1Ix +DjAMBgNVBAgTBVNlb3VsMRgwFgYDVQQKEw9JbmljaXMgQ28sIEx0ZC4xDzANBgNV +BAsTBklOSXBheTEfMB0GA1UEAxMWSU5JcGF5IFBheW1lbnQgR2F0ZXdheTEdMBsG +CSqGSIb3DQEJARYOZGV2QGluaWNpcy5jb20wHhcNMDcwOTA2MDYxNTI0WhcNMTcw +OTAzMDYxNTI0WjCBiDELMAkGA1UEBhMCS1IxDjAMBgNVBAgTBVNlb3VsMRgwFgYD +VQQKEw9JbmljaXMgQ28sIEx0ZC4xDzANBgNVBAsTBklOSXBheTEfMB0GA1UEAxMW +SU5JcGF5IFBheW1lbnQgR2F0ZXdheTEdMBsGCSqGSIb3DQEJARYOZGV2QGluaWNp +cy5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOC8v1rxqoo7tonq7t4d +c3FVfIlLyA9ku+l9+d5pUQrbiUXDe8NoJZnoSyud4WhOUrN2ZpzNmjGxuPquYrT/ +LkXoR+ib9OAhFBp7izstjHEA+oUNTVO24MRRvOHWWaLrCeTNX9PeaZl9ploojyHc +Uxm5/gIlPEojiaWNc3HVnb55AgMBAAGjgegwgeUwHQYDVR0OBBYEFGgqMfJUMSUQ +pjyGnurepI+NUf6JMIG1BgNVHSMEga0wgaqAFGgqMfJUMSUQpjyGnurepI+NUf6J +oYGOpIGLMIGIMQswCQYDVQQGEwJLUjEOMAwGA1UECBMFU2VvdWwxGDAWBgNVBAoT +D0luaWNpcyBDbywgTHRkLjEPMA0GA1UECxMGSU5JcGF5MR8wHQYDVQQDExZJTklw +YXkgUGF5bWVudCBHYXRld2F5MR0wGwYJKoZIhvcNAQkBFg5kZXZAaW5pY2lzLmNv +bYIBHjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GBANUj8vYzU2Q9pebQ +yX+6U9e36DeO/+15iDgU2PRK63uPaEa6vMqN2ibI8twolZB2t2oqIRgO44Hf3Nyf +1XKNzCP1eRF1XreGOnrPZtJ5UeUs3RNBqvQkIAdSW80jkXw0i/7i95BYxRIJWSIE +2fLjemy6r8gAQgWRAPv32F0xwRRT +-----END CERTIFICATE----- \ No newline at end of file diff --git a/shop/inicis/key/readme.txt b/shop/inicis/key/readme.txt new file mode 100644 index 000000000..d8d53d59f --- /dev/null +++ b/shop/inicis/key/readme.txt @@ -0,0 +1,19 @@ + +please read this README.TXT file + +ZIP file contains following 3 files. + - mcert.pem + - mpriv.pem + - keypass.enc + +Copy these 3 files to directory [key/Cyworld014]. + +Merchant ID : Cyworld014 +Key Password : 1111 +Admin Password: 1111 + +please visit https://iniweb.inicis.com +for your Merchant Administration. +This site provides your payment transaction details and account details by calculation period. + +You can also log on this site using your Merchant ID(Cyworld014). diff --git a/shop/inicis/key/rndseed.binary b/shop/inicis/key/rndseed.binary new file mode 100644 index 000000000..6d7bc5219 Binary files /dev/null and b/shop/inicis/key/rndseed.binary differ diff --git a/shop/inicis/libs/CreateIdModule.php b/shop/inicis/libs/CreateIdModule.php new file mode 100644 index 000000000..10bc2d0d3 --- /dev/null +++ b/shop/inicis/libs/CreateIdModule.php @@ -0,0 +1,99 @@ +getPGID($payMetod) . $mid . $time . $this->makeRandNum(); + + + return $tid; + } + + function getPGID($payMethod) { + $pgid = ""; + + if ($payMethod == "Card") { + $pgid = "CARD"; + } elseif ($payMethod == "Account") { + $pgid = "ACCT"; + } elseif ($payMethod == "DirectBank") { + $pgid = "DBNK"; + } elseif ($payMethod == "OCBPoint") { + $pgid = "OCBP"; + } elseif ($payMethod == "VCard") { + $pgid = "ISP_"; + } elseif ($payMethod == "HPP") { + $pgid = "HPP_"; + } elseif ($payMethod == "Nemo") { + $pgid = "NEMO"; + } elseif ($payMethod == "ArsBill") { + $pgid = "ARSB"; + } elseif ($payMethod == "PhoneBill") { + $pgid = "PHNB"; + } elseif ($payMethod == "Ars1588Bill") { + $pgid = "1588"; + } elseif ($payMethod == "VBank") { + $pgid = "VBNK"; + } elseif ($payMethod == "Culture") { + $pgid = "CULT"; + } elseif ($payMethod == "CMS") { + $pgid = "CMS_"; + } elseif ($payMethod == "AUTH") { + $pgid = "AUTH"; + } elseif ($payMethod == "INIcard") { + $pgid = "INIC"; + } elseif ($payMethod == "MDX") { + $pgid = "MDX_"; + } elseif ($payMethod == "CASH") { + $pgid = "CASH"; + } elseif (strlen($payMethod) > 4) { + $pgid = strtoupper($payMethod); + $pgid = substr($pgid, 0, 4); + } else { + $pgid = trim($pgid); + } + + return $pgid; + } + + //랜덤 숫자 생성 + function makeRandNum() { + $strNum = ""; + $randNum = rand(0, 300); + + if ($randNum < 10) { + $strNum = $strNum . "00" . $randNum; + } elseif ($randNum < 100) { + $strNum = $strNum . "0" . $randNum; + } else { + $strNum = $randNum; + } + + return $strNum; + } + +} \ No newline at end of file diff --git a/shop/inicis/libs/HttpClient.php b/shop/inicis/libs/HttpClient.php new file mode 100644 index 000000000..2179eb82e --- /dev/null +++ b/shop/inicis/libs/HttpClient.php @@ -0,0 +1,153 @@ + $value) { + $key2 = urlencode($key); + $value2 = urlencode($value); + $data .= "&$key2=$value2"; + } + + $data = substr($data, 1); // remove leading "&" + $url_data = parse_url($url); + + // host 가 inicis.com 의 주소가 아니라면 false 반환 + // [scheme] => https, [host] => fcstdpay.inicis.com, [path] => /api/payAuth + if (preg_match("#inicis\.com$#", $url_data["host"]) == false) { + // error_log(print_r($url_data, 1)); + return false; + } + + if ($url_data["scheme"] == "https") { + $this->ssl = "ssl://"; + $this->port = 443; + } + + $this->host = $url_data["host"]; + /* + + if (is_null($url_data["port"])) { + $this->port = "80"; + } else { + $this->port = $url_data["port"]; + } + */ + + $this->path = $url_data["path"]; + + if (!$this->sock = @fsockopen($this->ssl . $this->host, $this->port, $errno, $errstr, CONNECT_TIMEOUT)) { + + switch ($errno) { + case -3: + $this->errormsg = 'Socket creation failed (-3)'; + case -4: + $this->errormsg = 'DNS lookup failure (-4)'; + case -5: + $this->errormsg = 'Connection refused or timed out (-5)'; + default: + $this->errormsg = 'Connection failed (' . $errno . ')'; + $this->errormsg .= ' ' . $errstr; + } + return false; + } + + $this->headers = ""; + $this->body = ""; + + /* Write */ + $request = "POST " . $this->path . " HTTP/1.0\r\n"; + $request .= "Connection: close\r\n"; + $request .= "Host: " . $this->host . "\r\n"; + $request .= "Content-type: application/x-www-form-urlencoded\r\n"; + $request .= "Content-length: " . strlen($data) . "\r\n"; + $request .= "Accept: */*\r\n"; + $request .= "\r\n"; + $request .= $data . "\r\n"; + $request .= "\r\n"; + fwrite($this->sock, $request); + + /* Read */ + stream_set_blocking($this->sock, FALSE); + $atStart = true; + $IsHeader = true; + $timeout = false; + $start_time = time(); + while (!feof($this->sock) && !$timeout) { + $line = fgets($this->sock, 4096); + $diff = time() - $start_time; + if ($diff >= READ_TIMEOUT) { + $timeout = true; + } + if ($IsHeader) { + if ($line == "") { + continue; + } + if (substr($line, 0, 2) == "\r\n") { + $IsHeader = false; + continue; + } + $this->headers .= $line; + if ($atStart) { + $atStart = false; + if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) { + $this->errormsg = "Status code line invalid: " . htmlentities($line) . $m[1] . $m[2] . $m[3]; + fclose($this->sock); + return false; + } + $http_version = $m[1]; + $this->status = $m[2]; + $status_string = $m[3]; + continue; + } + } else { + $this->body .= $line; + } + } + + + fclose($this->sock); + + if ($timeout) { + $this->errorcode = READ_TIMEOUT_ERR; + $this->errormsg = "Socket Timeout(" . $diff . "SEC)"; + return false; + } + + return true; + // return false; + } + + function getErrorCode() { + return $this->errorcode; + } + + function getErrorMsg() { + return $this->errormsg; + } + + function getBody() { + return $this->body; + } + +} \ No newline at end of file diff --git a/shop/inicis/libs/INICls.php b/shop/inicis/libs/INICls.php new file mode 100644 index 000000000..1909cd8c8 --- /dev/null +++ b/shop/inicis/libs/INICls.php @@ -0,0 +1,1400 @@ +debug_msg = array("", "CRITICAL", "ERROR", "NOTICE", "4", "INFO", "6", "DEBUG", "8"); + $this->debug_mode = $request["debug"]; + $this->type = $request["type"]; + $this->log = isset($request["log"]) ? $request["log"] : ''; + $this->homedir = $request["inipayhome"]; + $this->mid = $request["mid"]; + $this->starttime = GetMicroTime(); + $this->mergelog = isset($request["mergelog"]) ? $request["mergelog"] : ''; + } + + function StartLog() { + if ($this->log == "false") + return true; + + if ($this->type == "chkfake") + $type = "securepay"; + else + $type = $this->type; + if ($this->mergelog == "1") + $logfile = $this->homedir . "/log/" . PROGRAM . "_" . $type . "_mergelog_" . date("ymd") . ".log"; + else + $logfile = $this->homedir . "/log/" . PROGRAM . "_" . $type . "_" . $this->mid . "_" . date("ymd") . ".log"; + $this->handle = fopen($logfile, "a+"); + if (!$this->handle) + return false; + $this->WriteLog(INFO, "START " . PROGRAM . " " . $this->type . " (" . VERSION . "-" . BUILDDATE . ")(OS:" . php_uname('s') . php_uname('r') . ",PHP:" . phpversion() . ")"); + return true; + } + + function WriteLog($debug, $data) { + if ($this->log == "false" || !$this->handle) + return; + + if (!$this->debug_mode && $debug >= DEBUG) + return; + + $pfx = $this->debug_msg[$debug] . "\t[" . SetTimestamp() . "] <" . getmypid() . "> "; + if (is_array($data)) { + foreach ($data as $key => $val) { + fwrite($this->handle, $pfx . $key . ":" . $val . "\r\n"); + } + } else { + fwrite($this->handle, $pfx . $data . "\r\n"); + } + fflush($this->handle); + } + + function CloseLog($msg) { + if ($this->log == "false") + return; + + $laptime = GetMicroTime() - $this->starttime; + $this->WriteLog(INFO, "END " . $this->type . " " . $msg . " Laptime:[" . round($laptime, 3) . "sec]"); + $this->WriteLog(INFO, "==============================================================="); + fclose($this->handle); + } + +} + +/* ----------------------------------------------------- */ +/* Data Class */ +/* -TID Generate Function */ +/* -Data Encrypt Function */ +/* -Check Field Function */ +/* ----------------------------------------------------- */ + +class INIData { + + //---------------------------- + //Common + //---------------------------- + var $m_Type; + var $m_EscrowType; + var $m_ErrCode; + var $m_ErrMsg; + var $m_EncBody; + var $m_PG1; + var $m_PG2; + var $m_PG1IP; + var $m_PG2IP; + //---------------------------- + //IFD 요청필드 + //---------------------------- + var $m_sCmd; + var $m_sCrypto; + var $m_sTID; + var $m_sPayMethod; + var $m_MPubSN; + var $m_PIPGPubSN; + var $m_TXPGPubSN; + var $m_TXVersion; + var $m_sMsg; + var $m_sHead; + var $m_sBody; + var $m_sTail; + var $m_sEncrypted; + var $m_sSessionKey; + //---------------------------- + //IFD 응답헤더 필드 + //---------------------------- + var $m_FlgCrypto; + var $m_FlgSign; + var $m_Cmd; + var $m_Body; + //Xml Data + var $m_Xml = array(); + var $m_REQUEST = array(); + var $m_REQUEST2 = array(); //User Defined Entity + var $m_RESULT = array(); //Encrypted 필드 hash table + var $m_RESULT2 = array(); //PG Added Entity + + function __construct($request, $request2) { + $this->m_Xml = NULL; + + $this->m_REQUEST = $request; + $this->m_REQUEST2 = $request2; + + $this->m_Type = $this->m_REQUEST["type"]; + if ($this->m_Type == TYPE_SECUREPAY || $this->m_Type == TYPE_AUTH) { + $this->m_sCmd = CMD_REQ_PAY; + $this->m_sCrypto = FLAG_CRYPTO_RC4; + } else if ($this->m_Type == TYPE_CANCEL) { + $this->m_sCmd = CMD_REQ_CAN; + $this->m_sCrypto = FLAG_CRYPTO_3DES; + } else if ($this->m_Type == TYPE_INQUIRY) { + $this->m_sCmd = CMS_REQ_INQR; + $this->m_sCrypto = FLAG_CRYPTO_3DES; + } else if ($this->m_Type == TYPE_OPENSUB) { + $this->m_sCmd = CMS_REQ_OPEN_SUB; + $this->m_sCrypto = FLAG_CRYPTO_3DES; + } + //가상계좌 부분환불 추가 + else if (( $this->m_Type == TYPE_REPAY) || ( $this->m_Type == TYPE_VACCTREPAY)) { + $this->m_sCmd = CMD_REQ_PRTC; + $this->m_sCrypto = FLAG_CRYPTO_3DES; + } else if ($this->m_Type == TYPE_CAPTURE) { + $this->m_sCmd = CMD_REQ_CAP; + $this->m_sCrypto = FLAG_CRYPTO_3DES; + } else if ($this->m_Type == TYPE_ESCROW) { + $this->m_EscrowType = $this->m_REQUEST["escrowtype"]; + if ($this->m_EscrowType == TYPE_ESCROW_DLV) { + $this->m_sCmd = CMD_REQ_DLV; + $this->m_sCrypto = FLAG_CRYPTO_3DES; + } else if ($this->m_EscrowType == TYPE_ESCROW_CNF) { + parse_str($this->m_REQUEST["encrypted"]); + if ($iniescr_type == "1") {//confirm + $this->m_EscrowType = TYPE_ESCROW_CNF; + $this->m_sCmd = CMD_REQ_CNF; + $this->m_sCrypto = FLAG_CRYPTO_RC4; + } else if ($iniescr_type == "2") {//deny + $this->m_EscrowType = TYPE_ESCROW_DNY; + $this->m_sCmd = CMD_REQ_DNY; + $this->m_sCrypto = FLAG_CRYPTO_RC4; + } + } else if ($this->m_EscrowType == TYPE_ESCROW_DNY_CNF) { + $this->m_sCmd = CMD_REQ_DNY_CNF; + $this->m_sCrypto = FLAG_CRYPTO_3DES; + } + } else if ($this->m_Type == TYPE_REFUND) { //가상계좌환불(09.08.05) + $this->m_sCmd = CMD_REQ_RFD; + $this->m_sCrypto = FLAG_CRYPTO_3DES; + } else { + $this->m_sCmd = CMD_REQ_PAY; + $this->m_sCrypto = FLAG_CRYPTO_3DES; + } + $this->m_sPayMethod = isset($this->m_REQUEST["paymethod"]) ? $this->m_REQUEST["paymethod"] : ''; + + $this->m_TXVersion = sprintf("%-6.6s", VERSION) . + sprintf("B%-8.8s", BUILDDATE) . + sprintf("%-5.5s", $this->m_Type) . + sprintf("%-10.10s", php_uname('s')) . + sprintf("%-3.3s", "PHP") . //modulescript + sprintf("%-10.10s", "chkfake") . //moduledesc + sprintf("%-30.30s", php_uname('r') . "PHP:" . phpversion()) //ETCINFO + ; + } + + function CheckField() { + //--------------------------------- + //공통 + //--------------------------------- + if (trim($this->m_REQUEST["inipayhome"]) == "") { + $this->m_ErrCode = NULL_DIR_ERR; + $this->m_ErrMsg = "inipayhome"; + return false; + } + if (trim($this->m_REQUEST["mid"]) == "") { + $this->m_ErrCode = NULL_MID_ERR; + $this->m_ErrMsg = "mid"; + return false; + } + if (trim($this->m_REQUEST["type"]) == "") { + $this->m_ErrCode = NULL_TYPE_ERR; + $this->m_ErrMsg = "type"; + return false; + } + if (trim($this->m_REQUEST["admin"]) == "") { + $this->m_ErrCode = NULL_KEYPW_ERR; + $this->m_ErrMsg = "admin"; + return false; + } + //--------------------------------- + //type별로 + //--------------------------------- + if ($this->m_Type == TYPE_SECUREPAY) { + /* + //delete UIP(2009.01.21) + if( trim($this->m_REQUEST["uip"]) == "") + { + $this->m_ErrCode = NULL_UIP_ERR; + $this->m_ErrMsg = "uip"; + return false; + } + */ + if (trim($this->m_REQUEST["url"]) == "") { + $this->m_ErrCode = NULL_URL_ERR; + $this->m_ErrMsg = "url"; + return false; + } + if (trim($this->m_REQUEST["price"]) == "") { + $this->m_ErrCode = NULL_PRICE_ERR; + $this->m_ErrMsg = "price"; + return false; + } + if (trim($this->m_REQUEST["currency"]) == "") { + $this->m_ErrCode = NULL_CURRENCY_ERR; + $this->m_ErrMsg = "currency"; + return false; + } + if (trim($this->m_REQUEST["paymethod"]) == "") { + $this->m_ErrCode = NULL_PAYMETHOD_ERR; + $this->m_ErrMsg = "paymethod"; + return false; + } + if (trim($this->m_REQUEST["goodname"]) == "") { + $this->m_ErrCode = NULL_GOODNAME_ERR; + $this->m_ErrMsg = "goodname"; + return false; + } + if (trim($this->m_REQUEST["buyername"]) == "") { + $this->m_ErrCode = NULL_BUYERNAME_ERR; + $this->m_ErrMsg = "buyername"; + return false; + } + if (trim($this->m_REQUEST["buyertel"]) == "") { + $this->m_ErrCode = NULL_BUYERTEL_ERR; + $this->m_ErrMsg = "buyertel"; + return false; + } + if (trim($this->m_REQUEST["buyeremail"]) == "") { + $this->m_ErrCode = NULL_BUYEREMAIL_ERR; + $this->m_ErrMsg = "buyeremail"; + return false; + } + if (trim($this->m_REQUEST["sessionkey"]) == "") { + $this->m_ErrCode = NULL_SESSIONKEY_ERR; + $this->m_ErrMsg = "sessionkey"; + return false; + } + if (trim($this->m_REQUEST["encrypted"]) == "") { + $this->m_ErrCode = NULL_ENCRYPTED_ERR; + $this->m_ErrMsg = "encrypted"; + return false; + } + } else if ($this->m_Type == TYPE_CANCEL) { + if (trim($this->m_REQUEST["tid"]) == "") { + $this->m_ErrCode = NULL_TID_ERR; + $this->m_ErrMsg = "tid"; + return false; + } + } + //가상계좌 부분환불도 부분환불 로직에 추가 + else if (( $this->m_Type == TYPE_REPAY ) || ( $this->m_Type == TYPE_VACCTREPAY )) { + if (trim($this->m_REQUEST["oldtid"]) == "") { + $this->m_ErrCode = NULL_TID_ERR; + $this->m_ErrMsg = "oldtid"; + return false; + } + if (trim($this->m_REQUEST["price"]) == "") { + $this->m_ErrCode = NULL_PRICE_ERR; + $this->m_ErrMsg = "price"; + return false; + } + if (trim($this->m_REQUEST["confirm_price"]) == "") { + $this->m_ErrCode = NULL_CONFIRM_PRICE_ERR; + $this->m_ErrMsg = "confirm_price"; + return false; + } + + //가상계좌 부분환불 로직에서는 계조번호,은행코드,계좌주명이 필수 + if ($this->m_Type == TYPE_VACCTREPAY) { + if (trim($this->m_REQUEST["refundacctnum"]) == "") { + $this->m_ErrCode = NULL_FIELD_REFUNDACCTNUM; + $this->m_ErrMsg = "환불계좌번호"; + return false; + } + if (trim($this->m_REQUEST["refundbankcode"]) == "") { + $this->m_ErrCode = NULL_FIELD_REFUNDBANKCODE; + $this->m_ErrMsg = "환불은행코드"; + return false; + } + if (trim($this->m_REQUEST["refundacctname"]) == "") { + $this->m_ErrCode = NULL_FIELD_REFUNDACCTNAME; + $this->m_ErrMsg = "환불계좌주성명"; + return false; + } + } + } else if ($this->m_Type == TYPE_CHKFAKE) { + if (trim($this->m_REQUEST["nointerest"]) == "") { + $this->m_ErrCode = NULL_NOINTEREST_ERR; + $this->m_ErrMsg = "nointerest"; + return false; + } + if (trim($this->m_REQUEST["quotabase"]) == "") { + $this->m_ErrCode = NULL_QUOTABASE_ERR; + $this->m_ErrMsg = "quotabase"; + return false; + } + } else if ($this->m_Type == TYPE_REFUND) { + if (trim($this->m_REQUEST["tid"]) == "") { + $this->m_ErrCode = NULL_TID_ERR; + $this->m_ErrMsg = "tid"; + return false; + } + if (trim($this->m_REQUEST["racctnum"]) == "") { + $this->m_ErrCode = NULL_FIELD_REFUNDACCTNUM; + $this->m_ErrMsg = "환불계좌번호"; + return false; + } + if (trim($this->m_REQUEST["rbankcode"]) == "") { + $this->m_ErrCode = NULL_FIELD_REFUNDBANKCODE; + $this->m_ErrMsg = "환불은행코드"; + return false; + } + if (trim($this->m_REQUEST["racctname"]) == "") { + $this->m_ErrCode = NULL_FIELD_REFUNDACCTNAME; + $this->m_ErrMsg = "환불계좌주성명"; + return false; + } + } + return true; + } + + function MakeRN() { + list($usec, $sec) = explode(" ", microtime()); + $datestr = date("YmdHis", $sec) . substr($usec, 2, 3); //YYYYMMDDHHMMSSSSS + return Base64Encode($datestr . rand(10000, 99999)); + } + + function MakeTID() { + list($usec, $sec) = explode(" ", microtime()); + $datestr = date("YmdHis", $sec) . substr($usec, 2, 3); //YYYYMMDDHHMMSSSSS + + $datestr_con = substr($datestr, 0, 14) . substr($datestr, 15, 2); //YYYYMMDDHHMMSSxSS 중간의 x값은 버림(milli second의 첫번째 자리수) + + mt_srand(getmypid() * mt_rand(1, 999)); //mt_rand 하기전에 srand 로 seed 적용 , seed key = pid * mt_rand(1,999) + //pgid + mid + 16자리 날짜및 시간 + random_key 4자리 (seed적용) + $this->m_sTID = $this->m_REQUEST["pgid"] . $this->m_REQUEST["mid"] . $datestr_con . mt_rand(1000, 9999); + if (strlen($this->m_sTID) != TID_LEN) { + return false; + } + $this->m_REQUEST["tid"] = $this->m_sTID; + return true; + } + + function GenRand($length, $nullOk, $ascii = false) { + # mt_srand( 99999 ); + $out = ''; + for ($i = 0; $i < $length; $i++) + $out .= chr(mt_rand($nullOk ? 0 : 1, $ascii ? 127 : 255 )); + return $out; + } + + function MakeEncrypt($INICrypto) { + //generate key/iv + $key = $this->GenRand(MAX_KEY_LEN, true); + $iv = $this->GenRand(MAX_IV_LEN, true); + + //make XML + $xml = new XML(); + if ($this->m_Type == TYPE_FORMPAY) { + + } else if ($this->m_Type == TYPE_RECEIPT) { + $PI = $xml->add_node("", PAYMENTINFO); + $PM = $xml->add_node($PI, PAYMENT); + $CS = $xml->add_node($PM, NM_CSHR); + $PD = $xml->add_node($CS, TX_CSHR_APPLPRICE, $this->m_REQUEST["cr_price"]); + $PD = $xml->add_node($CS, TX_CSHR_SUPPLYPRICE, $this->m_REQUEST["sup_price"]); + $PD = $xml->add_node($CS, TX_CSHR_TAX, $this->m_REQUEST["tax"]); + $PD = $xml->add_node($CS, TX_CSHR_SERVICEPRICE, $this->m_REQUEST["srvc_price"]); + $PD = $xml->add_node($CS, TX_CSHR_TYPE, $this->m_REQUEST["useopt"]); + $PD = $xml->add_node($CS, TX_CSHR_REGNUM, $this->m_REQUEST["reg_num"]); + $PD = $xml->add_node($CS, TX_CSHR_COMPANYNUM, $this->m_REQUEST["companynumber"]); + /* + $PD = $xml->add_node($CS, TX_CSHR_OPENMARKET, $this->m_REQUEST[""] ); + $PD = $xml->add_node($CS, TX_CSHR_SUBCNT, $this->m_REQUEST[""] ); + $PD = $xml->add_node($CS, TX_CSHR_SUBCOMPANYNAME1, $this->m_REQUEST[""] ); + $PD = $xml->add_node($CS, TX_CSHR_SUBCOMPANYNUM1, $this->m_REQUEST[""] ); + $PD = $xml->add_node($CS, TX_CSHR_SUBREGNUM1, $this->m_REQUEST[""] ); + $PD = $xml->add_node($CS, TX_CSHR_SUBMID1, $this->m_REQUEST[""] ); + $PD = $xml->add_node($CS, TX_CSHR_SUBAPPLPRICE1, $this->m_REQUEST[""] ); + $PD = $xml->add_node($CS, TX_CSHR_SUBSERVICEPRICE1, $this->m_REQUEST[""] ); + */ + } else if ($this->m_Type == TYPE_CANCEL) { + $cancelcode = isset($this->m_REQUEST["cancelcode"]) ? $this->m_REQUEST["cancelcode"] : ''; + + $CI = $xml->add_node("", CANCELINFO); + $CD = $xml->add_node($CI, TX_CANCELTID, $this->m_REQUEST["tid"]); + $CD = $xml->add_node($CI, TX_CANCELMSG, $this->m_REQUEST["cancelmsg"], array("urlencode" => "1")); + $CD = $xml->add_node($CI, TX_CANCELREASON, $cancelcode); + + $node_racctnum = isset($this->m_REQUEST["racctnum"]) ? $this->m_REQUEST["racctnum"] : ''; + $node_rbankcode = isset($this->m_REQUEST["rbankcode"]) ? $this->m_REQUEST["rbankcode"] : ''; + $node_racctname = isset($this->m_REQUEST["racctname"]) ? $this->m_REQUEST["racctname"] : ''; + + //휴대폰 익월환불 추가 + $CD = $xml->add_node($CI, TX_REFUNDACCTNUM, $node_racctnum); + $CD = $xml->add_node($CI, TX_REFUNDBANKCODE, $node_rbankcode); + $CD = $xml->add_node($CI, TX_REFUNDACCTNAME, $node_racctname, array("urlencode" => "1")); + + $this->AddUserDefinedEntity(CANCELINFO, "", $xml, $CI); + } else if ($this->m_Type == TYPE_REPAY) { + //PartCancelInfo(ROOT) + $CI = $xml->add_node("", PARTCANCELINFO); + $CD = $xml->add_node($CI, TX_PRTC_TID, $this->m_REQUEST["oldtid"]); + $CD = $xml->add_node($CI, TX_PRTC_PRICE, $this->m_REQUEST["price"]); + $CD = $xml->add_node($CI, TX_PRTC_REMAINS, $this->m_REQUEST["confirm_price"]); + $CD = $xml->add_node($CI, TX_PRTC_QUOTA, $this->m_REQUEST["cardquota"]); + $CD = $xml->add_node($CI, TX_PRTC_INTEREST, $this->m_REQUEST["quotainterest"]); + //I계좌이체 국민은행 부분취소시 계좌번호 계좌주성명을 받음 2011-10-06 + $CD = $xml->add_node($CI, TX_PRTC_NOACCT, $this->m_REQUEST["no_acct"]); + $CD = $xml->add_node($CI, TX_PRTC_NMACCT, $this->m_REQUEST["nm_acct"], array("urlencode" => "1")); + //과세,비과세 추가 2014-07-23 by jung.ks + //$CD = $xml->add_node($CI, TX_PRTC_TAX, $this->m_REQUEST["tax"] ); + //$CD = $xml->add_node($CI, TX_PRTC_TAXFREE, $this->m_REQUEST["taxfree"] ); + + $this->AddUserDefinedEntity(PARTCANCELINFO, "", $xml, $CI); + } + //가상계좌 부분환불 + else if ($this->m_Type == TYPE_VACCTREPAY) { + //PartCancelInfo(ROOT) + $CI = $xml->add_node("", PARTCANCELINFO); + $CD = $xml->add_node($CI, TX_PRTC_TID, $this->m_REQUEST["oldtid"]); + $CD = $xml->add_node($CI, TX_PRTC_PRICE, $this->m_REQUEST["price"]); + $CD = $xml->add_node($CI, TX_PRTC_REMAINS, $this->m_REQUEST["confirm_price"]); + $CD = $xml->add_node($CI, TX_PRTC_QUOTA, $this->m_REQUEST["cardquota"]); + $CD = $xml->add_node($CI, TX_PRTC_INTEREST, $this->m_REQUEST["quotainterest"]); + $CD = $xml->add_node($CI, TX_PRTC_NOACCT, $this->m_REQUEST["refundacctnum"]); + $CD = $xml->add_node($CI, TX_PRTC_NMACCT, $this->m_REQUEST["refundacctname"], array("urlencode" => "1")); + $CD = $xml->add_node($CI, TX_PRTC_REFUNDFLGREMIT, $this->m_REQUEST["refundflgremit"]); + $CD = $xml->add_node($CI, TX_PRTC_REFUNDBANKCODE, $this->m_REQUEST["refundbankcode"]); + $this->AddUserDefinedEntity(PARTCANCELINFO, "", $xml, $CI); + } else if ($this->m_Type == TYPE_CAPTURE) { + $CI = $xml->add_node("", CAPTUREINFO); + $CD = $xml->add_node($CI, TX_CAPTURETID, $this->m_REQUEST["tid"]); + $this->AddUserDefinedEntity(CAPTUREINFO, "", $xml, $CI); + } else if ($this->m_Type == TYPE_ESCROW) { + if ($this->m_EscrowType == TYPE_ESCROW_DLV) { + $EI = $xml->add_node("", ESCROWINFO); + $EC = $xml->add_node($EI, ESCROW_DELIVERY); + $ED = $xml->add_node($EC, "DLV_Oid", $this->m_REQUEST["oid"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_SOid", $this->m_REQUEST["soid"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_Name", $this->m_REQUEST["dlv_name"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_IP", $this->m_REQUEST["dlv_ip"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_MAC", $this->m_REQUEST["dlv_mac"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_Report", $this->m_REQUEST["dlv_report"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_SendName", $this->m_REQUEST["dlv_sendname"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_SendPost", $this->m_REQUEST["dlv_sendpost"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_SendAddr1", $this->m_REQUEST["dlv_sendaddr1"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_SendAddr2", $this->m_REQUEST["dlv_sendaddr2"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_SendTel", $this->m_REQUEST["dlv_sendtel"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_RecvName", $this->m_REQUEST["dlv_recvname"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_RecvPost", $this->m_REQUEST["dlv_recvpost"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_RecvAddr", $this->m_REQUEST["dlv_recvaddr"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_RecvTel", $this->m_REQUEST["dlv_recvtel"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_ExCode", $this->m_REQUEST["dlv_excode"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_ExName", $this->m_REQUEST["dlv_exname"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_Invoice", $this->m_REQUEST["dlv_invoice"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_Charge", $this->m_REQUEST["dlv_charge"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_InvoiceDay", $this->m_REQUEST["dlv_invoiceday"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_GoodsCode", $this->m_REQUEST["dlv_goodscode"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_Goods", $this->m_REQUEST["dlv_goods"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_GoodsCnt", $this->m_REQUEST["dlv_goodscnt"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_Price", $this->m_REQUEST["price"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_Reserved1", $this->m_REQUEST["dlv_reserved1"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_Reserved2", $this->m_REQUEST["dlv_reserved2"], array("urlencode" => "1")); + $ED = $xml->add_node($EC, "DLV_Reserved3", $this->m_REQUEST["dlv_reserved3"], array("urlencode" => "1")); + } else if ($this->m_EscrowType == TYPE_ESCROW_CNF) { + //PluginIn!! + } else if ($this->m_EscrowType == TYPE_ESCROW_DNY) { + //PluginIn!! + } else if ($this->m_EscrowType == TYPE_ESCROW_DNY_CNF) { + $EI = $xml->add_node("", ESCROWINFO); + $EC = $xml->add_node($EI, ESCROW_DENYCONFIRM); + $ED = $xml->add_node($EC, "DCNF_Name", $this->m_REQUEST["dcnf_name"], array("urlencode" => "1")); + } + } else if ($this->m_Type == TYPE_REFUND) { + $CI = $xml->add_node("", CANCELINFO); + $CD = $xml->add_node($CI, TX_CANCELTID, $this->m_REQUEST["tid"]); + $CD = $xml->add_node($CI, TX_CANCELMSG, $this->m_REQUEST["cancelmsg"], array("urlencode" => "1")); + $CD = $xml->add_node($CI, TX_REFUNDACCTNUM, $this->m_REQUEST["racctnum"]); + $CD = $xml->add_node($CI, TX_REFUNDBANKCODE, $this->m_REQUEST["rbankcode"]); + $CD = $xml->add_node($CI, TX_REFUNDACCTNAME, $this->m_REQUEST["racctname"], array("urlencode" => "1")); + $CD = $xml->add_node($CI, TX_REFUNDFLGREMIT, $this->m_REQUEST["refundflgremit"]); + + + $this->AddUserDefinedEntity(CANCELINFO, "", $xml, $CI); + } else if ($this->m_Type == TYPE_INQUIRY) { + $CI = $xml->add_node("", INQUIRYINFO); + $CD = $xml->add_node($CI, TX_INQR_TID, $this->m_REQUEST["tid"]); + $CD = $xml->add_node($CI, TX_INQR_OID, $this->m_REQUEST["oid"], array("urlencode" => "1")); + //$this->AddUserDefinedEntity( INQUIRYINFO, "", $xml, $CI ); + } else if ($this->m_Type == TYPE_OPENSUB) { + $OI = $xml->add_node("", OPENSUBINFO); + $OD = $xml->add_node($OI, TX_OPENREG_TID, $this->m_REQUEST["oldtid"]); + $OD = $xml->add_node($OI, TX_OPENREG_MID, $this->m_REQUEST["mid"]); + //$this->AddUserDefinedEntity( INQUIRYINFO, "", $xml, $CI ); + } + $this->m_EncBody = $xml->make_xml(); + + //encrypt body by SYMM + if (( $rtv = $INICrypto->SymmEncrypt($this->m_EncBody, $this->m_sEncrypted, $key, $iv)) != OK) + return $rtv; + + //encrypt key/iv by ASYMM + if (!$INICrypto->RSAPGPubEncrypt($key, $this->m_sSessionKey)) + return ENC_RSA_ERR; + + $this->m_sSessionKey = Base64Encode($this->m_sSessionKey . $iv); + + return OK; + } + + function MakeHead() { + $this->m_sHead = sprintf("%05d", strlen($this->m_sBody)); + $this->m_sHead .= sprintf("%05d", strlen($this->m_sTail)); + $this->m_sHead .= sprintf("%s", $this->m_sCrypto); + $this->m_sHead .= sprintf("%5s", FLAG_SIGN_SHA1); + $this->m_sHead .= sprintf("%20s", $this->m_MPubSN); + $this->m_sHead .= sprintf("%20s", $this->m_PIPGPubSN); + $this->m_sHead .= sprintf("%20s", $this->m_TXPGPubSN); + $this->m_sHead .= sprintf("%4s", $this->m_sCmd); + $this->m_sHead .= sprintf("%10s", $this->m_REQUEST["mid"]); + if ($this->m_Type == TYPE_RECEIPT) { + $cr_price = isset($this->m_REQUEST["cr_price"]) ? $this->m_REQUEST["cr_price"] : 0; + $this->m_sHead .= sprintf("%20s", $cr_price); + } else { + $price = isset($this->m_REQUEST["price"]) ? $this->m_REQUEST["price"] : 0; + $this->m_sHead .= sprintf("%20s", $price); + } + $this->m_sHead .= sprintf("%40s", $this->m_REQUEST["tid"]); + + $this->m_sMsg = $this->m_sHead . $this->m_sBody . $this->m_sTail; + return true; + } + + /* + /* Add User Defined Entity + /* Sample + /* $inipay->SetXPath("INIpay/GoodsInfo/UserDefined1","value1"); + /* $inipay->SetXPath("INIpay/GoodsInfo/UserDefined2","value2"); + /* $inipay->SetXPath("INIpay/GoodsInfo/Goods/UserDefined3","value3"); + /* $inipay->SetXPath("INIpay/GoodsInfo/Goods/UserDefined4","value4"); + /* $inipay->SetXPath("INIpay/BuyerInfo/UserDefined5","value5"); + /* $inipay->SetXPath("INIpay/BuyerInfo/UserDefined6","value6"); + /* $inipay->SetXPath("INIpay/PaymentInfo/Payment/UserDefined7","value7"); + /* $inipay->SetXPath("INIpay/PaymentInfo/Payment/UserDefined8","value8"); + /* $inipay->SetXPath("INIpay/ManageInfo/UserDefined9","value9"); + /* $inipay->SetXPath("INIpay/ReservedInfo/UserDefined10","value10"); + */ + + // + function AddUserDefinedEntity($info_node, $downnode, $xml, $upnode) { + foreach ($this->m_REQUEST2 as $key => $val) { + $node = explode('/', $key); + $node_cnt = count($node); + + if ($node_cnt < 3) + continue; //minumum 3 + if ($node[1] != $info_node) + continue; + if ($node_cnt == 3 && $downnode != "") + continue; + if ($node_cnt == 4 && $downnode != $node[2]) + continue; + + $last_node = substr(strrchr($key, '/'), 1); + $xml->add_node($upnode, $last_node, $val, array("urlencode" => "1")); + } + } + + function MakeBody() { + $xml = new XML(); + + //ROOT(INIpay) ROOT를 ROOTINFO로 수정 2011-05-23 + $root = $xml->add_node("", ROOTINFO); + + if ($this->m_Type == TYPE_SECUREPAY || $this->m_Type == TYPE_RECEIPT) { + //GoodsInfo + //장바구니 기능 추가(2010.04.13) + //==goodscnt가 없을 경우(장바구니 기능이 아닐경우) 기본 값 1로 설정 + $tGoodCnt = (isset($this->m_REQUEST["goodscnt"]) && (int) $this->m_REQUEST["goodscnt"] > 0 ) ? $this->m_REQUEST["goodscnt"] : 1; + + $request_oid = isset($this->m_REQUEST["oid"]) ? $this->m_REQUEST["oid"] : ''; + $request_taxfree = isset($this->m_REQUEST["taxfree"]) ? $this->m_REQUEST["taxfree"] : ''; + + $GI = $xml->add_node($root, GOODSINFO); + //장바구니 기능 추가(2010.04.13) + //==TX_GOOSCNT는 $tGoodCnt로 부터 입력 + //$GP = $xml->add_node($GI, TX_GOOSCNT, "1" ); + $GP = $xml->add_node($GI, TX_GOOSCNT, $tGoodCnt); + $GP = $xml->add_node($GI, TX_MOID, $request_oid, array("urlencode" => "1")); + $GP = $xml->add_node($GI, TX_CURRENCY, $this->m_REQUEST["currency"]); + $GP = $xml->add_node($GI, TX_TAX, $this->m_REQUEST["tax"]); + $GP = $xml->add_node($GI, TX_TAXFREE, $request_taxfree); + $this->AddUserDefinedEntity(GOODSINFO, "", $xml, $GI); + + //장바구니 기능 추가(2010.04.13) [START] + //==장바구니 XML 전문 추가 + $iGoodCnt = 1; + while ($iGoodCnt <= $tGoodCnt) { + if (isset($this->m_REQUEST["smid_" . $iGoodCnt]) && strlen($this->m_REQUEST["smid_" . $iGoodCnt]) > 0) { + $GS = $xml->add_node($GI, GOODS); + $GD = $xml->add_node($GS, TX_SMID, $this->m_REQUEST["smid_" . $iGoodCnt]); + $GD = $xml->add_node($GS, TX_GOODSNAME, $this->m_REQUEST["goodsname_" . $iGoodCnt], array("urlencode" => "1")); + $GD = $xml->add_node($GS, TX_GOODSCNTS, $this->m_REQUEST["goodscnts_" . $iGoodCnt]); + if ($this->m_Type == TYPE_SECUREPAY) + $GD = $xml->add_node($GS, TX_GOODSPRICE, $this->m_REQUEST["goodsprice_" . $iGoodCnt]); + if ($this->m_Type == TYPE_RECEIPT) + $GD = $xml->add_node($GS, TX_GOODSPRICE, $this->m_REQUEST["cr_price"]); + } + else { + $GS = $xml->add_node($GI, GOODS); + $GD = $xml->add_node($GS, TX_SMID, $this->m_REQUEST["mid"]); + $GD = $xml->add_node($GS, TX_GOODSNAME, $this->m_REQUEST["goodname"], array("urlencode" => "1")); + + if ($this->m_Type == TYPE_SECUREPAY) + $GD = $xml->add_node($GS, TX_GOODSPRICE, $this->m_REQUEST["price"]); + if ($this->m_Type == TYPE_RECEIPT) + $GD = $xml->add_node($GS, TX_GOODSPRICE, $this->m_REQUEST["cr_price"]); + } + $iGoodCnt++; + } + //장바구니 기능 추가(2010.04.13) [END] + + $request_parentemail = isset($this->m_REQUEST["parentemail"]) ? $this->m_REQUEST["parentemail"] : ''; + $request_recvname = isset($this->m_REQUEST["recvname"]) ? $this->m_REQUEST["recvname"] : ''; + $request_recvtel = isset($this->m_REQUEST["recvtel"]) ? $this->m_REQUEST["recvtel"] : ''; + $request_recvmsg = isset($this->m_REQUEST["recvmsg"]) ? $this->m_REQUEST["recvmsg"] : ''; + $request_recvaddr = isset($this->m_REQUEST["recvaddr"]) ? $this->m_REQUEST["recvaddr"] : ''; + $request_recvpostnum = isset($this->m_REQUEST["recvpostnum"]) ? $this->m_REQUEST["recvpostnum"] : ''; + $request_joincard = isset($this->m_REQUEST["joincard"]) ? $this->m_REQUEST["joincard"] : ''; + $request_joinexpire = isset($this->m_REQUEST["joinexpire"]) ? $this->m_REQUEST["joinexpire"] : ''; + $request_mailorder = isset($this->m_REQUEST["mailorder"]) ? $this->m_REQUEST["mailorder"] : ''; + + $this->AddUserDefinedEntity(GOODSINFO, GOODS, $xml, $GS); + //BuyerInfo + $BI = $xml->add_node($root, BUYERINFO); + $BP = $xml->add_node($BI, TX_BUYERNAME, $this->m_REQUEST["buyername"], array("urlencode" => "1")); + $BP = $xml->add_node($BI, TX_BUYERTEL, $this->m_REQUEST["buyertel"]); + $BP = $xml->add_node($BI, TX_BUYEREMAIL, $this->m_REQUEST["buyeremail"], array("urlencode" => "1")); + $BP = $xml->add_node($BI, TX_PARENTEMAIL, $request_parentemail, array("urlencode" => "1")); + $BP = $xml->add_node($BI, TX_RECVNAME, $request_recvname, array("urlencode" => "1")); + $BP = $xml->add_node($BI, TX_RECVTEL, $request_recvtel, array("urlencode" => "1")); + $BP = $xml->add_node($BI, TX_RECVMSG, $request_recvmsg, array("urlencode" => "1")); + $BP = $xml->add_node($BI, TX_RECVADDR, $request_recvaddr, array("urlencode" => "1")); + $BP = $xml->add_node($BI, TX_RECVPOSTNUM, $request_recvpostnum, array("urlencode" => "1")); + $this->AddUserDefinedEntity(BUYERINFO, "", $xml, $BI); + //PaymentInfo + $PI = $xml->add_node($root, PAYMENTINFO); + $PM = $xml->add_node($PI, PAYMENT); + $PD = $xml->add_node($PM, TX_PAYMETHOD, $this->m_REQUEST["paymethod"]); + $PD = $xml->add_node($PM, TX_JOINCARD, $request_joincard); + $PD = $xml->add_node($PM, TX_JOINEXPIRE, $request_joinexpire); + $PD = $xml->add_node($PM, TX_MAILORDER, $request_mailorder); + if ($this->m_Type == TYPE_SECUREPAY) { + $PD = $xml->add_node($PM, TX_SESSIONKEY, $this->m_REQUEST["sessionkey"]); + $PD = $xml->add_node($PM, TX_ENCRYPTED, $this->m_REQUEST["encrypted"], array("urlencode" => "1")); + } + if ($this->m_Type == TYPE_RECEIPT) { + $PD = $xml->add_node($PM, TX_SESSIONKEY, $this->m_sSessionKey); + $PD = $xml->add_node($PM, TX_ENCRYPTED, $this->m_sEncrypted); + } + $this->AddUserDefinedEntity(PAYMENTINFO, PAYMENT, $xml, $PM); + } else if ($this->m_Type == TYPE_CANCEL) { + //CancelInfo + $CI = $xml->add_node($root, CANCELINFO); + $CD = $xml->add_node($CI, TX_SESSIONKEY, $this->m_sSessionKey); + $CD = $xml->add_node($CI, TX_ENCRYPTED, $this->m_sEncrypted); + } + //가상계좌 부분환불추가 + else if (( $this->m_Type == TYPE_REPAY ) || ( $this->m_Type == TYPE_VACCTREPAY )) { + //PartCancelInfo + $CI = $xml->add_node($root, PARTCANCELINFO); + $CD = $xml->add_node($CI, TX_SESSIONKEY, $this->m_sSessionKey); + $CD = $xml->add_node($CI, TX_ENCRYPTED, $this->m_sEncrypted); + if ($this->m_Type == TYPE_REPAY) { + $CIG = $xml->add_node($root, GOODSINFO); + $CDG = $xml->add_node($CIG, TX_PRTC_TAX, $this->m_REQUEST["tax"]); + $CDG = $xml->add_node($CIG, TX_PRTC_TAXFREE, $this->m_REQUEST["taxfree"]); + $CDG = $xml->add_node($CIG, TX_PRTC_CURRENCY, $this->m_REQUEST["currency"]); + } + } else if ($this->m_Type == TYPE_CAPTURE) { + //CaptureInfo + $CI = $xml->add_node($root, CAPTUREINFO); + $CD = $xml->add_node($CI, TX_SESSIONKEY, $this->m_sSessionKey); + $CD = $xml->add_node($CI, TX_ENCRYPTED, $this->m_sEncrypted); + } else if ($this->m_Type == TYPE_ESCROW) { + //EscrowInfo + $CI = $xml->add_node($root, ESCROWINFO); + if ($this->m_EscrowType == TYPE_ESCROW_DLV || $this->m_EscrowType == TYPE_ESCROW_DNY_CNF) { + $CD = $xml->add_node($CI, TX_SESSIONKEY, $this->m_sSessionKey); + $CD = $xml->add_node($CI, TX_ENCRYPTED, $this->m_sEncrypted); + } else if ($this->m_EscrowType == TYPE_ESCROW_CNF || $this->m_EscrowType == TYPE_ESCROW_DNY) { + $CD = $xml->add_node($CI, TX_SESSIONKEY, $this->m_REQUEST["sessionkey"]); + $CD = $xml->add_node($CI, TX_ENCRYPTED, $this->m_REQUEST["encrypted"], array("urlencode" => "1")); + } + } else if ($this->m_Type == TYPE_REFUND) { + //CancelInfo + $CI = $xml->add_node($root, CANCELINFO); + $CD = $xml->add_node($CI, TX_SESSIONKEY, $this->m_sSessionKey); + $CD = $xml->add_node($CI, TX_ENCRYPTED, $this->m_sEncrypted); + } else if ($this->m_Type == TYPE_INQUIRY) { + //CancelInfo + $CI = $xml->add_node($root, INQUIRYINFO); + $CD = $xml->add_node($CI, TX_SESSIONKEY, $this->m_sSessionKey); + $CD = $xml->add_node($CI, TX_ENCRYPTED, $this->m_sEncrypted); + } else if ($this->m_Type == TYPE_OPENSUB) { + //GoodsInfo + //장바구니 기능 추가(2010.04.13) + //==goodscnt가 없을 경우(장바구니 기능이 아닐경우) 기본 값 1로 설정 + $tSubCnt = ($this->m_REQUEST["subcnt"] != null && (int) $this->m_REQUEST["subcnt"] > 0 ) ? $this->m_REQUEST["subcnt"] : 1; + + $OI = $xml->add_node($root, OPENSUBINFO); + + $OD = $xml->add_node($OI, TX_SESSIONKEY, $this->m_sSessionKey); + $OD = $xml->add_node($OI, TX_ENCRYPTED, $this->m_sEncrypted); + + $OD = $xml->add_node($OI, TX_OPENREG_SUBCNT, $tSubCnt); + + $iSubCnt = 1; + while ($iSubCnt <= $tSubCnt) { + $SG = $xml->add_node($OI, TX_OPENREG_SUBGOODS, "", array("no" => $iSubCnt)); + + $SD = $xml->add_node($SG, TX_OPENREG_SUBCOMPNO, $this->m_REQUEST["subcompno_" . $iSubCnt]); + $SD = $xml->add_node($SG, TX_OPENREG_SUBCOMPNM, $this->m_REQUEST["subcompnm_" . $iSubCnt], array("urlencode" => "1")); + $SD = $xml->add_node($SG, TX_OPENREG_SUBPRSUPPLY, $this->m_REQUEST["subprsupply_" . $iSubCnt]); + $SD = $xml->add_node($SG, TX_OPENREG_SUBPRFREE, $this->m_REQUEST["subprfree_" . $iSubCnt]); + $SD = $xml->add_node($SG, TX_OPENREG_SUBPRTAX, $this->m_REQUEST["subprtax_" . $iSubCnt]); + $SD = $xml->add_node($SG, TX_OPENREG_SUBPRSERVICE, $this->m_REQUEST["subprservice_" . $iSubCnt]); + $SD = $xml->add_node($SG, TX_OPENREG_SUBPRICE, $this->m_REQUEST["subprice_" . $iSubCnt]); + + $iSubCnt++; + } + //장바구니 기능 추가(2010.04.13) [END] + $this->AddUserDefinedEntity(OPENSUBINFO, "", $xml, $OI); + } + + $node_mreserved1 = isset($this->m_REQUEST["mreserved1"]) ? $this->m_REQUEST["mreserved1"] : ''; + $node_mreserved2 = isset($this->m_REQUEST["mreserved2"]) ? $this->m_REQUEST["mreserved2"] : ''; + $node_mreserved3 = isset($this->m_REQUEST["mreserved3"]) ? $this->m_REQUEST["mreserved3"] : ''; + $node_language = isset($this->m_REQUEST["language"]) ? $this->m_REQUEST["language"] : ''; + $node_url = isset($this->m_REQUEST["url"]) ? $this->m_REQUEST["url"] : ''; + $node_id_customer = isset($this->m_REQUEST["id_customer"]) ? $this->m_REQUEST["id_customer"] : ''; + $node_id_regnum = isset($this->m_REQUEST["id_regnum"]) ? $this->m_REQUEST["id_regnum"] : ''; + + //ReservedInfo + $RI = $xml->add_node($root, RESERVEDINFO); + $RD = $xml->add_node($RI, TX_MRESERVED1, $node_mreserved1); + $RD = $xml->add_node($RI, TX_MRESERVED2, $node_mreserved2); + $RD = $xml->add_node($RI, TX_MRESERVED3, $node_mreserved3); + $this->AddUserDefinedEntity(RESERVEDINFO, "", $xml, $RI); + + //ManageInfo + $MI = $xml->add_node($root, MANAGEINFO); + $MD = $xml->add_node($MI, TX_LANGUAGE, $node_language); + $MD = $xml->add_node($MI, TX_URL, $node_url, array("urlencode" => "1")); + $MD = $xml->add_node($MI, TX_TXVERSION, $this->m_TXVersion); + //delete UIP(2009.01.21) + //$MD = $xml->add_node($MI, TX_TXUSERIP, $this->m_REQUEST["uip"] ); + $MD = $xml->add_node($MI, TX_TXUSERID, $node_id_customer, array("urlencode" => "1")); + $MD = $xml->add_node($MI, TX_TXREGNUM, $node_id_regnum); + + //Ack, rn + if ($this->m_Type == TYPE_SECUREPAY || $this->m_Type == TYPE_OCBSAVE || + $this->m_Type == TYPE_FORMPAY || $this->m_Type == TYPE_RECEIPT + ) { + $MD = $xml->add_node($MI, TX_ACK, "1"); + if (isset($this->m_REQUEST["rn"]) && $this->m_REQUEST["rn"]) + $MD = $xml->add_node($MI, TX_RN, $this->m_REQUEST["rn"]); + } + $this->AddUserDefinedEntity(MANAGEINFO, "", $xml, $MI); + + $this->m_sBody = $xml->make_xml(); + + return true; + } + + function ParseHead($head) { + $iLen = BODY_LEN + TAIL_LEN; + if (strlen($head) != MSGHEADER_LEN) + return RESULT_MSG_FORMAT_ERR; + + $this->m_FlgCrypto = substr($head, $iLen, FLGCRYPTO_LEN); + $iLen += FLGCRYPTO_LEN; + $this->m_FlgSign = substr($head, $iLen, FLGSIGN_LEN); + $iLen += FLGSIGN_LEN; + $this->m_MPubSN = substr($head, $iLen, MPUBSN_LEN); + $iLen += MPUBSN_LEN; + $this->m_PIPGPubSN = substr($head, $iLen, PIPGPUBSN_LEN); + $iLen += PIPGPUBSN_LEN; + $this->m_TXPGPubSN = substr($head, $iLen, TXPGPUBSN_LEN); + $iLen += TXPGPUBSN_LEN; + $this->m_Cmd = substr($head, $iLen, CMD_LEN); + $iLen += CMD_LEN; + $this->m_RESULT[NM_MID] = substr($head, $iLen, MID_LEN); + $iLen += MID_LEN; + $this->m_RESULT[NM_TOTPRICE] = substr($head, $iLen, TOTPRICE_LEN); + $iLen += TOTPRICE_LEN; + $this->m_RESULT[NM_TID] = substr($head, $iLen, TID_LEN); + + return OK; + } + + function ParseBody($body, &$encrypted, &$sessionkey) { + $xml = new XML(); + if (($rtv = $xml->load_xml("", $body)) != OK) + return $rtv; + + $this->m_Xml = $xml->xml_node; + + //GOODSINFO + $this->m_RESULT[NM_MOID] = $this->GetXMLData('MOID'); + + //PAYMENTINFO + //기타지불수단이 paymethod를 주지 않아 임시로 요청 Paymethod로 대체 + //PG에서 주는 PayMethod와 요청Paymethod는 같다! + $this->m_RESULT[NM_PAYMETHOD] = $this->m_sPayMethod; + + $ResultCode = $this->GetXMLData("ResultCode"); + + //if( substr($ResultCode,2, 4) == "0000" ) + if (strcmp(substr($ResultCode, 2, 4), "0000") == 0) { + $this->m_RESULT[NM_RESULTCODE] = "00"; + $this->m_RESULT[NM_RESULTMSG] = $this->GetXMLData("ResultMsg"); + } else { + $this->m_RESULT[NM_RESULTCODE] = "01"; + $this->m_RESULT['NM_ERRORCODE'] = $ResultCode; + $this->m_RESULT[NM_RESULTMSG] = "[" . $ResultCode . "|" . $this->GetXMLData("ResultMsg") . "]"; + } + $encrypted = $this->GetXMLData("Encrypted"); + $sessionkey = $this->GetXMLData("SessionKey"); + return OK; + } + + function ParseDecrypt($decrypted) { + $xml = new XML(); + if (($rtv = $xml->load_xml("", $decrypted)) != OK) + return $rtv; + + $this->m_Xml = array_merge($this->m_Xml, $xml->xml_node); + + if ($this->m_Type == TYPE_SECUREPAY || $this->m_Type == TYPE_RECEIPT) { + //승인날짜(ApplDate), 승인시간(ApplTime), 승인번호(ApplNum)는 공통!!(OCB, 현금영수증 제외) + //ISP, CARD는 CARD로 assign. 고객/상점은 ISP가 뭔지, CARD가 뭔지 알게 뭐야!!!-_- + if ($this->m_sPayMethod == NM_TX_CARD) { + $this->m_RESULT[APPLDATE] = $this->GetXMLData(CARD_APPLDATE); + $this->m_RESULT[APPLTIME] = $this->GetXMLData(CARD_APPLTIME); + $this->m_RESULT[APPLNUM] = $this->GetXMLData(CARD_APPLNUM); + $this->m_RESULT[CARD_NUM] = $this->GetXMLData(CARD_NUM); + $this->m_RESULT[CARD_EXPIRE] = $this->GetXMLData(CARD_EXPIRE); + $this->m_RESULT[CARD_BANKCODE] = $this->GetXMLData(CARD_BANKCODE); + $this->m_RESULT[CARD_CODE] = $this->GetXMLData(CARD_CODE); + $this->m_RESULT[CARD_APPLPRICE] = $this->GetXMLData(CARD_APPLPRICE); + $this->m_RESULT[CARD_QUOTA] = $this->GetXMLData(CARD_QUOTA); + $this->m_RESULT[CARD_INTEREST] = $this->GetXMLData(CARD_INTEREST); + $this->m_RESULT[CARD_POINT] = $this->GetXMLData(CARD_POINT); + $this->m_RESULT[CARD_AUTHTYPE] = $this->GetXMLData(CARD_AUTHTYPE); + $this->m_RESULT[CARD_REGNUM] = $this->GetXMLData(CARD_REGNUM); + $this->m_RESULT[CARD_TERMINALNUM] = $this->GetXMLData(CARD_TERMINALNUM); + $this->m_RESULT[CARD_MEMBERNUM] = $this->GetXMLData(CARD_MEMBERNUM); + $this->m_RESULT[CARD_PURCHASECODE] = $this->GetXMLData(CARD_PURCHASECODE); + } else if ($this->m_sPayMethod == NM_TX_ISP) { + $this->m_RESULT[APPLDATE] = $this->GetXMLData(ISP_APPLDATE); + $this->m_RESULT[APPLTIME] = $this->GetXMLData(ISP_APPLTIME); + $this->m_RESULT[APPLNUM] = $this->GetXMLData(ISP_APPLNUM); + $this->m_RESULT[CARD_NUM] = $this->GetXMLData(ISP_CARDNUM); + $this->m_RESULT[CARD_EXPIRE] = $this->GetXMLData(ISP_EXPIRE); + $this->m_RESULT[CARD_BANKCODE] = $this->GetXMLData(ISP_BANKCODE); + $this->m_RESULT[CARD_CODE] = $this->GetXMLData(ISP_CARDCODE); + $this->m_RESULT[CARD_APPLPRICE] = $this->GetXMLData(ISP_APPLPRICE); + $this->m_RESULT[CARD_QUOTA] = $this->GetXMLData(ISP_QUOTA); + $this->m_RESULT[CARD_INTEREST] = $this->GetXMLData(ISP_INTEREST); + $this->m_RESULT[CARD_POINT] = $this->GetXMLData(ISP_POINT); + $this->m_RESULT[CARD_TERMINALNUM] = $this->GetXMLData(ISP_TERMINALNUM); + $this->m_RESULT[CARD_MEMBERNUM] = $this->GetXMLData(ISP_MEMBERNUM); + $this->m_RESULT[CARD_PURCHASECODE] = $this->GetXMLData(ISP_PURCHASECODE); + } else if ($this->m_sPayMethod == NM_TX_CSHR) { + $this->m_RESULT[APPLDATE] = $this->GetXMLData(CSHR_APPLDATE); + $this->m_RESULT[APPLTIME] = $this->GetXMLData(CSHR_APPLTIME); + $this->m_RESULT[APPLNUM] = $this->GetXMLData(CSHR_APPLNUM); + } else if ($this->m_sPayMethod == NM_TX_ACCT) { + $this->m_RESULT[APPLDATE] = $this->GetXMLData(ACCT_APPLDATE); + $this->m_RESULT[APPLTIME] = $this->GetXMLData(ACCT_APPLTIME); + $this->m_RESULT[APPLNUM] = $this->GetXMLData(ACCT_APPLNUM); + } else if ($this->m_sPayMethod == NM_TX_HPP) { + $this->m_RESULT[APPLDATE] = $this->GetXMLData(HPP_APPLDATE); + $this->m_RESULT[APPLTIME] = $this->GetXMLData(HPP_APPLTIME); + $this->m_RESULT[APPLNUM] = $this->GetXMLData(HPP_APPLNUM); + } else if ($this->m_sPayMethod == NM_TX_VACT) { + $this->m_RESULT[APPLDATE] = $this->GetXMLData(VACT_APPLDATE); + $this->m_RESULT[APPLTIME] = $this->GetXMLData(VACT_APPLTIME); + } else if ($this->m_sPayMethod == NM_TX_ARSB) { + $this->m_RESULT[APPLDATE] = $this->GetXMLData(ARSB_APPLDATE); + $this->m_RESULT[APPLTIME] = $this->GetXMLData(ARSB_APPLTIME); + $this->m_RESULT[APPLNUM] = $this->GetXMLData(ARSB_APPLNUM); + } else if ($this->m_sPayMethod == NM_TX_PHNB) { + $this->m_RESULT[APPLDATE] = $this->GetXMLData(PHNB_APPLDATE); + $this->m_RESULT[APPLTIME] = $this->GetXMLData(PHNB_APPLTIME); + $this->m_RESULT[APPLNUM] = $this->GetXMLData(PHNB_APPLNUM); + } else if ($this->m_sPayMethod == NM_TX_CULT) { + $this->m_RESULT[APPLDATE] = $this->GetXMLData(CULT_APPLDATE); + $this->m_RESULT[APPLTIME] = $this->GetXMLData(CULT_APPLTIME); + $this->m_RESULT[APPLNUM] = $this->GetXMLData(CULT_APPLNUM); + } else if ($this->m_sPayMethod == NM_TX_GAMG) { + $this->m_RESULT[APPLDATE] = $this->GetXMLData(GAMG_APPLDATE); + $this->m_RESULT[APPLTIME] = $this->GetXMLData(GAMG_APPLTIME); + $this->m_RESULT[APPLNUM] = $this->GetXMLData(GAMG_APPLNUM); + $this->m_RESULT[GAMG_CNT] = $this->GetXMLData(GAMG_CNT); + //게임문화상품권은 Multi결제 가능 + MakePathGAMG($this->m_RESULT[GAMG_CNT]); + for ($i = 1; $i <= $this->m_RESULT[GAMG_CNT]; $i++) { + $this->m_RESULT[constant("GAMG_NUM$i")] = $this->GetXMLData(constant("GAMG_NUM$i")); + $this->m_RESULT[constant("GAMG_REMAINS$i")] = $this->GetXMLData(constant("GAMG_REMAINS$i")); + $this->m_RESULT[constant("GAMG_ERRMSG$i")] = $this->GetXMLData(constant("GAMG_ERRMSG$i")); + } + $this->m_RESULT[GAMG_APPLPRICE] = $this->GetXMLData(GAMG_APPLPRICE); + $this->m_RESULT[GAMG_NUM] = $this->GetXMLData(GAMG_NUM); + $this->m_RESULT[GAMG_RESULTCODE] = $this->GetXMLData(GAMG_RESULTCODE); + $this->m_RESULT[GAMG_RESULTMSG] = $this->GetXMLData(GAMG_RESULTMSG); + } else if ($this->m_sPayMethod == NM_TX_EDUG) { + $this->m_RESULT[APPLDATE] = $this->GetXMLData(EDUG_APPLDATE); + $this->m_RESULT[APPLTIME] = $this->GetXMLData(EDUG_APPLTIME); + $this->m_RESULT[APPLNUM] = $this->GetXMLData(EDUG_APPLNUM); + } else if ($this->m_sPayMethod == NM_TX_TEEN) { + $this->m_RESULT[APPLDATE] = $this->GetXMLData(TEEN_APPLDATE); + $this->m_RESULT[APPLTIME] = $this->GetXMLData(TEEN_APPLTIME); + $this->m_RESULT[APPLNUM] = $this->GetXMLData(TEEN_APPLNUM); + } + } else if ($this->m_Type == TYPE_INQUIRY) { + $this->m_RESULT[INQR_TID] = $this->GetXMLData(INQR_TID); + $this->m_RESULT[INQR_PRICE] = $this->GetXMLData(INQR_Price); + $this->m_RESULT[INQR_STATUS] = $this->GetXMLData(INQR_Status); + } + + return OK; + } + + function GTHR($err_code, $err_msg) { + //Set + $data["mid"] = $this->m_REQUEST["mid"]; + $data["paymethod"] = isset($this->m_REQUEST["paymethod"]) ? $this->m_REQUEST["paymethod"] : ''; + //delete UIP(2009.01.21) + //$data["user_ip"] = $this->m_REQUEST["uip"]; + $data["tx_version"] = $this->m_TXVersion; + $data["err_code"] = $err_code; + $data["err_msg"] = $err_msg; + + // add tid / type (2014-12-09 by jungc) + $data["tid"] = $this->m_sTID; + $data["type"] = $this->m_Type; + + //Send + $qs = "ctype=TX&"; + foreach ($data as $key => $val) + $qs .= $key . '=' . urlencode($val) . '&'; + + $fp = fsockopen(G_SERVER, G_PORT, $errno, $errstr, G_TIMEOUT_CONNECT); + if ($fp) { + $out = "GET " . G_CGI . "?" . $qs . " HTTP/1.0\r\n"; + $out .= "Host: " . G_SERVER . "\r\n"; + $out .= "Connection: Close\r\n\r\n"; + fwrite($fp, $out); + fclose($fp); + } + } + + function ParsePIEncrypted() { + $output = array(); + if( isset($this->m_REQUEST["encrypted"]) ) { + parse_str($this->m_REQUEST["encrypted"], $output); + } + $this->m_PIPGPubSN = isset($output['CertVer']) ? $output['CertVer'] : ''; + $this->m_PG1 = isset($output['pg1']) ? $output['pg1'] : ''; + $this->m_PG2 = isset($output['pg2']) ? $output['pg2'] : ''; + $this->m_PG1IP = isset($output['pg1ip']) ? $output['pg1ip'] : ''; + $this->m_PG2IP = isset($output['pg2ip']) ? $output['pg2ip'] : ''; + } + + // Xpath로 안가져온다. 한달을 헛지랄 했다!! + // added by ddaemiri, 2007.09.03 + function GetXMLData($node) { + $content = isset($this->m_Xml[$node . "[1]"]["text"]) ? $this->m_Xml[$node . "[1]"]["text"] : ''; + if (isset($this->m_Xml[$node . "[1]"]["attr"]["urlencode"]) && $this->m_Xml[$node . "[1]"]["attr"]["urlencode"] == "1") + $content = urldecode($content); + + return $content; + } + +} + +/* ----------------------------------------------------- */ +/* Crypto Class */ +/* PHP4.2 & OpenSSL 필요) */ +/* ----------------------------------------------------- */ + +class INICrypto { + + var $homedir; + var $mid; + var $admin; + var $pgpubkeyid = NULL; + var $mprivkeyid = NULL; + var $mkey; + var $encMethod = "mcrypt"; + + function __construct($request) { + $this->homedir = $request["inipayhome"]; + $this->mid = $request["mid"]; + $this->admin = $request["admin"]; + $this->mkey = isset($request["mkey"]) ? $request["mkey"] : ''; + if(isset($request['encMethod']) && !empty($request['encMethod'])){ + $this->encMethod = strtolower($request['encMethod']); + } + } + + function LoadPGPubKey(&$pg_pubcert_SN) { + $fp = fopen($this->homedir . "/key/pgcert.pem", "r"); + if (!$fp) + return NULL_PGCERT_FP_ERR; + $pub_key = fread($fp, 8192); + if (!$pub_key) { + fclose($fp); + return NULL_PGCERT_FP_ERR; + } + fclose($fp); + + $this->pgpubkeyid = openssl_get_publickey($pub_key); + if (!$this->pgpubkeyid) + return NULL_PGCERT_ERR; + + $pg_pubcert = openssl_x509_parse($pub_key); + if (!$pg_pubcert) + return NULL_X509_ERR; //The structure of the returned data is (deliberately) not yet documented + $pg_pubcert_SN = $pg_pubcert["serialNumber"]; + + return OK; + } + + function UpdatePGPubKey($pgpubkey) { + $f_org = $this->homedir . "/key/pgcert.pem"; + $f_new = $this->homedir . "/key/.pgcert.pem.tmp"; + $fp = fopen($f_new, "w"); + if (!$fp) + return PGPUB_UPDATE_ERR; + fwrite($fp, $pgpubkey); + fclose($fp); + + //rename + if (!rename($f_new, $f_org)) + return PGPUB_UPDATE_ERR; + return OK; + } + + function LoadMPubKey(&$m_pubcert_SN) { + if ($this->mkey == "1") + $fp = fopen($this->homedir . "/key/mkey/mcert.pem", "r"); + else + $fp = fopen($this->homedir . "/key/" . $this->mid . "/mcert.pem", "r"); + if (!$fp) + return NULL_MCERT_FP_ERR; + $pub_key = fread($fp, 8192); + if (!$pub_key) { + fclose($fp); + return NULL_MCERT_FP_ERR; + } + fclose($fp); + + $m_pubcert = openssl_x509_parse($pub_key); + if (!$m_pubcert) + return NULL_X509_ERR; //The structure of the returned data is (deliberately) not yet documented + $m_pubcert_SN = $m_pubcert["serialNumber"]; + + return OK; + } + + function LoadMPrivKey() { + /* + //get keypw + $fp=fopen( $this->homedir . "/key/" . $this->mid . "/keypass.enc", "r"); + if( !$fp ) return GET_KEYPW_FILE_OPEN_ERR; + $enckey=fread($fp, 8192); + if( !$enckey ) return GET_KEYPW_FILE_OPEN_ERR; + fclose($fp); + if( !$this->SymmDecrypt( base64_decode($enckey), &$keypwd, $this->admin, IV ) ) + return GET_KEYPW_DECRYPT_FINAL_ERR; + */ + $keypwd = $this->admin; + + //load mpriv key + if ($this->mkey == "1") + $fp = fopen($this->homedir . "/key/mkey/mpriv.pem", "r"); + else + $fp = fopen($this->homedir . "/key/" . $this->mid . "/mpriv.pem", "r"); + if (!$fp) + return PRIVKEY_FILE_OPEN_ERR; + $priv_key = fread($fp, 8192); + if (!$priv_key) { + fclose($fp); + return PRIVKEY_FILE_OPEN_ERR; + } + fclose($fp); + $this->mprivkeyid = openssl_get_privatekey($priv_key, $keypwd); + if (!$this->mprivkeyid) + //return INVALID_KEYPASS_ERR; + return GET_KEYPW_DECRYPT_FINAL_ERR; + return OK; + } + + function Sign($body, &$sign) { + if (!openssl_sign($body, $sign, $this->mprivkeyid)) //default:SHA1 + return SIGN_FINAL_ERR; + $sign = Base64Encode($sign); + return OK; + } + + function Verify($body, $tail) { + $rtv = openssl_verify($body, base64_decode($tail), $this->pgpubkeyid); + if (!$rtv) + return SIGN_CHECK_ERR; + return OK; + } + + function Decrypt($sessionkey, $encrypted, &$decrypted) { + $dec_sesskey = base64_decode($sessionkey); + $src = substr($dec_sesskey, 0, strlen($dec_sesskey) - MAX_IV_LEN); + if (!$this->RSAMPrivDecrypt($src, $key)) + return DEC_RSA_ERR; + $iv = substr($dec_sesskey, strlen($dec_sesskey) - MAX_IV_LEN, MAX_IV_LEN); + if (!$this->SymmDecrypt(base64_decode($encrypted), $decrypted, $key, $iv)) + return DEC_FINAL_ERR; + return OK; + } + + function SymmEncrypt($src_data, &$enc_data, $key, $iv) { + if($this->encMethod == "openssl"){ //php version >= 5.3 + $enc_data = openssl_encrypt($src_data, "DES-EDE3-CBC", $key, OPENSSL_RAW_DATA, $iv); + } else { + $size = mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC); + $src_data = $this->pkcs5_pad($src_data, $size); + $cipher = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); + mcrypt_generic_init($cipher, $key, $iv); + $enc_data = mcrypt_generic($cipher, $src_data); + mcrypt_generic_deinit($cipher); + mcrypt_module_close($cipher); + } + + if (!$enc_data) + return ENC_FINAL_ERR; + $enc_data = Base64Encode($enc_data); + + return OK; + } + + function SymmDecrypt($enc_data, &$dec_data, $key, $iv) { + if($this->encMethod == "openssl"){ + $dec_data = openssl_decrypt($enc_data, "DES-EDE3-CBC", $key, OPENSSL_RAW_DATA, $iv); + } else { + $cipher = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); + mcrypt_generic_init($cipher, $key, $iv); + $dec_data = mdecrypt_generic($cipher, $enc_data); + mcrypt_generic_deinit($cipher); + mcrypt_module_close($cipher); + } + + if (!$dec_data) + return false; + $dec_data = $this->remove_ctrl($dec_data); + return true; + } + + function RSAMPrivDecrypt($enc_data, &$dec_data) { + return openssl_private_decrypt($enc_data, $dec_data, $this->mprivkeyid); + } + + function RSAMPrivEncrypt($org_data, &$enc_data) { + if (!openssl_private_encrypt($org_data, $enc_data, $this->mprivkeyid)) + return false; + $enc_data = Base64Encode($enc_data); + return true; + } + + function RSAPGPubEncrypt($org_data, &$enc_data) { + return openssl_public_encrypt($org_data, $enc_data, $this->pgpubkeyid); + } + + function FreePubKey() { + if ($this->pgpubkeyid) + openssl_free_key($this->pgpubkeyid); + } + + function FreePrivKey() { + if ($this->mprivkeyid) + openssl_free_key($this->mprivkeyid); + } + + function FreeAllKey() { + $this->FreePubKey(); + $this->FreePrivKey(); + } + + function remove_ctrl($string) { + for ($i = 0; $i < strlen($string); $i++) { + $chr = $string[$i]; + $ord = ord($chr); + if ($ord < 10) + $string[$i] = " "; + else + $string[$i] = $chr; + } + return trim($string); + } + + function pkcs5_pad($text, $blocksize) { + $pad = $blocksize - (strlen($text) % $blocksize); + return $text . str_repeat(chr($pad), $pad); + } + + function pkcs5_unpad($text) { + $pad = ord($text[strlen($text) - 1]); + if ($pad > strlen($text)) + return false; + if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) + return false; + return substr($text, 0, -1 * $pad); + } + + function MakeIMStr($pt, $key) { + if (get_magic_quotes_gpc()) { + $key = stripslashes($key); + $pt = stripslashes($pt); + } + return substr(chunk_split(base64_encode($this->IMstr($key, $pt)), 64, "\n"), 0, -1); + } + + function IMstr($pwd, $data) { + $key[] = ''; + $box[] = ''; + $cipher = ''; + + $pwd_length = strlen($pwd); + $data_length = strlen($data); + + for ($i = 0; $i < 256; $i++) { + $key[$i] = ord($pwd[$i % $pwd_length]); + $box[$i] = $i; + } + for ($j = $i = 0; $i < 256; $i++) { + $j = ($j + $box[$i] + $key[$i]) % 256; + $tmp = $box[$i]; + $box[$i] = $box[$j]; + $box[$j] = $tmp; + } + for ($a = $j = $i = 0; $i < $data_length; $i++) { + $a = ($a + 1) % 256; + $j = ($j + $box[$a]) % 256; + $tmp = $box[$a]; + $box[$a] = $box[$j]; + $box[$j] = $tmp; + $k = $box[(($box[$a] + $box[$j]) % 256)]; + $cipher .= chr(ord($data[$i]) ^ $k); + } + return $cipher; + } + +} \ No newline at end of file diff --git a/shop/inicis/libs/INIDFN.php b/shop/inicis/libs/INIDFN.php new file mode 100644 index 000000000..98f36d5e1 --- /dev/null +++ b/shop/inicis/libs/INIDFN.php @@ -0,0 +1,673 @@ +5001은 망취소시 서버측에서 서명오류가 남,그래도 망취소처리는 됨) + * @date 2008.03.12 + * @buildno 5016 + * @note pg1ip, pg2ip 추가/취소 원거래없음시 drpg로 재시도 + * @date 2008.04.02 + * @buildno 5017 + * @note 1)chkfake시 파라미터 로깅 삭제(중복) + * 2)call-time pass-by-reference => pass-by-value로 수정 + * @date 2009.01.12 + * @buildno 5019 + * @note delete UIP + * @date 2009.01.21 + * @note add mkey/mergelog ( for Makeshop ) + * @date 2009.02.24 + * @note 1)define MKEY deprecated 2009.02.19 ( Makeshop 초기 한번나감. 서비스되고 있는지는 모름) + * 2)Makeshop PG Updrade용으로 새로나감 2009.02.19 (interface에서 mkey값을 받아 처리하게 변경) + * 3)Makeshop PG Updrade용으로 새로나감 2009.02.24 (interface에서 mergelog값을 받아 처리하게 변경) + * @date 2009.05.07 + * @note add BUILDDATE in TXVersion + * @date 2009.08.05 + * @buildno 5030 + * @note add vacct refund + * @date 2009.12.16 + * @buildno 5030 + * @note add recv info + * @date 2010.07.14 + * @note add Tax, TaxFree info(TX_TAX, TX_TAXFREE) + * @date 2010.09.09 + * @note 취소요청시 PG 설정 변경(도메인->IP, INILib.php) + * @note BUILDDATE update(100414 -> 100909) + * @note 2011.05.23 5030 XML ELEMENT 중 ROOT 를 ROOTINFO로 수정 + * @buildno 5032 + * @note 2012.07.09 거래조회 추가 (TYPE_INQUIRY) + * @note 2012.07.09 PHP ini 파일 error display setting 추가 + * @buildno 5036 + * @note 2014.12.09 add gather parameter tid, type + * @note 20151113 주문번호 거래조회 추가 + */ +ini_set('error_reporting', E_ALL ^ E_NOTICE); +ini_set('display_errors', 'Off'); + +/* GLOBAL */ +define("PROGRAM", "INIPHP"); +define("LANG", "PHP"); +define("VERSION", "NV5053"); +define("BUILDDATE", "20190404"); +if( ! defined('TID_LEN')) define("TID_LEN", 40); +define("MAX_KEY_LEN", 24); +define("MAX_IV_LEN", 8); + +/* TIMEOUT */ +define("TIMEOUT_CONNECT", 5); +define("TIMEOUT_WRITE", 2); +define("TIMEOUT_READ", 20); +define("G_TIMEOUT_CONNECT", 2); +define("DNS_LOOKUP_TIMEOUT", 5); + +/* LOG LEVEL */ +define("CRITICAL", 1); +define("ERROR", 2); +define("NOTICE", 3); +define("INFO", 5); +define("DEBUG", 7); + +/* SERVER INFO */ +define("PG_HOST", "formpg.inicis.com"); +define("PG_IP", "203.238.37.3"); +define("KSPG_IP", "39.115.212.10"); +define("PG_PORT", 34049); +define("G_SERVER", "gthr.inicis.com"); +define("G_CGI", "/cgi-bin/g.cgi"); +define("G_PORT", 80); + + +define("OK", "0"); + +define("IV", "Initiative Tech"); +define("IMHK", "SFBQSU5JTkZPUk1BVElPTg=="); +define("IMHV", "SU5JQ0lTIENJUEhFUi4uLg=="); +define("IMJK", "UkVHSVNUX05PX1JDNEtFWQ=="); +define("IMJV", "UkVHSVNUX05PX1JDNElW"); + +//define for mkey +//deprecated 2009.02.19 ( Makeshop 초기 한번나감. 서비스되고 있는지는 모름) +//Makeshop PG Updrade용으로 새로나감 2009.02.19 (interface에서 mkey값을 받아 처리하게 변경) +//define("MKEY", 1); +//non block connect immediate return check code/str +define("ERRSTR_INPROGRESS", "Operation now in progress"); +define("ERRCODE_INPROGRESS_LINUX", 115); +define("ERRCODE_INPROGRESS_FREEBSD", 36); +define("ERRCODE_INPROGRESS_WIN", 10035); + +//------------------------------------------------------ +// IFD Header +//------------------------------------------------------ +define("MSGHEADER_LEN", 150); +define("BODY_LEN", 5); +define("TAIL_LEN", 5); +define("FLGCRYPTO_LEN", 1); +define("FLGSIGN_LEN", 5); +define("MPUBSN_LEN", 20); +define("PIPGPUBSN_LEN", 20); +define("TXPGPUBSN_LEN", 20); +define("CMD_LEN", 4); +define("MID_LEN", 10); +define("TOTPRICE_LEN", 20); + + +//------------------------------------------------------ +// IFD CMD +//------------------------------------------------------ +define("CMD_REQ_PAY", "0200"); +define("CMD_RES_PAY", "0210"); +define("CMD_REQ_CAP", "0300"); +define("CMD_RES_CAP", "0310"); +define("CMD_REQ_CAN", "0420"); +define("CMD_RES_CAN", "0430"); +define("CMD_REQ_NETC", "0520"); +define("CMD_RES_NETC", "0530"); +define("CMD_REQ_PRTC", "0620"); +define("CMD_RES_PRTC", "0630"); +define("CMD_REQ_ACK", "0800"); +define("CMD_RES_ACK", "0810"); +//자체에스크로 +//added 2008.01.08 +define("CMD_REQ_DLV", "3020"); //배송등록 +define("CMD_REQ_CNF", "3030"); //구매확인 +define("CMD_REQ_DNY", "3040"); //구매거절 +define("CMD_REQ_DNY_CNF", "3080"); //거절확인 +define("CMD_REQ_DLV_NETC", "3520"); //배송등록망상취소 +define("CMD_REQ_CNF_NETC", "3530"); //구매확인망상취소 +define("CMD_REQ_DNY_NETC", "3540"); //구매거절망상취소 +//가상계좌환불(09.08.05) +define("CMD_REQ_RFD", "0421"); +define("CMD_RES_RFD", "0431"); + +//거래조회(12.04.20) +define("CMS_REQ_INQR", "0900"); +define("CMS_RES_INQR", "0910"); + +//서브몰하위가맹점등록(14.03.06) +define("CMS_REQ_OPEN_SUB", "1040"); +define("CMS_RES_OPEN_SUB", "1041"); + +//------------------------------------------------------ +// HEADER FLAGS +//------------------------------------------------------ +define("FLAG_TEST", "T"); +define("FLAG_REAL", "R"); +define("FLAG_CRYPTO_NONE", "N"); +define("FLAG_CRYPTO_SEED", "S"); +define("FLAG_CRYPTO_RC4", "R"); +define("FLAG_CRYPTO_3DES", "D"); +define("FLAG_SIGN_SHA", "SHA"); +define("FLAG_SIGN_SHA1", "SHA1"); +define("FLAG_SIGN_MD5", "MD5"); + +//------------------------------------------------------ +//TYPE(서비스별) +//------------------------------------------------------ +define("TYPE_SECUREPAY", "securepay"); +define("TYPE_CANCEL", "cancel"); +define("TYPE_FORMPAY", "formpay"); +define("TYPE_RECEIPT", "receipt"); +define("TYPE_REPAY", "repay"); +define("TYPE_ESCROW", "escrow"); //자체에스크로! +define("TYPE_CONFIRM", "confirm"); +define("TYPE_OCBQUERY", "ocbquery"); +define("TYPE_OCBSAVE", "ocbsave"); +define("TYPE_OCBPOINT", "OCBPoint"); +define("TYPE_AUTH", "auth"); +define("TYPE_AUTHBILL", "auth_bill"); +define("TYPE_CAPTURE", "capture"); +define("TYPE_CMS", "CMS"); +define("TYPE_VBANK", "VBank"); +define("TYPE_REQREALBILL", "reqrealbill"); +define("TYPE_FORMAUTH", "formauth"); +define("TYPE_CHKFAKE", "chkfake"); +//가상계좌환불(09.08.05) +define("TYPE_REFUND", "refund"); +//가상계좌부분환불(12.06.05) +define("TYPE_VACCTREPAY", "vacctrepay"); +//거래조회(12.04.20) +define("TYPE_INQUIRY", "inquiry"); +//서브몰하위가맹점등록(14.03.06) +define("TYPE_OPENSUB", "opensub"); +//------------------------------------------------------ +//EscrowType(자체에스크로 타입) +//added 2008.01.08 +//------------------------------------------------------ +define("TYPE_ESCROW_DLV", "dlv"); +define("TYPE_ESCROW_CNF", "confirm"); //구매확인/거절(플러그인) +define("TYPE_ESCROW_DNY", "deny"); //위에서 처리됨,의미없음 +define("TYPE_ESCROW_DNY_CNF", "dcnf"); + +//------------------------------------------------------ +//PayMethod(서비스별, TX) +//------------------------------------------------------ +define("NM_TX_ISP", "VCard"); +define("NM_TX_CARD", "Card"); +define("NM_TX_HPP", "HPP"); +define("NM_TX_ACCT", "DirectBank"); +define("NM_TX_VACT", "VBank"); +define("NM_TX_OCB", "OCBPoint"); +define("NM_TX_CSHR", "CASH"); +define("NM_TX_ARSB", "Ars1588Bill"); +define("NM_TX_PHNB", "PhoneBill"); +define("NM_TX_CULT", "Culture"); +define("NM_TX_GAMG", "DGCL"); +define("NM_TX_EDUG", "EDCL"); +define("NM_TX_TEEN", "TEEN"); +define("NM_TX_ESCR", "Escrow"); + +//------------------------------------------------------ +//PayMethod(서비스별, PG) +//------------------------------------------------------ +define("NM_ISP", "ISP"); +define("NM_CARD", "CARD"); +define("NM_HPP", "HPP"); +define("NM_ACCT", "ACCT"); +define("NM_VACT", "VACT"); +define("NM_OCB", "OCB"); +define("NM_CSHR", "CASH"); +define("NM_ARSB", "ARSB"); +define("NM_PHNB", "PHNB"); +define("NM_CULT", "CULT"); +define("NM_GAMG", "DGCL"); +define("NM_EDUG", "EDCL"); +define("NM_TEEN", "TEEN"); +define("NM_ESCR", "Escrow"); + +//------------------------------------------------------ +//Charset +//------------------------------------------------------ +define("EUCKR", "EUC-KR"); +define("UTF8", "UTF-8"); + +//------------------------------------------------------ +//URL Encoding/Decoding Name +//------------------------------------------------------ +define("URLENCODE", "urlencode"); +define("URLDECODE", "urldecode"); + +//------------------------------------------------------ +//요청전문 +//------------------------------------------------------ +define("TX_GOOSCNT", "GoodsCnt"); +define("TX_MOID", "MOID"); +define("TX_CURRENCY", "Currency"); +define("TX_SMID", "SMID"); +define("TX_GOODSCNTS", "GoodsCnts"); +define("TX_GOODSNAME", "GoodsName"); +define("TX_GOODSPRICE", "GoodsPrice"); +define("TX_BUYERNAME", "BuyerName"); +define("TX_BUYEREMAIL", "BuyerEmail"); +define("TX_BUYERTEL", "BuyerTel"); +define("TX_PARENTEMAIL", "ParentEmail"); +define("TX_RECVNAME", "RecvName"); +define("TX_RECVTEL", "RecvTel"); +define("TX_RECVMSG", "RecvMsg"); +define("TX_RECVADDR", "RecvAddr"); +define("TX_RECVPOSTNUM", "RecvPostNum"); +define("TX_TAXFREE", "TaxFree"); +define("TX_TAX", "Tax"); +//PaymentInfo +define("TX_PAYMETHOD", "PayMethod"); +define("TX_JOINCARD", "JoinCard"); +define("TX_JOINEXPIRE", "JoinExpire"); +define("TX_MAILORDER", "MailOrder"); +define("TX_SESSIONKEY", "SessionKey"); +define("TX_ENCRYPTED", "Encrypted"); +//ReservedInfo +define("TX_MRESERVED1", "MReserved1"); +define("TX_MRESERVED2", "MReserved2"); +define("TX_MRESERVED3", "MReserved3"); +//ManageInfo +define("TX_LANGUAGE", "Language"); +define("TX_URL", "URL"); +define("TX_TXVERSION", "TXVersion"); +define("TX_TXUSERIP", "TXUserIP"); +define("TX_TXUSERID", "TXUserID"); +define("TX_TXREGNUM", "TXRegNum"); +define("TX_ACK", "Ack"); +define("TX_RN", "TXRN"); +//CancelInfo +define("TX_CANCELTID", "CancelTID"); +define("TX_CANCELMSG", "CancelMsg"); +define("TX_CANCELREASON", "CancelReason"); //2012-10-19 취소사유코드 추가 +//가상계좌환불(09.08.05) +define("TX_REFUNDACCTNUM", "RefundAcctNum"); +define("TX_REFUNDBANKCODE", "RefundBankCode"); +define("TX_REFUNDACCTNAME", "RefundAcctName"); +define("TX_REFUNDFLGREMIT", "RefundFlgRemit"); + +//PartCancelInfo +define("TX_PRTC_TID", "PRTC_TID"); +define("TX_PRTC_PRICE", "PRTC_Price"); +define("TX_PRTC_REMAINS", "PRTC_Remains"); +define("TX_PRTC_QUOTA", "PRTC_Quota"); +define("TX_PRTC_INTEREST", "PRTC_Interest"); +define("TX_PRTC_TAX", "Tax"); +define("TX_PRTC_TAXFREE", "TaxFree"); + +define("TX_PRTC_CURRENCY", "Currency"); + +//국민은행 I계좌이체 부분취소시 계좌번호/계좌주성명추가 2011-10-06 +define("TX_PRTC_NOACCT", "PRTC_NoAcctFNBC"); +define("TX_PRTC_NMACCT", "PRTC_NmAcctFNBC"); +//가상계좌 부분환불 관련 추가 +define("TX_PRTC_REFUNDFLGREMIT", "PRTC_RefundFlgRemit"); +define("TX_PRTC_REFUNDBANKCODE", "PRTC_RefundBankCode"); +//CaptureInfo +define("TX_CAPTURETID", "CaptureTID"); +//현금영수증 +define("TX_CSHR_APPLPRICE", "CSHR_ApplPrice"); +define("TX_CSHR_SUPPLYPRICE", "CSHR_SupplyPrice"); +define("TX_CSHR_TAX", "CSHR_Tax"); +define("TX_CSHR_SERVICEPRICE", "CSHR_ServicePrice"); +define("TX_CSHR_REGNUM", "CSHR_RegNum"); +define("TX_CSHR_TYPE", "CSHR_Type"); +define("TX_CSHR_COMPANYNUM", "CSHR_CompanyNum"); +define("TX_CSHR_OPENMARKET", "CSHR_OpenMarket"); +define("TX_CSHR_SUBCNT", "CSHR_SubCnt"); +define("TX_CSHR_SUBCOMPANYNAME1", "CSHR_SubCompanyName1"); +define("TX_CSHR_SUBCOMPANYNUM1", "CSHR_SubCompanyNum1"); +define("TX_CSHR_SUBREGNUM1", "CSHR_SubRegNum1"); +define("TX_CSHR_SUBMID1", "CSHR_SubMID1"); +define("TX_CSHR_SUBAPPLPRICE1", "CSHR_SubApplPrice1"); +define("TX_CSHR_SUBSERVICEPRICE1", "CSHR_SubServicePrice1"); +//거래조회(12.04.20) +define("TX_INQR_TID", "INQR_TID"); +define("TX_INQR_OID", "INQR_OID"); +//서브몰하위가맹점등록(14.03.06) +define("TX_OPENREG_TID", "OrgTID"); +define("TX_OPENREG_MID", "MID"); +define("TX_OPENREG_SUBCNT", "SubCnt"); +define("TX_OPENREG_SUBGOODS", "SubGoods"); +define("TX_OPENREG_SUBCOMPNO", "SubCompNo"); +define("TX_OPENREG_SUBCOMPNM", "SubCompNm"); +define("TX_OPENREG_SUBPRSUPPLY", "SubPrSupply"); +define("TX_OPENREG_SUBPRFREE", "SubPrFree"); +define("TX_OPENREG_SUBPRTAX", "SubPrTax"); +define("TX_OPENREG_SUBPRSERVICE", "SubPrService"); +define("TX_OPENREG_SUBPRICE", "SubPrice"); + +//------------------------------------------------------ +// +//응답전문 +// +//------------------------------------------------------ +//HEAD +define("NM_MID", "MID"); +define("NM_TID", "TID"); +define("NM_TOTPRICE", "TotPrice"); + +//BODY +define("NM_GOODSCNT", "GoodsCnt"); +define("NM_MOID", "MOID"); +define("NM_CURRENCY", "Currency"); +define("NM_SMID", "SMID"); +define("NM_GOODSNAME", "GoodsName"); +define("NM_GOODSPRICE", "GoodsPrice"); +define("NM_PAYMETHOD", "PayMethod"); +define("NM_RESULTCODE", "ResultCode"); +define("NM_RESULTERRORCODE", "ResultErrorCode"); +define("NM_RESULTMSG", "ResultMsg"); +define("NM_SESSIONKEY", "SessionKey"); +define("NM_ENCRYPTED", "Encrypted"); +define("NM_CANCELDATE", "CancelDate"); +define("NM_CANCELTIME", "CancelTime"); +define("NM_EVENTCODE", "EventCode"); +define("NM_ORGCURRENCY", "OrgCurrency"); +define("NM_ORGPRICE", "OrgPrice"); +define("NM_EXCHANGERATE", "ExchangeRate"); +define("NM_RESERVEDINFO", "ReservedInfo"); +define("NM_MRESERVED1", "MReserved1"); +define("NM_MRESERVED2", "MReserved2"); +define("NM_MRESERVED3", "MReserved3"); +define("PRTC_TID", "PRTC_TID"); +define("PRTC_PRICE", "PRTC_Price"); +define("PRTC_REMAINS", "PRTC_Remains"); +define("PRTC_QUOTA", "PRTC_Quota"); +define("PRTC_INTEREST", "PRTC_Interest"); +define("PRTC_TYPE", "PRTC_Type"); +define("PRTC_CNT", "PRTC_Cnt"); +define("NM_CAPTUREDATE", "CaptureDate"); +define("NM_CAPTURETIME", "CaptureTime"); + +define("NM_PGPUBKEY", "PGcertKey"); + +//RECV DATA XPATH +//XML XPATH +define("ROOTINFO", "INIpay"); +define("GOODSINFO", "GoodsInfo"); +define("GOODS", "Goods"); +define("BUYERINFO", "BuyerInfo"); +define("PAYMENTINFO", "PaymentInfo"); +define("PAYMENT", "Payment"); +define("MANAGEINFO", "ManageInfo"); +define("RESERVEDINFO", "ReservedInfo"); +//Cancel(NetCancel) +define("CANCELINFO", "CancelInfo"); +//PartCancel Encrypt +define("PARTCANCELINFO", "PartCancelInfo"); +//Capture +define("CAPTUREINFO", "CaptureInfo"); +//거래조회(12.04.20) +define("INQUIRYINFO", "InquiryInfo"); +//서브몰하위가맹점등록(14.03.06) +define("OPENSUBINFO", "OpenSubInfo"); +//Escrow +//added 2008.01.09 +define("ESCROWINFO", "EscrowInfo"); +define("ESCROW_DELIVERY", "Delivery"); +define("ESCROW_CONFIRM", "Confirm"); +define("ESCROW_DENY", "Deny"); +define("ESCROW_DENYCONFIRM", "DenyConfirm"); + + +//------------------------------------------------------ +//Auth Encrypt XPATH +//------------------------------------------------------ +//CARD COMMON +define("APPLDATE", "ApplDate"); +define("APPLTIME", "ApplTime"); +define("APPLNUM", "ApplNum"); +//CARD +define("CARD_NUM", "CARD_Num"); +define("CARD_EXPIRE", "CARD_Expire"); +define("CARD_CODE", "CARD_Code"); +define("CARD_APPLPRICE", "CARD_ApplPrice"); +define("CARD_BANKCODE", "CARD_BankCode"); +define("CARD_QUOTA", "CARD_Quota"); +define("CARD_INTEREST", "CARD_Interest"); +define("CARD_POINT", "CARD_Point"); +define("CARD_AUTHTYPE", "CARD_AuthType"); +define("CARD_REGNUM", "CARD_RegNum"); +define("CARD_APPLDATE", "CARD_ApplDate"); +define("CARD_APPLTIME", "CARD_ApplTime"); +define("CARD_APPLNUM", "CARD_ApplNum"); +define("CARD_RESULTCODE", "CARD_ResultCode"); +define("CARD_RESULTMSG", "CARD_ResultMsg"); +define("CARD_TERMINALNUM", "CARD_TerminalNum"); +define("CARD_MEMBERNUM", "CARD_MemberNum"); +define("CARD_PURCHASECODE", "CARD_PurchaseCode"); +//ISP +define("ISP_BANKCODE", "ISP_BankCode"); +define("ISP_QUOTA", "ISP_Quota"); +define("ISP_INTEREST", "ISP_Interest"); +define("ISP_APPLPRICE", "ISP_ApplPrice"); +define("ISP_CARDCODE", "ISP_CardCode"); +define("ISP_CARDNUM", "ISP_CardNum"); +define("ISP_POINT", "ISP_Point"); +define("ISP_APPLDATE", "ISP_ApplDate"); +define("ISP_APPLTIME", "ISP_ApplTime"); +define("ISP_APPLNUM", "ISP_ApplNum"); +define("ISP_RESULTCODE", "ISP_ResultCode"); +define("ISP_RESULTMSG", "ISP_ResultMsg"); +define("ISP_TERMINALNUM", "ISP_TerminalNum"); +define("ISP_MEMBERNUM", "ISP_MemberNum"); +define("ISP_PURCHASECODE", "ISP_PurchaseCode"); +//ACCT +define("ACCT_APPLDATE", "ACCT_ApplDate"); +define("ACCT_APPLTIME", "ACCT_ApplTime"); +define("ACCT_APPLNUM", "ACCT_ApplNum"); + +//HPP +define("HPP_APPLDATE", "HPP_ApplDate"); +define("HPP_APPLTIME", "HPP_ApplTime"); +define("HPP_APPLNUM", "HPP_ApplNum"); +//VACT +define("VACT_APPLDATE", "VACT_ApplDate"); +define("VACT_APPLTIME", "VACT_ApplTime"); +//CASH +define("CSHR_APPLDATE", "CSHR_ApplDate"); +define("CSHR_APPLTIME", "CSHR_ApplTime"); +define("CSHR_APPLNUM", "CSHR_ApplNum"); +//ARSB +define("ARSB_APPLDATE", "ARSB_ApplDate"); +define("ARSB_APPLTIME", "ARSB_ApplTime"); +define("ARSB_APPLNUM", "ARSB_ApplNum"); +//PHNB +define("PHNB_APPLDATE", "PHNB_ApplDate"); +define("PHNB_APPLTIME", "PHNB_ApplTime"); +define("PHNB_APPLNUM", "PHNB_ApplNum"); +//CULT +define("CULT_APPLDATE", "CULT_ApplDate"); +define("CULT_APPLTIME", "CULT_ApplTime"); +define("CULT_APPLNUM", "CULT_ApplNum"); +//DGCL +define("GAMG_CNT", "GAMG_Cnt"); +define("GAMG_APPLDATE", "GAMG_ApplDate"); +define("GAMG_APPLTIME", "GAMG_ApplTime"); +define("GAMG_APPLNUM", "GAMG_ApplNum"); + +function MakePathGAMG($cnt) { + for ($i = 1; $i <= $cnt; $i++) { + define("GAMG_NUM$i", "GAMG_Num$i"); + define("GAMG_REMAINS$i", "GAMG_Remains$i"); + define("GAMG_ERRMSG$i", "GAMG_ErrMsg$i"); + } +} + +//EDUG +define("EDUG_APPLDATE", "EDUG_ApplDate"); +define("EDUG_APPLTIME", "EDUG_ApplTime"); +define("EDUG_APPLNUM", "EDUG_ApplNum"); +//TEEN +define("TEEN_APPLDATE", "TEEN_ApplDate"); +define("TEEN_APPLTIME", "TEEN_ApplTime"); +define("TEEN_APPLNUM", "TEEN_ApplNum"); + +//---------------------------------- +//ERROR CODE +//---------------------------------- +//!!신TX에 추가된 에러!!! +define("NULL_DIR_ERR", "TX9001"); +define("NULL_TYPE_ERR", "TX9002"); +define("NULL_NOINTEREST_ERR", "TX9003"); +define("NULL_QUOTABASE_ERR", "TX9004"); +define("DNS_LOOKUP_ERR", "TX9005"); +define("MERCHANT_DB_ERR", "TX9006"); +define("DNS_LOOKUP_TIMEOUT_ERR", "TX9007"); +define("PGPUB_UPDATE_ERR", "TX9612"); + +//암복호화 에러 +define("B64DECODE_UPDATE_ERR", "TX9101"); +define("B64DECODE_FINAL_ERR", "TX9102"); +define("B64DECODE_LENGTH_ERR", "TX9103"); +define("GET_KEYPW_EVP_B2K_ERR", "TX9104"); +define("GET_KEYPW_FILE_OPEN_ERR", "TX9105"); +define("GET_KEYPW_FILE_READ_ERR", "TX9106"); +define("GET_KEYPW_DECRYPT_INIT_ERR", "TX9107"); +define("GET_KEYPW_DECRYPT_UPDATE_ERR", "TX9108"); +define("GET_KEYPW_DECRYPT_FINAL_ERR", "TX9109"); +define("ENC_RAND_BYTES_ERR", "TX9110"); +define("ENC_INIT_ERR", "TX9111"); +define("ENC_UPDATE_ERR", "TX9112"); +define("ENC_FINAL_ERR", "TX9113"); +define("ENC_RSA_ERR", "TX9114"); +define("DEC_RSA_ERR", "TX9115"); +define("DEC_CIPHER_ERR", "TX9116"); +define("DEC_INIT_ERR", "TX9117"); +define("DEC_UPDATE_ERR", "TX9118"); +define("DEC_FINAL_ERR", "TX9119"); +define("SIGN_FINAL_ERR", "TX9120"); +define("SIGN_CHECK_ERR", "TX9121"); +define("ENC_NULL_F_ERR", "TX9122"); +define("ENC_INIT_RAND_ERR", "TX9123"); +define("ENC_PUTENV_ERR", "TX9124"); +//필드체크 +define("NULL_KEYPW_ERR", "TX9201"); +define("NULL_MID_ERR", "TX9202"); +define("NULL_PGID_ERR", "TX9203"); +define("NULL_TID_ERR", "TX9204"); +define("NULL_UIP_ERR", "TX9205"); +define("NULL_URL_ERR", "TX9206"); +define("NULL_PRICE_ERR", "TX9207"); +define("NULL_PRICE1_ERR", "TX9208"); +define("NULL_PRICE2_ERR", "TX9209"); +define("NULL_CARDNUMBER_ERR", "TX9210"); +define("NULL_CARDEXPIRE_ERR", "TX9211"); +define("NULL_ENCRYPTED_ERR", "TX9212"); +define("NULL_CARDQUOTA_ERR", "TX9213"); +define("NULL_QUOTAINTEREST_ERR", "TX9214"); +define("NULL_AUTHENTIFICATION_ERR", "TX9215"); +define("NULL_AUTHFIELD1_ERR", "TX9216"); +define("NULL_AUTHFIELD2_ERR", "TX9217"); +define("NULL_BANKCODE_ERR", "TX9218"); +define("NULL_BANKACCOUNT_ERR", "TX9219"); +define("NULL_REGNUMBER_ERR", "TX9220"); +define("NULL_OCBCARDNUM_ERR", "TX9221"); +define("NULL_OCBPASSWD_ERR", "TX9222"); +define("NULL_PASSWD_ERR", "TX9223"); +define("NULL_CURRENCY_ERR", "TX9224"); +define("NULL_PAYMETHOD_ERR", "TX9225"); +define("NULL_GOODNAME_ERR", "TX9226"); +define("NULL_BUYERNAME_ERR", "TX9227"); +define("NULL_BUYERTEL_ERR", "TX9228"); +define("NULL_BUYEREMAIL_ERR", "TX9229"); +define("NULL_SESSIONKEY_ERR", "TX9230"); +//pg공개키 로드 오류 +define("NULL_PGCERT_FP_ERR", "TX9231"); +define("NULL_X509_ERR", "TX9232"); +define("NULL_PGCERT_ERR", "TX9233"); + +define("RESULT_MSG_FORMAT_ERR", "TX9234"); + +// 가상 계좌 이체 예약 +define("NULL_PERNO_ERR", "TX9235"); // 주민번호 빠짐 +define("NULL_OID_ERR", "TX9236"); // 주문번호 빠짐 +define("NULL_VCDBANK_ERR", "TX9237"); // 은행코드 빠짐 +define("NULL_DTINPUT_ERR", "TX9238"); // 입금 예정일 빠짐 +define("NULL_NMINPUT_ERR", "TX9239"); // 송금자 성명 빠짐 +//실시간 빌링 +define("NULL_BILLKEY_ERR", "TX9240"); // 빌키 빠짐 +define("NULL_CARDPASS_ERR", "TX9241"); // 카드 비번 빠짐 +define("NULL_BILLTYPE_ERR", "TX9242"); // 빌타입 누락 +// CMS 계좌이체 +define("NULL_PRICE_ORG_ERR", "TX9250"); // CMS 출금총금액 빠짐 +define("NULL_CMSDAY_ERR", "TX9251"); // CMS 출금일자 빠짐 +define("NULL_CMSDATEFROM_ERR", "TX9252"); // CMS 출금시작월 빠짐 +define("NULL_CMSDATETO_ERR", "TX9253"); // CMS 출금종료월 빠짐 +// 부분취소 +define("NULL_CONFIRM_PRICE_ERR", "TX9260"); // 재승인 요청금액 누락 에러 +// 현금영수증 발행 +define("NULL_CR_PRICE_ERR", "TX9270"); // 현금결제 금액 빠짐 +define("NULL_SUP_PRICE_ERR", "TX9271"); // 공급가액 빠짐 +define("NULL_TAX_ERR", "TX9272"); // 부가세 빠짐 +define("NULL_SRVC_PRICE_ERR", "TX9273"); // 봉사료 빠짐 +define("NULL_REG_NUM_ERR", "TX9274"); // 주민번호(사업자번호) +define("NULL_USEOPT_ERR", "TX9275"); // 현금영수증 용도 구분자 빠짐 + +define("PRIVKEY_FILE_OPEN_ERR", "TX9301"); +define("INVALID_KEYPASS_ERR", "TX9302"); + +define("MAKE_TID_ERR", "TX9401"); +define("ACK_CHECKSUM_ERR", "TX9402"); +define("NETCANCEL_SOCK_CREATE_ERR", "TX9403"); +define("NETCANCEL_SOCK_SEND_ERR", "TX9404"); +define("NETCANCEL_SOCK_RECV_ERR", "TX9405"); +define("LOG_OPEN_ERR", "TX9406"); +define("LOG_WRITE_ERR", "TX9407"); + +define("SOCK_MAKE_EP_ERR", "TX9501"); +define("SOCK_CONN_ERR", "TX9502"); +define("SOCK_SEND1_ERR", "TX9503"); +define("SOCK_SEND2_ERR", "TX9504"); +define("SOCK_CLOSED_BY_PEER_ERR", "TX9505"); +define("SOCK_RECV1_ERR", "TX9506"); +define("SOCK_RECV2_ERR", "TX9507"); +define("SOCK_RECV_LEN_ERR", "TX9508"); +define("SOCK_TIMEO_ERR", "TX9509"); +define("SOCK_ETC1_ERR", "TX9510"); +define("SOCK_ETC2_ERR", "TX9511"); + +define("NULL_ESCROWTYPE_ERR", "TX6000"); +define("NULL_ESCROWMSG_ERR", "TX6001"); + +define("NULL_FIELD_REFUNDACCTNUM", "TX9245"); +define("NULL_FIELD_REFUNDBANKCODE", "TX9243"); +define("NULL_FIELD_REFUNDACCTNAME", "TX9244"); \ No newline at end of file diff --git a/shop/inicis/libs/INILib.php b/shop/inicis/libs/INILib.php new file mode 100644 index 000000000..c77cf2002 --- /dev/null +++ b/shop/inicis/libs/INILib.php @@ -0,0 +1,735 @@ +UnsetField(); + } + + function UnsetField() { + unset($this->m_REQUEST); + unset($this->m_RESULT); + } + + /* -------------------------------------------------- */ + /* */ + /* 결제/취소 요청값 Set or Add */ + /* */ + /* -------------------------------------------------- */ + + function SetField($key, $val) { //Default Entity + $this->m_REQUEST[$key] = $val; + } + + function SetXPath($xpath, $val) { //User Defined Entity + $this->m_REQUEST2[$xpath] = $val; + } + + /* -------------------------------------------------- */ + /* */ + /* 결제/취소 결과값 fetch */ + /* */ + /* -------------------------------------------------- */ + + function GetResult($name) { //Default Entity + $result = isset($this->m_RESULT[$name]) ? $this->m_RESULT[$name] : ''; + if ($result == "") + $result = $this->m_Data->GetXMLData($name); + if ($result == "") + $result = $this->m_Data->m_RESULT[$name]; + return $result; + } + + /* -------------------------------------------------- */ + /* */ + /* 결제/취소 처리 메인 */ + /* */ + /* -------------------------------------------------- */ + + function startAction() { + + /* -------------------------------------------------- */ + /* Overhead Operation */ + /* -------------------------------------------------- */ + $this->m_Data = new INIData($this->m_REQUEST, $this->m_REQUEST2); + + /* -------------------------------------------------- */ + /* Log Start */ + /* -------------------------------------------------- */ + $this->m_Log = new INILog($this->m_REQUEST); + if (!$this->m_Log->StartLog()) { + $this->MakeTXErrMsg(LOG_OPEN_ERR, "로그파일을 열수가 없습니다.[" . $this->m_REQUEST["inipayhome"] . "]"); + return; + } + + /* -------------------------------------------------- */ + /* Logging Request Parameter */ + /* -------------------------------------------------- */ + $this->m_Log->WriteLog(DEBUG, $this->m_REQUEST); + + /* -------------------------------------------------- */ + /* Set Type */ + /* -------------------------------------------------- */ + $this->m_type = $this->m_REQUEST["type"]; + + /* -------------------------------------------------- */ + /* Check Field */ + /* -------------------------------------------------- */ + if (!$this->m_Data->CheckField()) { + $err_msg = "필수항목(" . $this->m_Data->m_ErrMsg . ")이 누락되었습니다."; + $this->MakeTXErrMsg($this->m_Data->m_ErrCode, $err_msg); + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + return; + } + $this->m_Log->WriteLog(INFO, "Check Field OK"); + + /* -------------------------------------------------- */ + //웹페이지위변조용 키생성. 여기서 끝!! + /* -------------------------------------------------- */ + if ($this->m_type == TYPE_CHKFAKE) { + return $this->MakeChkFake(); + } + + + //TID 인입 기반 거래의 경우 TID 를 기록함 + $temp_request = array_change_key_case($this->m_REQUEST, CASE_LOWER); + if(isset($temp_request['tid'])){ + $this->m_Log->WriteLog(INFO, "INPUT TID > ".$temp_request['tid']); + } + + /* -------------------------------------------------- */ + //Generate TID + /* -------------------------------------------------- */ + if ($this->m_type == TYPE_SECUREPAY || $this->m_type == TYPE_FORMPAY || $this->m_type == TYPE_OCBSAVE || + $this->m_type == TYPE_AUTHBILL || $this->m_type == TYPE_FORMAUTH || $this->m_type == TYPE_REQREALBILL || + $this->m_type == TYPE_REPAY || $this->m_type == TYPE_VACCTREPAY || $this->m_type == TYPE_RECEIPT || $this->m_type == TYPE_AUTH + ) { + if (!$this->m_Data->MakeTID()) { + $err_msg = "TID생성에 실패했습니다.::" . $this->m_Data->m_sTID; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg(MAKE_TID_ERR, $err_msg); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + return; + } + $this->m_Log->WriteLog(INFO, 'Make TID OK ' . $this->m_Data->m_sTID); + } + + $this->m_Crypto = new INICrypto($this->m_REQUEST); + + /* -------------------------------------------------- */ + //PI공개키 로드 + /* -------------------------------------------------- */ + $this->m_Data->ParsePIEncrypted(); + $this->m_Log->WriteLog(INFO, "PI PUB KEY LOAD OK [" . $this->m_Data->m_PIPGPubSN . "]"); + + /* -------------------------------------------------- */ + //PG공개키 로드 + /* -------------------------------------------------- */ + if (($rtv = $this->m_Crypto->LoadPGPubKey($pg_cert_SN)) != OK) { + $err_msg = "PG공개키 로드오류"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + return; + } + $this->m_Data->m_TXPGPubSN = $pg_cert_SN; + $this->m_Log->WriteLog(INFO, "PG PUB KEY LOAD OK [" . $this->m_Data->m_TXPGPubSN . "]"); + + /* -------------------------------------------------- */ + //상점개인키 로드 + /* -------------------------------------------------- */ + if (($rtv = $this->m_Crypto->LoadMPrivKey()) != OK) { + $err_msg = "상점개인키 로드오류"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Crypto->FreePubKey(); + return; + } + $this->m_Log->WriteLog(INFO, "MERCHANT PRIV KEY LOAD OK"); + + /* -------------------------------------------------- */ + //상점 공개키 로드(SN 를 알기위해!!) + /* -------------------------------------------------- */ + if (($rtv = $this->m_Crypto->LoadMPubKey($m_cert_SN)) != OK) { + $err_msg = "상점공개키 로드오류"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + return; + } + $this->m_Data->m_MPubSN = $m_cert_SN; + $this->m_Log->WriteLog(INFO, "MERCHANT PUB KEY LOAD OK [" . $this->m_Data->m_MPubSN . "]"); + + /* -------------------------------------------------- */ + //폼페이 암호화( formpay, cancel, repay, recept, inquiry, opensub) + /* -------------------------------------------------- */ + if ($this->m_type == TYPE_CANCEL || $this->m_type == TYPE_REPAY || $this->m_type == TYPE_VACCTREPAY || + $this->m_type == TYPE_FORMPAY || $this->m_type == TYPE_RECEIPT || + $this->m_type == TYPE_CAPTURE || $this->m_type == TYPE_INQUIRY || $this->m_type == TYPE_OPENSUB || + ($this->m_type == TYPE_ESCROW && $this->m_Data->m_EscrowType == TYPE_ESCROW_DLV ) || + ($this->m_type == TYPE_ESCROW && $this->m_Data->m_EscrowType == TYPE_ESCROW_DNY_CNF ) || + $this->m_type == TYPE_REFUND + ) { + if (($rtv = $this->m_Data->MakeEncrypt($this->m_Crypto)) != OK) { + $err_msg = "암호화 오류"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + return; + } + //$this->m_Log->WriteLog( DEBUG, "MAKE ENCRYPT OK" ); + $this->m_Log->WriteLog(DEBUG, "MAKE ENCRYPT OK[" . $this->m_Data->m_EncBody . "]"); + } + + /* -------------------------------------------------- */ + //전문생성(Body) + /* -------------------------------------------------- */ + $this->m_Data->MakeBody(); + $this->m_Log->WriteLog(INFO, "MAKE BODY OK"); + //$this->m_Log->WriteLog( INFO, "MAKE BODY OK[".$this->m_Data->m_sBody."]" ); + + /* -------------------------------------------------- */ + //서명(sign) + /* -------------------------------------------------- */ + if (($rtv = $this->m_Crypto->Sign($this->m_Data->m_sBody, $sign)) != OK) { + $err_msg = "싸인실패"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Crypto->FreeAllKey(); + return; + } + $this->m_Data->m_sTail = $sign; + $this->m_Log->WriteLog(INFO, "SIGN OK"); + //$this->m_Log->WriteLog( INFO, "SIGN OK[".$sign."]" ); + + /* -------------------------------------------------- */ + //전문생성(Head) + /* -------------------------------------------------- */ + $this->m_Data->MakeHead(); + $this->m_Log->WriteLog(INFO, "MAKE HEAD OK"); + //$this->m_Log->WriteLog( INFO, "MAKE HEAD OK[".$head."]" ); + + $this->m_Log->WriteLog(DEBUG, "MSG_TO_PG:[" . $this->m_Data->m_sMsg . "]"); + + + /* -------------------------------------------------- */ + //소켓생성 + /* -------------------------------------------------- */ + + //플러그인 에스크로 결제 구분 설정 + $is_plugin_escrow = FALSE; + if($this->m_type == TYPE_ESCROW && ($this->m_Data->m_EscrowType == TYPE_ESCROW_CNF || $this->m_Data->m_EscrowType == TYPE_ESCROW_DNY)) $is_plugin_escrow = TRUE; + + + if(isset($this->m_REQUEST["pgn"]) && $this->m_REQUEST["pgn"] != "") { + $host = $this->m_REQUEST["pgn"]; + } else { + if ($this->m_type == TYPE_SECUREPAY || $is_plugin_escrow == TRUE) { //plugin + $host = $this->m_Data->m_PG1; + } else if ($this->m_cancelRC == 1){ //원거래없음 + $host = KSPG_IP; + } else { + $host = PG_HOST; + } + } + + $this->m_Socket = new INISocket($host); + + //1차 NSLOOKUP FAIL + if (($rtv = $this->m_Socket->DNSLookup()) != OK) { + $err_msg = "[" . $host . "] 1차 DNS LOOKUP 실패" . $this->m_Socket->getErr(); + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + + if ($this->m_type == TYPE_SECUREPAY || $is_plugin_escrow == TRUE) { + $this->m_Socket->ip = $this->m_Data->m_PG1IP; + } else { + if ($this->m_cancelRC == 1) $this->m_Socket->ip = KSPG_IP; + else $this->m_Socket->ip = PG_IP; + } + } + + $this->m_Log->WriteLog(INFO, "DNS LOOKUP OK(" . $this->m_Socket->host . ", " . $this->m_Socket->ip . ":" . $this->m_Socket->port . ") laptime:" . $this->m_Socket->dns_laptime); + + if (($rtv = $this->m_Socket->open()) != OK) { + $this->m_Socket->close(); + + //PG2로 전환 + $err_msg = "[" . $host."(". $this->m_Socket->ip .") 소켓연결오류(1차):: 2차 연결시도"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + if ($this->m_type == TYPE_SECUREPAY || $is_plugin_escrow == TRUE) { + $host = $this->m_Data->m_PG2; + } else { + $host = $this->m_Socket->ip == PG_IP ? KSPG_IP:PG_IP; + } + + $this->m_Socket = new INISocket($host); + + //SECUREPAY만 2차 NSLOOKUP 진행, 이외는 IP통신 + if ($this->m_type == TYPE_SECUREPAY || $is_plugin_escrow == TRUE) { + if (($rtv = $this->m_Socket->DNSLookup()) != OK) { + $err_msg = "[" . $host . "] 2차 DNS LOOKUP 실패" . $this->m_Socket->getErr(); + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Socket->ip = $this->m_Data->m_PG2IP; + } + } else { + $this->m_Socket->ip = $host; + } + + $this->m_Log->WriteLog(INFO, "DNS LOOKUP OK(" . $this->m_Socket->host . ", " . $this->m_Socket->ip . ":" . $this->m_Socket->port . ") laptime:" . $this->m_Socket->dns_laptime); + + if (($rtv = $this->m_Socket->open()) != OK) { + $err_msg = "[" . $host . "소켓연결오류(2차)::" . $this->m_Socket->getErr(); + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Socket->close(); + $this->m_Crypto->FreeAllKey(); + return; + } + } + $this->m_connIP = $this->m_Socket->ip; + $this->m_Log->WriteLog(INFO, "SOCKET CONNECT OK"); + + /* -------------------------------------------------- */ + //전문송신 + /* -------------------------------------------------- */ + if (($rtv = $this->m_Socket->send($this->m_Data->m_sMsg)) != OK) { + $err_msg = "소켓송신오류(MAIN)::" . $this->m_Socket->getErr(); + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Crypto->FreeAllKey(); + $this->m_Socket->close(); + return; + } + $this->m_Log->WriteLog(INFO, "SEND OK"); + + /* -------------------------------------------------- */ + //전문수신 + /* -------------------------------------------------- */ + if (($rtv = $this->m_Socket->recv($head, $body, $tail)) != OK) { + $err_msg = "소켓수신오류(MAIN)::" . $this->m_Socket->getErr(); + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Socket->close(); + $this->NetCancel(); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Crypto->FreeAllKey(); + return; + } + $this->m_Log->WriteLog(INFO, "RECV OK"); + $this->m_Log->WriteLog(INFO, "MSG_FROM_PG:[" . $head . $body . $tail . "]"); + $this->m_Data->m_Body = $body; + + /* -------------------------------------------------- */ + //서명확인 + /* -------------------------------------------------- */ + if (($rtv = $this->m_Crypto->Verify($body, $tail)) != OK) { + $err_msg = "VERIFY FAIL"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Socket->close(); + $this->NetCancel(); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Crypto->FreeAllKey(); + return; + } + $this->m_Log->WriteLog(INFO, "VERIFY OK"); + + /* -------------------------------------------------- */ + //Head 파싱 + /* -------------------------------------------------- */ + if (($rtv = $this->m_Data->ParseHead($head)) != OK) { + $err_msg = "수신전문(HEAD) 파싱 오류"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Socket->close(); + $this->NetCancel(); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Crypto->FreeAllKey(); + return; + } + $this->m_Log->WriteLog(INFO, "PARSE HEAD OK"); + + /* -------------------------------------------------- */ + //Body 파싱 + /* -------------------------------------------------- */ + if (($rtv = $this->m_Data->ParseBody($body, $encrypted, $sessionkey)) != OK) { + $err_msg = "수신전문(Body) 파싱 오류"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Socket->close(); + $this->NetCancel(); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Crypto->FreeAllKey(); + return; + } + $this->m_Log->WriteLog(INFO, "PARSE BODY OK"); + + /* -------------------------------------------------- */ + //복호화 + /* -------------------------------------------------- */ + if ($this->m_type == TYPE_SECUREPAY || $this->m_type == TYPE_FORMPAY || $this->m_type == TYPE_OCBSAVE || + $this->m_type == TYPE_CANCEL || $this->m_type == TYPE_AUTHBILL || $this->m_type == TYPE_FORMAUTH || + $this->m_type == TYPE_REQREALBILL || $this->m_type == TYPE_REPAY || $this->m_type == TYPE_VACCTREPAY || $this->m_type == TYPE_RECEIPT || + $this->m_type == TYPE_AUTH || $this->m_type == TYPE_CAPTURE || $this->m_type == TYPE_ESCROW || + $this->m_type == TYPE_REFUND || $this->m_type == TYPE_INQUIRY || $this->m_type == TYPE_OPENSUB + ) { + if (($rtv = $this->m_Crypto->Decrypt($sessionkey, $encrypted, $decrypted)) != OK) { + $err_msg = "복호화 실패[" . $this->GetResult(NM_RESULTMSG) . "]"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Socket->close(); + $this->NetCancel(); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Crypto->FreeAllKey(); + return; + } + $this->m_Log->WriteLog(INFO, "DECRYPT OK"); + $this->m_Log->WriteLog(DEBUG, "DECRYPT MSG:[" . $decrypted . "]"); + + //Parse Decrypt + $this->m_Data->ParseDecrypt($decrypted); + $this->m_Log->WriteLog(INFO, "DECRYPT PARSE OK"); + } + + /* -------------------------------------------------- */ + //Assign Interface Variables + /* -------------------------------------------------- */ + $this->m_RESULT = $this->m_Data->m_RESULT; + + /* -------------------------------------------------- */ + //ACK + /* -------------------------------------------------- */ + //if( $this->GetResult(NM_RESULTCODE) == "00" && + if ((strcmp($this->GetResult(NM_RESULTCODE), "00") == 0) && + ( $this->m_type == TYPE_SECUREPAY || $this->m_type == TYPE_OCBSAVE || + $this->m_type == TYPE_FORMPAY || $this->m_type == TYPE_RECEIPT + ) + ) { + $this->m_Log->WriteLog(INFO, "WAIT ACK INVOKING"); + if (($rtv = $this->Ack()) != OK) { + //ERROR + $err_msg = "ACK 실패"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Socket->close(); + $this->NetCancel(); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Crypto->FreeAllKey(); + return; + } + $this->m_Log->WriteLog(INFO, "SUCCESS ACK INVOKING"); + } + /* -------------------------------------------------- */ + //PG 공개키가 바뀌었으면 공개키 UPDATE + /* -------------------------------------------------- */ + $pgpubkey = $this->m_Data->GetXMLData(NM_PGPUBKEY); + if ($pgpubkey != "") { + if (($rtv = $this->m_Crypto->UpdatePGPubKey($pgpubkey)) != OK) { + $err_msg = "PG공개키 업데이트 실패"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->m_Data->GTHR($rtv, $err_msg); + } else + $this->m_Log->WriteLog(INFO, "PGPubKey UPDATED!!"); + } + + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Crypto->FreeAllKey(); + $this->m_Socket->close(); + + return; + } + +// End of StartAction + + /* -------------------------------------------------- */ + /* */ + /* 웹페이지 위변조 방지용 데이타 생성 */ + /* */ + /* -------------------------------------------------- */ + + function MakeChkFake() { + $this->m_Crypto = new INICrypto($this->m_REQUEST); + + /* -------------------------------------------------- */ + //상점개인키 로드 + /* -------------------------------------------------- */ + if (($rtv = $this->m_Crypto->LoadMPrivKey()) != OK) { + $err_msg = "상점개인키 로드오류"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Crypto->FreePubKey(); + return; + } + $this->m_Log->WriteLog(INFO, "MERCHANT PRIV KEY LOAD OK"); + + /* -------------------------------------------------- */ + //상점 공개키 로드(SN 를 알기위해!!) + /* -------------------------------------------------- */ + if (($rtv = $this->m_Crypto->LoadMPubKey($m_cert_SN)) != OK) { + $err_msg = "상점공개키 로드오류"; + $this->m_Log->WriteLog(ERROR, $err_msg); + $this->MakeTXErrMsg($rtv, $err_msg); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + return; + } + $this->m_Log->WriteLog(INFO, "MERCHANT PUB KEY LOAD OK [" . $this->m_Data->m_MPubSN . "]"); + + foreach ($this->m_REQUEST as $key => $val) { + if ($key == "inipayhome" || $key == "type" || $key == "debug" || + $key == "admin" || $key == "checkopt" || $key == "enctype") + continue; + if ($key == "mid") + $temp1 .= $key . "=" . $val . "&"; //msg + else + $temp2 .= $key . "=" . $val . "&"; //hashmsg + } + //Make RN + $this->m_RESULT["rn"] = $this->m_Data->MakeRN(); + $temp1 .= "rn=" . $this->m_RESULT["rn"] . "&"; + + $checkMsg = $temp1; + $checkHashMsg = $temp2; + + $retHashStr = Base64Encode(sha1($checkHashMsg, TRUE)); + $checkMsg .= "data=" . $retHashStr; + + $HashMid = Base64Encode(sha1($this->m_REQUEST["mid"], TRUE)); + + $this->m_Crypto->RSAMPrivEncrypt($checkMsg, $RSATemp); + $this->m_RESULT["encfield"] = "enc=" . $RSATemp . "&src=" . Base64Encode($checkHashMsg); + $this->m_RESULT["certid"] = $HashMid . $m_cert_SN; + + $this->m_Log->WriteLog(INFO, "CHKFAKE KEY MAKE OK:" . $this->m_RESULT["rn"]); + + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Crypto->FreeAllKey(); + $this->m_RESULT[NM_RESULTCODE] = "00"; + return; + } + + /* -------------------------------------------------- */ + /* */ + /* 결제처리 확인 메세지 전송 */ + /* */ + /* -------------------------------------------------- */ + + function Ack() { + //ACK용 Data + $this->m_Data->m_sBody = ""; + $this->m_Data->m_sTail = ""; + $this->m_Data->m_sCmd = CMD_REQ_ACK; + + //전문생성(Head) + $this->m_Data->MakeHead(); + $this->m_Log->WriteLog(DEBUG, "MAKE HEAD OK"); + //$this->m_Log->WriteLog( DEBUG, "MSG_TO_PG:[".$this->m_Data->m_sMsg."]" ); + //Send + if (($rtv = $this->m_Socket->send($this->m_Data->m_sMsg)) != OK) { + $err_msg = "ACK 전송오류"; + $this->m_Log->WriteLog(ERROR, $err_msg); + return ACK_CHECKSUM_ERR; + } + //$this->m_Log->WriteLog( DEBUG, "SEND OK" ); + + if (($rtv = $this->m_Socket->recv($head, $body, $tail)) != OK) { + $err_msg = "ACK 수신오류(ACK)"; + $this->m_Log->WriteLog(ERROR, $err_msg); + return ACK_CHECKSUM_ERR; + } + //$this->m_Log->WriteLog( DEBUG, "RECV OK" ); + //$this->m_Log->WriteLog( INFO, "MSG_FROM_PG:[".$recv."]" ); + return OK; + } + + /* -------------------------------------------------- */ + /* */ + /* 망취소 메세지 전송 */ + /* */ + /* -------------------------------------------------- */ + + function NetCancel() { + $this->m_Log->WriteLog(INFO, "WAIT NETCANCEL INVOKING"); + + if ($this->m_type == TYPE_CANCEL || $this->m_type == TYPE_REPAY || $this->m_type == TYPE_VACCTREPAY || $this->m_type == TYPE_RECEIPT || + $this->m_type == TYPE_CONFIRM || $this->m_type == TYPE_OCBQUERY || $this->m_type == TYPE_ESCROW || + $this->m_type == TYPE_CAPTURE || $this->m_type == TYPE_AUTH || $this->m_type == TYPE_AUTHBILL || + ($this->m_type == TYPE_ESCROW && $this->m_Data->m_EscrowType == TYPE_ESCROW_DNY_CNF ) || + $this->m_type == TYPE_NETCANCEL + ) { + $this->m_Log->WriteLog(INFO, "DON'T NEED NETCANCEL"); + return true; + } + + //NetCancel용 Data + $this->m_Data->m_REQUEST["cancelmsg"] = "망취소"; + $body = ""; + $sign = ""; + + $this->m_Data->m_Type = TYPE_CANCEL; //망취소 전문은 취소전문과 같음.헤더만틀리고..쩝~ + //added escrow netcancel, 08.03.11 + if ($this->m_type == TYPE_ESCROW && $this->m_Data->m_EscrowType == TYPE_ESCROW_DLV) + $this->m_Data->m_sCmd = CMD_REQ_DLV_NETC; + else if ($this->m_type == TYPE_ESCROW && $this->m_Data->m_EscrowType == TYPE_ESCROW_CNF) + $this->m_Data->m_sCmd = CMD_REQ_CNF_NETC; + else if ($this->m_type == TYPE_ESCROW && $this->m_Data->m_EscrowType == TYPE_ESCROW_DNY) + $this->m_Data->m_sCmd = CMD_REQ_DNY_NETC; + else + $this->m_Data->m_sCmd = CMD_REQ_NETC; + + $this->m_Data->m_sCrypto = FLAG_CRYPTO_3DES; + + //암호화 + if (($rtv = $this->m_Data->MakeEncrypt($this->m_Crypto)) != OK) { + $err_msg = "암호화 오류"; + $this->m_Log->WriteLog(ERROR, $err_msg); + //$this->MakeTXErrMsg( $rtv, $err_msg ); + return; + } + $this->m_Log->WriteLog(DEBUG, "MAKE ENCRYPT OK[" . $this->m_Data->m_EncBody . "]"); + + //전문생성(Body) + $this->m_Data->MakeBody(); + $this->m_Log->WriteLog(INFO, "MAKE BODY OK"); + + //서명(sign) + if (($rtv = $this->m_Crypto->Sign($this->m_Data->m_sBody, $sign)) != OK) { + $err_msg = "싸인실패"; + $this->m_Log->WriteLog(ERROR, $err_msg); + //$this->MakeTXErrMsg( $rtv, $err_msg ); + return false; + } + $this->m_Data->m_sTail = $sign; + $this->m_Log->WriteLog(INFO, "SIGN OK"); + + //전문생성(Head) + $this->m_Data->MakeHead(); + $this->m_Log->WriteLog(INFO, "MAKE HEAD OK"); + + $this->m_Log->WriteLog(DEBUG, "MSG_TO_PG:[" . $this->m_Data->m_sMsg . "]"); + + //소켓생성 + $this->m_Socket = new INISocket(""); + $this->m_Socket->ip = $this->m_connIP; //기존연결된 IP 사용, 08.03.12 + if (($rtv = $this->m_Socket->open()) != OK) { + $err_msg = "[" . $this->m_Socket->ip . "]소켓연결오류(NETC)::" . $this->m_Socket->getErr(); + $this->m_Log->WriteLog(ERROR, $err_msg); + //$this->MakeTXErrMsg( $rtv, $err_msg ); + $this->m_Log->CloseLog($this->GetResult(NM_RESULTMSG)); + $this->m_Socket->close(); + $this->m_Crypto->FreeAllKey(); + return; + } + $this->m_Log->WriteLog(INFO, "SOCKET CONNECT OK::" . $this->m_Socket->ip); + + //전문송신 + if (($rtv = $this->m_Socket->send($this->m_Data->m_sMsg)) != OK) { + $err_msg = "소켓송신오류(NETC)" . $this->m_Socket->getErr(); + $this->m_Log->WriteLog(ERROR, $err_msg); + //$this->MakeTXErrMsg( $rtv, $err_msg ); + $this->m_Socket->close(); + return false; + } + $this->m_Log->WriteLog(INFO, "SEND OK"); + + //전문수신 + if (($rtv = $this->m_Socket->recv($head, $body, $tail)) != OK) { + $err_msg = "소켓수신오류(NETC)"; + $this->m_Log->WriteLog(ERROR, $err_msg); + //$this->MakeTXErrMsg( $rtv, $err_msg ); + $this->m_Socket->close(); + return false; + } + $this->m_Log->WriteLog(INFO, "RECV OK"); + $this->m_Log->WriteLog(DEBUG, "MSG_FROM_PG:[" . $head . $body . $tail . "]"); + + //서명확인 + if (($rtv = $this->m_Crypto->Verify($body, $tail)) != OK) { + $err_msg = "VERIFY FAIL"; + $this->m_Log->WriteLog(ERROR, $err_msg); + //$this->MakeTXErrMsg( $rtv, $err_msg ); + $this->m_Socket->close(); + return false; + } + $this->m_Log->WriteLog(INFO, "VERIFY OK"); + + //이하 헤더나 본문은 파싱하지 않는다!!!! + //그냥 여기서 끝내자 피곤하다.-_-;; + //Head 파싱 + if (($rtv = $this->m_Data->ParseHead($head)) != OK) { + $err_msg = "수신전문(HEAD) 파싱 오류"; + $this->m_Log->WriteLog(ERROR, $err_msg); + //$this->MakeTXErrMsg( $rtv, $err_msg ); + $this->m_Socket->close(); + return; + } + //Body 파싱 + if (($rtv = $this->m_Data->ParseBody($body, $encrypted, $sessionkey)) != OK) { + $err_msg = "수신전문(Body) 파싱 오류"; + $this->m_Log->WriteLog(ERROR, $err_msg); + //$this->MakeTXErrMsg( $rtv, $err_msg ); + $this->m_Socket->close(); + return; + } + + //if( $this->GetResult(NM_RESULTCODE) == "00" ) + if (strcmp($this->GetResult(NM_RESULTCODE), "00") == 0) + $this->m_Log->WriteLog(INFO, "SUCCESS NETCANCEL"); + else + $this->m_Log->WriteLog(ERROR, "ERROR NETCANCEL[" . $this->GetResult(NM_RESULTMSG) . "]"); + return true; + } + + function MakeIMStr($s, $t) { + $this->m_Crypto = new INICrypto($this->m_REQUEST); + if ($t == "H") + return $this->m_Crypto->MakeIMStr($s, base64_decode(IMHK)); + else if ($t == "J") + return $this->m_Crypto->MakeIMStr($s, base64_decode(IMJK)); + } + + /* -------------------------------------------------- */ + /* */ + /* 에러메세지 Make */ + /* */ + /* -------------------------------------------------- */ + + function MakeTXErrMsg($err_code, $err_msg) { + $this->m_RESULT[NM_RESULTCODE] = "01"; + $this->m_RESULT[NM_RESULTERRORCODE] = $err_code; + $this->m_RESULT[NM_RESULTMSG] = "[" . $err_code . "|" . $err_msg . "]"; + $this->m_Data->GTHR($err_code, $err_msg); + return; + } + +} \ No newline at end of file diff --git a/shop/inicis/libs/INISoc.php b/shop/inicis/libs/INISoc.php new file mode 100644 index 000000000..c073040bc --- /dev/null +++ b/shop/inicis/libs/INISoc.php @@ -0,0 +1,226 @@ +hnd); + if ($errCode != 0) { + //Connection reset by peer + if ($errCode == 104) + $this->bConnected = false; + $errMsg = socket_strerror($errCode); + $this->sSocErr = "(" . $errCode . ")(" . $errMsg . ")"; + socket_clear_error($this->hnd); + } + elseif (strlen($msg)) { + $this->sSocErr = $errMsg; + } + return false; + } + + function __construct($host) { + $this->family = AF_INET; + $this->type = SOCK_STREAM; + $this->protocol = SOL_TCP; + $this->hnd = @socket_create($this->family, $this->type, $this->protocol); + $this->error(); + $this->sBuffer = false; + $this->ip = null; + $this->host = $host; + $this->port = PG_PORT; + } + + function DNSLookUP() { + $starttime = GetMicroTime(); + $ip = @gethostbyname($this->host); + if ($ip == PG_IP || $ip == KSPG_IP) { + $this->ip = $ip; + } else { + $this->error("Hostname " . $this->host . " could not be resolved"); + return DNS_LOOKUP_ERR; + } + + $this->dns_laptime = round(GetMicroTime() - $starttime, 3); + if ($this->dns_laptime > DNS_LOOKUP_TIMEOUT) + return DNS_LOOKUP_TIMEOUT_ERR; + + return OK; + } + + function open() { + //Connect timeout Trickkkkkkkkk ##2. NONBLOCKING NEED , less CPU clocking!!^^ + //modified by ddaemiri, 2007.08.30 + + socket_set_nonblock($this->hnd); + if (!@socket_connect($this->hnd, $this->ip, $this->port)) { + $err = socket_last_error($this->hnd); + $err_str = socket_strerror($err); + if ($err == 106) { //EISCONN + $this->bConnected = true; + socket_set_block($this->hnd); + return OK; + } + //EINPROGRESS( Linux:115, Window Socket:10035, FreeBSD4.10:36, 모든 OS 체크 불가능해서 str으로도 검색 ) + if ($err != ERRCODE_INPROGRESS_LINUX && $err != ERRCODE_INPROGRESS_WIN && + $err != ERRCODE_INPROGRESS_FREEBSD && $err_str != ERRSTR_INPROGRESS) { + $this->error(); + socket_close($this->hnd); + return SOCK_CONN_ERR; + } + } + + $read = array($this->hnd); + $write = array($this->hnd); + $except = NULL; + $rtv = @socket_select($read, $write, $except, TIMEOUT_CONNECT); + if ($rtv == 0) { //TIMEOUT + $this->error(); + socket_close($this->hnd); + return SOCK_TIMEO_ERR; + } else if ($rtv === FALSE) { + $this->error(); + socket_close($this->hnd); + return SOCK_ETC1_ERR; + } + if (in_array($this->hnd, $read) || in_array($this->hnd, $write)) { + if (@socket_get_option($this->hnd, SOL_SOCKET, SO_ERROR) === FALSE) { + $this->error(); + socket_close($this->hnd); + return SOCK_ETC2_ERR; + } + } + $this->bConnected = true; + socket_set_block($this->hnd); + return OK; + } + + function close() { + //if(!$this->bConnected) return; + @socket_shutdown($this->hnd, 2); + @socket_close($this->hnd); + } + + function send($sBuf) { + if (!$this->bConnected) { + $this->error("Socket error. Cannot send data on a closed socket."); + return SOCK_SEND1_ERR; + } + + $vWrite = array($this->hnd); + $vRead = null; + $vExcept = null; + + while (($rtv = @socket_select($vRead, $vWrite, $vExcept, TIMEOUT_WRITE)) === FALSE); + + if ($rtv == 0) { + $this->error(); + //return SOCK_TIMEO_ERR; + return SOCK_CONN_ERR; //modify 2008.04.01 + } + if ($rtv === FALSE) { + $this->error(); + return SOCK_SEND2_ERR; + } + + $tmpBuf = strlen($sBuf) ? $sBuf : $this->sBuffer; + $iBufLen = strlen($tmpBuf); + $res = @socket_send($this->hnd, $tmpBuf, $iBufLen, 0); + + if ($res === FALSE) { + $this->error(); + return SOCK_SEND2_ERR; + } elseif ($res < $iBufLen) { + $tmpBuf = substr($tmpBuf, $res); + $this->send($tmpBuf); + } + return OK; + } + + function WaitRecv(&$recv_buf, $nleft) { + $recv_buf = null; + $read = array($this->hnd); + $buf = null; + while ($nleft > 0) { + $write = null; + $except = null; + + $rtv = @socket_select($read, $write, $except, TIMEOUT_READ); + if ($rtv == 0) { + $this->error(); + return SOCK_TIMEO_ERR; + } else if ($rtv === FALSE) { + $this->error(); + return SOCK_ETC1_ERR; + } + + if (!in_array($this->hnd, $read)) { + $this->error(); + return SOCK_RECV1_ERR; + } + if ($buf = @socket_read($this->hnd, $nleft)) { + $recv_buf .= $buf; + } else { + $this->error(); + return SOCK_RECV1_ERR; + } + $nleft -= strlen($buf); + } + return OK; + } + + function recv(&$head, &$body, &$tail) { + if (!$this->bConnected) { + $this->error("Socket error. Cannot read any data on a closed socket."); + return SOCK_RECV1_ERR; + } + + //------------------------------------------------------ + //head + //------------------------------------------------------ + if (($rtv = $this->WaitRecv($head, MSGHEADER_LEN)) != OK) + return $rtv; + + if ($head == "") + return SOCK_RECV2_ERR; + $body_len = intval(substr($head, 0, BODY_LEN)); + $tail_len = intval(substr($head, BODY_LEN, TAIL_LEN)); + + //------------------------------------------------------ + //body + //------------------------------------------------------ + if (($rtv = $this->WaitRecv($body, $body_len)) != OK) + return $rtv; + + //------------------------------------------------------ + //tail + //------------------------------------------------------ + if (($rtv = $this->WaitRecv($tail, $tail_len)) != OK) + return $rtv; + + return OK; + } + + function getErr() { + return $this->sSocErr; + } + +} \ No newline at end of file diff --git a/shop/inicis/libs/INIStdPayUtil.php b/shop/inicis/libs/INIStdPayUtil.php new file mode 100644 index 000000000..7d30e69d0 --- /dev/null +++ b/shop/inicis/libs/INIStdPayUtil.php @@ -0,0 +1,124 @@ + $value) { + $string .= "&$key=$value"; + } + $string = substr($string, 1); // remove leading "&" + + $sign = hash( "sha256", $string); + + return $sign; + } + + function makeHash($data, $alg) { + // $s = hash_hmac('sha256', $data, 'secret', true); + // return base64_encode($s); + + ///$ret = openssl_digest($data, $alg); + $ret = hash($alg, $data); + return $ret; + } + + // + function makeSignatureAuth($parameters) { + + if ($parameters == null || sizeof($parameters) == 0) { + throw new Exception("

      Parameters can not be empty.

      "); + } + + $stringToSign = ""; //반환용 text + $mid = $parameters["mid"]; //mid + $tstamp = $parameters["tstamp"]; //auth timestamp + $MOID = $parameters["MOID"]; //OID + $TotPrice = $parameters["TotPrice"]; //total price + $tstampKey = substr($parameters["tstamp"], strlen($parameters["tstamp"]) - 1); // timestamp 마지막 자리 1자리 숫자 + + switch (intval($tstampKey)){ + case 1 : + $stringToSign = "MOID=" . $MOID . "&mid=" . $mid . "&tstamp=" . $tstamp ; + break; + case 2 : + $stringToSign = "MOID=" . $MOID . "&tstamp=" . $tstamp . "&mid=" . $mid ; + break; + case 3 : + $stringToSign = "mid=" . $mid . "&MOID=" . $MOID . "&tstamp=" . $tstamp ; + break; + case 4 : + $stringToSign = "mid=" . $mid . "&tstamp=" . $tstamp . "&MOID=" . $MOID ; + break; + case 5 : + $stringToSign = "tstamp=" . $tstamp . "&mid=" . $mid . "&MOID=" . $MOID ; + break; + case 6 : + $stringToSign = "tstamp=" . $tstamp . "&MOID=" . $MOID . "&mid=" . $mid ; + break; + case 7 : + $stringToSign = "TotPrice=" . $TotPrice . "&mid=" . $mid . "&tstamp=" . $tstamp ; + break; + case 8 : + $stringToSign = "TotPrice=" . $TotPrice . "&tstamp=" . $tstamp . "&mid=" . $mid ; + break; + case 9 : + $stringToSign = "TotPrice=" . $TotPrice . "&MOID=" . $MOID . "&tstamp=" . $tstamp ; + break; + case 0 : + $stringToSign = "TotPrice=" . $TotPrice . "&tstamp=" . $tstamp . "&MOID=" . $MOID ; + break; + } + + $signature = hash("sha256", $stringToSign); // sha256 처리하여 hash 암호화 + //$signature = $this->makeHash($stringToSign, "sha256"); // sha256 처리하여 hash 암호화 + + return $signature; + } + +} \ No newline at end of file diff --git a/shop/inicis/libs/INIXml.php b/shop/inicis/libs/INIXml.php new file mode 100644 index 000000000..284f31223 --- /dev/null +++ b/shop/inicis/libs/INIXml.php @@ -0,0 +1,3140 @@ + version 1.0 | +// | Copyright (c) 2001 Michael P. Mehl. All rights reserved. | +// +----------------------------------------------------------------------+ +// | Latest releases are available at http://phpxml.org/. For feedback or | +// | bug reports, please contact the author at mpm@phpxml.org. Thanks! | +// +----------------------------------------------------------------------+ +// | The contents of this file are subject to the Mozilla Public License | +// | Version 1.1 (the "License"); you may not use this file except in | +// | compliance with the License. You may obtain a copy of the License at | +// | http://www.mozilla.org/MPL/ | +// | | +// | Software distributed under the License is distributed on an "AS IS" | +// | basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See | +// | the License for the specific language governing rights and | +// | limitations under the License. | +// | | +// | The Original Code is . | +// | | +// | The Initial Developer of the Original Code is Michael P. Mehl. | +// | Portions created by Michael P. Mehl are Copyright (C) 2001 Michael | +// | P. Mehl. All Rights Reserved. | +// +----------------------------------------------------------------------+ +// | Authors: | +// | Michael P. Mehl | +// +----------------------------------------------------------------------+ +// + +/** + * Class for accessing XML data through the XPath language. + * + * This class offers methods for accessing the nodes of a XML document using + * the XPath language. You can add or remove nodes, set or modify their + * content and their attributes. No additional PHP extensions like DOM XML + * or something similar are required to use these features. + * + * @link http://www.phpxml.org/ Latest release of this class + * @link http://www.w3.org/TR/xpath W3C XPath Recommendation + * @copyright Copyright (c) 2001 Michael P. Mehl. All rights reserved. + * @author Michael P. Mehl + * @version 1.0 (2001-03-08) + * @access public + */ + +/** + * + * 해당 라이브러리는 절대 수정되어서는 안됩니다. + * 임의로 수정된 코드에 대한 책임은 전적으로 수정자에게 있음을 알려드립니다. + * + */ +class XML { + + /** + * List of all document nodes. + * + * This array contains a list of all document nodes saved as an + * associative array. + * + * @access private + * @var array + */ + var $nodes = array(); + + /** + * List of document node IDs. + * + * This array contains a list of all IDs of all document nodes that + * are used for counting when adding a new node. + * + * @access private + * @var array + */ + var $ids = array(); + + /** + * Current document path. + * + * This variable saves the current path while parsing a XML file and adding + * the nodes being read from the file. + * + * @access private + * @var string + */ + var $path = ""; + + /** + * Current document position. + * + * This variable counts the current document position while parsing a XML + * file and adding the nodes being read from the file. + * + * @access private + * @var int + */ + var $position = 0; + + /** + * Path of the document root. + * + * This string contains the full path to the node that acts as the root + * node of the whole document. + * + * @access private + * @var string + */ + var $root = ""; + + /** + * Current XPath expression. + * + * This string contains the full XPath expression being parsed currently. + * + * @access private + * @var string + */ + var $xpath = ""; + + /** + * List of entities to be converted. + * + * This array contains a list of entities to be converted when an XPath + * expression is evaluated. + * + * @access private + * @var array + */ + var $entities = array("&" => "&", "<" => "<", ">" => ">", + "'" => "&apos", '"' => """); + + /** + * List of supported XPath axes. + * + * This array contains a list of all valid axes that can be evaluated in an + * XPath expression. + * + * @access private + * @var array + */ + var $axes = array("child", "descendant", "parent", "ancestor", + "following-sibling", "preceding-sibling", "following", "preceding", + "attribute", "namespace", "self", "descendant-or-self", + "ancestor-or-self"); + + /** + * List of supported XPath functions. + * + * This array contains a list of all valid functions that can be evaluated + * in an XPath expression. + * + * @access private + * @var array + */ + var $functions = array("last", "position", "count", "id", "name", + "string", "concat", "starts-with", "contains", "substring-before", + "substring-after", "substring", "string-length", "translate", + "boolean", "not", "true", "false", "lang", "number", "sum", "floor", + "ceiling", "round", "text"); + + /** + * List of supported XPath operators. + * + * This array contains a list of all valid operators that can be evaluated + * in a predicate of an XPath expression. The list is ordered by the + * precedence of the operators (lowest precedence first). + * + * @access private + * @var array + */ + var $operators = array(" or ", " and ", "=", "!=", "<=", "<", ">=", ">", + "+", "-", "*", " div ", " mod "); + var $xml_node = array(); + + /** + * Constructor of the class. + * + * This constructor initializes the class and, when a filename is given, + * tries to read and parse the given file. + * + * @access public + * @author Michael P. Mehl + * @param string $file Path and name of the file to read and parsed. + * @see load_xml() + */ + //modify by ddaemiri, 2007.05.28 + //load_file -> load_xml로 파일 및 string 으로 모두 입력받을 수 있음. + function __construct($file = "") { + // Check whether a file was given. + if (!empty($file)) { + // Load the XML file. + return $this->load_xml($file, ""); + } + } + + /** + * Reads a file and parses the XML data. + * + * This method reads the content of a XML file, tries to parse its + * content and upon success stores the information retrieved from + * the file into an array. + * + * @access public + * @author Michael P. Mehl + * @param string $file Path and name of the file to be read and parsed. + * @see handle_start_element(), handle_end_element(), + * handle_character_data() + */ + function remove_ctrl($string) { + for ($i = 0; $i < strlen($string); $i++) { + $chr = $string[$i]; + $ord = ord($chr); + if ($ord < 10) + $string[$i] = " "; + else + $string[$i] = $chr; + } + return trim($string); + } + //modify by ddaemiri, 2007.05.28 + //load_file -> load_xml로 파일 및 string 으로 모두 입력받을 수 있음. + function load_xml($file, $str) { + // Check whether the file exists and is readable. + if ((file_exists($file) && is_readable($file)) || $str != "") { + // Read the content of the file. + if ($str == "") + $content = implode("", file($file)); + else + $content = $this->remove_ctrl($str); + + // Check whether content has been read. + if (!empty($content)) { + // Create an XML parser. + $parser = xml_parser_create(); + + // Set the options for parsing the XML data. + xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); + + // Set the object for the parser. + xml_set_object($parser, $this); + + // Set the element handlers for the parser. + xml_set_element_handler($parser, "handle_start_element", "handle_end_element"); + xml_set_character_data_handler($parser, "handle_character_data"); + + // Parse the XML file. + if (!xml_parse($parser, $content, true)) { + // Display an error message. + $this->display_error("XML error in file %s, line %d: %s", $file, xml_get_current_line_number($parser), xml_error_string(xml_get_error_code($parser))); + } + + // Free the parser. + xml_parser_free($parser); + + return OK; + } + } else { + // Display an error message. + //$this->display_error("File %s could not be found or read.", $file); + return RESULT_MSG_FORMAT_ERR; + } + } + + //modify by ddaemiri, 2007.05.28 + //charset 추가( header 생성 ) + function make_xml($highlight = array(), $root = "", $level = 0, $charset = "UTF-8") { + // header 추가 + $header = "" . "\n"; + $body = $this->get_xml($highlight, $root, $level); + return $header . $body; + } + + /** + * Generates a XML file with the content of the current document. + * + * This method creates a string containing the XML data being read + * and modified by this class before. This string can be used to save + * a modified document back to a file or doing other nice things with + * it. + * + * @access public + * @author Michael P. Mehl + * @param array $highlight Array containing a list of full document + * paths of nodes to be highlighted by ... tags + * in the generated XML string. + * @param string $root While doing a recursion with this method, this + * parameter is used for internal purpose. + * @param int $level While doing a recursion with this method, this + * parameter is used for internal purpose. + * @return string The returned string contains well-formed XML data + * representing the content of this document. + * @see load_xml(), evaluate(), get_content() + */ + //modify by ddaemiri, 2007.05.28 + //get_file -> get_xml 로 함수이름 변경. + function get_xml($highlight = array(), $root = "", $level = 0) { + + // Create a string to save the generated XML data. + $xml = ""; + + // Create two strings containing the tags for highlighting a node. + $highlight_start = ""; + $highlight_end = ""; + + // Generate a string to be displayed before the tags. + $before = ""; + + // Calculate the amount of whitespaces to display. + for ($i = 0; $i < ( $level * 2 ); $i++) { + // Add a whitespaces to the string. + $before .= " "; + } + + // Check whether a root node is given. + if (empty($root)) { + // Set it to the document root. + $root = $this->root; + } + + // Check whether the node is selected. + $selected = in_array($root, $highlight); + + // Now add the whitespaces to the XML data. + $xml .= $before; + + // Check whether the node is selected. + if ($selected) { + // Add the highlight code to the XML data. + $xml .= $highlight_start; + } + + // Now open the tag. + $xml .= "<" . $this->nodes[$root]["name"]; + + $count_root_attributes = (isset($this->nodes[$root]["attributes"]) && is_array($this->nodes[$root]["attributes"])) ? count($this->nodes[$root]["attributes"]) : 0; + // Check whether there are attributes for this node. + if ($count_root_attributes > 0) { + // Run through all attributes. + foreach ((array) $this->nodes[$root]["attributes"] as $key => $value) { + // Check whether this attribute is highlighted. + if (in_array($root . "/attribute::" . $key, $highlight)) { + // Add the highlight code to the XML data. + $xml .= $highlight_start; + } + + // Add the attribute to the XML data. + $xml .= " " . $key . "=\"" . trim(stripslashes($value)) . "\""; + + // Check whether this attribute is highlighted. + if (in_array($root . "/attribute::" . $key, $highlight)) { + // Add the highlight code to the XML data. + $xml .= $highlight_end; + } + } + } + + // Check whether the node contains character data or has children. + if ($this->nodes[$root]["text"] == "" && + !isset($this->nodes[$root]["children"])) { + // Add the end to the tag. + $xml .= "/"; + } + + // Close the tag. + //$xml .= ">\n"; + $xml .= ">"; + + // Check whether the node is selected. + if ($selected) { + // Add the highlight code to the XML data. + $xml .= $highlight_end; + } + + // Check whether the node contains character data. + if ($this->nodes[$root]["text"] != "") { + // Add the character data to the XML data. + //$xml .= $before." ".$this->nodes[$root]["text"]."\n"; + //$xml .= $before.$this->nodes[$root]["text"]; + $xml .= $this->nodes[$root]["text"]; + } + + // Check whether the node has children. + if (isset($this->nodes[$root]["children"])) { + // Run through all children with different names. + foreach ($this->nodes[$root]["children"] as $child => $pos) { + // Run through all children with the same name. + for ($i = 1; $i <= $pos; $i++) { + // Generate the full path of the child. + $fullchild = $root . "/" . $child . "[" . $i . "]"; + + // Add the child's XML data to the existing data. + $xml .= "\n\t" . $this->get_xml($highlight, $fullchild, $level + 1); + } + } + } + + // Check whether there are attributes for this node. + if ($this->nodes[$root]["text"] != "" || + isset($this->nodes[$root]["children"])) { + // Add the whitespaces to the XML data. + //$xml .= $before; + // Check whether the node is selected. + if ($selected) { + // Add the highlight code to the XML data. + $xml .= $highlight_start; + } + + // Add the closing tag. + $xml .= "nodes[$root]["name"] . ">"; + + // Check whether the node is selected. + if ($selected) { + // Add the highlight code to the XML data. + $xml .= $highlight_end; + } + + // Add a linebreak. + //$xml .= "\n"; + } + + // Return the XML data. + return $xml; + } + + /** + * Adds a new node to the XML document. + * + * This method adds a new node to the tree of nodes of the XML document + * being handled by this class. The new node is created according to the + * parameters passed to this method. + * + * @access public + * @author Michael P. Mehl + * @param string $content Full path of the parent, to which the new + * node should be added as a child. + * @param string $name Name of the new node. + * @return string The string returned by this method will contain the + * full document path of the created node. + * @see remove_node(), evaluate() + */ + function add_node($context, $name, $value = "", $attr_arr = NULL) { + // Check whether a name for this element is already set. + if (empty($this->root)) { + // Use this tag as the root element. + $this->root = "/" . $name . "[1]"; + } + + // Calculate the full path for this element. + $path = $context . "/" . $name; + + // Set the relative context and the position. + + $othis_ids_path = isset($this->ids[$path]) ? (int) $this->ids[$path] : 0; + $position = ++$othis_ids_path; + $relative = $name . "[" . $position . "]"; + + // Calculate the full path. + $fullpath = $context . "/" . $relative; + + // Calculate the context position, which is the position of this + // element within elements of the same name in the parent node. + $this->nodes[$fullpath]["context-position"] = $position; + + // Calculate the position for the following and preceding axis + // detection. + $othis_document_position = isset($this->nodes[$context]["document-position"]) ? (int) $this->nodes[$context]["document-position"] : 0; + $this->nodes[$fullpath]["document-position"] = $othis_document_position + 1; + + // Save the information about the node. + $this->nodes[$fullpath]["name"] = $name; + $this->nodes[$fullpath]["text"] = ""; + $this->nodes[$fullpath]["parent"] = $context; + + // Add this element to the element count array. + if (! (isset($this->nodes[$context]["children"][$name]) && $this->nodes[$context]["children"][$name])) { + // Set the default name. + $this->nodes[$context]["children"][$name] = 1; + } else { + // Calculate the name. + $this->nodes[$context]["children"][$name] = $this->nodes[$context]["children"][$name] + 1; + } + + if ($value != "" && is_array($attr_arr)) { + $this->set_attributes($fullpath, $attr_arr); + if ($attr_arr["urlencode"] == "1") + $value = urlencode($value); + } + if ($value != "") { + $this->set_content($fullpath, $value); + } + + // Return the path of the new node. + return $fullpath; + } + + /** + * Removes a node from the XML document. + * + * This method removes a node from the tree of nodes of the XML document. + * If the node is a document node, all children of the node and its + * character data will be removed. If the node is an attribute node, + * only this attribute will be removed, the node to which the attribute + * belongs as well as its children will remain unmodified. + * + * @access public + * @author Michael P. Mehl + * @param string $node Full path of the node to be removed. + * @see add_node(), evaluate() + */ + function remove_node($node) { + // Check whether the node is an attribute node. + if (preg_match("/attribute::/", $node)) { + // Get the path to the attribute node's parent. + $parent = $this->prestr($node, "/attribute::"); + + // Get the name of the attribute. + $attribute = $this->afterstr($node, "/attribute::"); + + // Check whether the attribute exists. + if (isset($this->nodes[$parent]["attributes"][$attribute])) { + // Create a new array. + $new = array(); + + // Run through the existing attributes. + foreach ($this->nodes[$parent]["attributes"] + as $key => $value) { + // Check whether it's the attribute to remove. + if ($key != $attribute) { + // Add it to the new array again. + $new[$key] = $value; + } + } + + // Save the new attributes. + $this->nodes[$parent]["attributes"] = $new; + } + } else { + // Create an associative array, which contains information about + // all nodes that required to be renamed. + $rename = array(); + + // Get the name, the parent and the siblings of current node. + $name = $this->nodes[$node]["name"]; + $parent = $this->nodes[$node]["parent"]; + $siblings = $this->nodes[$parent]["children"][$name]; + + // Decrease the number of children. + $this->nodes[$parent]["children"][$name] --; + + // Create a counter for renumbering the siblings. + $counter = 1; + + // Now run through the siblings. + for ($i = 1; $i <= $siblings; $i++) { + // Create the name of the sibling. + $sibling = $parent . "/" . $name . "[" . $i . "]"; + + // Check whether it's the name of the current node. + if ($sibling != $node) { + // Create the new name for the sibling. + $new = $parent . "/" . $name . "[" . $counter . "]"; + + // Increase the counter. + $counter++; + + // Add the old and the new name to the list of nodes + // to be renamed. + $rename[$sibling] = $new; + } + } + + // Create an array for saving the new node-list. + $nodes = array(); + + // Now run through through the existing nodes. + foreach ($this->nodes as $name => $values) { + // Check the position of the path of the node to be deleted + // in the path of the current node. + $position = strpos($name, $node); + + // Check whether it's not the node to be deleted. + if ($position === false) { + // Run through the array of nodes to be renamed. + foreach ($rename as $old => $new) { + // Check whether this node and it's parent requires to + // be renamed. + $name = str_replace($old, $new, $name); + $values["parent"] = str_replace($old, $new, $values["parent"]); + } + + // Add the node to the list of nodes. + $nodes[$name] = $values; + } + } + + // Save the new array of nodes. + $this->nodes = $nodes; + } + } + + /** + * Add content to a node. + * + * This method adds content to a node. If it's an attribute node, then + * the value of the attribute will be set, otherwise the character data of + * the node will be set. The content is appended to existing content, + * so nothing will be overwritten. + * + * @access public + * @author Michael P. Mehl + * @param string $path Full document path of the node. + * @param string $value String containing the content to be added. + * @see get_content(), evaluate() + */ + function add_content($path, $value) { + // Check whether it's an attribute node. + if (preg_match("/attribute::/", $path)) { + // Get the path to the attribute node's parent. + $parent = $this->prestr($path, "/attribute::"); + + // Get the parent node. + $parent = $this->nodes[$parent]; + + // Get the name of the attribute. + $attribute = $this->afterstr($path, "/attribute::"); + + // Set the attribute. + $parent["attributes"][$attribute] .= $value; + } else { + // Set the character data of the node. + $this->nodes[$path]["text"] .= $value; + } + } + + /** + * Set the content of a node. + * + * This method sets the content of a node. If it's an attribute node, then + * the value of the attribute will be set, otherwise the character data of + * the node will be set. Existing content will be overwritten. + * + * @access public + * @author Michael P. Mehl + * @param string $path Full document path of the node. + * @param string $value String containing the content to be set. + * @see get_content(), evaluate() + */ + function set_content($path, $value) { + // Check whether it's an attribute node. + if (preg_match("/attribute::/", $path)) { + // Get the path to the attribute node's parent. + $parent = $this->prestr($path, "/attribute::"); + + // Get the parent node. + $parent = $this->nodes[$parent]; + + // Get the name of the attribute. + $attribute = $this->afterstr($path, "/attribute::"); + + // Set the attribute. + $parent["attributes"][$attribute] = $value; + } else { + // Set the character data of the node. + $this->nodes[$path]["text"] = strtr($value, $this->entities); + } + } + + /** + * Retrieves the content of a node. + * + * This method retrieves the content of a node. If it's an attribute + * node, then the value of the attribute will be retrieved, otherwise + * it'll be the character data of the node. + * + * @access public + * @author Michael P. Mehl + * @param string $path Full document path of the node, from which the + * content should be retrieved. + * @return string The returned string contains either the value or the + * character data of the node. + * @see set_content(), evaluate() + */ + function get_content($path) { + // Check whether it's an attribute node. + if (preg_match("/attribute::/", $path)) { + // Get the path to the attribute node's parent. + $parent = $this->prestr($path, "/attribute::"); + + // Get the parent node. + $parent = $this->nodes[$parent]; + + // Get the name of the attribute. + $attribute = $this->afterstr($path, "/attribute::"); + + // Get the attribute. + $attribute = $parent["attributes"][$attribute]; + + // Return the value of the attribute. + return $attribute; + } else { + // Return the cdata of the node. + return stripslashes($this->nodes[$path]["text"]); + } + } + + /** + * Add attributes to a node. + * + * This method adds attributes to a node. Existing attributes will not be + * overwritten. + * + * @access public + * @author Michael P. Mehl + * @param string $path Full document path of the node, the attributes + * should be added to. + * @param array $attributes Associative array containing the new + * attributes for the node. + * @see set_content(), get_content() + */ + function add_attributes($path, $attributes) { + // Add the attributes to the node. + $this->nodes[$path]["attributes"] = array_merge($attributes, $this->nodes[$path]["attributes"]); + } + + /** + * Sets the attributes of a node. + * + * This method sets the attributes of a node and overwrites all existing + * attributes by doing this. + * + * @access public + * @author Michael P. Mehl + * @param string $path Full document path of the node, the attributes + * of which should be set. + * @param array $attributes Associative array containing the new + * attributes for the node. + * @see set_content(), get_content() + */ + function set_attributes($path, $attributes) { + // Set the attributes of the node. + $this->nodes[$path]["attributes"] = $attributes; + } + + /** + * Retrieves a list of all attributes of a node. + * + * This method retrieves a list of all attributes of the node specified in + * the argument. + * + * @access public + * @author Michael P. Mehl + * @param string $path Full document path of the node, from which the + * list of attributes should be retrieved. + * @return array The returned associative array contains the all + * attributes of the specified node. + * @see get_content(), $nodes, $ids + */ + function get_attributes($path) { + // Return the attributes of the node. + return $this->nodes[$path]["attributes"]; + } + + /** + * Retrieves the name of a document node. + * + * This method retrieves the name of document node specified in the + * argument. + * + * @access public + * @author Michael P. Mehl + * @param string $path Full document path of the node, from which the + * name should be retrieved. + * @return string The returned array contains the name of the specified + * node. + * @see get_content(), $nodes, $ids + */ + function get_name($path) { + // Return the name of the node. + return $this->nodes[$path]["name"]; + } + + /** + * Evaluates an XPath expression. + * + * This method tries to evaluate an XPath expression by parsing it. A + * XML document has to be read before this method is able to work. + * + * @access public + * @author Michael P. Mehl + * @param string $path XPath expression to be evaluated. + * @param string $context Full path of a document node, starting + * from which the XPath expression should be evaluated. + * @return array The returned array contains a list of the full + * document paths of all nodes that match the evaluated + * XPath expression. + * @see $nodes, $ids + */ + function evaluate($path, $context = "") { + // Remove slashes and quote signs. + $path = stripslashes($path); + $path = str_replace("\"", "", $path); + $path = str_replace("'", "", $path); + + // Split the paths into different paths. + $paths = $this->split_paths($path); + + // Create an empty set to save the result. + $result = array(); + + // Run through all paths. + foreach ($paths as $path) { + // Trim the path. + $path = trim($path); + + // Save the current path. + $this->xpath = $path; + + // Convert all entities. + $path = strtr($path, array_flip($this->entities)); + + // Split the path at every slash. + $steps = $this->split_steps($path); + + // Check whether the first element is empty. + if (empty($steps[0])) { + // Remove the first and empty element. + array_shift($steps); + } + + // Start to evaluate the steps. + $nodes = $this->evaluate_step($context, $steps); + + // Remove duplicated nodes. + $nodes = array_unique($nodes); + + // Add the nodes to the result set. + $result = array_merge($result, $nodes); + } + + // Return the result. + return $result; + } + + /** + * Handles opening XML tags while parsing. + * + * While parsing a XML document for each opening tag this method is + * called. It'll add the tag found to the tree of document nodes. + * + * @access private + * @author Michael P. Mehl + * @param int $parser Handler for accessing the current XML parser. + * @param string $name Name of the opening tag found in the document. + * @param array $attributes Associative array containing a list of + * all attributes of the tag found in the document. + * @see handle_end_element(), handle_character_data(), $nodes, $ids + */ + function handle_start_element($parser, $name, $attributes) { + // Add a node. + $this->path = $this->add_node($this->path, $name); + + // Set the attributes. + // Xpath로 안가져온다. 한달을 헛지랄 했다!! + // modifyed by ddaemiri, 2007.09.03 + // $this->set_attributes($this->path, $attributes); + // add array, added by ddaemiri, 2007.09.03 + $arr = preg_split("/[\/]+/", $this->path, -1, PREG_SPLIT_NO_EMPTY); + $this->xml_node[$arr[count($arr) - 1]]["attr"] = $attributes; + } + + /** + * Handles closing XML tags while parsing. + * + * While parsing a XML document for each closing tag this method is + * called. + * + * @access private + * @author Michael P. Mehl + * @param int $parser Handler for accessing the current XML parser. + * @param string $name Name of the closing tag found in the document. + * @see handle_start_element(), handle_character_data(), $nodes, $ids + */ + function handle_end_element($parser, $name) { + // Jump back to the parent element. + $this->path = substr($this->path, 0, strrpos($this->path, "/")); + } + + /** + * Handles character data while parsing. + * + * While parsing a XML document for each character data this method + * is called. It'll add the character data to the document tree. + * + * @access private + * @author Michael P. Mehl + * @param int $parser Handler for accessing the current XML parser. + * @param string $text Character data found in the document. + * @see handle_start_element(), handle_end_element(), $nodes, $ids + */ + function handle_character_data($parser, $text) { + // Replace entities. + $text = strtr($text, $this->entities); + + // Save the text. + // Xpath로 안가져온다. 한달을 헛지랄 했다!! + // modifyed by ddaemiri, 2007.09.03 + //$this->add_content($this->path, addslashes(trim($text))); + // add array, added by ddaemiri, 2007.09.03 + $arr = preg_split("/[\/]+/", $this->path, -1, PREG_SPLIT_NO_EMPTY); + //edited by ddaemiri. libexpat은 \n을 분리자로 인식 + //$this->xml_node[$arr[count($arr)-1]]["text"] = addslashes(trim($text)); + $othis_count_text = isset($this->xml_node[$arr[count($arr) - 1]]["text"]) ? $this->xml_node[$arr[count($arr) - 1]]["text"] : ''; + $this->xml_node[$arr[count($arr) - 1]]["text"] = $othis_count_text . addslashes(trim($text)); + } + + /** + * Splits an XPath expression into its different expressions. + * + * This method splits an XPath expression. Each expression can consists of + * list of expression being separated from each other by a | character. + * + * @access private + * @author Michael P. Mehl + * @param string $expression The complete expression to be splitted + * into its different expressions. + * @return array The array returned from this method contains a list + * of all expressions found in the expression passed to this + * method as a parameter. + * @see evalute() + */ + function split_paths($expression) { + // Create an empty array. + $paths = array(); + + // Save the position of the slash. + $position = -1; + + // Run through the expression. + do { + // Search for a slash. + $position = $this->search_string($expression, "|"); + + // Check whether a | was found. + if ($position >= 0) { + // Get the left part of the expression. + $left = substr($expression, 0, $position); + $right = substr($expression, $position + 1); + + // Add the left value to the steps. + $paths[] = $left; + + // Reduce the expression to the right part. + $expression = $right; + } + } while ($position > -1); + + // Add the remaing expression to the list of steps. + $paths[] = $expression; + + // Return the steps. + return $paths; + } + + /** + * Splits an XPath expression into its different steps. + * + * This method splits an XPath expression. Each expression can consists of + * list of steps being separated from each other by a / character. + * + * @access private + * @author Michael P. Mehl + * @param string $expression The complete expression to be splitted + * into its different steps. + * @return array The array returned from this method contains a list + * of all steps found in the expression passed to this + * method as a parameter. + * @see evalute() + */ + function split_steps($expression) { + // Create an empty array. + $steps = array(); + + // Replace a double slashes, because they'll cause problems otherwise. + $expression = str_replace("//@", "/descendant::*/@", $expression); + $expression = str_replace("//", "/descendant::", $expression); + + // Save the position of the slash. + $position = -1; + + // Run through the expression. + do { + // Search for a slash. + $position = $this->search_string($expression, "/"); + + // Check whether a slash was found. + if ($position >= 0) { + // Get the left part of the expression. + $left = substr($expression, 0, $position); + $right = substr($expression, $position + 1); + + // Add the left value to the steps. + $steps[] = $left; + + // Reduce the expression to the right part. + $expression = $right; + } + } while ($position > -1); + + // Add the remaing expression to the list of steps. + $steps[] = $expression; + + // Return the steps. + return $steps; + } + + /** + * Retrieves axis information from an XPath expression step. + * + * This method tries to extract the name of the axis and its node-test + * from a given step of an XPath expression at a given node. + * + * @access private + * @author Michael P. Mehl + * @param string $step String containing a step of an XPath expression. + * @param string $node Full document path of the node on which the + * step is executed. + * @return array This method returns an array containing information + * about the axis found in the step. + * @see evaluate_step() + */ + function get_axis($step, $node) { + // Create an array to save the axis information. + $axis = array( + "axis" => "", + "node-test" => "", + "predicate" => array() + ); + + // Check whether there are predicates. + if (preg_match("/\[/", $step)) { + // Get the predicates. + $predicates = substr($step, strpos($step, "[")); + + // Reduce the step. + $step = $this->prestr($step, "["); + + // Try to split the predicates. + $predicates = str_replace("][", "]|[", $predicates); + $predicates = explode("|", $predicates); + + // Run through all predicates. + foreach ($predicates as $predicate) { + // Remove the brackets. + $predicate = substr($predicate, 1, strlen($predicate) - 2); + + // Add the predicate to the list of predicates. + $axis["predicate"][] = $predicate; + } + } + + // Check whether the axis is given in plain text. + if ($this->search_string($step, "::") > -1) { + // Split the step to extract axis and node-test. + $axis["axis"] = $this->prestr($step, "::"); + $axis["node-test"] = $this->afterstr($step, "::"); + } else { + // Check whether the step is empty. + if (empty($step)) { + // Set it to the default value. + $step = "."; + } + + // Check whether is an abbreviated syntax. + if ($step == "*") { + // Use the child axis and select all children. + $axis["axis"] = "child"; + $axis["node-test"] = "*"; + } + //elseif ( ereg("\(", $step) ) + //elseif ( preg_match("\(", $step) ) + elseif (preg_match("/\(/", $step)) { + // Check whether it's a function. + if ($this->is_function($this->prestr($step, "("))) { + // Get the position of the first bracket. + $start = strpos($step, "("); + $end = strpos($step, ")", $start); + + // Get everything before, between and after the brackets. + $before = substr($step, 0, $start); + $between = substr($step, $start + 1, $end - $start - 1); + $after = substr($step, $end + 1); + + // Trim each string. + $before = trim($before); + $between = trim($between); + $after = trim($after); + + // Save the evaluated function. + $axis["axis"] = "function"; + $axis["node-test"] = $this->evaluate_function($before, $between, $node); + } else { + // Use the child axis and a function. + $axis["axis"] = "child"; + $axis["node-test"] = $step; + } + } + //elseif ( eregi("^@", $step) ) + //elseif ( preg_match("^@/i", $step) ) + elseif (preg_match("/^@/i", $step)) { + // Use the attribute axis and select the attribute. + $axis["axis"] = "attribute"; + $axis["node-test"] = substr($step, 1); + } + //elseif ( eregi("\]$", $step) ) + //elseif ( preg_match("\]$/i", $step) ) + elseif (preg_match("/\]$/i", $step)) { + // Use the child axis and select a position. + $axis["axis"] = "child"; + $axis["node-test"] = substr($step, strpos($step, "[")); + } elseif ($step == ".") { + // Select the self axis. + $axis["axis"] = "self"; + $axis["node-test"] = "*"; + } elseif ($step == "..") { + // Select the parent axis. + $axis["axis"] = "parent"; + $axis["node-test"] = "*"; + } + //elseif ( ereg("^[a-zA-Z0-9\-_]+$", $step) ) + //elseif ( preg_match("^[a-zA-Z0-9\-_]+$", $step) ) + elseif (preg_match("/^[a-zA-Z0-9\-_]+$/", $step)) { + // Select the child axis and the child. + $axis["axis"] = "child"; + $axis["node-test"] = $step; + } else { + // Use the child axis and a name. + $axis["axis"] = "child"; + $axis["node-test"] = $step; + } + } + + // Check whether it's a valid axis. + if (!in_array($axis["axis"], array_merge($this->axes, array("function")))) { + // Display an error message. + $this->display_error("While parsing an XPath expression, in " . + "the step \"%s\" the invalid axis \"%s\" was found.", str_replace($step, "" . $step . "", $this->xpath), # + $axis["axis"]); + } + + // Return the axis information. + return $axis; + } + + /** + * Looks for a string within another string. + * + * This method looks for a string within another string. Brackets in the + * string the method is looking through will be respected, which means that + * only if the string the method is looking for is located outside of + * brackets, the search will be successful. + * + * @access private + * @author Michael P. Mehl + * @param string $term String in which the search shall take place. + * @param string $expression String that should be searched. + * @return int This method returns -1 if no string was found, otherwise + * the offset at which the string was found. + * @see evaluate_step() + */ + function search_string($term, $expression) { + // Create a new counter for the brackets. + $brackets = 0; + + // Run through the string. + for ($i = 0; $i < strlen($term); $i++) { + // Get the character at the position of the string. + $character = substr($term, $i, 1); + + // Check whether it's a breacket. + if (( $character == "(" ) || ( $character == "[" )) { + // Increase the number of brackets. + $brackets++; + } elseif (( $character == ")" ) || ( $character == "]" )) { + // Decrease the number of brackets. + $brackets--; + } elseif ($brackets == 0) { + // Check whether we can find the expression at this index. + if (substr($term, $i, strlen($expression)) == $expression) { + // Return the current index. + return $i; + } + } + } + + // Check whether we had a valid number of brackets. + if ($brackets != 0) { + // Display an error message. + $this->display_error("While parsing an XPath expression, in the " . + "predicate \"%s\", there was an invalid number of brackets.", str_replace($term, "" . $term . "", $this->xpath)); + } + + // Nothing was found. + return (-1); + } + + /** + * Checks for a valid function name. + * + * This method check whether an expression contains a valid name of an + * XPath function. + * + * @access private + * @author Michael P. Mehl + * @param string $expression Name of the function to be checked. + * @return boolean This method returns true if the given name is a valid + * XPath function name, otherwise false. + * @see evaluate() + */ + function is_function($expression) { + // Check whether it's in the list of supported functions. + if (in_array($expression, $this->functions)) { + // It's a function. + return true; + } else { + // It's not a function. + return false; + } + } + + /** + * Evaluates a step of an XPath expression. + * + * This method tries to evaluate a step from an XPath expression at a + * specific context. + * + * @access private + * @author Michael P. Mehl + * @param string $context Full document path of the context from + * which starting the step should be evaluated. + * @param array $steps Array containing the remaining steps of the + * current XPath expression. + * @return array This method returns an array containing all nodes + * that are the result of evaluating the given XPath step. + * @see evaluate() + */ + function evaluate_step($context, $steps) { + // Create an empty array for saving the nodes found. + $nodes = array(); + + // Check whether the context is an array of contexts. + if (is_array($context)) { + // Run through the array. + foreach ($context as $path) { + // Call this method for this single path. + $nodes = array_merge($nodes, $this->evaluate_step($path, $steps)); + } + } else { + // Get this step. + $step = array_shift($steps); + + // Create an array to save the new contexts. + $contexts = array(); + + // Get the axis of the current step. + $axis = $this->get_axis($step, $context); + + // Check whether it's a function. + if ($axis["axis"] == "function") { + // Check whether an array was return by the function. + if (is_array($axis["node-test"])) { + // Add the results to the list of contexts. + $contexts = array_merge($contexts, $axis["node-test"]); + } else { + // Add the result to the list of contexts. + $contexts[] = $axis["node-test"]; + } + } else { + // Create the name of the method. + $method = "handle_axis_" . str_replace("-", "_", $axis["axis"]); + + // Check whether the axis handler is defined. + if (!method_exists($this, $method)) { + // Display an error message. + $this->display_error("While parsing an XPath expression, " . + "the axis \"%s\" could not be handled, because this " . + "version does not support this axis.", $axis["axis"]); + } + + // Perform an axis action. + $contexts = call_user_func(array($this, $method), $axis, $context); + + // Check whether there are predicates. + if (count($axis["predicate"]) > 0) { + // Check whether each node fits the predicates. + $contexts = $this->check_predicates($contexts, $axis["predicate"]); + } + } + + // Check whether there are more steps left. + if (count($steps) > 0) { + // Continue the evaluation of the next steps. + $nodes = $this->evaluate_step($contexts, $steps); + } else { + // Save the found contexts. + $nodes = $contexts; + } + } + + // Return the nodes found. + return $nodes; + } + + /** + * Evaluates an XPath function + * + * This method evaluates a given XPath function with its arguments on a + * specific node of the document. + * + * @access private + * @author Michael P. Mehl + * @param string $function Name of the function to be evaluated. + * @param string $arguments String containing the arguments being + * passed to the function. + * @param string $node Full path to the document node on which the + * function should be evaluated. + * @return mixed This method returns the result of the evaluation of + * the function. Depending on the function the type of the + * return value can be different. + * @see evaluate() + */ + function evaluate_function($function, $arguments, $node) { + // Remove whitespaces. + $function = trim($function); + $arguments = trim($arguments); + + // Create the name of the function handling function. + $method = "handle_function_" . str_replace("-", "_", $function); + + // Check whether the function handling function is available. + if (!method_exists($this, $method)) { + // Display an error message. + $this->display_error("While parsing an XPath expression, " . + "the function \"%s\" could not be handled, because this " . + "version does not support this function.", $function); + } + + // Return the result of the function. + return call_user_func(array($this, $method), $axis, $context); + } + + /** + * Evaluates a predicate on a node. + * + * This method tries to evaluate a predicate on a given node. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the predicate + * should be evaluated. + * @param string $predicate String containing the predicate expression + * to be evaluated. + * @return mixed This method is called recursively. The first call should + * return a boolean value, whether the node matches the predicate + * or not. Any call to the method being made during the recursion + * may also return other types for further processing. + * @see evaluate() + */ + function evaluate_predicate($node, $predicate) { + // Set the default position and the type of the operator. + $position = 0; + $operator = ""; + + // Run through all operators and try to find them. + foreach ($this->operators as $expression) { + // Check whether a position was already found. + if ($position <= 0) { + // Try to find the operator. + $position = $this->search_string($predicate, $expression); + + // Check whether a operator was found. + if ($position > 0) { + // Save the operator. + $operator = $expression; + + // Check whether it's the equal operator. + if ($operator == "=") { + // Also look for other operators containing the + // equal sign. + if ($this->search_string($predicate, "!=") == + ( $position - 1 )) { + // Get the new position. + $position = $this->search_string($predicate, "!="); + + // Save the new operator. + $operator = "!="; + } + if ($this->search_string($predicate, "<=") == + ( $position - 1 )) { + // Get the new position. + $position = $this->search_string($predicate, "<="); + + // Save the new operator. + $operator = "<="; + } + if ($this->search_string($predicate, ">=") == + ( $position - 1 )) { + // Get the new position. + $position = $this->search_string($predicate, ">="); + + // Save the new operator. + $operator = ">="; + } + } + } + } + } + + // Check whether the operator is a - sign. + if ($operator == "-") { + // Check whether it's not a function containing a - in its name. + foreach ($this->functions as $function) { + // Check whether there's a - sign in the function name. + //if ( ereg("-", $function) ) + //if ( preg_match("-", $function) ) + if (preg_match("/-/", $function)) { + // Get the position of the - in the function name. + $sign = strpos($function, "-"); + + // Extract a substring from the predicate. + $sub = substr($predicate, $position - $sign, strlen($function)); + + // Check whether it's the function. + if ($sub == $function) { + // Don't use the operator. + $operator = ""; + $position = -1; + } + } + } + } elseif ($operator == "*") { + // Get some substrings. + $character = substr($predicate, $position - 1, 1); + $attribute = substr($predicate, $position - 11, 11); + + // Check whether it's an attribute selection. + if (( $character == "@" ) || ( $attribute == "attribute::" )) { + // Don't use the operator. + $operator = ""; + $position = -1; + } + } + + // Check whether an operator was found. + if ($position > 0) { + // Get the left and the right part of the expression. + $left = substr($predicate, 0, $position); + $right = substr($predicate, $position + strlen($operator)); + + // Remove whitespaces. + $left = trim($left); + $right = trim($right); + + // Evaluate the left and the right part. + $left = $this->evaluate_predicate($node, $left); + $right = $this->evaluate_predicate($node, $right); + + // Check the kind of operator. + switch ($operator) { + case " or ": + // Return the two results connected by an "or". + return ( $left or $right ); + + case " and ": + // Return the two results connected by an "and". + return ( $left and $right ); + + case "=": + // Compare the two results. + return ( $left == $right ); + + case "!=": + // Check whether the two results are not equal. + return ( $left != $right ); + + case "<=": + // Compare the two results. + return ( $left <= $right ); + + case "<": + // Compare the two results. + return ( $left < $right ); + + case ">=": + // Compare the two results. + return ( $left >= $right ); + + case ">": + // Compare the two results. + return ( $left > $right ); + + case "+": + // Return the result by adding one result to the other. + return ( $left + $right ); + + case "-": + // Return the result by decrease one result by the other. + return ( $left - $right ); + + case "*": + // Return a multiplication of the two results. + return ( $left * $right ); + + case " div ": + // Return a division of the two results. + if ($right == 0) { + // Display an error message. + $this->display_error("While parsing an XPath " . + "predicate, a error due a division by zero " . + "occured."); + } else { + // Return the result of the division. + return ( $left / $right ); + } + break; + + case " mod ": + // Return a modulo of the two results. + return ( $left % $right ); + } + } + + // Check whether the predicate is a function. + //if ( ereg("\(", $predicate) ) + //if ( preg_match("\(", $predicate) ) + if (preg_match("/\(/", $predicate)) { + // Get the position of the first bracket. + $start = strpos($predicate, "("); + $end = strpos($predicate, ")", $start); + + // Get everything before, between and after the brackets. + $before = substr($predicate, 0, $start); + $between = substr($predicate, $start + 1, $end - $start - 1); + $after = substr($predicate, $end + 1); + + // Trim each string. + $before = trim($before); + $between = trim($between); + $after = trim($after); + + // Check whether there's something after the bracket. + if (!empty($after)) { + // Display an error message. + $this->display_error("While parsing an XPath expression " . + "there was found an error in the predicate \"%s\", " . + "because after a closing bracket there was found " . + "something unknown.", str_replace($predicate, "" . $predicate . "", $this->xpath)); + } + + // Check whether it's a function. + if (empty($before) && empty($after)) { + // Evaluate the content of the brackets. + return $this->evaluate_predicate($node, $between); + } elseif ($this->is_function($before)) { + // Return the evaluated function. + return $this->evaluate_function($before, $between, $node); + } else { + // Display an error message. + $this->display_error("While parsing a predicate in an XPath " . + "expression, a function \"%s\" was found, which is not " . + "yet supported by the parser.", str_replace($before, "" . $before . "", $this->xpath)); + } + } + + // Check whether the predicate is just a digit. + //if ( ereg("^[0-9]+(\.[0-9]+)?$", $predicate) || ereg("^\.[0-9]+$", $predicate) ) + //if ( preg_match("^[0-9]+(\.[0-9]+)?$", $predicate) || preg_match("^\.[0-9]+$", $predicate) ) + if (preg_match("/^[0-9]+(\.[0-9]+)?$/", $predicate) || preg_match("/^\.[0-9]+$/", $predicate)) { + // Return the value of the digit. + return doubleval($predicate); + } + + // Check whether it's an XPath expression. + $result = $this->evaluate($predicate, $node); + if (count($result) > 0) { + // Convert the array. + $result = explode("|", implode("|", $result)); + + // Get the value of the first result. + $value = $this->get_content($result[0]); + + // Return the value. + return $value; + } + + // Return the predicate as a string. + return $predicate; + } + + /** + * Checks whether a node matches predicates. + * + * This method checks whether a list of nodes passed to this method match + * a given list of predicates. + * + * @access private + * @author Michael P. Mehl + * @param array $nodes Array of full paths of all nodes to be tested. + * @param array $predicates Array of predicates to use. + * @return array The array returned by this method contains a list of + * all nodes matching the given predicates. + * @see evaluate_step() + */ + function check_predicates($nodes, $predicates) { + // Create an empty set of nodes. + $result = array(); + + // Run through all nodes. + foreach ($nodes as $node) { + // Create a variable whether to add this node to the node-set. + $add = true; + + // Run through all predicates. + foreach ($predicates as $predicate) { + // Check whether the predicate is just an number. + //if ( ereg("^[0-9]+$", $predicate) ) + //if ( preg_match("^[0-9]+$", $predicate) ) + if (preg_match("/^[0-9]+$/", $predicate)) { + // Enhance the predicate. + $predicate .= "=position()"; + } + + // Do the predicate check. + $check = $this->evaluate_predicate($node, $predicate); + + // Check whether it's a string. + if (is_string($check) && ( ( $check == "" ) || + ( $check == $predicate ) )) { + // Set the result to false. + $check = false; + } + + // Check whether it's an integer. + if (is_int($check)) { + // Check whether it's the current position. + if ($check == $this->handle_function_position($node, "")) { + // Set it to true. + $check = true; + } else { + // Set it to false. + $check = false; + } + } + + // Check whether the predicate is OK for this node. + $add = $add && $check; + } + + // Check whether to add this node to the node-set. + if ($add) { + // Add the node to the node-set. + $result[] = $node; + } + } + + // Return the array of nodes. + return $result; + } + + /** + * Checks whether a node matches a node-test. + * + * This method checks whether a node in the document matches a given + * node-test. + * + * @access private + * @author Michael P. Mehl + * @param string $context Full path of the node, which should be tested + * for matching the node-test. + * @param string $node_test String containing the node-test for the + * node. + * @return boolean This method returns true if the node matches the + * node-test, otherwise false. + * @see evaluate() + */ + function check_node_test($context, $node_test) { + // Check whether it's a function. + //if ( ereg("\(", $node_test) ) + if (preg_match("/\(/", $node_test)) { + // Get the type of function to use. + $function = $this->prestr($node_test, "("); + + // Check whether the node fits the method. + switch ($function) { + case "node": + // Add this node to the list of nodes. + return true; + + case "text": + // Check whether the node has some text. + if (!empty($this->nodes[$context]["text"])) { + // Add this node to the list of nodes. + return true; + } + break; + + case "comment": + // Check whether the node has some comment. + if (!empty($this->nodes[$context]["comment"])) { + // Add this node to the list of nodes. + return true; + } + break; + + case "processing-instruction": + // Get the literal argument. + $literal = $this->afterstr($axis["node-test"], "("); + + // Cut the literal. + $literal = substr($literal, 0, strlen($literal) - 1); + + // Check whether a literal was given. + if (!empty($literal)) { + // Check whether the node's processing instructions + // are matching the literals given. + if ($this->nodes[$context] + ["processing-instructions"] == $literal) { + // Add this node to the node-set. + return true; + } + } else { + // Check whether the node has processing + // instructions. + if (!empty($this->nodes[$context] + ["processing-instructions"])) { + // Add this node to the node-set. + return true; + } + } + break; + + default: + // Display an error message. + $this->display_error("While parsing an XPath " . + "expression there was found an undefined " . + "function called \"%s\".", str_replace($function, "" . $function . "", $this->xpath)); + } + } elseif ($node_test == "*") { + // Add this node to the node-set. + return true; + } + //elseif ( ereg("^[a-zA-Z0-9\-_]+", $node_test) ) + //elseif ( preg_match("^[a-zA-Z0-9\-_]+", $node_test) ) + elseif (preg_match("/^[a-zA-Z0-9\-_]+/", $node_test)) { + // Check whether the node-test can be fulfilled. + if ($this->nodes[$context]["name"] == $node_test) { + // Add this node to the node-set. + return true; + } + } else { + // Display an error message. + $this->display_error("While parsing the XPath expression \"%s\" " . + "an empty and therefore invalid node-test has been found.", $this->xpath); + } + + // Don't add this context. + return false; + } + + /** + * Handles the XPath child axis. + * + * This method handles the XPath child axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_child($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Get a list of all children. + $children = $this->nodes[$context]["children"]; + + // Check whether there are children. + if (!empty($children)) { + // Run through all children. + foreach ($children as $child_name => $child_position) { + // Run through all childs with this name. + for ($i = 1; $i <= $child_position; $i++) { + // Create the path of the child. + $child = $context . "/" . $child_name . "[" . $i . "]"; + + // Check whether + if ($this->check_node_test($child, $axis["node-test"])) { + // Add the child to the node-set. + $nodes[] = $child; + } + } + } + } + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath parent axis. + * + * This method handles the XPath parent axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_parent($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Check whether the parent matches the node-test. + if ($this->check_node_test($this->nodes[$context]["parent"], $axis["node-test"])) { + // Add this node to the list of nodes. + $nodes[] = $this->nodes[$context]["parent"]; + } + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath attribute axis. + * + * This method handles the XPath attribute axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_attribute($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Check whether all nodes should be selected. + if ($axis["node-test"] == "*") { + // Check whether there are attributes. + if (count($this->nodes[$context]["attributes"]) > 0) { + // Run through the attributes. + foreach ($this->nodes[$context]["attributes"] as $key => $value) { + // Add this node to the node-set. + $nodes[] = $context . "/attribute::" . $key; + } + } + } elseif (!empty($this->nodes[$context]["attributes"] + [$axis["node-test"]])) { + // Add this node to the node-set. + $nodes[] = $context . "/attribute::" . $axis["node-test"]; + } + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath self axis. + * + * This method handles the XPath self axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_self($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Check whether the context match the node-test. + if ($this->check_node_test($context, $axis["node-test"])) { + // Add this node to the node-set. + $nodes[] = $context; + } + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath descendant axis. + * + * This method handles the XPath descendant axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_descendant($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Check whether the current node has children. + if (count($this->nodes[$context]["children"]) > 0) { + // Get a list of children. + $children = $this->nodes[$context]["children"]; + + // Run through all children. + foreach ($children as $child_name => $child_position) { + // Run through all children of this name. + for ($i = 1; $i <= $child_position; $i++) { + // Create the full path for the children. + $child = $context . "/" . $child_name . "[" . $i . "]"; + + // Check whether the child matches the node-test. + if ($this->check_node_test($child, $axis["node-test"])) { + // Add the child to the list of nodes. + $nodes[] = $child; + } + + // Recurse to the next level. + $nodes = array_merge($nodes, $this->handle_axis_descendant($axis, $child)); + } + } + } + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath ancestor axis. + * + * This method handles the XPath ancestor axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_ancestor($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Get the parent of the current node. + $parent = $this->nodes[$context]["parent"]; + + // Check whether the parent isn't empty. + if (!empty($parent)) { + // Check whether the parent matches the node-test. + if ($this->check_node_test($parent, $axis["node-test"])) { + // Add the parent to the list of nodes. + $nodes[] = $parent; + } + + // Handle all other ancestors. + $nodes = array_merge($nodes, $this->handle_axis_ancestor($axis, $parent)); + } + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath namespace axis. + * + * This method handles the XPath namespace axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_namespace($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Check whether all nodes should be selected. + if (!empty($this->nodes[$context]["namespace"])) { + // Add this node to the node-set. + $nodes[] = $context; + } + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath following axis. + * + * This method handles the XPath following axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_following($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Get the current document position. + $position = $this->nodes[$context]["document-position"]; + + // Create a flag, whether we already found the context node. + $found = false; + + // Run through all nodes of the document. + foreach ($this->nodes as $node => $data) { + // Check whether the context node has already been found. + if ($found) { + // Check whether the position is correct. + if ($this->nodes[$node]["document-position"] == $position) { + // Check whether the node fits the node-test. + if ($this->check_node_test($node, $axis["node-test"])) { + // Add the node to the list of nodes. + $nodes[] = $node; + } + } + } + + // Check whether this is the context node. + if ($node == $context) { + // After this we'll look for more nodes. + $found = true; + } + } + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath preceding axis. + * + * This method handles the XPath preceding axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_preceding($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Get the current document position. + $position = $this->nodes[$context]["document-position"]; + + // Create a flag, whether we already found the context node. + $found = true; + + // Run through all nodes of the document. + foreach ($this->nodes as $node => $data) { + // Check whether this is the context node. + if ($node == $context) { + // After this we won't look for more nodes. + $found = false; + } + + // Check whether the context node has already been found. + if ($found) { + // Check whether the position is correct. + if ($this->nodes[$node]["document-position"] == $position) { + // Check whether the node fits the node-test. + if ($this->check_node_test($node, $axis["node-test"])) { + // Add the node to the list of nodes. + $nodes[] = $node; + } + } + } + } + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath following-sibling axis. + * + * This method handles the XPath following-sibling axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_following_sibling($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Get all children from the parent. + $siblings = $this->handle_axis_child($axis, $this->nodes[$context]["parent"]); + + // Create a flag whether the context node was already found. + $found = false; + + // Run through all siblings. + foreach ($siblings as $sibling) { + // Check whether the context node was already found. + if ($found) { + // Check whether the sibling is a real sibling. + if ($this->nodes[$sibling]["name"] == + $this->nodes[$context]["name"]) { + // Check whether the sibling matches the node-test. + if ($this->check_node_test($sibling, $axis["node-test"])) { + // Add the sibling to the list of nodes. + $nodes[] = $sibling; + } + } + } + + // Check whether this is the context node. + if ($sibling == $context) { + // Continue looking for other siblings. + $found = true; + } + } + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath preceding-sibling axis. + * + * This method handles the XPath preceding-sibling axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_preceding_sibling($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Get all children from the parent. + $siblings = $this->handle_axis_child($axis, $this->nodes[$context]["parent"]); + + // Create a flag whether the context node was already found. + $found = true; + + // Run through all siblings. + foreach ($siblings as $sibling) { + // Check whether this is the context node. + if ($sibling == $context) { + // Don't continue looking for other siblings. + $found = false; + } + + // Check whether the context node was already found. + if ($found) { + // Check whether the sibling is a real sibling. + if ($this->nodes[$sibling]["name"] == + $this->nodes[$context]["name"]) { + // Check whether the sibling matches the node-test. + if ($this->check_node_test($sibling, $axis["node-test"])) { + // Add the sibling to the list of nodes. + $nodes[] = $sibling; + } + } + } + } + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath descendant-or-self axis. + * + * This method handles the XPath descendant-or-self axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_descendant_or_self($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Read the nodes. + $nodes = array_merge( + $this->handle_axis_descendant($axis, $context), $this->handle_axis_self($axis, $context)); + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath ancestor-or-self axis. + * + * This method handles the XPath ancestor-or-self axis. + * + * @access private + * @author Michael P. Mehl + * @param array $axis Array containing information about the axis. + * @param string $context Node from which starting the axis should + * be processed. + * @return array This method returns an array containing all nodes + * that were found during the evaluation of the given axis. + * @see evaluate() + */ + function handle_axis_ancestor_or_self($axis, $context) { + // Create an empty node-set. + $nodes = array(); + + // Read the nodes. + $nodes = array_merge( + $this->handle_axis_ancestor($axis, $context), $this->handle_axis_self($axis, $context)); + + // Return the nodeset. + return $nodes; + } + + /** + * Handles the XPath function last. + * + * This method handles the XPath function last. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_last($node, $arguments) { + // Calculate the size of the context. + $parent = $this->nodes[$node]["parent"]; + $children = $this->nodes[$parent]["children"]; + $context = $children[$this->nodes[$node]["name"]]; + + // Return the size. + return $context; + } + + /** + * Handles the XPath function position. + * + * This method handles the XPath function position. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_position($node, $arguments) { + // return the context-position. + return $this->nodes[$node]["context-position"]; + } + + /** + * Handles the XPath function count. + * + * This method handles the XPath function count. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_count($node, $arguments) { + // Evaluate the argument of the method as an XPath and return + // the number of results. + return count($this->evaluate($arguments, $node)); + } + + /** + * Handles the XPath function id. + * + * This method handles the XPath function id. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_id($node, $arguments) { + // Trim the arguments. + $arguments = trim($arguments); + + // Now split the arguments. + $arguments = explode(" ", $arguments); + + // Check whether + // Create a list of nodes. + $nodes = array(); + + // Run through all document node. + foreach ($this->nodes as $node => $position) { + // Check whether the node has the ID we're looking for. + if (in_array($this->nodes[$node]["attributes"]["id"], $arguments)) { + // Add this node to the list of nodes. + $nodes[] = $node; + } + } + + // Return the list of nodes. + return $nodes; + } + + /** + * Handles the XPath function name. + * + * This method handles the XPath function name. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_name($node, $arguments) { + // Return the name of the node. + return $this->nodes[$node]["name"]; + } + + /** + * Handles the XPath function string. + * + * This method handles the XPath function string. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_string($node, $arguments) { + // Check what type of parameter is given + //if ( ereg("^[0-9]+(\.[0-9]+)?$", $arguments) || ereg("^\.[0-9]+$", $arguments) ) + //if ( preg_match("^[0-9]+(\.[0-9]+)?$", $arguments) || preg_match("^\.[0-9]+$", $arguments) ) + if (preg_match("/^[0-9]+(\.[0-9]+)?$/", $arguments) || preg_match("/^\.[0-9]+$/", $arguments)) { + // Convert the digits to a number. + $number = doubleval($arguments); + + // Return the number. + return strval($number); + } elseif (is_bool($arguments)) { + // Check whether it's true. + if ($arguments == true) { + // Return true as a string. + return "true"; + } else { + // Return false as a string. + return "false"; + } + } elseif (!empty($arguments)) { + // Use the argument as an XPath. + $result = $this->evaluate($arguments, $node); + + // Get the first argument. + $result = explode("|", implode("|", $result)); + + // Return the first result as a string. + return $result[0]; + } elseif (empty($arguments)) { + // Return the current node. + return $node; + } else { + // Return an empty string. + return ""; + } + } + + /** + * Handles the XPath function concat. + * + * This method handles the XPath function concat. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_concat($node, $arguments) { + // Split the arguments. + $arguments = explode(",", $arguments); + + // Run through each argument and evaluate it. + for ($i = 0; $i < sizeof($arguments); $i++) { + // Trim each argument. + $arguments[$i] = trim($arguments[$i]); + + // Evaluate it. + $arguments[$i] = $this->evaluate_predicate($node, $arguments[$i]); + } + + // Put the string together. + $arguments = implode("", $arguments); + + // Return the string. + return $arguments; + } + + /** + * Handles the XPath function starts-with. + * + * This method handles the XPath function starts-with. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_starts_with($node, $arguments) { + // Get the arguments. + $first = trim($this->prestr($arguments, ",")); + $second = trim($this->afterstr($arguments, ",")); + + // Evaluate each argument. + $first = $this->evaluate_predicate($node, $first); + $second = $this->evaluate_predicate($node, $second); + + // Check whether the first string starts with the second one. + //if ( ereg("^".$second, $first) ) + //if ( preg_match("^".$second, $first) ) + if (preg_match("/^" . $second . "/", $first)) { + // Return true. + return true; + } else { + // Return false. + return false; + } + } + + /** + * Handles the XPath function contains. + * + * This method handles the XPath function contains. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_contains($node, $arguments) { + // Get the arguments. + $first = trim($this->prestr($arguments, ",")); + $second = trim($this->afterstr($arguments, ",")); + + // Evaluate each argument. + $first = $this->evaluate_predicate($node, $first); + $second = $this->evaluate_predicate($node, $second); + + // Check whether the first string starts with the second one. + //if ( ereg($second, $first) ) + //if ( preg_match($second, $first) ) + if (preg_match("/^" . $second . "/", $first)) { + // Return true. + return true; + } else { + // Return false. + return false; + } + } + + /** + * Handles the XPath function substring-before. + * + * This method handles the XPath function substring-before. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_substring_before($node, $arguments) { + // Get the arguments. + $first = trim($this->prestr($arguments, ",")); + $second = trim($this->afterstr($arguments, ",")); + + // Evaluate each argument. + $first = $this->evaluate_predicate($node, $first); + $second = $this->evaluate_predicate($node, $second); + + // Return the substring. + return $this->prestr(strval($first), strval($second)); + } + + /** + * Handles the XPath function substring-after. + * + * This method handles the XPath function substring-after. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_substring_after($node, $arguments) { + // Get the arguments. + $first = trim($this->prestr($arguments, ",")); + $second = trim($this->afterstr($arguments, ",")); + + // Evaluate each argument. + $first = $this->evaluate_predicate($node, $first); + $second = $this->evaluate_predicate($node, $second); + + // Return the substring. + return $this->afterstr(strval($first), strval($second)); + } + + /** + * Handles the XPath function substring. + * + * This method handles the XPath function substring. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_substring($node, $arguments) { + // Split the arguments. + $arguments = explode(",", $arguments); + + // Run through all arguments. + for ($i = 0; $i < sizeof($arguments); $i++) { + // Trim the string. + $arguments[$i] = trim($arguments[$i]); + + // Evaluate each argument. + $arguments[$i] = $this->evaluate_predicate($node, $arguments[$i]); + } + + // Check whether a third argument was given. + if (!empty($arguments[2])) { + // Return the substring. + return substr(strval($arguments[0]), $arguments[1] - 1, $arguments[2]); + } else { + // Return the substring. + return substr(strval($arguments[0]), $arguments[1] - 1); + } + } + + /** + * Handles the XPath function string-length. + * + * This method handles the XPath function string-length. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_string_length($node, $arguments) { + // Trim the argument. + $arguments = trim($arguments); + + // Evaluate the argument. + $arguments = $this->evaluate_predicate($node, $arguments); + + // Return the length of the string. + return strlen(strval($arguments)); + } + + /** + * Handles the XPath function translate. + * + * This method handles the XPath function translate. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_translate($node, $arguments) { + // Split the arguments. + $arguments = explode(",", $arguments); + + // Run through all arguments. + for ($i = 0; $i < sizeof($arguments); $i++) { + // Trim the argument. + $arguments[$i] = trim($arguments[$i]); + + // Evaluate the argument. + $arguments[$i] = $this->evaluate_predicate($node, $arguments[$i]); + } + + // Return the translated string. + return strtr($arguments[0], $arguments[1], $arguments[2]); + } + + /** + * Handles the XPath function boolean. + * + * This method handles the XPath function boolean. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_boolean($node, $arguments) { + // Trim the arguments. + $arguments = trim($arguments); + + // Check what type of parameter is given + //if ( ereg("^[0-9]+(\.[0-9]+)?$", $arguments) || ereg("^\.[0-9]+$", $arguments) ) + //if ( preg_match("^[0-9]+(\.[0-9]+)?$", $arguments) || preg_match("^\.[0-9]+$", $arguments) ) + if (preg_match("/^[0-9]+(\.[0-9]+)?$/", $arguments) || preg_match("/^\.[0-9]+$/", $arguments)) { + // Convert the digits to a number. + $number = doubleval($arguments); + + // Check whether the number zero. + if ($number == 0) { + // Return false. + return false; + } else { + // Return true. + return true; + } + } elseif (empty($arguments)) { + // Sorry, there were no arguments. + return false; + } else { + // Try to evaluate the argument as an XPath. + $result = $this->evaluate($arguments, $node); + + // Check whether we found something. + if (count($result) > 0) { + // Return true. + return true; + } else { + // Return false. + return false; + } + } + } + + /** + * Handles the XPath function not. + * + * This method handles the XPath function not. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_not($node, $arguments) { + // Trim the arguments. + $arguments = trim($arguments); + + // Return the negative value of the content of the brackets. + return !$this->evaluate_predicate($node, $arguments); + } + + /** + * Handles the XPath function true. + * + * This method handles the XPath function true. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_true($node, $arguments) { + // Return true. + return true; + } + + /** + * Handles the XPath function false. + * + * This method handles the XPath function false. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_false($node, $arguments) { + // Return false. + return false; + } + + /** + * Handles the XPath function lang. + * + * This method handles the XPath function lang. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_lang($node, $arguments) { + // Trim the arguments. + $arguments = trim($arguments); + + // Check whether the node has an language attribute. + if (empty($this->nodes[$node]["attributes"]["xml:lang"])) { + // Run through the ancestors. + while (!empty($node)) { + // Select the parent node. + $node = $this->nodes[$node]["parent"]; + + // Check whether there's a language definition. + if (!empty($this->nodes[$node]["attributes"]["xml:lang"])) { + // Check whether it's the language, the user asks for. + //if ( eregi("^".$arguments, $this->nodes[$node] + // ["attributes"]["xml:lang"]) ) + //if ( preg_match("^/i".$arguments, $this->nodes[$node] + if (preg_match("/^" . $arguments . "/i", $this->nodes[$node] + ["attributes"]["xml:lang"])) { + // Return true. + return true; + } else { + // Return false. + return false; + } + } + } + + // Return false. + return false; + } else { + // Check whether it's the language, the user asks for. + //if ( eregi("^".$arguments, $this->nodes[$node]["attributes"] + // ["xml:lang"]) ) + //if ( preg_match("^/i".$arguments, $this->nodes[$node]["attributes"] + if (preg_match("/^" . $arguments . "/i", $this->nodes[$node]["attributes"] + ["xml:lang"])) { + // Return true. + return true; + } else { + // Return false. + return false; + } + } + } + + /** + * Handles the XPath function number. + * + * This method handles the XPath function number. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_number($node, $arguments) { + // Check the type of argument. + //if ( ereg("^[0-9]+(\.[0-9]+)?$", $arguments) || + // ereg("^\.[0-9]+$", $arguments) ) + //if ( preg_match("^[0-9]+(\.[0-9]+)?$", $arguments) || preg_match("^\.[0-9]+$", $arguments) ) + if (preg_match("/^[0-9]+(\.[0-9]+)?$/", $arguments) || preg_match("/^\.[0-9]+$/", $arguments)) { + // Return the argument as a number. + return doubleval($arguments); + } elseif (is_bool($arguments)) { + // Check whether it's true. + if ($arguments == true) { + // Return 1. + return 1; + } else { + // Return 0. + return 0; + } + } + } + + /** + * Handles the XPath function sum. + * + * This method handles the XPath function sum. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_sum($node, $arguments) { + // Trim the arguments. + $arguments = trim($arguments); + + // Evaluate the arguments as an XPath expression. + $results = $this->evaluate($arguments, $node); + + // Create a variable to save the sum. + $sum = 0; + + // Run through all results. + foreach ($results as $result) { + // Get the value of the node. + $result = $this->get_content($result); + + // Add it to the sum. + $sum += doubleval($result); + } + + // Return the sum. + return $sum; + } + + /** + * Handles the XPath function floor. + * + * This method handles the XPath function floor. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_floor($node, $arguments) { + // Trim the arguments. + $arguments = trim($arguments); + + // Convert the arguments to a number. + $arguments = doubleval($arguments); + + // Return the result + return floor($arguments); + } + + /** + * Handles the XPath function ceiling. + * + * This method handles the XPath function ceiling. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_ceiling($node, $arguments) { + // Trim the arguments. + $arguments = trim($arguments); + + // Convert the arguments to a number. + $arguments = doubleval($arguments); + + // Return the result + return ceil($arguments); + } + + /** + * Handles the XPath function round. + * + * This method handles the XPath function round. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_round($node, $arguments) { + // Trim the arguments. + $arguments = trim($arguments); + + // Convert the arguments to a number. + $arguments = doubleval($arguments); + + // Return the result + return round($arguments); + } + + /** + * Handles the XPath function text. + * + * This method handles the XPath function text. + * + * @access private + * @author Michael P. Mehl + * @param string $node Full path of the node on which the function + * should be processed. + * @param string $arguments String containing the arguments that were + * passed to the function. + * @return mixed Depending on the type of function being processed this + * method returns different types. + * @see evaluate() + */ + function handle_function_text($node, $arguments) { + // Return the character data of the node. + return $this->nodes[$node]["text"]; + } + + /** + * Retrieves a substring before a delimiter. + * + * This method retrieves everything from a string before a given delimiter, + * not including the delimiter. + * + * @access private + * @author Michael P. Mehl + * @param string $string String, from which the substring should be + * extracted. + * @param string $delimiter String containing the delimiter to use. + * @return string Substring from the original string before the + * delimiter. + * @see afterstr() + */ + function prestr($string, $delimiter) { + // Return the substring. + return substr($string, 0, strlen($string) - strlen(strstr($string, "$delimiter"))); + } + + /** + * Retrieves a substring after a delimiter. + * + * This method retrieves everything from a string after a given delimiter, + * not including the delimiter. + * + * @access private + * @author Michael P. Mehl + * @param string $string String, from which the substring should be + * extracted. + * @param string $delimiter String containing the delimiter to use. + * @return string Substring from the original string after the + * delimiter. + * @see prestr() + */ + function afterstr($string, $delimiter) { + // Return the substring. + return substr($string, strpos($string, $delimiter) + strlen($delimiter)); + } + + /** + * Displays an error message. + * + * This method displays an error messages and stops the execution of the + * script. This method is called exactly in the same way as the printf + * function. The first argument contains the message and additional + * arguments of various types may be passed to this method to be inserted + * into the message. + * + * @access private + * @author Michael P. Mehl + * @param string $message Error message to be displayed. + */ + function display_error($message) { + // Check whether more than one argument was given. + if (func_num_args() > 1) { + // Read all arguments. + $arguments = func_get_args(); + + //보안 이슈로 eval 함수 제거 20161011 jhkim + array_shift($arguments); + $message = vsprintf($message, $arguments); + } + + // Display the error message. + echo "phpXML error: " . $message; + + // End the execution of this script. + exit; + } + + //added by ddaemiri, 2007.05.28 + //entity 가 하나만 있다고 가정!! 배열의 첫번째만 가져옴. + function get_content_fetch($path) { + $e = $this->evaluate($path); + $content = $this->get_content($e[0]); + $a = $this->get_attributes_patch($path, "urlencode"); + if ($a != "") + $content = urldecode($content); + return $content; + } + + function get_attributes_patch($path, $attr) { + $e = $this->evaluate($path); + $a = $this->get_attributes($e[0]); + return $a[$attr]; + } + +} \ No newline at end of file diff --git a/shop/inicis/libs/INIpayStdMakeSignature.php b/shop/inicis/libs/INIpayStdMakeSignature.php new file mode 100644 index 000000000..c7183f28b --- /dev/null +++ b/shop/inicis/libs/INIpayStdMakeSignature.php @@ -0,0 +1,14 @@ + $SignatureUtil->makeHash($input, "sha256") + 'signature' => hash("sha256", $input) +); + +echo json_encode($output); \ No newline at end of file diff --git a/shop/inicis/libs/JSON.php b/shop/inicis/libs/JSON.php new file mode 100644 index 000000000..c07c76767 --- /dev/null +++ b/shop/inicis/libs/JSON.php @@ -0,0 +1,804 @@ + + * @author Matt Knapp + * @author Brett Stimmerman + * @copyright 2005 Michal Migurski + * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $ + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 + */ + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_SLICE', 1); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_STR', 2); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_ARR', 3); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_OBJ', 4); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_CMT', 5); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_LOOSE_TYPE', 16); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_SUPPRESS_ERRORS', 32); + +/** + * Converts to and from JSON format. + * + * Brief example of use: + * + * + * // create a new instance of Services_JSON + * $json = new Services_JSON(); + * + * // convert a complexe value to JSON notation, and send it to the browser + * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); + * $output = $json->encode($value); + * + * print($output); + * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] + * + * // accept incoming POST data, assumed to be in JSON notation + * $input = file_get_contents('php://input', 1000000); + * $value = $json->decode($input); + * + */ +class Services_JSON +{ + /** + * constructs a new JSON instance + * + * @param int $use object behavior flags; combine with boolean-OR + * + * possible values: + * - SERVICES_JSON_LOOSE_TYPE: loose typing. + * "{...}" syntax creates associative arrays + * instead of objects in decode(). + * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. + * Values which can't be encoded (e.g. resources) + * appear as NULL instead of throwing errors. + * By default, a deeply-nested resource will + * bubble up with an error, so all return values + * from encode() should be checked with isError() + */ + function Services_JSON($use = 0) + { + $this->use = $use; + } + + /** + * convert a string from one UTF-16 char to one UTF-8 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + * @access private + */ + function utf162utf8($utf16) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + } + + $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); + + switch(true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * convert a string from one UTF-8 char to one UTF-16 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + * @access private + */ + function utf82utf16($utf8) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + } + + switch(strlen($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $utf8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8{0}) >> 2)) + . chr((0xC0 & (ord($utf8{0}) << 6)) + | (0x3F & ord($utf8{1}))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8{0}) << 4)) + | (0x0F & (ord($utf8{1}) >> 2))) + . chr((0xC0 & (ord($utf8{1}) << 6)) + | (0x7F & ord($utf8{2}))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * encodes an arbitrary variable into JSON format + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a strng, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return mixed JSON string representation of input var or an error if a problem occurs + * @access public + */ + function encode($var) + { + switch (gettype($var)) { + case 'boolean': + return $var ? 'true' : 'false'; + + case 'NULL': + return 'null'; + + case 'integer': + return (int) $var; + + case 'double': + case 'float': + return (float) $var; + + case 'string': + // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT + $ascii = ''; + $strlen_var = strlen($var); + + /* + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for ($c = 0; $c < $strlen_var; ++$c) { + + $ord_var_c = ord($var{$c}); + + switch (true) { + case $ord_var_c == 0x08: + $ascii .= '\b'; + break; + case $ord_var_c == 0x09: + $ascii .= '\t'; + break; + case $ord_var_c == 0x0A: + $ascii .= '\n'; + break; + case $ord_var_c == 0x0C: + $ascii .= '\f'; + break; + case $ord_var_c == 0x0D: + $ascii .= '\r'; + break; + + case $ord_var_c == 0x22: + case $ord_var_c == 0x2F: + case $ord_var_c == 0x5C: + // double quote, slash, slosh + $ascii .= '\\'.$var{$c}; + break; + + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $var{$c}; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, ord($var{$c + 1})); + $c += 1; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2})); + $c += 2; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3})); + $c += 3; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4})); + $c += 4; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4}), + ord($var{$c + 5})); + $c += 5; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + + return '"'.$ascii.'"'; + + case 'array': + /* + * As per JSON spec if any array key is not an integer + * we must treat the the whole array as an object. We + * also try to catch a sparsely populated associative + * array with numeric keys here because some JS engines + * will create an array with empty indexes up to + * max_index which can cause memory issues and because + * the keys, which may be relevant, will be remapped + * otherwise. + * + * As per the ECMA and JSON specification an object may + * have any string as a property. Unfortunately due to + * a hole in the ECMA specification if the key is a + * ECMA reserved word or starts with a digit the + * parameter is only accessible using ECMAScript's + * bracket notation. + */ + + // treat as a JSON object + if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { + $properties = array_map(array($this, 'name_value'), + array_keys($var), + array_values($var)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + } + + // treat it like a regular array + $elements = array_map(array($this, 'encode'), $var); + + foreach($elements as $element) { + if(Services_JSON::isError($element)) { + return $element; + } + } + + return '[' . join(',', $elements) . ']'; + + case 'object': + $vars = get_object_vars($var); + + $properties = array_map(array($this, 'name_value'), + array_keys($vars), + array_values($vars)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + + default: + return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) + ? 'null' + : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); + } + } + + /** + * array-walking function for use in generating JSON-formatted name-value pairs + * + * @param string $name name of key to use + * @param mixed $value reference to an array element to be encoded + * + * @return string JSON-formatted name-value pair, like '"name":value' + * @access private + */ + function name_value($name, $value) + { + $encoded_value = $this->encode($value); + + if(Services_JSON::isError($encoded_value)) { + return $encoded_value; + } + + return $this->encode(strval($name)) . ':' . $encoded_value; + } + + /** + * reduce a string by removing leading and trailing comments and whitespace + * + * @param $str string string value to strip of comments and whitespace + * + * @return string string value stripped of comments and whitespace + * @access private + */ + function reduce_string($str) + { + $str = preg_replace(array( + + // eliminate single line comments in '// ...' form + '#^\s*//(.+)$#m', + + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + + ), '', $str); + + // eliminate extraneous space + return trim($str); + } + + /** + * decodes a JSON string into appropriate variable + * + * @param string $str JSON-formatted string + * + * @return mixed number, boolean, string, array, or object + * corresponding to given JSON input string. + * See argument 1 to Services_JSON() above for object-output behavior. + * Note that decode() always returns strings + * in ASCII or UTF-8 format! + * @access public + */ + function decode($str) + { + $str = $this->reduce_string($str); + + switch (strtolower($str)) { + case 'true': + return true; + + case 'false': + return false; + + case 'null': + return null; + + default: + $m = array(); + + if (is_numeric($str)) { + // Lookie-loo, it's a number + + // This would work on its own, but I'm trying to be + // good about returning integers where appropriate: + // return (float)$str; + + // Return float or int, as appropriate + return ((float)$str == (integer)$str) + ? (integer)$str + : (float)$str; + + } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { + // STRINGS RETURNED IN UTF-8 FORMAT + $delim = substr($str, 0, 1); + $chrs = substr($str, 1, -1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = substr($chrs, $c, 2); + $ord_chrs_c = ord($chrs{$c}); + + switch (true) { + case $substr_chrs_c_2 == '\b': + $utf8 .= chr(0x08); + ++$c; + break; + case $substr_chrs_c_2 == '\t': + $utf8 .= chr(0x09); + ++$c; + break; + case $substr_chrs_c_2 == '\n': + $utf8 .= chr(0x0A); + ++$c; + break; + case $substr_chrs_c_2 == '\f': + $utf8 .= chr(0x0C); + ++$c; + break; + case $substr_chrs_c_2 == '\r': + $utf8 .= chr(0x0D); + ++$c; + break; + + case $substr_chrs_c_2 == '\\"': + case $substr_chrs_c_2 == '\\\'': + case $substr_chrs_c_2 == '\\\\': + case $substr_chrs_c_2 == '\\/': + if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || + ($delim == "'" && $substr_chrs_c_2 != '\\"')) { + $utf8 .= $chrs{++$c}; + } + break; + + case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) + . chr(hexdec(substr($chrs, ($c + 4), 2))); + $utf8 .= $this->utf162utf8($utf16); + $c += 5; + break; + + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs{$c}; + break; + + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 2); + ++$c; + break; + + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 3); + $c += 2; + break; + + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 4); + $c += 3; + break; + + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 5); + $c += 4; + break; + + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 6); + $c += 5; + break; + + } + + } + + return $utf8; + + } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { + // array, or object notation + + if ($str{0} == '[') { + $stk = array(SERVICES_JSON_IN_ARR); + $arr = array(); + } else { + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = array(); + } else { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = new stdClass(); + } + } + + array_push($stk, array('what' => SERVICES_JSON_SLICE, + 'where' => 0, + 'delim' => false)); + + $chrs = substr($str, 1, -1); + $chrs = $this->reduce_string($chrs); + + if ($chrs == '') { + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } else { + return $obj; + + } + } + + //print("\nparsing {$chrs}\n"); + + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = substr($chrs, $c, 2); + + if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { + // found a comma that is not inside a string, array, etc., + // OR we've reached the end of the character list + $slice = substr($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + // we are in an array, so just push an element onto the stack + array_push($arr, $this->decode($slice)); + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + // we are in an object, so figure + // out the property name and set an + // element in an associative array, + // for now + $parts = array(); + + if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } + + } + + } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { + // found a quote, and we are not inside a string + array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); + //print("Found start of string at {$c}\n"); + + } elseif (($chrs{$c} == $top['delim']) && + ($top['what'] == SERVICES_JSON_IN_STR) && + ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { + // found a quote, we're in a string, and it's not escaped + // we know that it's not escaped becase there is _not_ an + // odd number of backslashes at the end of the string so far + array_pop($stk); + //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '[') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-bracket, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); + //print("Found start of array at {$c}\n"); + + } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { + // found a right-bracket, and we're in an array + array_pop($stk); + //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '{') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-brace, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); + //print("Found start of object at {$c}\n"); + + } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { + // found a right-brace, and we're in an object + array_pop($stk); + //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($substr_chrs_c_2 == '/*') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a comment start, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); + $c++; + //print("Found start of comment at {$c}\n"); + + } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { + // found a comment end, and we're in one now + array_pop($stk); + $c++; + + for ($i = $top['where']; $i <= $c; ++$i) + $chrs = substr_replace($chrs, ' ', $i, 1); + + //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } + + } + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + return $obj; + + } + + } + } + } + + /** + * @todo Ultimately, this should just call PEAR::isError() + */ + function isError($data, $code = null) + { + if (class_exists('pear')) { + return PEAR::isError($data, $code); + } elseif (is_object($data) && (get_class($data) == 'services_json_error' || + is_subclass_of($data, 'services_json_error'))) { + return true; + } + + return false; + } +} + +if (class_exists('PEAR_Error')) { + + class Services_JSON_Error extends PEAR_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + parent::PEAR_Error($message, $code, $mode, $options, $userinfo); + } + } + +} else { + + /** + * @todo Ultimately, this class shall be descended from PEAR_Error + */ + class Services_JSON_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + + } + } + +} \ No newline at end of file diff --git a/shop/inicis/libs/json_lib.php b/shop/inicis/libs/json_lib.php new file mode 100644 index 000000000..82232bd64 --- /dev/null +++ b/shop/inicis/libs/json_lib.php @@ -0,0 +1,28 @@ +decode($content); + } +} + +if (!function_exists('json_encode')) { + function json_encode($content) { + require_once 'JSON.php'; + $json = new Services_JSON; + return $json->encode($content); + } +} \ No newline at end of file diff --git a/shop/inicis/libs/sha256.inc.php b/shop/inicis/libs/sha256.inc.php new file mode 100644 index 000000000..72386947b --- /dev/null +++ b/shop/inicis/libs/sha256.inc.php @@ -0,0 +1,414 @@ +. + * + * Include: + * + * require_once("[path/]sha256.inc.php"); + * + * Usage Options: + * + * 1) $shaStr = hash('sha256', $string_to_hash); + * + * 2) $shaStr = sha256($string_to_hash[, bool ignore_php5_hash = false]); + * + * 3) $obj = new nanoSha2([bool $upper_case_output = false]); + * $shaStr = $obj->hash($string_to_hash[, bool $ignore_php5_hash = false]); + * + * Reference: http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html + * + * 2007-12-13: Cleaned up for initial public release + * 2008-05-10: Moved all helper functions into a class. API access unchanged. + * 2009-06-23: Created abstraction of hash() routine + * 2009-07-23: Added detection of 32 vs 64bit platform, and patches. + * Ability to define "_NANO_SHA2_UPPER" to yeild upper case hashes. + * 2009-08-01: Added ability to attempt to use mhash() prior to running pure + * php code. + * + * NOTE: Some sporadic versions of PHP do not handle integer overflows the + * same as the majority of builds. If you get hash results of: + * 7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff + * + * If you do not have permissions to change PHP versions (if you did + * you'd probably upgrade to PHP 5 anyway) it is advised you install a + * module that will allow you to use their hashing routines, examples are: + * - mhash module : http://ca3.php.net/mhash + * - Suhosin : http://www.hardened-php.net/suhosin/ + * + * If you install the Suhosin module, this script will transparently + * use their routine and define the PHP routine as _nano_sha256(). + * + * If the mhash module is present, and $ignore_php5_hash = false the + * script will attempt to use the output from mhash prior to running + * the PHP code. + */ +if (!class_exists('nanoSha2')) +{ + class nanoSha2 + { + // php 4 - 5 compatable class properties + var $toUpper; + var $platform; + + // Php 4 - 6 compatable constructor + // PHP Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP + // function nanoSha2($toUpper = false) { + function __construct($toUpper = false) { + // Determine if the caller wants upper case or not. + $this->toUpper = is_bool($toUpper) + ? $toUpper + : ((defined('_NANO_SHA2_UPPER')) ? true : false); + + // Deteremine if the system is 32 or 64 bit. + $tmpInt = (int)4294967295; + $this->platform = ($tmpInt > 0) ? 64 : 32; + } + + // Do the SHA-256 Padding routine (make input a multiple of 512 bits) + function char_pad($str) + { + $tmpStr = $str; + + $l = strlen($tmpStr)*8; // # of bits from input string + + $tmpStr .= "\x80"; // append the "1" bit followed by 7 0's + + $k = (512 - (($l + 8 + 64) % 512)) / 8; // # of 0 bytes to append + $k += 4; // PHP Strings will never exceed (2^31)-1, 1st 32bits of + // the 64-bit value representing $l can be all 0's + + for ($x = 0; $x < $k; $x++) { + $tmpStr .= "\0"; + } + + // append the 32-bits representing # of bits from input string ($l) + $tmpStr .= chr((($l>>24) & 0xFF)); + $tmpStr .= chr((($l>>16) & 0xFF)); + $tmpStr .= chr((($l>>8) & 0xFF)); + $tmpStr .= chr(($l & 0xFF)); + + return $tmpStr; + } + + // Here are the bitwise and functions as defined in FIPS180-2 Standard + function addmod2n($x, $y, $n = 4294967296) // Z = (X + Y) mod 2^32 + { + $mask = 0x80000000; + + if ($x < 0) { + $x &= 0x7FFFFFFF; + $x = (float)$x + $mask; + } + + if ($y < 0) { + $y &= 0x7FFFFFFF; + $y = (float)$y + $mask; + } + + $r = $x + $y; + + if ($r >= $n) { + while ($r >= $n) { + $r -= $n; + } + } + + return (int)$r; + } + + // Logical bitwise right shift (PHP default is arithmetic shift) + function SHR($x, $n) // x >> n + { + if ($n >= 32) { // impose some limits to keep it 32-bit + return (int)0; + } + + if ($n <= 0) { + return (int)$x; + } + + $mask = 0x40000000; + + if ($x < 0) { + $x &= 0x7FFFFFFF; + $mask = $mask >> ($n-1); + return ($x >> $n) | $mask; + } + + return (int)$x >> (int)$n; + } + + function ROTR($x, $n) { return (int)(($this->SHR($x, $n) | ($x << (32-$n)) & 0xFFFFFFFF)); } + function Ch($x, $y, $z) { return ($x & $y) ^ ((~$x) & $z); } + function Maj($x, $y, $z) { return ($x & $y) ^ ($x & $z) ^ ($y & $z); } + function Sigma0($x) { return (int) ($this->ROTR($x, 2)^$this->ROTR($x, 13)^$this->ROTR($x, 22)); } + function Sigma1($x) { return (int) ($this->ROTR($x, 6)^$this->ROTR($x, 11)^$this->ROTR($x, 25)); } + function sigma_0($x) { return (int) ($this->ROTR($x, 7)^$this->ROTR($x, 18)^$this->SHR($x, 3)); } + function sigma_1($x) { return (int) ($this->ROTR($x, 17)^$this->ROTR($x, 19)^$this->SHR($x, 10)); } + + /* + * Custom functions to provide PHP support + */ + // split a byte-string into integer array values + function int_split($input) + { + $l = strlen($input); + + if ($l <= 0) { + return (int)0; + } + + if (($l % 4) != 0) { // invalid input + return false; + } + + for ($i = 0; $i < $l; $i += 4) + { + $int_build = (ord($input[$i]) << 24); + $int_build += (ord($input[$i+1]) << 16); + $int_build += (ord($input[$i+2]) << 8); + $int_build += (ord($input[$i+3])); + + $result[] = $int_build; + } + + return $result; + } + + /** + * Process and return the hash. + * + * @param $str Input string to hash + * @param $ig_func Option param to ignore checking for php > 5.1.2 + * @return string Hexadecimal representation of the message digest + */ + function hash($str, $ig_func = false) + { + unset($binStr); // binary representation of input string + unset($hexStr); // 256-bit message digest in readable hex format + + // check for php's internal sha256 function, ignore if ig_func==true + if ($ig_func == false) { + if (version_compare(PHP_VERSION,'5.1.2','>=')) { + return hash("sha256", $str, false); + } else if (function_exists('mhash') && defined('MHASH_SHA256')) { + return base64_encode(bin2hex(mhash(MHASH_SHA256, $str))); + } + } + + /* + * SHA-256 Constants + * Sequence of sixty-four constant 32-bit words representing the + * first thirty-two bits of the fractional parts of the cube roots + * of the first sixtyfour prime numbers. + */ + $K = array((int)0x428a2f98, (int)0x71374491, (int)0xb5c0fbcf, + (int)0xe9b5dba5, (int)0x3956c25b, (int)0x59f111f1, + (int)0x923f82a4, (int)0xab1c5ed5, (int)0xd807aa98, + (int)0x12835b01, (int)0x243185be, (int)0x550c7dc3, + (int)0x72be5d74, (int)0x80deb1fe, (int)0x9bdc06a7, + (int)0xc19bf174, (int)0xe49b69c1, (int)0xefbe4786, + (int)0x0fc19dc6, (int)0x240ca1cc, (int)0x2de92c6f, + (int)0x4a7484aa, (int)0x5cb0a9dc, (int)0x76f988da, + (int)0x983e5152, (int)0xa831c66d, (int)0xb00327c8, + (int)0xbf597fc7, (int)0xc6e00bf3, (int)0xd5a79147, + (int)0x06ca6351, (int)0x14292967, (int)0x27b70a85, + (int)0x2e1b2138, (int)0x4d2c6dfc, (int)0x53380d13, + (int)0x650a7354, (int)0x766a0abb, (int)0x81c2c92e, + (int)0x92722c85, (int)0xa2bfe8a1, (int)0xa81a664b, + (int)0xc24b8b70, (int)0xc76c51a3, (int)0xd192e819, + (int)0xd6990624, (int)0xf40e3585, (int)0x106aa070, + (int)0x19a4c116, (int)0x1e376c08, (int)0x2748774c, + (int)0x34b0bcb5, (int)0x391c0cb3, (int)0x4ed8aa4a, + (int)0x5b9cca4f, (int)0x682e6ff3, (int)0x748f82ee, + (int)0x78a5636f, (int)0x84c87814, (int)0x8cc70208, + (int)0x90befffa, (int)0xa4506ceb, (int)0xbef9a3f7, + (int)0xc67178f2); + + // Pre-processing: Padding the string + $binStr = $this->char_pad($str); + + // Parsing the Padded Message (Break into N 512-bit blocks) + $M = str_split($binStr, 64); + + // Set the initial hash values + $h[0] = (int)0x6a09e667; + $h[1] = (int)0xbb67ae85; + $h[2] = (int)0x3c6ef372; + $h[3] = (int)0xa54ff53a; + $h[4] = (int)0x510e527f; + $h[5] = (int)0x9b05688c; + $h[6] = (int)0x1f83d9ab; + $h[7] = (int)0x5be0cd19; + + // loop through message blocks and compute hash. ( For i=1 to N : ) + $N = count($M); + for ($i = 0; $i < $N; $i++) + { + // Break input block into 16 32bit words (message schedule prep) + $MI = $this->int_split($M[$i]); + + // Initialize working variables + $_a = (int)$h[0]; + $_b = (int)$h[1]; + $_c = (int)$h[2]; + $_d = (int)$h[3]; + $_e = (int)$h[4]; + $_f = (int)$h[5]; + $_g = (int)$h[6]; + $_h = (int)$h[7]; + unset($_s0); + unset($_s1); + unset($_T1); + unset($_T2); + $W = array(); + + // Compute the hash and update + for ($t = 0; $t < 16; $t++) + { + // Prepare the first 16 message schedule values as we loop + $W[$t] = $MI[$t]; + + // Compute hash + $_T1 = $this->addmod2n($this->addmod2n($this->addmod2n($this->addmod2n($_h, $this->Sigma1($_e)), $this->Ch($_e, $_f, $_g)), $K[$t]), $W[$t]); + $_T2 = $this->addmod2n($this->Sigma0($_a), $this->Maj($_a, $_b, $_c)); + + // Update working variables + $_h = $_g; $_g = $_f; $_f = $_e; $_e = $this->addmod2n($_d, $_T1); + $_d = $_c; $_c = $_b; $_b = $_a; $_a = $this->addmod2n($_T1, $_T2); + } + + for (; $t < 64; $t++) + { + // Continue building the message schedule as we loop + $_s0 = $W[($t+1)&0x0F]; + $_s0 = $this->sigma_0($_s0); + $_s1 = $W[($t+14)&0x0F]; + $_s1 = $this->sigma_1($_s1); + + $W[$t&0xF] = $this->addmod2n($this->addmod2n($this->addmod2n($W[$t&0xF], $_s0), $_s1), $W[($t+9)&0x0F]); + + // Compute hash + $_T1 = $this->addmod2n($this->addmod2n($this->addmod2n($this->addmod2n($_h, $this->Sigma1($_e)), $this->Ch($_e, $_f, $_g)), $K[$t]), $W[$t&0xF]); + $_T2 = $this->addmod2n($this->Sigma0($_a), $this->Maj($_a, $_b, $_c)); + + // Update working variables + $_h = $_g; $_g = $_f; $_f = $_e; $_e = $this->addmod2n($_d, $_T1); + $_d = $_c; $_c = $_b; $_b = $_a; $_a = $this->addmod2n($_T1, $_T2); + } + + $h[0] = $this->addmod2n($h[0], $_a); + $h[1] = $this->addmod2n($h[1], $_b); + $h[2] = $this->addmod2n($h[2], $_c); + $h[3] = $this->addmod2n($h[3], $_d); + $h[4] = $this->addmod2n($h[4], $_e); + $h[5] = $this->addmod2n($h[5], $_f); + $h[6] = $this->addmod2n($h[6], $_g); + $h[7] = $this->addmod2n($h[7], $_h); + } + + // Convert the 32-bit words into human readable hexadecimal format. + $hexStr = sprintf("%08x%08x%08x%08x%08x%08x%08x%08x", $h[0], $h[1], $h[2], $h[3], $h[4], $h[5], $h[6], $h[7]); + + return ($this->toUpper) ? strtoupper($hexStr) : $hexStr; + } + + } +} + +if (!function_exists('str_split')) +{ + /** + * Splits a string into an array of strings with specified length. + * Compatability with older verions of PHP + */ + function str_split($string, $split_length = 1) + { + $sign = ($split_length < 0) ? -1 : 1; + $strlen = strlen($string); + $split_length = abs($split_length); + + if (($split_length == 0) || ($strlen == 0)) { + $result = false; + } elseif ($split_length >= $strlen) { + $result[] = $string; + } else { + $length = $split_length; + + for ($i = 0; $i < $strlen; $i++) + { + $i = (($sign < 0) ? $i + $length : $i); + $result[] = substr($string, $sign*$i, $length); + $i--; + $i = (($sign < 0) ? $i : $i + $length); + + $length = (($i + $split_length) > $strlen) + ? ($strlen - ($i + 1)) + : $split_length; + } + } + + return $result; + } +} + +/** + * Main routine called from an application using this include. + * + * General usage: + * require_once('sha256.inc.php'); + * $hashstr = sha256('abc'); + * + * Note: + * PHP Strings are limitd to (2^31)-1, so it is not worth it to + * check for input strings > 2^64 as the FIPS180-2 defines. + */ +// 2009-07-23: Added check for function as the Suhosin plugin adds this routine. +if (!function_exists('sha256')) { + function sha256($str, $ig_func = false) { + $obj = new nanoSha2((defined('_NANO_SHA2_UPPER')) ? true : false); + return $obj->hash($str, $ig_func); + } +} else { + function _nano_sha256($str, $ig_func = false) { + $obj = new nanoSha2((defined('_NANO_SHA2_UPPER')) ? true : false); + return $obj->hash($str, $ig_func); + } +} + +// support to give php4 the hash() routine which abstracts this code. +if (!function_exists('hash')) +{ + function hash($algo, $data) + { + if (empty($algo) || !is_string($algo) || !is_string($data)) { + return false; + } + + if (function_exists($algo)) { + return $algo($data); + } + } +} \ No newline at end of file diff --git a/shop/inicis/lpay_common.php b/shop/inicis/lpay_common.php new file mode 100644 index 000000000..497b4dbac --- /dev/null +++ b/shop/inicis/lpay_common.php @@ -0,0 +1,9 @@ +', 10); +?> + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + \ No newline at end of file diff --git a/shop/inicis/lpay_order.script.php b/shop/inicis/lpay_order.script.php new file mode 100644 index 000000000..d9767f500 --- /dev/null +++ b/shop/inicis/lpay_order.script.php @@ -0,0 +1,74 @@ + + \ No newline at end of file diff --git a/shop/inicis/makesignature.php b/shop/inicis/makesignature.php new file mode 100644 index 000000000..c7313b460 --- /dev/null +++ b/shop/inicis/makesignature.php @@ -0,0 +1,32 @@ +'올바른 방법으로 이용해 주십시오.'))); + +$orderNumber = get_session('ss_order_inicis_id'); +$price = preg_replace('#[^0-9]#', '', $_POST['price']); + +if(strlen($price) < 1) + die(json_encode(array('error'=>'가격이 올바르지 않습니다.'))); + +// +//################################### +// 2. 가맹점 확인을 위한 signKey를 해시값으로 변경 (SHA-256방식 사용) +//################################### +$mKey = hash("sha256", $signKey); + +/* + //*** 위변조 방지체크를 signature 생성 *** + oid, price, timestamp 3개의 키와 값을 + key=value 형식으로 하여 '&'로 연결한 하여 SHA-256 Hash로 생성 된값 + ex) oid=INIpayTest_1432813606995&price=819000×tamp=2012-02-01 09:19:04.004 + * key기준 알파벳 정렬 + * timestamp는 반드시 signature생성에 사용한 timestamp 값을 timestamp input에 그대로 사용하여야함 + */ +$params = "oid=" . $orderNumber . "&price=" . $price . "×tamp=" . $timestamp; +$sign = hash("sha256", $params); + +die(json_encode(array('error'=>'', 'mKey'=>$mKey, 'timestamp'=>$timestamp, 'sign'=>$sign))); \ No newline at end of file diff --git a/shop/inicis/orderform.1.php b/shop/inicis/orderform.1.php new file mode 100644 index 000000000..57f560620 --- /dev/null +++ b/shop/inicis/orderform.1.php @@ -0,0 +1,42 @@ +', 10); +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + 취소 +
      + \ No newline at end of file diff --git a/shop/inicis/orderform.4.php b/shop/inicis/orderform.4.php new file mode 100644 index 000000000..b090a888d --- /dev/null +++ b/shop/inicis/orderform.4.php @@ -0,0 +1,2 @@ +SetField("type", "repay"); // 고정 (절대 수정 불가) +$inipay->SetField("pgid", "INIphpRPAY"); // 고정 (절대 수정 불가) +$inipay->SetField("subpgip", "203.238.3.10"); // 고정 +$inipay->SetField("mid", $default['de_inicis_mid']); // 상점아이디 +$inipay->SetField("admin", $default['de_inicis_admin_key']); //비대칭 사용키 키패스워드 +$inipay->SetField("oldtid", $oldtid); // 취소할 거래의 거래아이디 +$inipay->SetField("currency", $currency); // 화폐단위 +$inipay->SetField("price", $price); // 취소금액 +$inipay->SetField("confirm_price", $confirm_price); // 승인요청금액 +$inipay->SetField("buyeremail", $buyeremail); // 구매자 이메일 주소 +$inipay->SetField("tax", $tax); // 부가세금액 +$inipay->SetField("taxfree", $taxfree); // 비과세금액 + +/****************** + * 4. 재승인 요청 * + ******************/ +$inipay->startAction(); + + +/******************************************************************* + * 5. 재승인 결과 * + * * + * 신거래번호 : $inipay->getResult('TID') * + * 결과코드 : $inipay->getResult('ResultCode') ("00"이면 재승인 성공) * + * 결과내용 : $inipay->getResult('ResultMsg') (재승인결과에 대한 설명) * + * 원거래 번호 : $inipay->getResult('PRTC_TID') * + * 최종결제 금액 : $inipay->getResult('PRTC_Remains') * + * 부분취소 금액 : $inipay->getResult('PRTC_Price') * + * 부분취소,재승인 구분값 : $inipay->getResult('PRTC_Type') * + * ("0" : 재승인, "1" : 부분취소) * + * 부분취소(재승인) 요청횟수 : $inipay->getResult('PRTC_Cnt') * + *******************************************************************/ + + if($inipay->getResult('ResultCode') == '00') { + // 환불금액기록 + $tno = $inipay->getResult('PRTC_TID'); + $re_price = $inipay->getResult('PRTC_Price'); + + $sql = " update {$g5['g5_shop_order_table']} + set od_refund_price = od_refund_price + '$re_price', + od_shop_memo = concat(od_shop_memo, \"$mod_memo\") + where od_id = '{$od['od_id']}' + and od_tno = '$tno' "; + sql_query($sql); + + // 미수금 등의 정보 업데이트 + $info = get_order_info($od_id); + + $sql = " update {$g5['g5_shop_order_table']} + set od_misu = '{$info['od_misu']}', + od_tax_mny = '{$info['od_tax_mny']}', + od_vat_mny = '{$info['od_vat_mny']}', + od_free_mny = '{$info['od_free_mny']}' + where od_id = '$od_id' "; + sql_query($sql); + } else { + alert(iconv_utf8($inipay->GetResult("ResultMsg")).' 코드 : '.$inipay->GetResult("ResultCode")); + } \ No newline at end of file diff --git a/shop/inicis/popup.php b/shop/inicis/popup.php new file mode 100644 index 000000000..bdef45db7 --- /dev/null +++ b/shop/inicis/popup.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/shop/inicis/taxsave_form.php b/shop/inicis/taxsave_form.php new file mode 100644 index 000000000..fd9d66a65 --- /dev/null +++ b/shop/inicis/taxsave_form.php @@ -0,0 +1,197 @@ + + + + +
      +

      + +
      +

      주문정보

      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      주문 번호
      상품 정보
      주문자 이름
      주문자 E-Mail
      주문자 전화번호
      +
      +
      + +
      +

      현금영수증 발급 정보

      + +
      + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      원 거래 시각
      발행 용도 + + + + +
      + + + ("-" 생략) +
      거래금액 총합
      공급가액
      봉사료
      부가가치세
      +
      + +
      + + + + +
      + +
      +
      + +
      \ No newline at end of file diff --git a/shop/inicis/taxsave_result.php b/shop/inicis/taxsave_result.php new file mode 100644 index 000000000..141429d52 --- /dev/null +++ b/shop/inicis/taxsave_result.php @@ -0,0 +1,194 @@ +개인결제 내역이 존재하지 않습니다.

      '); + + if($od['pp_cash'] == 1) + alert('이미 등록된 현금영수증 입니다.'); + + $buyername = $od['pp_name']; + $goodname = $od['pp_name'].'님 개인결제'; + $amt_tot = (int)$od['pp_receipt_price']; + $amt_sup = (int)round(($amt_tot * 10) / 11); + $amt_svc = 0; + $amt_tax = (int)($amt_tot - $amt_sup); +} else { + $od = sql_fetch(" select * from {$g5['g5_shop_order_table']} where od_id = '$od_id' "); + if (!$od) + die('

      주문서가 존재하지 않습니다.

      '); + + if($od['od_cash'] == 1) + alert('이미 등록된 현금영수증 입니다.'); + + $buyername = $od['od_name']; + $goods = get_goods($od['od_id']); + $goodname = $goods['full_name']; + $amt_tot = (int)$od['od_tax_mny'] + (int)$od['od_vat_mny'] + (int)$od['od_free_mny']; + $amt_sup = (int)$od['od_tax_mny'] + (int)$od['od_free_mny']; + $amt_tax = (int)$od['od_vat_mny']; + $amt_svc = 0; +} + + +$reg_num = $id_info; +$useopt = $tr_code; +$currency = 'WON'; + +/********************* + * 3. 발급 정보 설정 * + *********************/ +$inipay->SetField("type" ,"receipt"); // 고정 +$inipay->SetField("pgid" ,"INIphpRECP"); // 고정 +$inipay->SetField("paymethod" ,"CASH"); // 고정 (요청분류) +$inipay->SetField("currency" ,$currency); // 화폐단위 (고정) +/************************************************************************************************** +* admin 은 키패스워드 변수명입니다. 수정하시면 안됩니다. 1111의 부분만 수정해서 사용하시기 바랍니다. +* 키패스워드는 상점관리자 페이지(https://iniweb.inicis.com)의 비밀번호가 아닙니다. 주의해 주시기 바랍니다. +* 키패스워드는 숫자 4자리로만 구성됩니다. 이 값은 키파일 발급시 결정됩니다. +* 키패스워드 값을 확인하시려면 상점측에 발급된 키파일 안의 readme.txt 파일을 참조해 주십시오. +**************************************************************************************************/ +$inipay->SetField("admin" ,$default['de_inicis_admin_key']); // 키패스워드(상점아이디에 따라 변경) +$inipay->SetField("mid" ,$default['de_inicis_mid']); // 상점아이디 +$inipay->SetField("goodname" ,iconv_euckr($goodname)); // 상품명 +$inipay->SetField("cr_price" ,$amt_tot); // 총 현금결제 금액 +$inipay->SetField("sup_price" ,$amt_sup); // 공급가액 +$inipay->SetField("tax" ,$amt_tax); // 부가세 +$inipay->SetField("srvc_price" ,$amt_svc); // 봉사료 +$inipay->SetField("buyername" ,iconv_euckr($buyername)); // 구매자 성명 +$inipay->SetField("buyeremail" ,$buyeremail); // 구매자 이메일 주소 +$inipay->SetField("buyertel" ,$buyertel); // 구매자 전화번호 +$inipay->SetField("reg_num" ,$reg_num); // 현금결제자 주민등록번호 +$inipay->SetField("useopt" ,$useopt); // 현금영수증 발행용도 ("1" - 소비자 소득공제용, "2" - 사업자 지출증빙용) +$inipay->SetField("companynumber" ,$companynumber); // 서브몰 사업자번호 + + +/**************** + * 4. 발급 요청 * + ****************/ +$inipay->startAction(); + + +/******************************************************************************** + * 5. 발급 결과 * + * * + * 결과코드 : $inipay->GetResult('ResultCode') ("00" 이면 발행 성공) * + * 승인번호 : $inipay->GetResult('ApplNum') (현금영수증 발행 승인번호) * + * 승인날짜 : $inipay->GetResult('ApplDate') (YYYYMMDD) * + * 승인시각 : $inipay->GetResult('ApplTime') (HHMMSS) * + * 거래번호 : $inipay->GetResult('TID') * + * 총현금결제 금액 : $inipay->GetResult('CSHR_ApplPrice') * + * 공급가액 : $inipay->GetResult('CSHR_SupplyPrice') * + * 부가세 : $inipay->GetResult('CSHR_Tax') * + * 봉사료 : $inipay->GetResult('CSHR_ServicePrice') * + * 사용구분 : $inipay->GetResult('CSHR_Type') * + ********************************************************************************/ + + +// DB 반영 +if($inipay->GetResult('ResultCode') == '00') { + $cash_no = $inipay->GetResult('ApplNum'); + + $cash = array(); + $cash['TID'] = $inipay->GetResult('TID'); + $cash['ApplNum'] = $inipay->GetResult('ApplNum'); + $cash['ApplDate'] = $inipay->GetResult('ApplDate'); + $cash['ApplTime'] = $inipay->GetResult('ApplTime'); + $cash['CSHR_Type'] = $inipay->GetResult('CSHR_Type'); + $cash_info = serialize($cash); + + if($tx == 'personalpay') { + $sql = " update {$g5['g5_shop_personalpay_table']} + set pp_cash = '1', + pp_cash_no = '$cash_no', + pp_cash_info = '$cash_info' + where pp_id = '$od_id' "; + } else { + $sql = " update {$g5['g5_shop_order_table']} + set od_cash = '1', + od_cash_no = '$cash_no', + od_cash_info = '$cash_info' + where od_id = '$od_id' "; + } + + $result = sql_query($sql, false); + + if(!$result) + include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; +} + +$g5['title'] = '현금영수증 발급'; +include_once(G5_PATH.'/head.sub.php'); +?> + + + +
      +

      현금영수증 - KG이니시스

      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      결과코드GetResult('ResultCode'); ?>
      결과 메세지GetResult('ResultMsg')); ?>
      현금영수증 거래번호GetResult('TID'); ?>
      현금영수증 승인번호GetResult('ApplNum'); ?>
      승인시간GetResult('ApplDate').$inipay->GetResult('ApplTime')); ?>
      현금영수증 URL + +

      영수증 확인은 실 등록의 경우에만 가능합니다.

      +
      +
      + +
      + + 0) { + for ($i=1; $i<=$tv_idx; $i++) { + if (get_session("ss_tv[$i]") == $it_id) { + $saved = true; + break; + } + } +} + +if (!$saved) { + $tv_idx++; + set_session("ss_tv_idx", $tv_idx); + set_session("ss_tv[$tv_idx]", $it_id); +} +// 오늘 본 상품 저장 끝 + +// 조회수 증가 +if (get_cookie('ck_it_id') != $it_id) { + sql_query(" update {$g5['g5_shop_item_table']} set it_hit = it_hit + 1 where it_id = '$it_id' "); // 1증가 + set_cookie("ck_it_id", $it_id, 3600); // 1시간동안 저장 +} + +// 스킨경로 +$skin_dir = G5_SHOP_SKIN_PATH; +$ca_dir_check = true; + +if($it['it_skin']) { + if(preg_match('#^theme/(.+)$#', $it['it_skin'], $match)) + $skin_dir = G5_THEME_PATH.'/'.G5_SKIN_DIR.'/shop/'.$match[1]; + else + $skin_dir = G5_PATH.'/'.G5_SKIN_DIR.'/shop/'.$it['it_skin']; + + if(is_dir($skin_dir)) { + $form_skin_file = $skin_dir.'/item.form.skin.php'; + + if(is_file($form_skin_file)) + $ca_dir_check = false; + } +} + +if($ca_dir_check) { + if($ca['ca_skin_dir']) { + if(preg_match('#^theme/(.+)$#', $ca['ca_skin_dir'], $match)) + $skin_dir = G5_THEME_PATH.'/'.G5_SKIN_DIR.'/shop/'.$match[1]; + else + $skin_dir = G5_PATH.'/'.G5_SKIN_DIR.'/shop/'.$ca['ca_skin_dir']; + + if(is_dir($skin_dir)) { + $form_skin_file = $skin_dir.'/item.form.skin.php'; + + if(!is_file($form_skin_file)) + $skin_dir = G5_SHOP_SKIN_PATH; + } else { + $skin_dir = G5_SHOP_SKIN_PATH; + } + } +} + +define('G5_SHOP_CSS_URL', str_replace(G5_PATH, G5_URL, $skin_dir)); + +$g5['title'] = $it['it_name'].' > '.$it['ca_name']; + +// 분류 상단 코드가 있으면 출력하고 없으면 기본 상단 코드 출력 +if ($ca['ca_include_head'] && is_include_path_check($ca['ca_include_head'])) + @include_once($ca['ca_include_head']); +else + include_once(G5_SHOP_PATH.'/_head.php'); + +// 분류 위치 +// HOME > 1단계 > 2단계 ... > 6단계 분류 +$ca_id = $it['ca_id']; +$nav_skin = $skin_dir.'/navigation.skin.php'; +if(!is_file($nav_skin)) + $nav_skin = G5_SHOP_SKIN_PATH.'/navigation.skin.php'; +include $nav_skin; + +if(defined('G5_THEME_USE_ITEM_CATEGORY') && G5_THEME_USE_ITEM_CATEGORY){ + // 이 분류에 속한 하위분류 출력 + $cate_skin = $skin_dir.'/listcategory.skin.php'; + if(!is_file($cate_skin)) + $cate_skin = G5_SHOP_SKIN_PATH.'/listcategory.skin.php'; + include $cate_skin; +} + +if ($is_admin) { + echo ''; +} +?> + + +'.conv_content($it['it_head_html'], 1).''; + +// 보안서버경로 +if (G5_HTTPS_DOMAIN) + $action_url = G5_HTTPS_DOMAIN.'/'.G5_SHOP_DIR.'/cartupdate.php'; +else + $action_url = G5_SHOP_URL.'/cartupdate.php'; + + +// 이전 상품보기 +$sql = " select it_id, it_name from {$g5['g5_shop_item_table']} where it_id > '$it_id' and SUBSTRING(ca_id,1,4) = '".substr($it['ca_id'],0,4)."' and it_use = '1' order by it_id asc limit 1 "; +$row = sql_fetch($sql); +if (isset($row['it_id']) && $row['it_id']) { + $prev_title = '이전상품 '.$row['it_name'].''; + $prev_href = ''; + $prev_href2 = ''.PHP_EOL; +} else { + $prev_title = ''; + $prev_href = ''; + $prev_href2 = ''; +} + +// 다음 상품보기 +$sql = " select it_id, it_name from {$g5['g5_shop_item_table']} where it_id < '$it_id' and SUBSTRING(ca_id,1,4) = '".substr($it['ca_id'],0,4)."' and it_use = '1' order by it_id desc limit 1 "; +$row = sql_fetch($sql); +if (isset($row['it_id']) && $row['it_id']) { + $next_title = '다음 상품 '.$row['it_name'].''; + $next_href = ''; + $next_href2 = ''.PHP_EOL; +} else { + $next_title = ''; + $next_href = ''; + $next_href2 = ''; +} + +// 고객선호도 별점수 +$star_score = get_star_image($it['it_id']); + +// 관리자가 확인한 사용후기의 개수를 얻음 +$sql = " select count(*) as cnt from `{$g5['g5_shop_item_use_table']}` where it_id = '{$it_id}' and is_confirm = '1' "; +$row = sql_fetch($sql); +$item_use_count = $row['cnt']; + +// 상품문의의 개수를 얻음 +$sql = " select count(*) as cnt from `{$g5['g5_shop_item_qa_table']}` where it_id = '{$it_id}' "; +$row = sql_fetch($sql); +$item_qa_count = $row['cnt']; + +// 관련상품의 개수를 얻음 +if($default['de_rel_list_use']) { + $sql = " select count(*) as cnt from {$g5['g5_shop_item_relation_table']} a left join {$g5['g5_shop_item_table']} b on (a.it_id2=b.it_id) where a.it_id = '{$it['it_id']}' and b.it_use='1' "; + $row = sql_fetch($sql); + $item_relation_count = $row['cnt']; +} + +// 소셜 관련 +$sns_title = get_text($it['it_name']).' | '.get_text($config['cf_title']); +$sns_url = shop_item_url($it['it_id']); +$sns_share_links = get_sns_share_link('facebook', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/facebook.png').' '; +$sns_share_links .= get_sns_share_link('twitter', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/twitter.png').' '; +$sns_share_links .= get_sns_share_link('googleplus', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/gplus.png'); + +// 상품품절체크 +if(G5_SOLDOUT_CHECK) + $is_soldout = is_soldout($it['it_id']); + +// 주문가능체크 +$is_orderable = true; +if(!$it['it_use'] || $it['it_tel_inq'] || $is_soldout) + $is_orderable = false; + +$option_item = $supply_item = ''; + +if($is_orderable) { + if(defined('G5_THEME_USE_OPTIONS_TRTD') && G5_THEME_USE_OPTIONS_TRTD){ + $option_item = get_item_options($it['it_id'], $it['it_option_subject'], ''); + $supply_item = get_item_supply($it['it_id'], $it['it_supply_subject'], ''); + } else { + // 선택 옵션 ( 기존의 tr td 태그로 가져오려면 'div' 를 '' 로 바꾸거나 또는 지워주세요 ) + $option_item = get_item_options($it['it_id'], $it['it_option_subject'], 'div', 1); + + // 추가 옵션 ( 기존의 tr td 태그로 가져오려면 'div' 를 '' 로 바꾸거나 또는 지워주세요 ) + $supply_item = get_item_supply($it['it_id'], $it['it_supply_subject'], 'div', 1); + } + + // 상품 선택옵션 수 + $option_count = 0; + if($it['it_option_subject']) { + $temp = explode(',', $it['it_option_subject']); + $option_count = count($temp); + } + + // 상품 추가옵션 수 + $supply_count = 0; + if($it['it_supply_subject']) { + $temp = explode(',', $it['it_supply_subject']); + $supply_count = count($temp); + } +} + +function pg_anchor($anc_id) { + global $default; + global $item_use_count, $item_qa_count, $item_relation_count; +?> + + + + + + + +
      + + + + + +
      + + + + and io_id like '$opt_id".chr(30)."' +*/ +$sql = " select * from {$g5['g5_shop_item_option_table']} + where io_type = '0' + and it_id = '$it_id' + and io_use = '1' + and io_id like '$opt_id".chr(30)."%' + order by io_no asc "; +$result = sql_query($sql); + +$option_title = '선택'; + +if( $op_title && ($op_title !== $option_title) && $it['it_option_subject'] ){ + $array_tmps = explode(',', $it['it_option_subject']); + if( isset($array_tmps[$idx+1]) && $array_tmps[$idx+1] ){ + $option_title = $array_tmps[$idx+1]; + } +} + +$str = ''; +$opt = array(); + +for($i=0; $row=sql_fetch_array($result); $i++) { + $val = explode(chr(30), $row['io_id']); + $key = $idx + 1; + + if(!strlen($val[$key])) + continue; + + $continue = false; + foreach($opt as $v) { + if(strval($v) === strval($val[$key])) { + $continue = true; + break; + } + } + if($continue) + continue; + + $opt[] = strval($val[$key]); + + if($key + 1 < $sel_count) { + $str .= PHP_EOL.''; + } else { + if($row['io_price'] >= 0) + $price = '  + '.number_format($row['io_price']).'원'; + else + $price = '   '.number_format($row['io_price']).'원'; + + $io_stock_qty = get_option_stock_qty($it_id, $row['io_id'], $row['io_type']); + + if($io_stock_qty < 1) + $soldout = '  [품절]'; + else + $soldout = ''; + + $str .= PHP_EOL.''; + } +} + +echo $str; \ No newline at end of file diff --git a/shop/itemqa.php b/shop/itemqa.php new file mode 100644 index 000000000..3ff450187 --- /dev/null +++ b/shop/itemqa.php @@ -0,0 +1,88 @@ +'; + } + /* + if( !G5_IS_MOBILE ){ //PC 에서는 검색엔진 화면에 노출하지 않도록 수정 + return; + } + */ +} + +if (G5_IS_MOBILE) { + include_once(G5_MSHOP_PATH.'/itemqa.php'); + return; +} + +include_once(G5_LIB_PATH.'/thumbnail.lib.php'); + +// 현재페이지, 총페이지수, 한페이지에 보여줄 행, URL +function itemqa_page($write_pages, $cur_page, $total_page, $url, $add="") +{ + //$url = preg_replace('#&page=[0-9]*(&page=)$#', '$1', $url); + $url = preg_replace('#&page=[0-9]*#', '', $url) . '&page='; + + $str = ''; + if ($cur_page > 1) { + $str .= '처음'.PHP_EOL; + } + + $start_page = ( ( (int)( ($cur_page - 1 ) / $write_pages ) ) * $write_pages ) + 1; + $end_page = $start_page + $write_pages - 1; + + if ($end_page >= $total_page) $end_page = $total_page; + + if ($start_page > 1) $str .= '이전'.PHP_EOL; + + if ($total_page > 1) { + for ($k=$start_page;$k<=$end_page;$k++) { + if ($cur_page != $k) + $str .= ''.$k.'페이지'.PHP_EOL; + else + $str .= '열린'.$k.'페이지'.PHP_EOL; + } + } + + if ($total_page > $end_page) $str .= '다음'.PHP_EOL; + + if ($cur_page < $total_page) { + $str .= '맨끝'.PHP_EOL; + } + + if ($str) + return ""; + else + return ""; +} + +$itemqa_list = G5_SHOP_URL."/itemqalist.php"; +$itemqa_form = G5_SHOP_URL."/itemqaform.php?it_id=".$it_id; +$itemqa_formupdate = G5_SHOP_URL."/itemqaformupdate.php?it_id=".$it_id; + +$sql_common = " from `{$g5['g5_shop_item_qa_table']}` where it_id = '{$it_id}' "; + +// 테이블의 전체 레코드수만 얻음 +$sql = " select COUNT(*) as cnt " . $sql_common; +$row = sql_fetch($sql); +$total_count = $row['cnt']; + +$rows = 5; +$total_page = ceil($total_count / $rows); // 전체 페이지 계산 +if ($page < 1) $page = 1; // 페이지가 없으면 첫 페이지 (1 페이지) +$from_record = ($page - 1) * $rows; // 시작 레코드 구함 + +$sql = "select * $sql_common order by iq_id desc limit $from_record, $rows "; +$result = sql_query($sql); + +$itemqa_skin = G5_SHOP_SKIN_PATH.'/itemqa.skin.php'; + +if(!file_exists($itemqa_skin)) { + echo str_replace(G5_PATH.'/', '', $itemqa_skin).' 스킨 파일이 존재하지 않습니다.'; +} else { + include_once($itemqa_skin); +} \ No newline at end of file diff --git a/shop/itemqaform.php b/shop/itemqaform.php new file mode 100644 index 000000000..4af8038ab --- /dev/null +++ b/shop/itemqaform.php @@ -0,0 +1,69 @@ +'', 'iq_question'=>''); + +if (G5_IS_MOBILE) { + include_once(G5_MSHOP_PATH.'/itemqaform.php'); + return; +} + +include_once(G5_EDITOR_LIB); + +if (!$is_member) { + alert_close("상품문의는 회원만 작성 가능합니다."); +} + +// 상품정보체크 +$row = get_shop_item($it_id, true); +if(! (isset($row['it_id']) && $row['it_id'])) + alert_close('상품정보가 존재하지 않습니다.'); + +$chk_secret = ''; + +if($w == '') { + $qa['iq_email'] = $member['mb_email']; + $qa['iq_hp'] = $member['mb_hp']; +} + +if ($w == "u") +{ + $qa = sql_fetch(" select * from {$g5['g5_shop_item_qa_table']} where iq_id = '$iq_id' "); + if (!$qa) { + alert_close("상품문의 정보가 없습니다."); + } + + $it_id = $qa['it_id']; + + if (!$is_admin && $qa['mb_id'] != $member['mb_id']) { + alert_close("자신의 상품문의만 수정이 가능합니다."); + } + + if($qa['iq_secret']) + $chk_secret = 'checked="checked"'; +} + +include_once(G5_PATH.'/head.sub.php'); + +$is_dhtml_editor = false; +// 모바일에서는 DHTML 에디터 사용불가 +if ($config['cf_editor'] && (!is_mobile() || defined('G5_IS_MOBILE_DHTML_USE') && G5_IS_MOBILE_DHTML_USE)) { + $is_dhtml_editor = true; +} +$editor_html = editor_html('iq_question', get_text(html_purifier($qa['iq_question']), 0), $is_dhtml_editor); +$editor_js = ''; +$editor_js .= get_editor_js('iq_question', $is_dhtml_editor); +$editor_js .= chk_editor_js('iq_question', $is_dhtml_editor); + +$itemqaform_skin = G5_SHOP_SKIN_PATH.'/itemqaform.skin.php'; + +if(!file_exists($itemqaform_skin)) { + echo str_replace(G5_PATH.'/', '', $itemqaform_skin).' 스킨 파일이 존재하지 않습니다.'; +} else { + include_once($itemqaform_skin); +} + +include_once(G5_PATH.'/tail.sub.php'); \ No newline at end of file diff --git a/shop/itemqaformupdate.php b/shop/itemqaformupdate.php new file mode 100644 index 000000000..bb44f1e19 --- /dev/null +++ b/shop/itemqaformupdate.php @@ -0,0 +1,138 @@ +(.*?)#is', '', $iq_question); +$iq_answer = isset($_POST['iq_answer']) ? trim($_POST['iq_answer']) : ''; +$hash = isset($_REQUEST['hash']) ? trim($_REQUEST['hash']) : ''; +$get_editor_img_mode = $config['cf_editor'] ? false : true; + +$iq_secret = isset($_POST['iq_secret']) ? (int) $_POST['iq_secret'] : 0; +$iq_email = isset($_POST['iq_email']) ? clean_xss_tags($_POST['iq_email'], 1, 1) : ''; +$iq_hp = isset($_POST['iq_hp']) ? clean_xss_tags($_POST['iq_hp'], 1, 1) : ''; +$is_mobile_shop = isset($_REQUEST['is_mobile_shop']) ? (int) $_REQUEST['is_mobile_shop'] : 0; + +if ($w == "" || $w == "u") { + $iq_name = addslashes(strip_tags($member['mb_name'])); + $iq_password = $member['mb_password']; + + if (!$iq_subject) alert("제목을 입력하여 주십시오."); + if (!$iq_question) alert("질문을 입력하여 주십시오."); +} + +if($is_mobile_shop) + $url = './iteminfo.php?it_id='.$it_id.'&info=qa'; +else + $url = shop_item_url($it_id, "_=".get_token()."#sit_qa"); + +if ($w == "") +{ + $sql = "insert {$g5['g5_shop_item_qa_table']} + set it_id = '$it_id', + mb_id = '{$member['mb_id']}', + iq_secret = '$iq_secret', + iq_name = '$iq_name', + iq_email = '$iq_email', + iq_hp = '$iq_hp', + iq_password = '$iq_password', + iq_subject = '$iq_subject', + iq_question = '$iq_question', + iq_time = '".G5_TIME_YMDHIS."', + iq_ip = '".$_SERVER['REMOTE_ADDR']."' "; + sql_query($sql); + + $alert_msg = '상품문의가 등록 되었습니다.'; +} +else if ($w == "u") +{ + if (!$is_admin) + { + $sql = " select count(*) as cnt from {$g5['g5_shop_item_qa_table']} where mb_id = '{$member['mb_id']}' and iq_id = '$iq_id' "; + $row = sql_fetch($sql); + if (!$row['cnt']) + alert("자신의 상품문의만 수정하실 수 있습니다."); + } + + $sql = " update {$g5['g5_shop_item_qa_table']} + set iq_secret = '$iq_secret', + iq_email = '$iq_email', + iq_hp = '$iq_hp', + iq_subject = '$iq_subject', + iq_question = '$iq_question' + where iq_id = '$iq_id' "; + sql_query($sql); + + $alert_msg = '상품문의가 수정 되었습니다.'; +} +else if ($w == "d") +{ + if (!$is_admin) + { + $sql = " select iq_answer from {$g5['g5_shop_item_qa_table']} where mb_id = '{$member['mb_id']}' and iq_id = '$iq_id' "; + $row = sql_fetch($sql); + if (!$row) + alert("자신의 상품문의만 삭제하실 수 있습니다."); + + if ($row['iq_answer']) + alert("답변이 있는 상품문의는 삭제하실 수 없습니다."); + } + + // 에디터로 첨부된 이미지 삭제 + $sql = " select iq_question, iq_answer from {$g5['g5_shop_item_qa_table']} where iq_id = '$iq_id' and md5(concat(iq_id,iq_time,iq_ip)) = '{$hash}' "; + $row = sql_fetch($sql); + + $imgs = get_editor_image($row['iq_question'], $get_editor_img_mode); + + for($i=0;$i
    '; + + $list[$i]['g_dir'] = G5_URL; + $list[$i]['it_id'] = $row['it_id']; + $list[$i]['it_simg'] = get_it_image($row['it_id'], 70, 70); + $list[$i]['it_name'] = $row['it_name']; + $list[$i]['it_origin'] = $row['it_origin']; + $list[$i]['it_opt'] = $options; + $list[$i]['ct_price'] = $row['ct_price']; + $list[$i]['stotal_price'] = $sum['price']; + $list[$i]['stotal_point'] = $sum['point']; + + $ttotal_price += $list[$i]['stotal_price']; + $ttotal_point += $list[$i]['stotal_point']; +} +//------------------------------------------------------------------------------ + +// 배송비가 있다면 총계에 더한다 +if ($od_send_cost) + $ttotal_price += $od_send_cost; + +// 추가배송비가 있다면 총계에 더한다 +if ($od_send_cost2) + $ttotal_price += $od_send_cost2; \ No newline at end of file diff --git a/shop/ordermail2.inc.php b/shop/ordermail2.inc.php new file mode 100644 index 000000000..c1e1abe5d --- /dev/null +++ b/shop/ordermail2.inc.php @@ -0,0 +1,93 @@ + '' + group by a.it_id "; +$result = sql_query($sql); +for ($i=0; $row=sql_fetch_array($result); $i++) +{ + // 합계금액 계산 + $sql = " select SUM(IF(io_type = 1, (io_price * ct_qty), ((ct_price + io_price) * ct_qty))) as price, + SUM(ct_point * ct_qty) as point, + SUM(ct_qty) as qty + from {$g5['g5_shop_cart_table']} + where it_id = '{$row['it_id']}' + and od_id = '$od_id' + and ct_select = '1' "; + $sum = sql_fetch($sql); + + // 옵션정보 + $sql2 = " select ct_option, ct_qty, io_price + from {$g5['g5_shop_cart_table']} + where it_id = '{$row['it_id']}' and od_id = '$od_id' and ct_select = '1' + order by io_type asc, ct_id asc "; + $result2 = sql_query($sql2); + + $options = ''; + $options_ul = ' style="margin:0;padding:0"'; // ul style + $options_li = ' style="padding:5px 0;list-style:none"'; // li style + for($k=0; $row2=sql_fetch_array($result2); $k++) { + if($k == 0) + $options .= ''.PHP_EOL; + $price_plus = ''; + if($row2['io_price'] >= 0) + $price_plus = '+'; + $options .= ''.$row2['ct_option'].' ('.$price_plus.display_price($row2['io_price']).') '.$row2['ct_qty'].'개'.PHP_EOL; + } + + if($k > 0) + $options .= ''; + + $list[$i]['it_id'] = $row['it_id']; + $list[$i]['it_simg'] = get_it_image($row['it_id'], 70, 70); + $list[$i]['it_name'] = $row['it_name']; + $list[$i]['it_opt'] = $options; + $list[$i]['ct_price'] = $sum['price']; + + $subject = $config['cf_title'].' - 주문 알림 메일 (주문자 '.$od_name.'님)'; + ob_start(); + include G5_SHOP_PATH.'/mail/orderupdate3.mail.php'; + $content = ob_get_contents(); + ob_end_clean(); + + mailer($config['cf_admin_email_name'], $config['cf_admin_email'], $row['it_sell_email'], $subject, $content, 1); +} +//==============================================================================; \ No newline at end of file diff --git a/shop/ordersendcost.php b/shop/ordersendcost.php new file mode 100644 index 000000000..9bb445f28 --- /dev/null +++ b/shop/ordersendcost.php @@ -0,0 +1,18 @@ += '$code' "; +$row = sql_fetch($sql); + +if(! (isset($row['sc_id']) && $row['sc_id'])) + die('0'); + +die($row['sc_price']); \ No newline at end of file diff --git a/shop/ordersendcostcoupon.php b/shop/ordersendcostcoupon.php new file mode 100644 index 000000000..2766058a1 --- /dev/null +++ b/shop/ordersendcostcoupon.php @@ -0,0 +1,81 @@ += '".G5_TIME_YMD."' + and cp_minimum <= '$price' "; +$result = sql_query($sql); +$count = sql_num_rows($result); +?> + + +
    +

    배송비쿠폰

    + 0) { ?> +
    + + + + + + + + + + + $row['cp_maximum']) + $dc = $row['cp_maximum']; + + if($dc > $send_cost) + $dc = $send_cost; + ?> + + + + + + + +
    쿠폰 선택
    쿠폰명할인금액적용
    + + + + +
    +
    + 사용할 수 있는 쿠폰이 없습니다.

    '; + } + ?> +
    + +
    +
    + \ No newline at end of file diff --git a/shop/personalpay.php b/shop/personalpay.php new file mode 100644 index 000000000..ecc03702a --- /dev/null +++ b/shop/personalpay.php @@ -0,0 +1,71 @@ + + + +
    + + personalpay.skin.php 파일을 찾을 수 없습니다.
    관리자에게 알려주시면 감사하겠습니다.

    '; + } + + if ($i==0) + { + echo '

    등록된 개인결제가 없습니다.

    '; + } + ?> + + +
    + + + 0 "; +$pp = sql_fetch($sql); + +if(! (isset($pp['pp_id']) && $pp['pp_id'])) + alert('개인결제 정보가 존재하지 않습니다.'); + +if($pp['pp_tno']) + alert('이미 결제하신 개인결제 내역입니다.'); + +$pp['pp_name'] = strip_tags($pp['pp_name']); + +$g5['title'] = $pp['pp_name'].'님 개인결제'; + +if(G5_IS_MOBILE) + include_once(G5_MSHOP_PATH.'/_head.php'); +else + include_once(G5_SHOP_PATH.'/_head.php'); + +// 개인결제 체크를 위한 hash +$hash_data = md5($pp['pp_id'].$pp['pp_price'].$pp['pp_time']); +set_session('ss_personalpay_id', $pp['pp_id']); +set_session('ss_personalpay_hash', $hash_data); + +// 에스크로 상품정보 +if($default['de_escrow_use']) { + $good_info .= "seq=1".chr(31); + $good_info .= "ordr_numb={$pp_id}_".sprintf("%04d", 1).chr(31); + $good_info .= "good_name=".addslashes($pp['pp_name'].'님 개인결제').chr(31); + $good_info .= "good_cntx=1".chr(31); + $good_info .= "good_amtx=".$pp['pp_price'].chr(31); +} + +// 주문폼과 공통 사용을 위해 추가 +$od_id = $pp_id; +$tot_price = $pp['pp_price']; +$goods = $pp['pp_name'].'님 개인결제'; + +if($default['de_pg_service'] == 'inicis') + set_session('ss_order_inicis_id', $od_id); + +// 기기별 결제폼 include +if($is_mobile_pay) { + $order_action_url = G5_HTTPS_MSHOP_URL.'/personalpayformupdate.php'; + require_once(G5_MSHOP_PATH.'/personalpayform.sub.php'); +} else { + $order_action_url = G5_HTTPS_SHOP_URL.'/personalpayformupdate.php'; + require_once(G5_SHOP_PATH.'/personalpayform.sub.php'); +} + +if(G5_IS_MOBILE) + include_once(G5_MSHOP_PATH.'/_tail.php'); +else + include_once(G5_SHOP_PATH.'/_tail.php'); \ No newline at end of file diff --git a/shop/personalpayform.sub.php b/shop/personalpayform.sub.php new file mode 100644 index 000000000..d87ad2d2c --- /dev/null +++ b/shop/personalpayform.sub.php @@ -0,0 +1,322 @@ + + +
    + + + + +
    +

    개인결제정보

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    상세내용
    결제금액
    +
    +
    + +
    +

    결제수단

    + "; + } + + if ($default['de_vbank_use'] || $default['de_iche_use'] || $default['de_card_use'] || $default['de_hp_use']) { + echo '
    '; + echo '결제방법 선택'; + } + ?> + +
      +
    • + '.PHP_EOL; + $checked = ''; + } + ?> +
    • + +
    • + '.PHP_EOL; + $checked = ''; + } + ?> +
    • + +
    • + '.PHP_EOL; + $checked = ''; + } + ?> +
    • + +
    • + '.PHP_EOL; + $checked = ''; + } + ?> +
    • +
    + + '; + + } + + if ($multi_settle == 0) + echo '

    결제할 방법이 없습니다.
    운영자에게 알려주시면 감사하겠습니다.

    '; + ?> + + +
    +
    + + \ No newline at end of file diff --git a/shop/personalpayformupdate.php b/shop/personalpayformupdate.php new file mode 100644 index 000000000..30d61c621 --- /dev/null +++ b/shop/personalpayformupdate.php @@ -0,0 +1,264 @@ +$sql

    " . sql_error_info() . "

    error file : {$_SERVER['SCRIPT_NAME']}"); +} + +// 주문번호가 있으면 결제정보 반영 +if($pp_receipt_price > 0 && $pp['pp_id'] && $pp['od_id']) { + $od_escrow = 0; + if($escw_yn == 'Y') + $od_escrow = 1; + + $sql = " update {$g5['g5_shop_order_table']} + set od_receipt_price = od_receipt_price + '$pp_receipt_price', + od_receipt_time = '$pp_receipt_time', + od_pg = '$pp_pg', + od_tno = '$pp_tno', + od_app_no = '$app_no', + od_escrow = '$od_escrow', + od_settle_case = '$pp_settle_case', + od_deposit_name = '$pp_deposit_name', + od_bank_account = '$pp_bank_account', + od_shop_memo = concat(od_shop_memo, \"\\n개인결제 ".$pp['pp_id']." 로 결제완료 - ".$pp_receipt_time."\") + where od_id = '{$pp['od_id']}' "; + $result = sql_query($sql, false); + + // 결제정보 입력 오류시 결제 취소 + if(!$result) { + $cancel_msg = '결제정보 입력 오류'; + switch($default['de_pg_service']) { + case 'lg': + include G5_SHOP_PATH.'/lg/xpay_cancel.php'; + break; + case 'inicis': + include G5_SHOP_PATH.'/inicis/inipay_cancel.php'; + break; + default: + include G5_SHOP_PATH.'/kcp/pp_ax_hub_cancel.php'; + break; + } + + die("

    $sql

    " . sql_error_info() . "

    error file : {$_SERVER['SCRIPT_NAME']}"); + } + + // 미수금 정보 업데이트 + $info = get_order_info($pp['od_id']); + + $sql = " update {$g5['g5_shop_order_table']} + set od_misu = '{$info['od_misu']}' "; + if($info['od_misu'] == 0) + $sql .= " , od_status = '입금' "; + $sql .= " where od_id = '{$pp['od_id']}' "; + sql_query($sql, FALSE); + + // 장바구니 상태변경 + if($info['od_misu'] == 0) { + $sql = " update {$g5['g5_shop_cart_table']} + set ct_status = '입금' + where od_id = '{$pp['od_id']}' "; + sql_query($sql, FALSE); + } +} + +// 개인결제번호제거 +set_session('ss_personalpay_id', ''); +set_session('ss_personalpay_hash', ''); + +$uid = md5($pp['pp_id'].$pp['pp_time'].$_SERVER['REMOTE_ADDR']); +set_session('ss_personalpay_uid', $uid); + +goto_url(G5_SHOP_URL.'/personalpayresult.php?pp_id='.$pp['pp_id'].'&uid='.$uid); +?> + + + + 개인결제정보 기록 + + + \ No newline at end of file diff --git a/shop/personalpayresult.php b/shop/personalpayresult.php new file mode 100644 index 000000000..6ff820ead --- /dev/null +++ b/shop/personalpayresult.php @@ -0,0 +1,320 @@ +'.PHP_EOL; + } else { + echo ''.PHP_EOL; + } +} +?> + + +

    + +

    개인결제번호

    + +
    +

    결제 정보

    + 0) + $pp_receipt_price = display_price($pp['pp_receipt_price']); + else + $pp_receipt_price = '아직 입금되지 않았거나 입금정보를 입력하지 못하였습니다.'; + + $app_no_subj = ''; + $disp_bank = true; + $disp_receipt = false; + if($pp['pp_settle_case'] == '신용카드') { + $app_no_subj = '승인번호'; + $app_no = $pp['pp_app_no']; + $disp_bank = false; + $disp_receipt = true; + } else if($pp['pp_settle_case'] == '휴대폰') { + $app_no_subj = '휴대폰번호'; + $app_no = $pp['pp_bank_account']; + $disp_bank = false; + $disp_receipt = true; + } else if($pp['pp_settle_case'] == '가상계좌' || $pp['pp_settle_case'] == '계좌이체') { + $app_no_subj = '거래번호'; + $app_no = $pp['pp_tno']; + } + ?> + +
    +

    결제정보

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0) + $is_cash_receipt = false; + } + + // 미수금이 없고 현금일 경우에만 현금영수증을 발급 할 수 있습니다. + if ($is_cash_receipt && $misu_price == 0 && $pp['pp_receipt_price'] && ($pp['pp_settle_case'] == '계좌이체' || $pp['pp_settle_case'] == '가상계좌')) { + ?> + + + + + + +
    주문번호
    결제방식
    결제금액
    결제일시
    입금자명
    입금계좌
    영수증 + + 영수증 출력 + + 영수증 출력 + + +
    현금영수증 + + 현금영수증 확인하기 + + 현금영수증을 발급하시려면 클릭하십시오. + +
    +
    +
    +
    + +
    +

    결제합계

    + +
      +
    • + 총 주문액 + +
    • + 0) { + echo '
    • '; + echo '미결제액'.PHP_EOL; + echo ''.display_price($misu_price).''; + echo '
    • '; + } + ?> +
    • + 결제액 + +
    • +
    +
    + + +
    +
    +

    관리자가 가상계좌 테스트를 한 경우에만 보입니다.

    + + + + + + + + + + + + + + + + + + + + + + + + +
    모의입금처리
    +
    + +
    +
    +
    + + +
    + + +>> 전체상품수 +<<>> 시작 상품시작 알림 필수 +<<>> 상품ID 해당사 상품 ID 필수 +<<>> 원판매가(할인전가격) 선택적필수 +<<>> 할인적용가 할인후가격 필수 +<<>> 모바일 할인적용가 할인후가격 선택적필수 +<<>> 상품명 상품명 필수,varchar(500) +<<>> 상품링크 해당 상품으로 갈 상품URL 필수 +<<>> 이미지링크 상품이미지 링크 + (상품이미지 중 제일 큰이미지링크) 필수,varchar(255) +<<>> 카테고리명 대분류명 필수 +<<>> 카테고리 ID(대분류) 필수 +<<>> 카테고리명 중분류명 +<<>> 카테고리 ID(중분류) +<<>> 카테고리명 소분류명 +<<>> 카테고리 ID(소분류) +<<>> 카테고리명 세분류명 +<<>> 카테고리 ID(세분류) + +<<>> 모델명 +<<>> 브랜드명 +<<>> 제조사 + +<<>> 쿠폰/제휴쿠폰 +<<>> 모바일 쿠폰/제휴쿠폰 +<<>> 무이자할부 +<<>> 적립금/포인트 +<<>> 배송비 무료일 때는 0, 유료일 때는 배송금액, 착불은 -1 +<<>> 이벤트 +<<>> 가중치값 + +<<>> 셀러 ID 선택 +<<>> 별도설치비 +<<>> 끝알림 필수 +*/ + +$lt = "<<<"; +$gt = ">>>"; +$shop_url = G5_SHOP_URL; +$data_url = G5_DATA_URL; + +$sql =" select * from {$g5['g5_shop_item_table']} where it_use = '1' and it_soldout = '0' order by ca_id"; +$result = sql_query($sql); +$totcnt = sql_num_rows($result); + +echo $lt.'tocnt'.$gt.$totcnt.PHP_EOL; + +for ($i=0; $row=sql_fetch_array($result); $i++) +{ + $cate1 = $cate2 = $cate3 = $cate4 = ""; + + $row2 = sql_fetch(" select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '".substr($row['ca_id'],0,2)."' "); + $cate1 = $row2['ca_name']; + $caid1 = $row2['ca_id']; + + $cate2 = $cate3 = $cate4 = ""; + $caid2 = $caid3 = $caid4 = ""; + + if (strlen($row['ca_id']) >= 8) { + $row2 = sql_fetch(" select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '".substr($row['ca_id'],0,8)."' "); + $cate4 = $row2['ca_name']; + $caid4 = $row2['ca_id']; + } + + if (strlen($row['ca_id']) >= 6) { + $row2 = sql_fetch(" select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '".substr($row['ca_id'],0,6)."' "); + $cate3 = $row2['ca_name']; + $caid3 = $row2['ca_id']; + } + + if (strlen($row['ca_id']) >= 4) { + $row2 = sql_fetch(" select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '".substr($row['ca_id'],0,4)."' "); + $cate2 = $row2['ca_name']; + $caid2 = $row2['ca_id']; + } + + $point = get_item_point($row); + if( $point ){ + $point .= '원'; + } + + // 배송비계산 + $deliv = get_item_sendcost2($row['it_id'], $row['it_price'], 1); + + // 상품이미지 + $img_url = get_it_imageurl($row['it_id']); + + $str = "{$lt}begin{$gt}".PHP_EOL; + $str .= "{$lt}mapid{$gt}{$row['it_id']}".PHP_EOL; + $str .= "{$lt}price{$gt}{$row['it_price']}".PHP_EOL; + $str .= "{$lt}pname{$gt}{$row['it_name']}".PHP_EOL; + $str .= "{$lt}pgurl{$gt}".shop_item_url($row['it_id']).PHP_EOL; + $str .= "{$lt}igurl{$gt}$img_url".PHP_EOL; + $str .= "{$lt}cate1{$gt}$cate1".PHP_EOL; + $str .= "{$lt}caid1{$gt}$caid1".PHP_EOL; + if( $cate2 ){ + $str .= "{$lt}cate2{$gt}$cate2".PHP_EOL; + } + if( $caid2 ){ + $str .= "{$lt}caid2{$gt}$caid2".PHP_EOL; + } + if( $cate3 ){ + $str .= "{$lt}cate3{$gt}$cate3".PHP_EOL; + } + if( $caid3 ){ + $str .= "{$lt}caid3{$gt}$caid3".PHP_EOL; + } + if( $cate4 ){ + $str .= "{$lt}cate4{$gt}$cate4".PHP_EOL; + } + if( $caid4 ){ + $str .= "{$lt}caid4{$gt}$caid4".PHP_EOL; + } + if( $row['it_model'] ){ + $str .= "{$lt}model{$gt}{$row['it_model']}".PHP_EOL; + } + if( $row['it_brand'] ){ + $str .= "{$lt}brand{$gt}{$row['it_brand']}".PHP_EOL; + } + if( $row['it_maker'] ){ + $str .= "{$lt}maker{$gt}{$row['it_maker']}".PHP_EOL; + } + $str .= "{$lt}point{$gt}$point".PHP_EOL; + $str .= "{$lt}deliv{$gt}$deliv".PHP_EOL; + $str .= "{$lt}ftend{$gt}".PHP_EOL; + +echo iconv('utf-8', 'euc-kr', $str); +} + + + +$content = ob_get_contents(); +ob_end_clean(); + +echo $content; \ No newline at end of file diff --git a/shop/price/daum_summary.php b/shop/price/daum_summary.php new file mode 100644 index 000000000..33ba7029c --- /dev/null +++ b/shop/price/daum_summary.php @@ -0,0 +1,153 @@ +>> 시작 상품시작 알림 필수 +<<>> 상품ID 해당사 상품 ID 필수 +<<>> 원판매가(할인전가격) 선택적필수 +<<>> 할인적용가 할인후가격 필수 +<<>> 모바일 할인적용가 할인후가격 선택적필수 +<<>> 상품명 상품명 필수,varchar(500) +<<>> 상품링크 해당 상품으로 갈 상품URL 필수 +<<>> 이미지링크 상품이미지 링크 + (상품이미지 중 제일 큰이미지링크) 필수,varchar(255) +<<>> 카테고리명 대분류명 필수 +<<>> 카테고리 ID(대분류) 필수 +<<>> 카테고리명 중분류명 +<<>> 카테고리 ID(중분류) +<<>> 카테고리명 소분류명 +<<>> 카테고리 ID(소분류) +<<>> 카테고리명 세분류명 +<<>> 카테고리 ID(세분류) + +<<>> 모델명 +<<>> 브랜드명 +<<>> 제조사 + +<<>> 쿠폰/제휴쿠폰 +<<>> 모바일 쿠폰/제휴쿠폰 +<<>> 무이자할부 +<<>> 적립금/포인트 +<<>> 배송비 무료일 때는 0, 유료일 때는 배송금액, 착불은 -1 +<<>> 이벤트 +<<>> 가중치값 + +<<>> 셀러 ID 선택 +<<>> 별도설치비 +<<>> 끝알림 필수 +*/ + +$lt = "<<<"; +$gt = ">>>"; +$shop_url = G5_SHOP_URL; +$data_url = G5_DATA_URL; + +$sql =" select * from {$g5['g5_shop_item_table']} where it_use = '1' and substring(it_update_time, 1, 10) = '".G5_TIME_YMD."' order by ca_id"; +$result = sql_query($sql); + +for ($i=0; $row=sql_fetch_array($result); $i++) +{ + $cate1 = $cate2 = $cate3 = $cate4 = ""; + + $row2 = sql_fetch(" select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '".substr($row['ca_id'],0,2)."' "); + $cate1 = $row2['ca_name']; + $caid1 = $row2['ca_id']; + + $cate2 = $cate3 = $cate4 = ""; + $caid2 = $caid3 = $caid4 = ""; + + if (strlen($row['ca_id']) >= 8) { + $row2 = sql_fetch(" select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '".substr($row['ca_id'],0,8)."' "); + $cate4 = $row2['ca_name']; + $caid4 = $row2['ca_id']; + } + + if (strlen($row['ca_id']) >= 6) { + $row2 = sql_fetch(" select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '".substr($row['ca_id'],0,6)."' "); + $cate3 = $row2['ca_name']; + $caid3 = $row2['ca_id']; + } + + if (strlen($row['ca_id']) >= 4) { + $row2 = sql_fetch(" select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '".substr($row['ca_id'],0,4)."' "); + $cate2 = $row2['ca_name']; + $caid2 = $row2['ca_id']; + } + + $point = get_item_point($row); + if( $point ){ + $point .= '원'; + } + + // 배송비계산 + $deliv = get_item_sendcost2($row['it_id'], $row['it_price'], 1); + + // 상품이미지 + $img_url = get_it_imageurl($row['it_id']); + + // 상태 + $class = 'U'; + $stock_qty = get_it_stock_qty($row['it_id']); + + if(substr($row['it_time'], 0, 10) == G5_TIME_YMD && $row['it_update_time'] >= $row['it_time']) + $class = 'I'; + + if($row['it_soldout'] || $stock_qty < 0) + $class = 'D'; + + // 수정시간 + $utime = str_replace(array('-', ' ', ':'), '', $row['it_update_time']); + + $str = "{$lt}begin{$gt}".PHP_EOL; + $str .= "{$lt}mapid{$gt}{$row['it_id']}".PHP_EOL; + $str .= "{$lt}price{$gt}{$row['it_price']}".PHP_EOL; + $str .= "{$lt}class{$gt}$class".PHP_EOL; + $str .= "{$lt}utime{$gt}$utime".PHP_EOL; + $str .= "{$lt}pname{$gt}{$row['it_name']}".PHP_EOL; + $str .= "{$lt}pgurl{$gt}".shop_item_url($row['it_id']).PHP_EOL; + $str .= "{$lt}igurl{$gt}$img_url".PHP_EOL; + $str .= "{$lt}cate1{$gt}$cate1".PHP_EOL; + $str .= "{$lt}caid1{$gt}$caid1".PHP_EOL; + if( $cate2 ){ + $str .= "{$lt}cate2{$gt}$cate2".PHP_EOL; + } + if( $caid2 ){ + $str .= "{$lt}caid2{$gt}$caid2".PHP_EOL; + } + if( $cate3 ){ + $str .= "{$lt}cate3{$gt}$cate3".PHP_EOL; + } + if( $caid3 ){ + $str .= "{$lt}caid3{$gt}$caid3".PHP_EOL; + } + if( $cate4 ){ + $str .= "{$lt}cate4{$gt}$cate4".PHP_EOL; + } + if( $caid4 ){ + $str .= "{$lt}caid4{$gt}$caid4".PHP_EOL; + } + if( $row['it_model'] ){ + $str .= "{$lt}model{$gt}{$row['it_model']}".PHP_EOL; + } + if( $row['it_brand'] ){ + $str .= "{$lt}brand{$gt}{$row['it_brand']}".PHP_EOL; + } + if( $row['it_maker'] ){ + $str .= "{$lt}maker{$gt}{$row['it_maker']}".PHP_EOL; + } + $str .= "{$lt}point{$gt}$point".PHP_EOL; + $str .= "{$lt}deliv{$gt}$deliv".PHP_EOL; + $str .= "{$lt}ftend{$gt}".PHP_EOL; + +echo iconv('utf-8', 'euc-kr', $str); +} + +$content = ob_get_contents(); +ob_end_clean(); + +echo $content; \ No newline at end of file diff --git a/shop/price/google_feed.php b/shop/price/google_feed.php new file mode 100644 index 000000000..19b6b7bef --- /dev/null +++ b/shop/price/google_feed.php @@ -0,0 +1,93 @@ + '0' order by a.`ca_id`"; +$result = sql_query($sql); + +$xml = new SimpleXMLElement(""); +$xml->addAttribute("xmlns:xmlns:g", "http://base.google.com/ns/1.0"); +$xml->addAttribute("version", "2.0"); +$channel = $xml->addChild("channel"); +$title = $channel->addChild("title", "쇼핑몰피드"); +$link = $channel->addChild("link", G5_URL); +$description = $channel->addChild("description", ""); + +for ($i = 0; $row = sql_fetch_array($result); $i++) { + $it_id = $row['it_id']; + $it_title = $row['it_name']; + $it_link = shop_item_url($row['it_id']); + $it_basic = strip_tags($row['it_basic']); + + $it_image = ""; + for($j = 1; $j <= 10; $j++) { + $img = $row['it_img'.$j]; + + if(empty($img)) continue; + + $it_image = G5_DATA_URL."/item/".$img; + break; + } + + $stock = "in_stock"; + if($row['it_stock_qty'] <= 0) { + $stock = "out_of_stock"; + } else { + if($row['in_stock'] <= 0) $stock = "out_of_stock"; + } + + $item = $channel->addChild("item"); + // 필수 입력 항목 + $item->addChild("g:g:id", $it_id); + $item->addChild("title", $it_title); + $item->addChild("description", $it_basic); + $item->addChild("link", $it_link); + $item->addChild("g:g:image_link", $it_image); + $item->addChild("g:g:availability", $stock); + + if($row['it_cust_price'] != null && $row['it_cust_price'] > 0) { + $item->addChild("g:g:price", sprintf('%.2fKRW', $row['it_cust_price'])); + $item->addChild("g:g:sale_price", sprintf('%.2fKRW', $row['it_price'])); + } else { + $item->addChild("g:g:price", sprintf('%.2fKRW', $row['it_price'])); + } + + // 선택적 입력 항목 + $item->addChild("g:g:condition", "new"); + + $cate_array = array($row['ca_id'], $row['ca_id2'], $row['ca_id3']); + + $adult = "no"; + foreach($cate_array as $key => $var) { + if(empty($var)) continue; + if(in_array(1, $category_adult_array[$var])) { + $adult = "yes"; + } + } + + $item->addChild("g:g:adult", $adult); +} + +header('Content-type: text/xml'); +echo $xml->asXML(); + +?> \ No newline at end of file diff --git a/shop/price/naver.php b/shop/price/naver.php new file mode 100644 index 000000000..fc6248c8e --- /dev/null +++ b/shop/price/naver.php @@ -0,0 +1,103 @@ + '0' order by ca_id"; +$result = sql_query($sql); + +for ($i=0; $row=sql_fetch_array($result); $i++) +{ + $cate1 = $cate2 = $cate3 = $cate4 = ''; + $caid1 = $caid2 = $caid3 = $caid4 = ''; + + $caid1 = substr($row['ca_id'],0,2); + $row2 = sql_fetch(" select ca_name from {$g5['g5_shop_category_table']} where ca_id = '$caid1' "); + $cate1 = $row2['ca_name']; + + if (strlen($row['ca_id']) >= 8) { + $caid4 = substr($row['ca_id'],0,8); + $row2 = sql_fetch(" select ca_name from {$g5['g5_shop_category_table']} where ca_id = '$caid4' "); + $cate4 = $row2['ca_name']; + } + + if (strlen($row['ca_id']) >= 6) { + $caid3 = substr($row['ca_id'],0,6); + $row2 = sql_fetch(" select ca_name from {$g5['g5_shop_category_table']} where ca_id = '$caid3' "); + $cate3 = $row2['ca_name']; + } + + if (strlen($row['ca_id']) >= 4) { + $caid2 = substr($row['ca_id'],0,4); + $row2 = sql_fetch(" select ca_name from {$g5['g5_shop_category_table']} where ca_id = '$caid2' "); + $cate2 = $row2['ca_name']; + } + + // 배송비계산 + $delivery = get_item_sendcost2($row['it_id'], $row['it_price'], 1); + + // 상품이미지 + $img_url = get_it_imageurl($row['it_id']); + + // 포인트 + $it_point = get_item_point($row); + + $item_link = shop_item_url($row['it_id']); + + // 상태 + $class = 'U'; + $stock_qty = get_it_stock_qty($row['it_id']); + + if(substr($row['it_time'], 0, 10) == G5_TIME_YMD && $row['it_update_time'] >= $row['it_time']) + $class = 'I'; + + if($row['it_soldout'] || $stock_qty < 0) + $class = 'D'; + + // 리뷰 카운트 + $review_count = (int) $row['it_use_cnt']; + + echo "\n{$row['it_id']}{$tab}{$row['it_name']}{$tab}{$row['it_price']}{$tab}{$item_link}{$tab}{$img_url}{$tab}{$cate1}{$tab}{$cate2}{$tab}{$cate3}{$tab}{$cate4}{$tab}{$row['it_brand']}{$tab}{$row['it_maker']}{$tab}{$row['it_origin']}{$tab}{$it_point}{$tab}{$review_count}{$tab}{$delivery}{$tab}{$class}{$tab}{$row['it_update_time']}"; +} + +$content = ob_get_contents(); +ob_end_clean(); + +echo $content; \ No newline at end of file diff --git a/shop/price/naver_summary.php b/shop/price/naver_summary.php new file mode 100644 index 000000000..d06f303be --- /dev/null +++ b/shop/price/naver_summary.php @@ -0,0 +1,100 @@ + '0' and substring(it_update_time, 1, 10) = '".G5_TIME_YMD."' order by ca_id"; +$result = sql_query($sql); + +for ($i=0; $row=sql_fetch_array($result); $i++) +{ + $cate1 = $cate2 = $cate3 = $cate4 = ''; + $caid1 = $caid2 = $caid3 = $caid4 = ''; + + $caid1 = substr($row['ca_id'],0,2); + $row2 = sql_fetch(" select ca_name from {$g5['g5_shop_category_table']} where ca_id = '$caid1' "); + $cate1 = $row2['ca_name']; + + if (strlen($row['ca_id']) >= 8) { + $caid4 = substr($row['ca_id'],0,8); + $row2 = sql_fetch(" select ca_name from {$g5['g5_shop_category_table']} where ca_id = '$caid4' "); + $cate4 = $row2['ca_name']; + } + + if (strlen($row['ca_id']) >= 6) { + $caid3 = substr($row['ca_id'],0,6); + $row2 = sql_fetch(" select ca_name from {$g5['g5_shop_category_table']} where ca_id = '$caid3' "); + $cate3 = $row2['ca_name']; + } + + if (strlen($row['ca_id']) >= 4) { + $caid2 = substr($row['ca_id'],0,4); + $row2 = sql_fetch(" select ca_name from {$g5['g5_shop_category_table']} where ca_id = '$caid2' "); + $cate2 = $row2['ca_name']; + } + + // 배송비계산 + $delivery = get_item_sendcost2($row['it_id'], $row['it_price'], 1); + + // 상품이미지 + $img_url = get_it_imageurl($row['it_id']); + + // 포인트 + $it_point = get_item_point($row); + + $item_link = shop_item_url($row['it_id']); + + // 상태 + $class = 'U'; + $stock_qty = get_it_stock_qty($row['it_id']); + + if(substr($row['it_time'], 0, 10) == G5_TIME_YMD && $row['it_update_time'] >= $row['it_time']) + $class = 'I'; + + if($row['it_soldout'] || $stock_qty < 0) + $class = 'D'; + + echo "\n{$row['it_id']}{$tab}{$row['it_name']}{$tab}{$row['it_price']}{$tab}{$item_link}{$tab}{$img_url}{$tab}{$cate1}{$tab}{$cate2}{$tab}{$cate3}{$tab}{$cate4}{$tab}{$row['it_model']}{$tab}{$row['it_brand']}{$tab}{$row['it_maker']}{$tab}{$row['it_origin']}{$tab}{$it_point}{$tab}{$delivery}{$tab}{$class}{$tab}{$row['it_update_time']}"; +} + +$content = ob_get_contents(); +ob_end_clean(); + +echo $content; \ No newline at end of file diff --git a/shop/search.php b/shop/search.php new file mode 100644 index 000000000..c2861eca2 --- /dev/null +++ b/shop/search.php @@ -0,0 +1,154 @@ +\'\"\\\'\\\"\%\=\(\)\s]/", "", $qsort); +} else { + $qsort = ''; +} +if (isset($_GET['qorder'])) { + $qorder = preg_match("/^(asc|desc)$/i", $qorder) ? $qorder : ''; +} else { + $qorder = ''; +} + +if(!($qname || $qexplan || $qid || $qbasic)) + $search_all = true; + +// 검색범위 checkbox 처리 +$qname_check = false; +$qexplan_check = false; +$qid_check = false; +$qbasic_check = false; + +if($search_all) { + $qname_check = true; + $qexplan_check = true; + $qid_check = true; + $qbasic_check = true; +} else { + if($qname) + $qname_check = true; + if($qexplan) + $qexplan_check = true; + if($qid) + $qid_check = true; + if($qbasic) + $qbasic_check = true; +} + +if ($q) { + $arr = explode(" ", $q); + $detail_where = array(); + for ($i=0; $iset_query(" select * $sql_common $sql_where {$order_by} limit $from_record, $items "); +} + +if(!file_exists($search_skin)) { + echo str_replace(G5_PATH.'/', '', $search_skin).' 스킨 파일이 존재하지 않습니다.'; +} else { + include_once($search_skin); +} + +include_once('./_tail.php'); \ No newline at end of file diff --git a/shop/settle_inicis.inc.php b/shop/settle_inicis.inc.php new file mode 100644 index 000000000..8e502166f --- /dev/null +++ b/shop/settle_inicis.inc.php @@ -0,0 +1,151 @@ +SetField("inipayhome", G5_SHOP_PATH.'/inicis'); // 이니페이 홈디렉터리(상점수정 필요) +$inipay->SetField("debug", "false"); + +if( ! function_exists('mcrypt_encrypt')) { // mcrypt 관련 함수가 없다면 취소시 openssl로 합니다. + $inipay->SetField("encMethod", "openssl"); +} + +$util = new INIStdPayUtil(); + +$timestamp = $util->getTimestamp(); // util에 의해서 자동생성 + +// 이니시스에서 진행하는 무이자 이벤트 외 별도의 카드 무이자 설정이 필요한 경우 이니시스의 승인이 필요합니다. +// 코드는 따로 입력해야 합니다. 예) $cardNoInterestQuota = '51-2:3:5,14-5:6,34-3:4'; +$cardNoInterestQuota = ''; // 카드 무이자 여부 설정(가맹점에서 직접 설정) +$cardQuotaBase = '2:3:4:5:6:7:8:9:10:11:12'; // 가맹점에서 사용할 할부 개월수 설정 + +$inicis_cardpoint = $default['de_inicis_cartpoint_use'] ? ':cardpoint' : ''; //신용카드 포인트 결제에 관한 옵션 ( 신청해야 함 ) + +$acceptmethod = 'HPP(2):no_receipt:vbank('.date('Ymd', strtotime("+3 days", G5_SERVER_TIME)).'):below1000'.$useescrow.$inicis_cardpoint; + +/* 기타 */ +$siteDomain = G5_SHOP_URL.'/inicis'; //가맹점 도메인 입력 +// 페이지 URL에서 고정된 부분을 적는다. +// Ex) returnURL이 http://localhost:8082/demo/INIpayStdSample/INIStdPayReturn.php 라면 +// http://localhost:8082/demo/INIpayStdSample 까지만 기입한다. + +$returnUrl = $siteDomain.'/inistdpay_return.php'; +$closeUrl = $siteDomain.'/close.php'; +$popupUrl = $siteDomain.'/popup.php'; + +$BANK_CODE = array( + '03' => '기업은행', + '04' => '국민은행', + '05' => '외환은행', + '07' => '수협중앙회', + '11' => '농협중앙회', + '20' => '우리은행', + '23' => 'SC 제일은행', + '31' => '대구은행', + '32' => '부산은행', + '34' => '광주은행', + '37' => '전북은행', + '39' => '경남은행', + '53' => '한국씨티은행', + '71' => '우체국', + '81' => '하나은행', + '88' => '신한은행', + '89' => '케이뱅크', + '90' => '카카오뱅크', + '92' => '토스뱅크', + 'D1' => '동양종합금융증권', + 'D2' => '현대증권', + 'D3' => '미래에셋증권', + 'D4' => '한국투자증권', + 'D5' => '우리투자증권', + 'D6' => '하이투자증권', + 'D7' => 'HMC 투자증권', + 'D8' => 'SK 증권', + 'D9' => '대신증권', + 'DA' => '하나대투증권', + 'DB' => '굿모닝신한증권', + 'DC' => '동부증권', + 'DD' => '유진투자증권', + 'DE' => '메리츠증권', + 'DF' => '신영증권' +); + +$CARD_CODE = array( + '01' => '외환', + '03' => '롯데', + '04' => '현대', + '06' => '국민', + '11' => 'BC', + '12' => '삼성', + '14' => '신한', + '15' => '한미', + '16' => 'NH', + '17' => '하나 SK', + '21' => '해외비자', + '22' => '해외마스터', + '23' => 'JCB', + '24' => '해외아멕스', + '25' => '해외다이너스', + '93' => '토스머니', + '94' => 'SSG머니', + '97' => '카카오머니', + '98' => '페이코' +); + +$PAY_METHOD = array( + 'VCard' => '신용카드', + 'Card' => '신용카드', + 'DirectBank' => '계좌이체', + 'HPP' => '휴대폰', + 'VBank' => '가상계좌' +); \ No newline at end of file diff --git a/shop/settle_inicis_common.php b/shop/settle_inicis_common.php new file mode 100644 index 000000000..b3c63871e --- /dev/null +++ b/shop/settle_inicis_common.php @@ -0,0 +1,181 @@ + + +
    \ No newline at end of file diff --git a/shop/settle_lg.inc.php b/shop/settle_lg.inc.php new file mode 100644 index 000000000..59951f62a --- /dev/null +++ b/shop/settle_lg.inc.php @@ -0,0 +1,53 @@ +config[$key] = $val; + } +} + +/* + * 1. 기본결제 인증요청 정보 변경 + * + * 기본정보를 변경하여 주시기 바랍니다.(파라미터 전달시 POST를 사용하세요) + */ +$CST_PLATFORM = $default['de_card_test'] ? 'test' : 'service'; //LG유플러스 결제 서비스 선택(test:테스트, service:서비스) +$CST_MID = 'si_'.$config['cf_lg_mid']; //상점아이디(LG유플러스으로 부터 발급받으신 상점아이디를 입력하세요) + //테스트 아이디는 't'를 반드시 제외하고 입력하세요. +$LGD_MID = (('test' == $CST_PLATFORM) ? 't' : '').$CST_MID; //상점아이디(자동생성) +$LGD_TIMESTAMP = date('YmdHis'); //타임스탬프 +$LGD_BUYERIP = $_SERVER['REMOTE_ADDR']; //구매자IP +$LGD_BUYERID = ''; //구매자ID +$LGD_CUSTOM_SKIN = 'red'; //상점정의 결제창 스킨 (red, purple, yellow) +$LGD_WINDOW_VER = '2.5'; //결제창 버젼정보 +$LGD_MERTKEY = ''; //상점MertKey(mertkey는 상점관리자 -> 계약정보 -> 상점정보관리에서 확인하실수 있습니다) +$LGD_WINDOW_TYPE = 'iframe'; //결제창 호출 방식 +$LGD_CUSTOM_SWITCHINGTYPE = 'IFRAME'; //신용카드 카드사 인증 페이지 연동 방식 +$LGD_RETURNURL = G5_SHOP_URL.'/lg/returnurl.php'; //LGD_RETURNURL 을 설정하여 주시기 바랍니다. 반드시 현재 페이지와 동일한 프로트콜 및 호스트이어야 합니다. 아래 부분을 반드시 수정하십시요. +$LGD_VERSION = 'PHP_Non-ActiveX_Standard'; // 버전정보 (삭제하지 마세요) + +// 결제가능 수단 +$useablepay = array(); +$LGD_CUSTOM_USABLEPAY = ''; +if($default['de_iche_use']) + $useablepay[] = 'SC0030'; +if($default['de_vbank_use']) + $useablepay[] = 'SC0040'; +if($default['de_card_use']) + $useablepay[] = 'SC0010'; +if($default['de_hp_use']) + $useablepay[] = 'SC0060'; +if(count($useablepay) > 0) + $LGD_CUSTOM_USABLEPAY = implode("-", $useablepay); + +$configPath = G5_LGXPAY_PATH.'/lgdacom'; //LG유플러스에서 제공한 환경파일("/conf/lgdacom.conf") 위치 지정. + +/* + * 가상계좌(무통장) 결제 연동을 하시는 경우 아래 LGD_CASNOTEURL 을 설정하여 주시기 바랍니다. + */ +$LGD_CASNOTEURL = G5_SHOP_URL.'/settle_lg_common.php'; \ No newline at end of file diff --git a/shop/settle_lg_common.php b/shop/settle_lg_common.php new file mode 100644 index 000000000..21d6662c3 --- /dev/null +++ b/shop/settle_lg_common.php @@ -0,0 +1,177 @@ + + '.PHP_EOL; +} else { + $naverpay_button_js = ' + '.PHP_EOL; +} + +$naverpay_button_js .= ''.PHP_EOL; + +if($default['de_naverpay_test'] || $default['de_card_test']) { + $req_addr = 'ssl://test-pay.naver.com'; + $buy_req_url = 'POST /customer/api/order.nhn HTTP/1.1'; + $wish_req_url = 'POST /customer/api/wishlist.nhn HTTP/1.1'; + $req_host = 'test-pay.naver.com'; + $req_port = 443; + if($is_mobile_order) { + $orderUrl = 'https://test-m.pay.naver.com/mobile/customer/order.nhn'; + $wishUrl = 'https://test-m.pay.naver.com/mobile/customer/wishList.nhn'; + } else { + $orderUrl = 'https://test-pay.naver.com/customer/order.nhn'; + $wishUrl = 'https://test-pay.naver.com/customer/wishlistPopup.nhn'; + } +} else { + $req_addr = 'ssl://pay.naver.com'; + $buy_req_url = 'POST /customer/api/order.nhn HTTP/1.1'; + $wish_req_url = 'POST /customer/api/wishlist.nhn HTTP/1.1'; + $req_host = 'pay.naver.com'; + $req_port = 443; + if($is_mobile_order) { + $orderUrl = 'https://m.pay.naver.com/mobile/customer/order.nhn'; + $wishUrl = 'https://m.pay.naver.com/mobile/customer/wishList.nhn'; + } else { + $orderUrl = 'https://pay.naver.com/customer/order.nhn'; + $wishUrl = 'https://pay.naver.com/customer/wishlistPopup.nhn'; + } +} + +define('SHIPPING_ADDITIONAL_PRICE', $default['de_naverpay_sendcost']); + +$naverpay_request_js = ''.PHP_EOL; \ No newline at end of file diff --git a/shop/shop.head.php b/shop/shop.head.php new file mode 100644 index 000000000..5bae5fa2c --- /dev/null +++ b/shop/shop.head.php @@ -0,0 +1,267 @@ +', 10); +add_stylesheet('', 0); +?> + + +
    +

    + + + + + +
    + + +
    +
    + 쇼핑몰 전체검색 +
    + + + +
    + +
    +
    + + + + + +
    + + +
    + + +
    +
      +
    • +
    • +
    • +
    • +
    + +
    +
    +
    + + + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + + +
    + +
    + + +
    + + + +
    +

    인기상품

    + set_type(4); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_basic', false); + $list->set_view('it_cust_price', false); + $list->set_view('it_price', true); + $list->set_view('it_icon', false); + $list->set_view('sns', false); + $list->set_view('star', true); + echo $list->run(); + ?> +
    + + + + + +
    + + + +
    +
    + +
    + + + +
    + \ No newline at end of file diff --git a/shop/shop.tail.php b/shop/shop.tail.php new file mode 100644 index 000000000..a9f1c790e --- /dev/null +++ b/shop/shop.tail.php @@ -0,0 +1,69 @@ + +
    +
    +
    + + + +
    +
    + +
    +

    사이트 정보

    +

    + 회사명 + 주소
    + 사업자 등록번호 + 대표 + 전화 + 팩스
    + + 통신판매업신고번호 + 개인정보 보호책임자
    + 부가통신사업신고번호 '.$default['de_admin_buga_no'].''; ?> +

    +
    + + +
    + +
    + + + +
    + +
    Copyright © 2001-2013 . All Rights Reserved.
    +
    + + + + + + +개인결제 내역이 존재하지 않습니다.

    '); + + $goods_name = $od['pp_name'].'님 개인결제'; + $amt_tot = (int)$od['pp_receipt_price']; + $dir = $od['pp_pg']; + $od_name = $od['pp_name']; + $od_email = get_text($od['pp_email']); + $od_tel = get_text($od['pp_hp']); + + $amt_tot = (int)$od['pp_receipt_price']; + $amt_sup = (int)round(($amt_tot * 10) / 11); + $amt_svc = 0; + $amt_tax = (int)($amt_tot - $amt_sup); +} else { + $od = sql_fetch(" select * from {$g5['g5_shop_order_table']} where od_id = '$od_id' "); + if (!$od) + die('

    주문서가 존재하지 않습니다.

    '); + + if ( ! $is_admin && ! (shop_is_taxsave($od)) ){ + die('해당 주문은 현금영수증을 발급할수 없습니다.'); + } + + $goods = get_goods($od['od_id']); + $goods_name = $goods['full_name']; + $amt_tot = (int)($od['od_receipt_price'] - $od['od_refund_price']); + $dir = $od['od_pg']; + $od_name = $od['od_name']; + $od_email = get_text($od['od_email']); + $od_tel = get_text($od['od_tel']); + + $amt_tot = (int)$od['od_tax_mny'] + (int)$od['od_vat_mny'] + (int)$od['od_free_mny']; + $amt_sup = (int)$od['od_tax_mny'] + (int)$od['od_free_mny']; + $amt_tax = (int)$od['od_vat_mny']; + $amt_svc = 0; +} + +$trad_time = date("YmdHis"); + +// 신청폼 +if(!$dir) + $dir = $default['de_pg_service']; + +include_once(G5_SHOP_PATH.'/'.$dir.'/taxsave_form.php'); + +include_once(G5_PATH.'/tail.sub.php'); \ No newline at end of file diff --git a/shop/wishlist.php b/shop/wishlist.php new file mode 100644 index 000000000..cc292844f --- /dev/null +++ b/shop/wishlist.php @@ -0,0 +1,148 @@ + + + +
    + +
    + + + + +
    +
      + + +
    • +
      +
      +
      + + 품절 + +
      + + +
      + + + + + + +
      + +
      + 삭제 +
      +
    • + 보관함이 비었습니다.'; + ?> +
    +
    + +
    + + +
    +
    +
    + + + + +', 0); +?> + +
    + +
      + +
    • + "; + if ($list[$i]['is_notice']) + echo "".$list[$i]['subject'].""; + else + echo $list[$i]['subject']; + + if ($list[$i]['comment_cnt']) + echo $list[$i]['comment_cnt']; + + echo ""; + + // if ($list[$i]['link']['count']) { echo "[{$list[$i]['link']['count']}]"; } + // if ($list[$i]['file']['count']) { echo "<{$list[$i]['file']['count']}>"; } + + if (isset($list[$i]['icon_new']) && $list[$i]['icon_new']) echo " NEW"; + //if (isset($list[$i]['icon_hot'])) echo " " ; + //if (isset($list[$i]['icon_file'])) echo " " ; + //if (isset($list[$i]['icon_link'])) echo " " ; + //if (isset($list[$i]['icon_secret'])) echo " " ; + ?> +
    • + + +
    • 게시물이 없습니다.
    • + +
    +
    diff --git a/skin/latest/shop_basic/style.css b/skin/latest/shop_basic/style.css new file mode 100644 index 000000000..bbcfb2402 --- /dev/null +++ b/skin/latest/shop_basic/style.css @@ -0,0 +1,12 @@ +@charset "utf-8"; +/* 새글 스킨 (latest) */ +.lat {position:relative;} +.lat ul {margin:0 0 10px;padding:0;list-style:none;border:1px solid #e5e5e5} +.lat li {border-top:1px solid #f3f3f3;padding:10px} +.lat li:first-child{border:0} +.lat li i{color:#9da4bc} +.lat li .fa-heart{color:#ff0000} +.lat li .new_icon{display:inline-block;padding: 0 3px;line-height:14px ;font-size:0.833em;color:#fff;background:#c56bed} +.lat li .cnt_cmt{color:#ff3970} +.lat_title {display:block;padding:10px 0 8px;font-size:1.167em} +.lat_more {position:absolute;top:10px;right:0;} diff --git a/skin/member/basic/login.skin.php b/skin/member/basic/login.skin.php index f8d368697..55971bed3 100644 --- a/skin/member/basic/login.skin.php +++ b/skin/member/basic/login.skin.php @@ -30,13 +30,81 @@ add_stylesheet('', + + + + + + +
    +

    비회원 구매

    +

    비회원으로 주문하시는 경우 포인트는 지급하지 않습니다.

    + +
    + +
    + +
    + + +
    + + + + +
    + + +
    +

    비회원 주문조회

    + +
    + 비회원 주문조회 + +
    + + + + + + + +
    +
    + +
    +

    메일로 발송해드린 주문서의 주문번호 및 주문 시 입력하신 비밀번호를 정확히 입력해주십시오.

    +
    + +
    + + + + + + diff --git a/skin/member/basic/member_cert_refresh.skin.php b/skin/member/basic/member_cert_refresh.skin.php new file mode 100644 index 000000000..6ed192978 --- /dev/null +++ b/skin/member/basic/member_cert_refresh.skin.php @@ -0,0 +1,148 @@ +', 0); +if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipin'] || $config['cf_cert_hp'])) + add_javascript('', 0); +?> + +
    +
    + + + + + + + +
    +

    (필수) 추가 개인정보처리방침 안내

    +
    +
    + + + + + + + + + + + + + + + + +
    추가 개인정보처리방침 안내
    목적항목보유기간
    이용자 식별 및 본인여부 확인생년월일, 암호화된 개인식별부호(CI)회원 탈퇴 시까지
    +
    +
    + +
    + + +
    +
    + +
    +

    인증수단 선택하기

    + +
    + '; + if ($config['cf_cert_simple']) { + echo '' . PHP_EOL; + } + if ($config['cf_cert_hp']) + echo '' . PHP_EOL; + if ($config['cf_cert_ipin']) + echo '' . PHP_EOL; + echo '
    '; + echo '' . PHP_EOL; + } + ?> +
    + + + + + + \ No newline at end of file diff --git a/skin/member/basic/password_lost.skin.php b/skin/member/basic/password_lost.skin.php index 56f27ff58..97fc852cb 100644 --- a/skin/member/basic/password_lost.skin.php +++ b/skin/member/basic/password_lost.skin.php @@ -3,13 +3,16 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 add_stylesheet('', 0); -?> + +if($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipin'] || $config['cf_cert_hp'])) { ?> + + -
    -

    회원정보 찾기

    +
    +

    이메일로 찾기

    회원가입 시 등록하신 이메일 주소를 입력해 주세요.
    @@ -21,29 +24,94 @@ add_stylesheet('',

    - - +
    + +
    +

    본인인증으로 찾기

    +
    + + + + + + + + + +
    +
    +
    + \ No newline at end of file diff --git a/skin/member/basic/password_reset.skin.php b/skin/member/basic/password_reset.skin.php new file mode 100644 index 000000000..f7dfafdaa --- /dev/null +++ b/skin/member/basic/password_reset.skin.php @@ -0,0 +1,39 @@ +', 0); +?> + + +
    +
    +
    +
    +

    새로운 비밀번호를 입력해주세요.

    + +
    + 회원 아이디 : + + + + +
    +
    + +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/skin/member/basic/register.skin.php b/skin/member/basic/register.skin.php index 3d3898451..662c8da40 100644 --- a/skin/member/basic/register.skin.php +++ b/skin/member/basic/register.skin.php @@ -10,7 +10,7 @@ add_stylesheet('',
    -

    회원가입약관 및 개인정보처리방침안내의 내용에 동의하셔야 회원가입 하실 수 있습니다.

    +

    회원가입약관 및 개인정보 수집 및 이용의 내용에 동의하셔야 회원가입 하실 수 있습니다.

    ',
    -

    개인정보처리방침안내

    +

    개인정보 수집 및 이용

    - + @@ -40,7 +40,7 @@ add_stylesheet('', - + @@ -54,7 +54,7 @@ add_stylesheet('',
    - +
    @@ -80,7 +80,7 @@ add_stylesheet('', } if (!f.agree2.checked) { - alert("개인정보처리방침안내의 내용에 동의하셔야 회원가입 하실 수 있습니다."); + alert("개인정보 수집 및 이용의 내용에 동의하셔야 회원가입 하실 수 있습니다."); f.agree2.focus(); return false; } diff --git a/skin/member/basic/register_form.skin.php b/skin/member/basic/register_form.skin.php index e2dc5fd5b..f8f73b6d3 100644 --- a/skin/member/basic/register_form.skin.php +++ b/skin/member/basic/register_form.skin.php @@ -3,16 +3,14 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 add_stylesheet('', 0); +add_javascript('', 0); +if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipin'] || $config['cf_cert_hp'])) + add_javascript('', 0); ?>
    - - - - - @@ -32,19 +30,19 @@ add_stylesheet('',
    • class="frm_input full_input " minlength="3" maxlength="20" placeholder="아이디">
    • - + class="frm_input full_input " minlength="3" maxlength="20" placeholder="비밀번호"> -
    • +
    • - + class="frm_input full_input " minlength="3" maxlength="20" placeholder="비밀번호 확인">
    @@ -53,40 +51,57 @@ add_stylesheet('',

    개인정보 입력

      -
    • - - class="frm_input full_input " size="10" placeholder="이름"> - 아이핀 본인확인'.PHP_EOL; - if($config['cf_cert_hp']) - echo ''.PHP_EOL; +
    • + 본인확인 시 자동입력'; + $desc_phone = ' 본인확인 시 자동입력'; + + if (!$config['cf_cert_simple'] && !$config['cf_cert_hp'] && $config['cf_cert_ipin']) { + $desc_phone = ''; + } + + if ($config['cf_cert_simple']) { + echo ''.PHP_EOL; + } + if($config['cf_cert_hp']) + echo ''.PHP_EOL; + if ($config['cf_cert_ipin']) + echo ''.PHP_EOL; + echo '(필수)'; echo ''.PHP_EOL; } ?> -
      본인확인성인인증 완료
      - - - - 아이핀 본인확인 후에는 이름이 자동 입력되고 휴대폰 본인확인 후에는 이름과 휴대폰번호가 자동 입력되어 수동으로 입력할수 없게 됩니다. - + +
    • +
    • + + class="frm_input full_input " size="10" placeholder="이름">
    • @@ -98,7 +113,7 @@ add_stylesheet('',
    • -
    • - + class="frm_input full_input " size="70" maxlength="255" placeholder="홈페이지">
    • @@ -124,16 +138,16 @@ add_stylesheet('',
    • - + class="frm_input full_input " maxlength="20" placeholder="전화번호">
    • - - + + - class="frm_input full_input " maxlength="20" placeholder="휴대폰번호"> - + class="frm_input full_input " maxlength="20" placeholder="휴대폰번호"> + @@ -142,12 +156,12 @@ add_stylesheet('',
    • - 필수 - + (필수) + class="frm_input twopart_input " size="5" maxlength="6" placeholder="우편번호">
      class="frm_input frm_address full_input " size="50" placeholder="기본주소"> -
      +

      @@ -164,7 +178,7 @@ add_stylesheet('',
      • - +
      • @@ -291,14 +305,30 @@ gif, jpg, png파일만 가능하며 용량 $(function() { $("#reg_zip_find").css("display", "inline-block"); + var pageTypeParam = "pageType=register"; + + // 이니시스 간편인증 + var url = "/ini_request.php"; + var type = ""; + var params = ""; + var request_url = ""; + + $(".win_sa_cert").click(function() { + if(!cert_confirm()) return false; + type = $(this).data("type"); + params = "?directAgency=" + type + "&" + pageTypeParam; + request_url = url + params; + call_sa(request_url); + }); + // 아이핀인증 + var params = ""; $("#win_ipin_cert").click(function() { - if(!cert_confirm()) - return false; - - var url = "/ipin1.php"; + if(!cert_confirm()) return false; + params = "?" + pageTypeParam; + var url = "/ipin1.php"+params; certify_win_open('kcb-ipin', url); return; }); @@ -306,13 +336,13 @@ $(function() { // 휴대폰인증 + var params = ""; $("#win_hp_cert").click(function() { - if(!cert_confirm()) - return false; - - - - certify_win_open("", ""); + + certify_win_open("", ""+params); return; }); diff --git a/skin/member/basic/register_form_update.tail.skin.php b/skin/member/basic/register_form_update.tail.skin.php new file mode 100644 index 000000000..97cd044e1 --- /dev/null +++ b/skin/member/basic/register_form_update.tail.skin.php @@ -0,0 +1,59 @@ +SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting); + + $strDest = array(); + $strDest[] = $receive_number; + $strCallBack = $send_number; + $strCaller = iconv_euckr(trim($default['de_admin_company_name'])); + $strSubject = ''; + $strURL = ''; + $strData = iconv_euckr($sms_contents); + $strDate = ''; + $nCount = count($strDest); + + $res = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount); + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } else { + include_once(G5_LIB_PATH.'/icode.sms.lib.php'); + + $SMS = new SMS; // SMS 연결 + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + $SMS->Add($receive_number, $send_number, $config['cf_icode_id'], iconv_euckr(stripslashes($sms_contents)), ""); + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } +} +//---------------------------------------------------------- +// SMS 문자전송 끝 +//----------------------------------------------------------; \ No newline at end of file diff --git a/skin/member/basic/style.css b/skin/member/basic/style.css index 97c3ff395..713330524 100644 --- a/skin/member/basic/style.css +++ b/skin/member/basic/style.css @@ -1,35 +1,6 @@ @charset "utf-8"; /* ### 기본 스타일 커스터마이징 시작 ### */ - -/* 버튼 */ -.mbskin a.btn01 {} -.mbskin a.btn01:focus, .mbskin .btn01:hover {} -.mbskin a.btn02 {} -.mbskin a.btn02:focus, .mbskin .btn02:hover {} -.mbskin .btn_confirm {} /* 서식단계 진행 */ -.mbskin .btn_submit {} -.mbskin button.btn_submit {} -.mbskin fieldset .btn_submit {} -.mbskin .btn_cancel {} -.mbskin button.btn_cancel {} -.mbskin .btn_cancel:focus, .mbskin .btn_cancel:hover {} -.mbskin a.btn_frmline, .mbskin button.btn_frmline {} /* 우편번호검색버튼 등 */ -.mbskin button.btn_frmline {} -.mbskin .win_btn {} /* 새창용 */ -.mbskin .win_btn button {} -.mbskin .win_btn input {} -.mbskin .win_btn a {} -.mbskin .win_btn a:focus, .mbskin .win_btn a:hover {} - -/* 게시판용 버튼 */ -.mbskin a.btn_b01 {} -.mbskin a.btn_b01:focus, .mbskin .btn_b01:hover {} -.mbskin a.btn_b02 {} -.mbskin a.btn_b02:focus, .mbskin .btn_b02:hover {} -.mbskin a.btn_admin {} /* 관리자 전용 버튼 */ -.mbskin a.btn_admin:focus, .mbskin a.btn_admin:hover {} - /* 기본박스 */ .mbskin {position:relative;margin:100px auto 0;width:360px;text-align:center} .mbskin:after {right:10px;left:auto; @@ -42,54 +13,9 @@ .mbskin .frm_input {width:100%} .mbskin .btn_submit {width:100%;margin:10px 0 0;height:45px;font-weight:bold;font-size:1.25em} .mbskin h1 {margin:60px 0 30px;font-size:2em} - - -/* 기본테이블 */ -.mbskin .tbl_head01 {} -.mbskin .tbl_head01 caption {} -.mbskin .tbl_head01 thead th {} -.mbskin .tbl_head01 thead a {} -.mbskin .tbl_head01 thead th input {} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ -.mbskin .tbl_head01 tfoot th {} -.mbskin .tbl_head01 tfoot td {} -.mbskin .tbl_head01 tbody th {} -.mbskin .tbl_head01 td {} -.mbskin .tbl_head01 a {} -.mbskin td.empty_table {} - -/* 폼 테이블 */ -.mbskin table {} -.mbskin caption {} -.mbskin .frm_info {} -.mbskin .frm_file {} - -.mbskin .tbl_frm01 {} .mbskin .tbl_frm01 th {width:85px} -.mbskin .tbl_frm01 td {} -.mbskin .tbl_frm01 textarea, .mb_skin tbl_frm01 .frm_input {} -.mbskin .tbl_frm01 textarea {} -.mbskin .tbl_frm01 a {} - -/* 필수입력 */ -.mbskin .required, .mbskin textarea.required {} - -/* 테이블 항목별 정의 */ -.mbskin .td_board {} -.mbskin .td_chk {} -.mbskin .td_date {} -.mbskin .td_datetime {} -.mbskin .td_group {} -.mbskin .td_mb_id {} -.mbskin .td_mng {} -.mbskin .td_name {} -.mbskin .td_nick {} -.mbskin .td_num {} -.mbskin .td_numbig {} - -.mbskin .txt_active {} -.mbskin .txt_expired {} - /* ### 기본 스타일 커스터마이징 끝 ### */ + /* 회원가입 약관 */ .register {margin:0 auto} .register:after {display:block;visibility:hidden;clear:both;content:""} @@ -107,7 +33,7 @@ #fregister textarea {display:block;padding:20px;width:100%;height:150px;background:#fff;border:0;line-height:1.6em} #fregister_private {position:relative} #fregister_private div {padding:20px;background:#fff} -#fregister_private table {width:100%;border-collapse:collapse} +#fregister_private table {width:100%;border-collapse:collapse;font-size:1em;} #fregister_private table caption {position:absolute;font-size:0;line-height:0;overflow:hidden} #fregister_private table th {background:#f7f7f9;width:33.33%;color:#000;padding:10px;border:1px solid #d8dbdf} #fregister_private table td {border:1px solid #e7e9ec;padding:10px;border-top:0} @@ -115,7 +41,7 @@ .fregister_agree {position:absolute;top:0;right:0} .fregister_agree input[type="checkbox"] + label {color:#676e70} .fregister_agree input[type="checkbox"] + label:hover {color:#2172f8} -.fregister_agree input[type="checkbox"] + label span {position:absolute;top:20px;right:15px;width:17px;height:17px;display:block;background:#fff;border:1px solid #d0d4df;border-radius:3px} +.fregister_agree input[type="checkbox"] + label span {position:absolute;top:20px;right:15px;width:17px;height:17px;display:block;background:#fff;border:1px solid #999;border-radius:3px} .fregister_agree input[type="checkbox"]:checked + label {color:#000} .fregister_agree input[type="checkbox"]:checked + label span {background:url('./img/chk.png') no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} .fregister_agree.chk_all input[type="checkbox"] + label span {top:18px} @@ -133,7 +59,9 @@ .register_form_inner label {display:block;margin-bottom:10px;line-height:24px} .register_form_inner label.inline {display:inline} -#fregisterform #msg_certify {margin:5px 0 0;padding:5px;border:1px solid #dbecff;background:#eaf4ff;text-align:center} +#fregisterform .cert_desc {color:#3a8afd;} +#fregisterform .cert_req {margin-left:5px;line-height:35px;} +#fregisterform #msg_certify {margin:5px 0;padding:5px;border:1px solid #dbecff;background:#eaf4ff;text-align:center} #fregisterform .frm_address {margin:5px 0 0} #fregisterform #mb_addr3 {display:inline-block;margin:5px 0 0;vertical-align:middle} #fregisterform #mb_addr_jibeon {display:block;margin:5px 0 0} @@ -168,11 +96,47 @@ .tooltip {position:relative;width:auto;color:#fff;background:#000;padding:10px;font-size:small;line-height:18px;display:none;position:absolute;z-index:9;font-weight:normal;margin-left:15px;margin-top:10px} .tooltip:before {content:"";position:absolute;top:0;left:-10px;width:0;height:0;border-style:solid;border-top:0px solid transparent;border-bottom:10px solid transparent;border-left:0;border-right:10px solid #000} - /* 아이디/비밀번호 찾기 */ +#find_info h3 {display:none;margin-bottom:30px;text-align:center;font-size:1.1em;} +#find_info .new_win_con {background:#f7f7f7;} +#find_info.cert .new_win_con {width:460px;float:left;} +#find_info.cert .new_win_con:nth-child(2) {margin-left:10px;} +#find_info.cert h3 {display:block;} #find_info #mb_hp_label {display:inline-block;margin-left:10px} #find_info p {line-height:1.5em} #find_info #mb_email {margin:10px 0} +#find_info .find_btn .btn_submit {width:30%;word-break:keep-all;} + +/* 비밀번호 재설정 */ +#pw_reset #info_fs {margin-bottom: 10px} +#pw_reset .frm_input {margin:10px 0 0} + +/* 기존 회원 본인인증 */ +#member_cert_refresh p {position:relative;text-align:center;color:#fff;height:50px;line-height:50px;font-size:1.1em;background:#f2838f;margin:0 0 10px;border-radius:5px;font-weight:bold} +#member_cert_refresh p:before {content:"";position:absolute;top:0;left:0;width:5px;height:50px;border-radius:5px 0 0 5px;background:#da4453} +#member_cert_refresh p i {font-size:1.2em;vertical-align:middle} +#member_cert_refresh section {margin:10px auto 15px;border:1px solid #dde7e9;position:relative;border-radius:3px} +#member_cert_refresh_chkall {position:relative;text-align:center;background:#f5f7fa;line-height:50px;border:1px solid #e5e9f0;border-radius:3px;margin-bottom:15px} +#member_cert_refresh h2 {text-align:left;padding:20px;border-bottom:1px solid #dde7e9;font-size:1.2em} +#member_cert_refresh textarea {display:block;padding:20px;width:100%;height:150px;background:#fff;border:0;line-height:1.6em} +#member_cert_refresh_private {position:relative} +#member_cert_refresh_private div {padding:20px;background:#fff} +#member_cert_refresh_private table {width:100%;border-collapse:collapse;font-size:1em;} +#member_cert_refresh_private table caption {position:absolute;font-size:0;line-height:0;overflow:hidden} +#member_cert_refresh_private table th {background:#f7f7f9;width:33.33%;color:#000;padding:10px;border:1px solid #d8dbdf;font-weight:bold;} +#member_cert_refresh_private table td {border:1px solid #e7e9ec;padding:10px;border-top:0} + +.member_cert_refresh_agree {position:absolute;top:0;right:0} +.member_cert_refresh_agree input[type="checkbox"] + label {color:#676e70} +.member_cert_refresh_agree input[type="checkbox"] + label:hover {color:#2172f8} +.member_cert_refresh_agree input[type="checkbox"] + label span {position:absolute;top:20px;right:15px;width:17px;height:17px;display:block;background:#fff;border:1px solid #999;border-radius:3px} +.member_cert_refresh_agree input[type="checkbox"]:checked + label {color:#000} +.member_cert_refresh_agree input[type="checkbox"]:checked + label span {background:url('./img/chk.png') no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} +.member_cert_refresh_agree.chk_all input[type="checkbox"] + label span {top:18px} + +#member_cert_refresh #find_info {margin:50px 0} +#member_cert_refresh #find_info .find_btn {padding:10px 20px;background:#fff} +#member_cert_refresh #find_info .find_btn > div {margin:10px 0} /* 로그인 */ #mb_login {} @@ -250,7 +214,7 @@ .memo_from li.memo_view_date {display:block;color:#555;line-height:24px} .memo_from li.memo_op_btn {position:absolute} .memo_from li.list_btn {right:53px;} -.memo_from li.del_btn {right:15px;padding} +.memo_from li.del_btn {right:15px;} .memo_from:after {display:block;visibility:hidden;clear:both;content:""} .memo_btn {width:100%} @@ -358,7 +322,6 @@ .chk_box input[type="checkbox"]:checked + label span {background:url(./img/chk.png) no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} .selec_chk {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} - /* 자기소개 */ #profile h1 a {} #profile table {margin-bottom:0} @@ -369,4 +332,4 @@ #profile .my_profile_img {display:block;margin:20px 0 5px} #profile .my_profile_img img {border-radius:50%} #profile .profile_img img {border-radius:50%} -#profile .profile_name .sv_wrap {font-weight:bold;text-align:left} \ No newline at end of file +#profile .profile_name .sv_wrap {font-weight:bold;text-align:left} diff --git a/skin/outlogin/basic/outlogin.skin.1.php b/skin/outlogin/basic/outlogin.skin.1.php index 5735d3326..5c41ffbdf 100644 --- a/skin/outlogin/basic/outlogin.skin.1.php +++ b/skin/outlogin/basic/outlogin.skin.1.php @@ -27,7 +27,7 @@ add_stylesheet(''
    ', 0); +?> + + +
    +

    회원로그인

    + +
    + + + + + +
    + + +
    + + + +
    + +
    + + + diff --git a/skin/outlogin/shop_basic/outlogin.skin.2.php b/skin/outlogin/shop_basic/outlogin.skin.2.php new file mode 100644 index 000000000..3639e614c --- /dev/null +++ b/skin/outlogin/shop_basic/outlogin.skin.2.php @@ -0,0 +1,43 @@ +', 0); +?> + + + + + +
    +

    회원정보

    + + +
    + + + diff --git a/skin/outlogin/shop_basic/style.css b/skin/outlogin/shop_basic/style.css new file mode 100644 index 000000000..05f59e4b7 --- /dev/null +++ b/skin/outlogin/shop_basic/style.css @@ -0,0 +1,44 @@ +@charset "utf-8"; + +/* 아웃로그인 스킨 */ +.ol {position:relative} +.ol h2 {margin:0;padding:0;width:1px;height:1px;font-size:0;line-height:0;overflow:hidden} + +.ol a.btn_admin {display:inline-block;padding:0 10px;height:25px;background:#d13f4a;color:#fff;text-decoration:none;line-height:25px;vertical-align:middle} /* 관리자 전용 버튼 */ +.ol a.btn_admin:focus, .ol a.btn_admin:hover {text-decoration:none} + +#ol_before {} +#ol_before fieldset {position:relative} +#ol_id {display:block;width:100%;margin:5px 0 10px} +.ol_idlabel {color:#333} +#ol_pw {display:block;width:100%;margin:5px 0} +.ol_pwlabel {color:#333} +#auto_login {} +#auto_login_label {letter-spacing:-0.1em} +#ol_submit {width:100%;height:40px;border:0;border-radius:3px;color:#fff;font-weight:bold} +#ol_before a {letter-spacing:-0.15em} +#ol_svc {text-align:center;margin:10px 0 0} +#ol_svc a {display:inline-block;color:#333;margin:0 5px} +#ol_auto {position:relative;margin:5px 0;font-size:0.92em;color:#555} +#ol_auto label {letter-spacing:-0.1em} +#ol_auto input {width:13px;height:13px;vertical-align:bottom} + +.btn_member_mn {min-width:150px;padding:5px 0;border:0;background:transparent;color:#fff;text-align:center} +.btn_member_mn .profile_img {display:inline-block;margin-right:5px} +.btn_member_mn .profile_img img {border-radius:50%} +.btn_member_mn .profile_name {display:inline-block;max-width:70px;line-height:34px;vertical-align: bottom;text-overflow:ellipsis;overflow:hidden;white-space:nowrap} +.btn_member_mn i {display:inline-block;margin-left:5px;font-size:1.2em;font-weight:bold} +.btn_member_mn_on {background:#fff;color:#000;border:1px solid #d0d0d0;border-bottom:0} +.member_mn {display:none;position:absolute;left:0;width:150px;background:#fff;z-index:99;border:1px solid #d0d0d0;border-top:0} + +#ol_after {} +#ol_after_private {text-align:left} +#ol_after_private:after {display:block;visibility:hidden;clear:both;content:""} +#ol_after_private li {margin-bottom:1px;position:relative} +#ol_after_private li:hover a {background:#f7f7f7} +#ol_after_private a {display:block;color:#444;padding:10px 15px;line-height:20px} +#ol_after_private a strong {float:right;display:inline-block;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:clip;padding:0 5px;border-radius:15px;font-weight:normal;font-size:0.92em} +#ol_after_private .win_point strong {background:#37bc9b} +#ol_after_private .win_coupon strong {background:#a352c1} +#ol_after_private .win_memo strong {background:#ff8b77} +#ol_after_logout {display:block;font-size:1.083em;line-height:45px;text-align:center;color:#3a8afd;border-top:1px solid #f6f6f6} diff --git a/skin/outlogin/shop_side/img/chk.png b/skin/outlogin/shop_side/img/chk.png new file mode 100644 index 000000000..2841a67f3 Binary files /dev/null and b/skin/outlogin/shop_side/img/chk.png differ diff --git a/skin/outlogin/shop_side/outlogin.skin.1.php b/skin/outlogin/shop_side/outlogin.skin.1.php new file mode 100644 index 000000000..8f3c7ce82 --- /dev/null +++ b/skin/outlogin/shop_side/outlogin.skin.1.php @@ -0,0 +1,65 @@ +', 0); +?> + + +
    +
    +

    회원로그인

    + 회원가입 +
    +
    +
    +
    + + + + + + +
    +
    +
    + + +
    + +
    + + +
    + +
    + + + diff --git a/skin/outlogin/shop_side/outlogin.skin.2.php b/skin/outlogin/shop_side/outlogin.skin.2.php new file mode 100644 index 000000000..abbc07bdf --- /dev/null +++ b/skin/outlogin/shop_side/outlogin.skin.2.php @@ -0,0 +1,70 @@ +', 0); + +// 쿠폰 +$cp_count = 0; +$sql = " select cp_id + from {$g5['g5_shop_coupon_table']} + where mb_id IN ( '{$member['mb_id']}', '전체회원' ) + and cp_start <= '".G5_TIME_YMD."' + and cp_end >= '".G5_TIME_YMD."' "; +$res = sql_query($sql); + +for($k=0; $cp=sql_fetch_array($res); $k++) { + if(!is_used_coupon($member['mb_id'], $cp['cp_id'])) + $cp_count++; +} +?> + + +
    +
    +

    나의 회원정보

    + + + 관리자 + + + 정보수정 + 로그아웃 +
    + +
    + + + diff --git a/skin/outlogin/shop_side/style.css b/skin/outlogin/shop_side/style.css new file mode 100644 index 000000000..67d0f6d78 --- /dev/null +++ b/skin/outlogin/shop_side/style.css @@ -0,0 +1,64 @@ +@charset "utf-8"; + +/* 아웃로그인 스킨 */ +.s_ol {position:relative;border-bottom:1px solid #f6f6f6} +.s_ol h2 {width:115px;float:left;padding:15px 0;text-align:center} +.s_ol .join {width:114px;float:left;padding:15px 0;text-align:center;background:#f7f7f7;color:#6e6e6e} +.s_ol #s_ol_be_cate:after {display:block;visibility:hidden;clear:both;content:""} +.s_ol form {padding:20px} +.s_ol a.btn_admin {display:inline-block;padding:0 10px;height:25px;text-decoration:none;line-height:25px;vertical-align:middle} /* 관리자 전용 버튼 */ +.s_ol a.btn_admin:focus, .s_ol a.btn_admin:hover {text-decoration:none} + +#s_ol_before {} +#s_ol_before:after {display:block;visibility:hidden;clear:both;content:""} +#s_ol_before .s_ol_wr {position:relative;margin-bottom:5px} +#ol_id {display:block;width:100%;border:1px solid #d0d3db;padding:0 10px;height:35px;margin-bottom:5px;border-radius:3px} +#ol_pw {display:block;width:100%;border:1px solid #d0d3db;padding:0 10px;height:35px;margin-bottom:5px;border-radius:3px} +#ol_submit {width:100%;height:35px;background:#3a8afd;border-left:1px solid #ccc;color:#fff;font-weight:bold;font-size:1.167em;border-radius:3px} +#ol_svc {float:right;margin-top:5px;line-height:20px} +#ol_svc a {display:inline-block;border:1px solid #d5d9dd;color:#3a8afd;border-radius:2px;padding:2px 5px} +#ol_auto {float:left;line-height:20px;margin-top:5px} +#ol_auto label {color:#555;vertical-align:baseline} +#ol_auto input {width:13px;height:13px} +.ol_auto_wr:after {display:block;visibility:hidden;clear:both;content:""} +#sns_login {margin-top:0 !important;border-top:0 !important} +#sns_login h3 {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#s_ol_after {border-bottom:1px solid #f6f6f6} +#s_ol_after_hd {position:relative;padding:10px;padding-left:80px;height:80px} +#s_ol_after_hd strong {display:block;margin:5px 0 10px} +#s_ol_after_hd .profile_img {position:absolute;top:15px;left:15px;display:inline-block} +#s_ol_after_hd .profile_img img {border-radius:50%;width:50px;height:50px} +#s_ol_after_hd .btn_admin {position:absolute;right:0;bottom:0;width:20px;height:20px;line-height:20px;padding:0;text-align:center;border-radius:50%;background:#000;vertical-align:baseline} + +#s_ol_after_info {display:inline-block;height:28px;line-height:22px;border:1px solid #d5d9dd;color:#3a8afd;border-radius:2px;padding:2px 5px} +#s_ol_after h2 {margin:0;padding:0;width:1px;height:1px;font-size:0;line-height:0;overflow:hidden} +#s_ol_after_hd .btn_b04 {line-height:23px;padding:0 5px} +#s_ol_after_private {zoom:1} +#s_ol_after_private:after {display:block;visibility:hidden;clear:both;content:""} +#s_ol_after_private li {text-align:left;position:relative;text-align:left} +#s_ol_after_private li:first-child a {border-left:0} +#s_ol_after_private a {display:block;background:#fff;color:#465168;line-height:18px;padding:10px 20px 10px 25px} +#s_ol_after_private a strong {display:inline-block;float:right;max-width:87px;overflow:hidden;white-space:nowrap;text-overflow:clip;color:#3a8afd;padding:0 5px;border-radius:15px;font-size:0.92em} +#s_ol_after_private a:hover strong {background:#4b8bff} +#s_ol_after_private li a:hover {color:#4b8bff;background:#f7f7f7} +#s_ol_after_private li a:hover:after {position:absolute;left:0;top:0;width:2px;height:38px;background:#3a8afd;content:""} +#s_ol_after_private li i {width:25px;color:#8c9eb0;margin-right:5px} +#s_ol_after_private li:hover i {color:#3a8afd} +#s_ol_after_private .win_point:hover strong {background:#37bc9b;color:#fff} +#s_ol_after_private .win_memo:hover strong {background:#ff8b77;color:#fff} +#s_ol_after_private .win_scrap:hover strong {background:#8cc152;color:#fff} +#s_ol_after_private .win_coupon:hover strong {background:#a352c1;color:#fff} + +#s_ol_after_logout {display:inline-block;height:28px;line-height:22px;border:1px solid #d5d9dd;color:#8a8a8a;border-radius:2px;padding:2px 5px} +#s_ol_after_logout:hover {color:#3c8bfd} +#ol_after_memo {margin-right:1px} +#ol_after_pt {margin-right:1px} + +.selec_chk {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box {position:relative} +.chk_box input[type="checkbox"] + label {padding-left:20px;color:#676e70} +.chk_box input[type="checkbox"] + label:hover{color:#2172f8} +.chk_box input[type="checkbox"] + label span {position:absolute;top:2px;left:0;width:15px;height:15px;display:block;margin:0;background:#fff;border:1px solid #d0d4df;border-radius:3px} +.chk_box input[type="checkbox"]:checked + label {color:#000} +.chk_box input[type="checkbox"]:checked + label span {background:url(./img/chk.png) no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} diff --git a/skin/poll/basic/style.css b/skin/poll/basic/style.css index 6c8f934f8..77a22b5cc 100644 --- a/skin/poll/basic/style.css +++ b/skin/poll/basic/style.css @@ -2,33 +2,7 @@ /* ### 기본 스타일 커스터마이징 시작 ### */ -#poll a.btn_admin {} /* 관리자 전용 버튼 */ -#poll a.btn_admin:focus, #poll a.btn_admin:hover {} - -#poll_result .tbl_frm table {} -#poll_result .tbl_frm .frm_info {} -#poll_result .tbl_frm .frm_address {} -#poll_result .tbl_frm .frm_file {} -#poll_result .tbl_frm caption {} - -#poll_result .tbl_frm01 {} -#poll_result .tbl_frm01 th {} -#poll_result .tbl_frm01 td {} -#poll_result .tbl_frm01 textarea, #poll_result tbl_frm01 .frm_input {} -#poll_result .tbl_frm01 textarea {} -#poll_result .tbl_frm01 a {} - -/* 필수입력 */ -#poll_result .required, #poll_result textarea.required {} - -#poll_result .btn_confirm {} /* 서식단계 진행 */ -#poll_result .btn_submit {} -#poll_result button.btn_submit {} #poll_result .win_btn {text-align:center} /* 새창용 */ -#poll_result .win_btn button {} -#poll_result .win_btn input {} -#poll_result .win_btn a {} -#poll_result .win_btn a:focus, #poll_result .win_btn a:hover {} /* ### 기본 스타일 커스터마이징 끝 ### */ diff --git a/skin/poll/shop_basic/poll.skin.php b/skin/poll/shop_basic/poll.skin.php new file mode 100644 index 000000000..ba1193e91 --- /dev/null +++ b/skin/poll/shop_basic/poll.skin.php @@ -0,0 +1,75 @@ +', 0); +?> + + + + + +
    +
    +

    설문조사

    + 설문관리 + " target="_blank" onclick="poll_result(this.href); return false;" class="btn_result">결과보기 +
    +
    +

    +
      + +
    • + + +
    • + +
    +
    + +
    +
    +
    + + + + \ No newline at end of file diff --git a/skin/poll/shop_basic/poll_result.skin.php b/skin/poll/shop_basic/poll_result.skin.php new file mode 100644 index 000000000..ab3df7063 --- /dev/null +++ b/skin/poll/shop_basic/poll_result.skin.php @@ -0,0 +1,125 @@ +', 0); +?> + + +
    +

    +
    + + 전체 +
    +

    결과

    +
      + +
    1. + 현재 가장 높은 득표율 +
      + +
      +
      + 500 표 + 90 % +
      +
    2. + + + +
    3. + +
      + +
      +
      + + % +
      +
    4. + +
    +
    + + + + +
    +

    이 설문에 대한 기타의견

    + + +
    +
    +

    님의 의견

    + + + 삭제"; } ?> +
    +

    + +

    +
    + + + = $po['po_level']) { ?> +
    + + + + +
    +

    기타의견

    +
    + + +
    +
    + +
    + + +
    + + + + + + +
    + + + + + + + +
    + +
    +
    +
    + + + \ No newline at end of file diff --git a/skin/poll/shop_basic/style.css b/skin/poll/shop_basic/style.css new file mode 100644 index 000000000..ed1d11433 --- /dev/null +++ b/skin/poll/shop_basic/style.css @@ -0,0 +1,81 @@ +@charset "utf-8"; + +/* ### 기본 스타일 커스터마이징 시작 ### */ + +#poll_result .win_btn {text-align:center} /* 새창용 */ + +/* ### 기본 스타일 커스터마이징 끝 ### */ + +/* 설문조사 스킨 */ +#poll {border:1px solid #dde7e9;background:#fff;position:relative;border-radius:3px;margin-bottom:15px} +#poll header {position:relative;border-bottom:1px solid #e8e8e8;padding:15px} +#poll header:after {display:block;visibility:hidden;clear:both;content:""} +#poll header h2 {display:inline-block;float:left;font-size:1.167em;color:#000;line-height:28px} +#poll header h2:after {display:block;visibility:hidden;clear:both;content:""} +#poll header .btn_result {float:right;display:inline-block;line-height:20px;height:28px;border:1px solid #d5d9dd;color:#3a8afd;border-radius:2px;padding:2px 5px;background:#fff} +#poll header .btn_admin {float:right;margin-left:5px;line-height:28px;font-size:1.4em} +#poll ul {padding:0 20px;list-style:none} +#poll li {padding:5px 0} + +.selec_chk {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box {position:relative} +.chk_box input[type="radio"] {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box input[type="radio"] + label {position:relative;padding-left:23px;display:inline-block;color:#676e70} +.chk_box input[type="radio"] + label span {position:absolute;top:0;left:0;width:15px;height:15px;display:block;background:#fff;border:1px solid #cdd6df;border-radius:50%} +.chk_box input[type="radio"]:checked + label {color:#305af9} +.chk_box input[type="radio"]:checked + label span:before {width:7px;height:7px;background:#305af9;content:'';position:absolute;top:3px;left:3px;border-radius:50%} + +#poll .poll_con {} +#poll .poll_con p {font-weight:bold;padding:15px 20px;color:#000;font-size:1.167em} +#poll_btn {padding:10px 20px 20px;text-align:center} +#poll_btn:after {display:block;visibility:hidden;clear:both;content:""} +#poll_btn .btn_poll {display:block;width:100%;height:40px;line-height:40px;padding:0 10px;border:0;font-weight:bold;background:#3a8afd;color:#fff;border-radius:3px} + +/* 설문조사 결과 (새창) */ +#poll_result {} +#poll_result section {} +#poll_result .tbl_wrap {margin:0} +#poll_result .sv_member, +#poll_result .sv_guest {font-weight:bold} +#poll_result .poll_all {position:absolute;top:10px;right:10px;display:inline-block;margin:0 0 10px;line-height:30px;font-size:0.92em;color:#3a8afd;background:#f6f6f6;padding:0 10px;border-radius:5px} +#poll_result_list {clear:both;margin:20px;border:1px solid #d6e2f4;border-top:0;background:#fff;border-radius:5px} +#poll_result_list h2 {margin:0;font-size:1.25em;padding:15px;margin:0 0 15px;border-top:1px solid #d6e2f4;border-bottom:1px solid #d6e2f4;text-align:center;background:#edf3fc;color:#375582;border-radius:5px} +#poll_result_list dt {margin-right:5%;color:#e8180d;text-align:right} +#poll_result_list ol {margin:0;padding:0 20px} +#poll_result_list li {margin:20px 0;position:relative;list-style-position:inside} + +.poll_1st .poll_result_graph span {background:#3a8afd} +.poll_result_graph {position:relative;width:90%;margin:5px 0;height:15px;background:#fff;border-radius:10px;-moz-box-shadow:inset 0px 2px 8px #dadada;-webkit-box-shadow:inset 0px 2px 8px #dadada;box-shadow:inset 0px 2px 8px #dadada} +.poll_result_graph span {position:absolute;top:0;left:0;height:15px;background:#8395b3;border-radius:10px 10px;white-space:nowrap} + +.poll_numerical {display:inline-block;position:absolute;top:0;right:0;text-align:center} +.poll_numerical .poll_percent {display:block;font-size:1.2em;color:#3a8afd;font-weight:bold;letter-spacing:-0.5px} +.poll_numerical .poll_cnt {font-size:1em;text-align:right;color:#8d8d8d} + +#poll_result_cmt {margin:20px} +#poll_result_cmt h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#poll_result_cmt article {margin:15px 0;position:relative;border-bottom:1px solid #eaeaea} +#poll_result_cmt h1 {position:absolute;margin:0;padding:0;border:0;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#poll_result_cmt header {margin:0 0 5px} +#poll_result_cmt .poll_datetime {display:inline-block;font-size:0.92em;color:#777} +#poll_result_cmt .profile_img img {border-radius:50%} +#poll_result_cmt p {padding:10px;line-height:1.5em} + +#poll_other_q h3 {margin:0;font-size:1.25em;padding:10px;border-bottom:1px solid #eaeaea;text-align:left} +#poll_other_q h3 span {background:#f7f8e3;color:#c97600;padding:3px;display:inline-block;border-radius:5px;margin-right:5px;font-weight:normal;font-size:0.8em} +#poll_result_wcmt {border:1px solid #cfd4db;margin-bottom:10px} +#poll_result_wcmt input {border:0;height:80px;padding:10px} +#poll_result_cmt .btn_submit {padding:0 20px;float:right} + +.poll_guest input {border: 1px solid #cfd4db;padding:10px;margin-bottom:10px;display:inline-block} + +.poll_cmt_del {float:right} +.poll_cmt_del a {display:inline-block;margin:0 0 5px 10px;color:#c7c9cb;font-size:15px} +.poll_cmt_del:hover a {color:#3a8afd} + +#poll_result_oth {clear:both;margin:20px} +#poll_result_oth h2 {padding:0 0 10px} +#poll_result_oth ul {margin:0;padding:0;list-style:none;border:1px solid #ddd;background:#fff;border-top:0} +#poll_result_oth ul li{border-top:1px solid #eaeaea;position:relative;line-height:20px} +#poll_result_oth a {display:block;padding:10px} +#poll_result_oth li span {position:absolute;bottom:10px;right:15px;color:#777;font-size:0.92em} diff --git a/skin/qa/basic/list.skin.php b/skin/qa/basic/list.skin.php index 56df884ee..47fdfb615 100644 --- a/skin/qa/basic/list.skin.php +++ b/skin/qa/basic/list.skin.php @@ -41,6 +41,11 @@ add_stylesheet('', 0); 게시물 검색 + + +
    diff --git a/skin/qa/basic/style.css b/skin/qa/basic/style.css index 7f12e4e41..4c0abb64a 100644 --- a/skin/qa/basic/style.css +++ b/skin/qa/basic/style.css @@ -2,89 +2,18 @@ /* ### 기본 스타일 커스터마이징 시작 ### */ /* 게시판 버튼 */ -/* 목록 버튼 */ -#bo_list a.btn_b01 {} -#bo_list a.btn_b01:focus, #bo_list a.btn_b01:hover {} -#bo_list a.btn_b02 {} -#bo_list a.btn_b02:focus, #bo_list a.btn_b02:hover {} -#bo_list a.btn_admin {} /* 관리자 전용 버튼 */ -#bo_list a.btn_admin:focus, #bo_list .btn_admin:hover {} - -/* 읽기 버튼 */ -#bo_v a.btn_b01 {} -#bo_v a.btn_b01:focus, #bo_v a.btn_b01:hover {} -#bo_v a.btn_b02 {} -#bo_v a.btn_b02:focus, #bo_v a.btn_b02:hover {} -#bo_v a.btn_admin {} /* 관리자 전용 버튼 */ -#bo_v a.btn_admin:focus, #bo_v a.btn_admin:hover {} - /* 쓰기 버튼 */ -#bo_w .btn_confirm {} /* 서식단계 진행 */ #bo_w .btn_submit {padding:0 20px;font-size:1.167em} -#bo_w button.btn_submit {} -#bo_w fieldset .btn_submit {} #bo_w .btn_cancel {font-size:1.167em;border-radius:3px} -#bo_w button.btn_cancel {} -#bo_w .btn_cancel:focus, #bo_w .btn_cancel:hover {} -#bo_w a.btn_frmline, #bo_w button.btn_frmline {} /* 우편번호검색버튼 등 */ -#bo_w button.btn_frmline {} /* 기본 테이블 */ /* 목록 테이블 */ #bo_list {position:relative} #bo_list:after {display:block;visibility:hidden;clear:both;content:""} -#bo_list .tbl_head01 {} -#bo_list .tbl_head01 caption {} -#bo_list .tbl_head01 thead th {} -#bo_list .tbl_head01 thead a {} -#bo_list .tbl_head01 thead th input {} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ -#bo_list .tbl_head01 tfoot th {} -#bo_list .tbl_head01 tfoot td {} -#bo_list .tbl_head01 tbody th {} -#bo_list .tbl_head01 td {} -#bo_list .tbl_head01 a {} -#bo_list td.empty_table {} #bo_list tbody .even td {background:#fbfbfb} -/* 읽기 내 테이블 */ -#bo_v .tbl_head01 {} -#bo_v .tbl_head01 caption {} -#bo_v .tbl_head01 thead th {} -#bo_v .tbl_head01 thead a {} -#bo_v .tbl_head01 thead th input {} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ -#bo_v .tbl_head01 tfoot th {} -#bo_v .tbl_head01 tfoot td {} -#bo_v .tbl_head01 tbody th {} -#bo_v .tbl_head01 td {} -#bo_v .tbl_head01 a {} -#bo_v td.empty_table {} - /* 쓰기 테이블 */ #bo_w h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} -#bo_w table {} -#bo_w caption {} -#bo_w .frm_info {} -#bo_w .frm_address {} -#bo_w .frm_file {} - -#bo_w .tbl_frm01 {} -#bo_w .tbl_frm01 th {} -#bo_w .tbl_frm01 td {} -#bo_w .tbl_frm01 textarea, #bo_w tbl_frm01 .frm_input {} -#bo_w .tbl_frm01 textarea {} -#bo_w .tbl_frm01 a {} - -/* 필수입력 */ -#bo_w .required, #bo_w textarea.required {} - -#bo_w .cke_sc {} -#bo_w button.btn_cke_sc {} -#bo_w .cke_sc_def {} -#bo_w .cke_sc_def dl {} -#bo_w .cke_sc_def dl:after {} -#bo_w .cke_sc_def dt, #bo_w .cke_sc_def dd {} -#bo_w .cke_sc_def dt {} -#bo_w .cke_sc_def dd {} /* ### 기본 스타일 커스터마이징 끝 ### */ @@ -182,7 +111,7 @@ box-shadow:inset 0 2px 5px rgb(33, 135, 202)} .bo_sch select {border:0;width:100%;height:40px;border:1px solid #d0d3db;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); -moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)} -.bo_sch .sch_bar {display:inline-block;width:100%;clear:both;border:1px solid #d0d3db;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +.bo_sch .sch_bar {display:inline-block;width:100%;clear:both;margin-top:15px;border:1px solid #d0d3db;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); -moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)} .bo_sch .sch_input {width:250px;height:38px;border:0;padding:0;background-color:transparent;float:left} diff --git a/skin/qa/basic/view.skin.php b/skin/qa/basic/view.skin.php index a8db766a5..a47b8528d 100644 --- a/skin/qa/basic/view.skin.php +++ b/skin/qa/basic/view.skin.php @@ -123,7 +123,7 @@ add_stylesheet('', 0); diff --git a/skin/shop/basic/boxbanner.skin.php b/skin/shop/basic/boxbanner.skin.php new file mode 100644 index 000000000..03be8e7ac --- /dev/null +++ b/skin/shop/basic/boxbanner.skin.php @@ -0,0 +1,48 @@ + ', 0); +add_javascript('', 10); +?> + +

    쇼핑몰 배너

    '.PHP_EOL; +?> + + diff --git a/skin/shop/basic/boxcart.skin.php b/skin/shop/basic/boxcart.skin.php new file mode 100644 index 000000000..ccc6f6ffa --- /dev/null +++ b/skin/shop/basic/boxcart.skin.php @@ -0,0 +1,82 @@ +', 0); +$cart_action_url = G5_SHOP_URL.'/cartupdate.php'; +?> + + + + + + diff --git a/skin/shop/basic/boxcategory.skin.php b/skin/shop/basic/boxcategory.skin.php new file mode 100644 index 000000000..1496911c5 --- /dev/null +++ b/skin/shop/basic/boxcategory.skin.php @@ -0,0 +1,44 @@ +', 0); + +$mshop_categories = get_shop_category_array(true); +?> + + + + \ No newline at end of file diff --git a/skin/shop/basic/boxcommunity.skin.php b/skin/shop/basic/boxcommunity.skin.php new file mode 100644 index 000000000..042f59e2f --- /dev/null +++ b/skin/shop/basic/boxcommunity.skin.php @@ -0,0 +1,25 @@ +', 0); +?> + + + + \ No newline at end of file diff --git a/skin/shop/basic/boxevent.skin.php b/skin/shop/basic/boxevent.skin.php new file mode 100644 index 000000000..376517b9b --- /dev/null +++ b/skin/shop/basic/boxevent.skin.php @@ -0,0 +1,77 @@ +', 0); +?> +
    +
    +

    이벤트

    +
    +
      +
      '; + $href = G5_SHOP_URL.'/event.php?ev_id='.$row['ev_id']; + + $event_img = G5_DATA_PATH.'/event/'.$row['ev_id'].'_m'; // 이벤트 이미지 + + if (file_exists($event_img)) { // 이벤트 이미지가 있다면 이미지 출력 + echo ''.$row['ev_subject'].''.PHP_EOL; + } else { // 없다면 텍스트 출력 + echo ''; + if ($row['ev_subject_strong']) echo ''; + echo $row['ev_subject']; + if ($row['ev_subject_strong']) echo ''; + echo ''.PHP_EOL; + } + + // 이벤트 상품 + $sql2 = " select b.* + from `{$g5['g5_shop_event_item_table']}` a left join `{$g5['g5_shop_item_table']}` b on (a.it_id = b.it_id) + where a.ev_id = '{$row['ev_id']}' + order by it_id desc + limit 0, 3 "; + $result2 = sql_query($sql2); + for($k=1; $row2=sql_fetch_array($result2); $k++) { + if($k == 1) { + echo '
        '.PHP_EOL; + } + + $item_href = shop_item_url($row2['it_id']); + + echo '
      • '.PHP_EOL; + echo ''.get_it_image($row2['it_id'], 110, 110, get_text($row2['it_name'])).''.PHP_EOL; + echo '
        '.get_text(cut_str($row2['it_name'], 30)).''.PHP_EOL; + echo ''.display_price(get_price($row2), $row2['it_tel_inq']).'
        '.PHP_EOL; + echo '
      • '.PHP_EOL; + } + if($k > 1) { + echo '
      • 더보기
      • '.PHP_EOL; + echo '
      '.PHP_EOL; + } + + if($k == 1) { + echo '
        '.PHP_EOL; + echo '
      • 등록된 상품이 없습니다.
      • '.PHP_EOL; + echo '
      '.PHP_EOL; + } + //echo '더보기'.PHP_EOL; + echo '
      '.PHP_EOL; + echo ''.PHP_EOL; + + } + + if ($i==0) + echo '
    • 이벤트 없음
    • '.PHP_EOL; + ?> +
    +
    +', 0); +?> + + +
    +

    오늘 본 상품

    + + + '.PHP_EOL; + echo '
  • '.PHP_EOL; + echo '
    '; + echo $img; + echo '
    '.PHP_EOL; + echo '
    '; + echo ''; + echo cut_str($it_name, 10, '').PHP_EOL; + echo ''; + echo ''; + echo $print_price.PHP_EOL; + echo ''.PHP_EOL; + echo '
    '.PHP_EOL; + echo '
  • '.PHP_EOL; + + $tv_tot_count++; + $i++; + } + if ($tv_tot_count > 0) echo ''.PHP_EOL; + ?> +
    + + + + + + +

    없음

    + + +
    + + + \ No newline at end of file diff --git a/skin/shop/basic/boxwish.skin.php b/skin/shop/basic/boxwish.skin.php new file mode 100644 index 000000000..4736de9bf --- /dev/null +++ b/skin/shop/basic/boxwish.skin.php @@ -0,0 +1,42 @@ +', 0); +?> + + + + diff --git a/skin/shop/basic/couponzone.10.skin.php b/skin/shop/basic/couponzone.10.skin.php new file mode 100644 index 000000000..0f300f019 --- /dev/null +++ b/skin/shop/basic/couponzone.10.skin.php @@ -0,0 +1,208 @@ +', 0); +?> + +
    +

    다운로드 쿠폰

    +

    회원이시라면 쿠폰 다운로드 후 바로 사용하실 수 있습니다.

    + + '.get_text($row3['it_name']).''; + $coupon_info_class = 'cp_2'; + break; + case '1': + $sql3 = " select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '{$row['cp_target']}' "; + $row3 = sql_fetch($sql3); + $cp_target = '카테고리할인'; + $cp_link = ''.get_text($row3['ca_name']).''; + $coupon_info_class = 'cp_1'; + break; + case '2': + $cp_link = $cp_target = '주문금액할인'; + $coupon_info_class = 'cp_3'; + break; + case '3': + $cp_link = $cp_target = '배송비할인'; + $coupon_info_class = 'cp_4'; + break; + } + + // 다운로드 쿠폰인지 + $disabled = ''; + if(is_coupon_downloaded($member['mb_id'], $row['cz_id'])) + $disabled = ' disabled'; + + // $row['cp_type'] 값이 있으면 % 이며 없으면 원 입니다. + $print_cp_price = $row['cp_type'] ? ''.$row['cp_price'].' %' : ''.number_format($row['cp_price']).' 원'; + + $coupon .= '
  • '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.$subj.''.PHP_EOL; + $coupon .= '
    '.$subj.'
    '.$print_cp_price.'
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '적용'.PHP_EOL; + $coupon .= '
    +

    '.$cp_target.'

    +
      +
    • 적용 : '.$cp_link.'
    • '; + + if( $row['cp_minimum'] ){ // 쿠폰에 최소주문금액이 있다면 + $coupon .= '
    • 최소주문금액 : '.number_format($row['cp_minimum']).'
    • '; + } + + $coupon .='
    + +
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    기한다운로드 후 '.number_format($row['cz_period']).'일
    '.PHP_EOL; + //cp_1 카테고리할인 + //cp_2 개별상품할인 + //cp_3 주문금액할인 + //cp_4 배송비할인 + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
  • '.PHP_EOL; + } + + if($coupon) + echo '
      '.PHP_EOL.$coupon.'
    '.PHP_EOL; + else + echo '

    사용할 수 있는 쿠폰이 없습니다.

    '; + ?> +
    + +
    +

    포인트 쿠폰

    +

    보유하신 회원 포인트를 쿠폰으로 교환하실 수 있습니다.

    + + '.get_text($row3['it_name']).''; + $cp_target = '개별상품할인'; + $coupon_info_class = 'cp_2'; + break; + case '1': + $sql3 = " select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '{$row['cp_target']}' "; + $row3 = sql_fetch($sql3); + $cp_link = ''.get_text($row3['ca_name']).''; + $cp_target = '카테고리할인'; + $coupon_info_class = 'cp_1'; + break; + case '2': + $cp_link = $cp_target = '주문금액할인'; + $coupon_info_class = 'cp_3'; + break; + case '3': + $cp_link = $cp_target = '배송비할인'; + $coupon_info_class = 'cp_4'; + break; + } + + // 다운로드 쿠폰인지 + $disabled = ''; + if(is_coupon_downloaded($member['mb_id'], $row['cz_id'])) + $disabled = ' disabled'; + + // $row['cp_type'] 값이 있으면 % 이며 없으면 원 입니다. + $print_cp_price = $row['cp_type'] ? ''.$row['cp_price'].' %' : ''.number_format($row['cp_price']).' 원'; + + $coupon .= '
  • '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.$subj.''.PHP_EOL; + $coupon .= '
    '.$subj.'
    '.$print_cp_price.'
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + + $coupon .= '
    '.PHP_EOL; + $coupon .= '적용'.PHP_EOL; + + $coupon .= '
    +

    '.$cp_target.'

    +
      +
    • 적용 : '.$cp_link.'
    • '; + + if( $row['cp_minimum'] ){ // 쿠폰에 최소주문금액이 있다면 + $coupon .= '
    • 최소주문금액 : '.number_format($row['cp_minimum']).'
    • '; + } + + $coupon .= '
    + +
    '.PHP_EOL; + + $coupon .= '
    '.PHP_EOL; + + $coupon .= '
    기한다운로드 후 '.number_format($row['cz_period']).'일
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + + $coupon .= '
    '.PHP_EOL; + $coupon .= '
    '.PHP_EOL; + $coupon .= '
  • '.PHP_EOL; + } + + if($coupon) + echo '
      '.PHP_EOL.$coupon.'
    '.PHP_EOL; + else + echo '

    사용할 수 있는 쿠폰이 없습니다.

    '; + ?> +
    + + \ No newline at end of file diff --git a/skin/shop/basic/img/btn_next.png b/skin/shop/basic/img/btn_next.png new file mode 100644 index 000000000..2cfd49355 Binary files /dev/null and b/skin/shop/basic/img/btn_next.png differ diff --git a/skin/shop/basic/img/btn_prev.png b/skin/shop/basic/img/btn_prev.png new file mode 100644 index 000000000..4fdda6491 Binary files /dev/null and b/skin/shop/basic/img/btn_prev.png differ diff --git a/skin/shop/basic/img/btn_sb_next.png b/skin/shop/basic/img/btn_sb_next.png new file mode 100644 index 000000000..2cfd49355 Binary files /dev/null and b/skin/shop/basic/img/btn_sb_next.png differ diff --git a/skin/shop/basic/img/btn_sb_prev.png b/skin/shop/basic/img/btn_sb_prev.png new file mode 100644 index 000000000..4fdda6491 Binary files /dev/null and b/skin/shop/basic/img/btn_sb_prev.png differ diff --git a/skin/shop/basic/img/chk.png b/skin/shop/basic/img/chk.png new file mode 100644 index 000000000..2841a67f3 Binary files /dev/null and b/skin/shop/basic/img/chk.png differ diff --git a/skin/shop/basic/img/facebook.png b/skin/shop/basic/img/facebook.png new file mode 100644 index 000000000..cf737d633 Binary files /dev/null and b/skin/shop/basic/img/facebook.png differ diff --git a/skin/shop/basic/img/gnb_bg.png b/skin/shop/basic/img/gnb_bg.png new file mode 100644 index 000000000..419b3a2c0 Binary files /dev/null and b/skin/shop/basic/img/gnb_bg.png differ diff --git a/skin/shop/basic/img/gnb_bg00.gif b/skin/shop/basic/img/gnb_bg00.gif new file mode 100644 index 000000000..b61236269 Binary files /dev/null and b/skin/shop/basic/img/gnb_bg00.gif differ diff --git a/skin/shop/basic/img/gnb_bg01.gif b/skin/shop/basic/img/gnb_bg01.gif new file mode 100644 index 000000000..cbae7886f Binary files /dev/null and b/skin/shop/basic/img/gnb_bg01.gif differ diff --git a/skin/shop/basic/img/gplus.png b/skin/shop/basic/img/gplus.png new file mode 100644 index 000000000..8ab2fa6bc Binary files /dev/null and b/skin/shop/basic/img/gplus.png differ diff --git a/skin/shop/basic/img/icon_arw_toleft.gif b/skin/shop/basic/img/icon_arw_toleft.gif new file mode 100644 index 000000000..a9d338b5e Binary files /dev/null and b/skin/shop/basic/img/icon_arw_toleft.gif differ diff --git a/skin/shop/basic/img/icon_secret.gif b/skin/shop/basic/img/icon_secret.gif new file mode 100644 index 000000000..c04899f14 Binary files /dev/null and b/skin/shop/basic/img/icon_secret.gif differ diff --git a/skin/shop/basic/img/is_button.gif b/skin/shop/basic/img/is_button.gif new file mode 100644 index 000000000..15f3c87aa Binary files /dev/null and b/skin/shop/basic/img/is_button.gif differ diff --git a/skin/shop/basic/img/personal.jpg b/skin/shop/basic/img/personal.jpg new file mode 100644 index 000000000..c8956ecb7 Binary files /dev/null and b/skin/shop/basic/img/personal.jpg differ diff --git a/skin/shop/basic/img/sbn_btn.png b/skin/shop/basic/img/sbn_btn.png new file mode 100644 index 000000000..ebd38ec94 Binary files /dev/null and b/skin/shop/basic/img/sbn_btn.png differ diff --git a/skin/shop/basic/img/sct_bg_toright.gif b/skin/shop/basic/img/sct_bg_toright.gif new file mode 100644 index 000000000..1617dc32f Binary files /dev/null and b/skin/shop/basic/img/sct_bg_toright.gif differ diff --git a/skin/shop/basic/img/select_arrow.png b/skin/shop/basic/img/select_arrow.png new file mode 100644 index 000000000..3ba8b7389 Binary files /dev/null and b/skin/shop/basic/img/select_arrow.png differ diff --git a/skin/shop/basic/img/select_arrow_left.png b/skin/shop/basic/img/select_arrow_left.png new file mode 100644 index 000000000..9e729ff41 Binary files /dev/null and b/skin/shop/basic/img/select_arrow_left.png differ diff --git a/skin/shop/basic/img/select_arrow_next.png b/skin/shop/basic/img/select_arrow_next.png new file mode 100644 index 000000000..f9ca78b70 Binary files /dev/null and b/skin/shop/basic/img/select_arrow_next.png differ diff --git a/skin/shop/basic/img/select_arrow_prev.png b/skin/shop/basic/img/select_arrow_prev.png new file mode 100644 index 000000000..75d70dca7 Binary files /dev/null and b/skin/shop/basic/img/select_arrow_prev.png differ diff --git a/skin/shop/basic/img/select_arrow_right.png b/skin/shop/basic/img/select_arrow_right.png new file mode 100644 index 000000000..f70cff766 Binary files /dev/null and b/skin/shop/basic/img/select_arrow_right.png differ diff --git a/skin/shop/basic/img/sit_siblings.jpg b/skin/shop/basic/img/sit_siblings.jpg new file mode 100644 index 000000000..41555fd18 Binary files /dev/null and b/skin/shop/basic/img/sit_siblings.jpg differ diff --git a/skin/shop/basic/img/sns_fb_s.png b/skin/shop/basic/img/sns_fb_s.png new file mode 100644 index 000000000..1ce297731 Binary files /dev/null and b/skin/shop/basic/img/sns_fb_s.png differ diff --git a/skin/shop/basic/img/sns_goo_s.png b/skin/shop/basic/img/sns_goo_s.png new file mode 100644 index 000000000..74235887d Binary files /dev/null and b/skin/shop/basic/img/sns_goo_s.png differ diff --git a/skin/shop/basic/img/sns_kakao_s.png b/skin/shop/basic/img/sns_kakao_s.png new file mode 100644 index 000000000..838b9697e Binary files /dev/null and b/skin/shop/basic/img/sns_kakao_s.png differ diff --git a/skin/shop/basic/img/sns_twt_s.png b/skin/shop/basic/img/sns_twt_s.png new file mode 100644 index 000000000..53f691a62 Binary files /dev/null and b/skin/shop/basic/img/sns_twt_s.png differ diff --git a/skin/shop/basic/img/twitter.png b/skin/shop/basic/img/twitter.png new file mode 100644 index 000000000..8fbf0914b Binary files /dev/null and b/skin/shop/basic/img/twitter.png differ diff --git a/skin/shop/basic/img/use_reply.png b/skin/shop/basic/img/use_reply.png new file mode 100644 index 000000000..14a3908ad Binary files /dev/null and b/skin/shop/basic/img/use_reply.png differ diff --git a/skin/shop/basic/item.form.skin.php b/skin/shop/basic/item.form.skin.php new file mode 100644 index 000000000..4f1095fb6 --- /dev/null +++ b/skin/shop/basic/item.form.skin.php @@ -0,0 +1,528 @@ +', 0); +?> +
    +
    + + + + +
    + +
    +
    + '.$img.''; + } + } + + if($big_img_count == 0) { + echo ''; + } + ?> + 확대보기 +
    + 0) { + echo ''; + } + ?> +
    + + + +
    +

    요약정보 및 구매

    +

    + +

    + 상품 선택옵션 개, 추가옵션 개 +

    + + +
    + + 고객평점 + + + + + 사용후기 + +
    + 위시리스트 + +
    + + 추천하기 +
    +
    +
    + + +
    +
    개인정보처리방침안내개인정보 수집 및 이용
    목적
    이용자 식별 및 본인여부 확인아이디, 이름, 비밀번호아이디, 이름, 비밀번호 회원 탈퇴 시까지
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */ + ?> + + + + + + + + 배송비결제'; + $sc_method = ''; + } + else + $sc_method = '주문시 결제'; + } + ?> + + + + + + + + + + + + + + + + + +
    판매가격판매중지
    판매가격전화문의
    시중가격
    판매가격 + + +
    제조사
    원산지
    브랜드
    모델
    재고수량
    포인트 + +
    최소구매수량
    최대구매수량
    +
    + + +
    +

    선택옵션

    + + +
    + + + + + +
    +

    추가옵션

    + +
    + + + + + +
    +

    선택된 옵션

    + +
      +
    • + + + + + +
      + +
      +
      + + + + + +0원 +
      +
    • +
    + + +
    + + + +
    + + + +

    상품의 재고가 부족하여 구매할 수 없습니다.

    + + +
    + + + + + 위시리스트 + + + 재입고알림 + + +
    + +
    + + +
    + +
    + +
    + 이 분류에 등록된 다른 상품이 없습니다.'; + } + ?> +
    + + + + + + + \ No newline at end of file diff --git a/skin/shop/basic/item.info.skin.php b/skin/shop/basic/item.info.skin.php new file mode 100644 index 000000000..722c20faf --- /dev/null +++ b/skin/shop/basic/item.info.skin.php @@ -0,0 +1,337 @@ +', 0); +?> + + + + + +
    +

    관련상품

    + set_query($sql); + echo $list->run(); + ?> +
    + + + +
    +
    +
      +
    • +
    • +
    • +
    • +
    +
      + + +
    • +

      상품 정보

      + + +

      상품 상세설명

      +
      + +
      + + + +

      상품 정보 고시

      + + + $val) { + $ii_title = $info_array[$key][0]; + $ii_value = $val; + ?> + + + + + + +
      + + 상품 정보 고시 정보가 올바르게 저장되지 않았습니다.
      config.php 파일의 G5_ESCAPE_FUNCTION 설정을 addslashes 로
      변경하신 후 관리자 > 상품정보 수정에서 상품 정보를 다시 저장해주세요.

      '; + } + } + } //if + ?> + +
    • + +
    • +

      사용후기

      +
      +
    • + + + +
    • +

      상품문의

      +
      +
    • + + + +
    • +

      배송/교환정보

      + + + +
      +

      배송

      + +
      + + + + + +
      +

      교환

      + +
      + + + +
    • + +
    +
    + +
    +
    + + +
    +

    선택옵션

    + +
    + + + + + +
    +

    추가옵션

    + +
    + + + + + +
    +

    선택된 옵션

    +
      + +
    • +
      + +
      +
      + + + + + +0원 +
      +
    • + +
    +
    + + +
    +
    + +
    + + +
    +
    + + +
    +
    +
    + + \ No newline at end of file diff --git a/skin/shop/basic/itemqa.skin.php b/skin/shop/basic/itemqa.skin.php new file mode 100644 index 000000000..9e4741463 --- /dev/null +++ b/skin/shop/basic/itemqa.skin.php @@ -0,0 +1,143 @@ +', 0); +?> + + + + +
    +

    등록된 상품문의

    + + + + '; + + if($is_admin || $member['mb_id' ] == $row['mb_id']) { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } else { + $iq_question = '비밀글로 보호된 문의입니다.'; + $is_secret = true; + } + } else { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } + $iq_time = substr($row['iq_time'], 2, 8); + + $hash = md5($row['iq_id'].$row['iq_time'].$row['iq_ip']); + + $iq_stats = ''; + $iq_style = ''; + $iq_answer = ''; + + if ($row['iq_answer']) + { + $iq_answer = get_view_thumbnail(conv_content($row['iq_answer'], 1), $thumbnail_width); + $iq_stats = '답변완료'; + $iq_style = 'sit_qaa_done'; + $is_answer = true; + } else { + $iq_stats = '답변대기'; + $iq_style = 'sit_qaa_yet'; + $iq_answer = '답변이 등록되지 않았습니다.'; + $is_answer = false; + } + + if ($i == 0) echo '
      '; + ?> + +
    1. + +
      +
      작성자/작성일
      +
      +
      + +
      +
      +
      + 문의내용 + Q + +
      + +
      + 답변 + A + +
      + +
      + + + + +
      +
    2. + + 0) echo '
    '; + + if (!$i) echo '

    상품문의가 없습니다.

    '; + ?> +
    + + + + + \ No newline at end of file diff --git a/skin/shop/basic/itemqaform.skin.php b/skin/shop/basic/itemqaform.skin.php new file mode 100644 index 000000000..a5797fc0a --- /dev/null +++ b/skin/shop/basic/itemqaform.skin.php @@ -0,0 +1,62 @@ +', 0); +?> + + +
    +

    상품문의 쓰기

    + +
    + + + + +
    +
      +
    • + 옵션 + class="selec_chk"> + +
    • +
    • +
      + +
      + 이메일을 입력하시면 답변 등록 시 답변이 이메일로 전송됩니다. +
      +
      + +
      + 휴대폰번호를 입력하시면 답변 등록 시 답변등록 알림이 SMS로 전송됩니다. +
      +
    • +
    • + + +
    • +
    • + + +
    • +
    + +
    + + +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/skin/shop/basic/itemqalist.skin.php b/skin/shop/basic/itemqalist.skin.php new file mode 100644 index 000000000..d70285924 --- /dev/null +++ b/skin/shop/basic/itemqalist.skin.php @@ -0,0 +1,144 @@ +', 0); +?> + + + + + +
    +
    + + +
    + + + +
    + 전체보기 +
    +
    + +
    + + '; + + if($is_admin || $member['mb_id' ] == $row['mb_id']) { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } else { + $iq_question = '비밀글로 보호된 문의입니다.'; + $is_secret = true; + } + } else { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } + + $it_href = shop_item_url($row['it_id']); + + if ($row['iq_answer']) + { + $iq_answer = get_view_thumbnail(conv_content($row['iq_answer'], 1), $thumbnail_width); + $iq_stats = '답변완료'; + $iq_style = 'sit_qaa_done'; + $is_answer = true; + } else { + $iq_stats = '답변대기'; + $iq_style = 'sit_qaa_yet'; + $iq_answer = '답변이 등록되지 않았습니다.'; + $is_answer = false; + } + + if ($i == 0) echo '
      '; + ?> +
    1. + + +
      +

      + + +
      +
      작성자
      +
      +
      작성일
      +
      +
      + + + +
      +
      + +
    2. + 0) echo '
    '; + if ($i == 0) echo '

    자료가 없습니다.

    '; + ?> +
    + + + + + \ No newline at end of file diff --git a/skin/shop/basic/itemuse.skin.php b/skin/shop/basic/itemuse.skin.php new file mode 100644 index 000000000..1c796be50 --- /dev/null +++ b/skin/shop/basic/itemuse.skin.php @@ -0,0 +1,134 @@ +', 0); +?> + + + + +
    +

    등록된 사용후기

    + +
    + +

    구매고객 총평점 (총 건 상품평 기준)

    + + + +
    + + '; + ?> + +
  • + +
    +
    평점
    +
    별<?php echo $is_star; ?>개
    +
    +
    +
    작성자/작성일
    +
    +
    + + + +
  • + + 0) echo ''; + + if (!$i) echo '

    사용후기가 없습니다.

    '; + ?> +
    + + + + + \ No newline at end of file diff --git a/skin/shop/basic/itemuseform.skin.php b/skin/shop/basic/itemuseform.skin.php new file mode 100644 index 000000000..3072e5cf5 --- /dev/null +++ b/skin/shop/basic/itemuseform.skin.php @@ -0,0 +1,75 @@ +', 0); +?> + + +
    +

    사용후기 쓰기

    + +
    + + + + +
    +
      +
    • + + +
    • +
    • + 내용 + +
    • +
    • + 평점 +
        +
      • + > + + 매우만족 +
      • +
      • + > + + 만족 +
      • +
      • + > + + 보통 +
      • +
      • + > + + 불만 +
      • +
      • + > + + 매우불만 +
      • +
      +
    • +
    + +
    + + +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/skin/shop/basic/itemuselist.skin.php b/skin/shop/basic/itemuselist.skin.php new file mode 100644 index 000000000..f78588f93 --- /dev/null +++ b/skin/shop/basic/itemuselist.skin.php @@ -0,0 +1,165 @@ +', 0); +?> + + + + +
    +
    + + +
    + + + +
    + 전체보기 +
    +
    + +
    + + '; + ?> +
  • +
    +
    + + + + + +
    +
    + +
    + 평가점수 + 별<?php echo $star; ?>개 + + + + + +
    +
    +
    작성자
    +
    +
    작성일
    +
    +
    + + + + +
    +
    +

    사용후기

    +
    +
    + +
    +
    작성자
    +
    +
    작성일
    +
    +
    +
    +
    + + + 평가점수별<?php echo $star; ?>개 +
    + +
    + + +
    +
    +

    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
  • + 0) echo ''; + if ($i == 0) echo '

    자료가 없습니다.

    '; + ?> +
    + + + + + \ No newline at end of file diff --git a/skin/shop/basic/largeimage.skin.php b/skin/shop/basic/largeimage.skin.php new file mode 100644 index 000000000..21f0759a0 --- /dev/null +++ b/skin/shop/basic/largeimage.skin.php @@ -0,0 +1,93 @@ +', 0); +?> + +
    +

    상품 이미지 새창 보기

    +
    + $imgs){ + $thumbnails[$i] = $imgs['thumb']; + ?> + + + + + + +
    + + 0) { + echo '
      '; + foreach($thumbnails as $key=>$val) { + echo '
    • '.$val.'
    • '; + } + echo '
    '; + } + ?> +
    + +
    +
    + + \ No newline at end of file diff --git a/skin/shop/basic/list.10.skin.php b/skin/shop/basic/list.10.skin.php new file mode 100644 index 000000000..eef54df06 --- /dev/null +++ b/skin/shop/basic/list.10.skin.php @@ -0,0 +1,166 @@ +', 0); + +// 장바구니 또는 위시리스트 ajax 스크립트 +add_javascript('', 10); +?> + + +view_star = (method_exists($this, 'view_star')) ? $this->view_star : true; + +foreach((array) $list as $row){ + if( empty($row) ) continue; + + $item_link_href = shop_item_url($row['it_id']); // 상품링크 + $star_score = $row['it_use_avg'] ? (int) get_star($row['it_use_avg']) : ''; //사용자후기 평균별점 + $list_mod = $this->list_mod; // 분류관리에서 1줄당 이미지 수 값 또는 파일에서 지정한 가로 수 + $is_soldout = is_soldout($row['it_id'], true); // 품절인지 체크 + + $classes = array(); + + $classes[] = 'col-row-'.$list_mod; + + if( $i && ($i % $list_mod == 0) ){ + $classes[] = 'row-clear'; + } + + $i++; // 변수 i 를 증가 + + if ($i === 1) { + if ($this->css) { + echo "
      css}\">\n"; + } else { + echo "
        \n"; + } + } + + echo "
      • \n"; + echo "
        \n"; + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_img) { + echo get_it_image($row['it_id'], $this->img_width, $this->img_height, '', '', stripslashes($row['it_name']))."\n"; + } + + if ($this->href) { + echo "\n"; + } + + if ( !$is_soldout ){ // 품절 상태가 아니면 출력합니다. + echo "
        + \n"; + echo "
        \n"; + } + + echo "
        \n"; + + if ($this->view_it_icon) { + // 품절 + if ($is_soldout) { + echo 'SOLD OUT'; + } + } + echo "
        \n"; + + echo "
        \n"; + + // 사용후기 평점표시 + if ($this->view_star && $star_score) { + echo "
        고객평점\"별점
        \n"; + } + + if ($this->view_it_id) { + echo "
        <".stripslashes($row['it_id']).">
        \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
        ".stripslashes($row['it_basic'])."
        \n"; + } + + echo "
        \n"; + + if ($this->view_it_cust_price || $this->view_it_price) { + + echo "
        \n"; + if ($this->view_it_price) { + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + } + if ($this->view_it_cust_price && $row['it_cust_price']) { + echo "".display_price($row['it_cust_price'])."\n"; + } + echo "
        \n"; + } + + // 위시리스트 + 공유 버튼 시작 + echo "
        \n"; + echo "\n"; + if ($this->view_sns) { + echo "\n"; + } + + echo "
        "; + if ($this->view_sns) { + $sns_top = $this->img_height + 10; + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
        "; + echo "

        SNS 공유

        "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/facebook.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/twitter.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/gplus.png'); + echo ""; + echo "
        \n"; + } + echo "
        "; + echo "
        \n"; + // 위시리스트 + 공유 버튼 끝 + + echo "
        "; + + if ($this->view_it_icon) { + echo "
        ".item_icon($row)."
        \n"; + } + + echo "
        \n"; + + echo "
      • \n"; +} //end foreach + +if ($i >= 1) echo "
      \n"; + +if ($i === 0) echo "

      등록된 상품이 없습니다.

      \n"; +?> + + + \ No newline at end of file diff --git a/skin/shop/basic/list.20.skin.php b/skin/shop/basic/list.20.skin.php new file mode 100644 index 000000000..c03116805 --- /dev/null +++ b/skin/shop/basic/list.20.skin.php @@ -0,0 +1,106 @@ +', 0); +?> + + +list_mod >= 2) { // 1줄 이미지 : 2개 이상 + if ($i%$this->list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$this->list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
        css}\">\n"; + } else { + echo "\n"; + +if($i == 0) echo "

        등록된 상품이 없습니다.

        \n"; +?> + \ No newline at end of file diff --git a/skin/shop/basic/list.30.skin.php b/skin/shop/basic/list.30.skin.php new file mode 100644 index 000000000..a37dafb99 --- /dev/null +++ b/skin/shop/basic/list.30.skin.php @@ -0,0 +1,129 @@ +', 0); +?> + + += 2) { // 1줄 이미지 : 2개 이상 + if ($i%$list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
          css}\">\n"; + } else { + echo "
            \n"; + } + } + + $list_top_pad = 20; + $list_right_pad = 10; + $list_bottom_pad = 20; + $list_left_pad = $this->img_width + 10; + $list_real_width = 389; + $list_width = $list_real_width; + $list_height = $this->img_height; + + echo "
          • \n"; + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_icon) { + echo "
            ".item_icon($row)."
            \n"; + } + + if ($this->view_it_id) { + echo "
            <".stripslashes($row['it_id']).">
            \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
            ".stripslashes($row['it_basic'])."
            \n"; + } + + if ($this->view_it_cust_price || $this->view_it_price) { + + echo "
            \n"; + + if ($this->view_it_cust_price && $row['it_cust_price']) { + echo "".display_price($row['it_cust_price'])."\n"; + } + + if ($this->view_it_price) { + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + } + + echo "
            \n"; + + } + + if ($this->view_sns) { + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
            "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/sns_fb_s.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/sns_twt_s.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/sns_goo_s.png'); + echo "
            \n"; + } + + $arrow_left = $this->img_width - 10; + echo "
            "; + + echo "
          • \n"; +} + +if ($i >= 1) echo "
          \n"; + +if($i == 0) echo "

          등록된 상품이 없습니다.

          \n"; +?> + + + \ No newline at end of file diff --git a/skin/shop/basic/list.40.skin.php b/skin/shop/basic/list.40.skin.php new file mode 100644 index 000000000..18a0facdc --- /dev/null +++ b/skin/shop/basic/list.40.skin.php @@ -0,0 +1,165 @@ +', 0); + +// 관련상품 스킨은 사품을 한줄에 하나만 표시하며 해당 상품에 관련상품이 등록되어 있는 경우 기본으로 7개까지 노출합니다. +?> + + +view_star = (method_exists($this, 'view_star')) ? $this->view_star : true; + +foreach((array) $list as $row){ + if( empty($row) ) continue; + + $item_link_href = shop_item_url($row['it_id']); // 상품링크 + $star_score = $row['it_use_avg'] ? (int) get_star($row['it_use_avg']) : ''; //사용자후기 평균별점 + $list_mod = $this->list_mod; // 분류관리에서 1줄당 이미지 수 값 또는 파일에서 지정한 가로 수 + $is_soldout = is_soldout($row['it_id'], true); // 품절인지 체크 + + $classes = array(); + + $classes[] = 'col-row-'.$list_mod; + + if( $i && ($i % $list_mod == 0) ){ + $classes[] = 'row-clear'; + } + + $i++; // 변수 i 를 증가 + + if ($i == 1) { + if ($this->css) { + echo "
            css}\">\n"; + } else { + echo "
              \n"; + } + } + + echo "
            • \n"; + echo "
              \n"; + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_img) { + echo get_it_image($row['it_id'], $this->img_width, $this->img_height, '', '', stripslashes($row['it_name']))."\n"; + } + + if ($this->href) { + echo "\n"; + } + + if ( !$is_soldout ){ // 품절 상태가 아니면 출력합니다. + echo "
              + \n"; + echo "
              \n"; + } + + echo "
              \n"; + + if ($this->view_it_icon) { + // 품절 + if ($is_soldout) { + echo 'SOLD OUT'; + } + } + echo "
              \n"; + + echo "
              \n"; + + // 사용후기 평점표시 + if ($this->view_star && $star_score) { + echo "
              고객평점\"별점
              \n"; + } + + if ($this->view_it_id) { + echo "
              <".stripslashes($row['it_id']).">
              \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
              ".stripslashes($row['it_basic'])."
              \n"; + } + + echo "
              \n"; + + if ($this->view_it_cust_price || $this->view_it_price) { + + echo "
              \n"; + if ($this->view_it_price) { + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + } + if ($this->view_it_cust_price && $row['it_cust_price']) { + echo "".display_price($row['it_cust_price'])."\n"; + } + echo "
              \n"; + } + + // 위시리스트 + 공유 버튼 시작 + echo "
              \n"; + echo "\n"; + if ($this->view_sns) { + echo "\n"; + } + + echo "
              "; + if ($this->view_sns) { + $sns_top = $this->img_height + 10; + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
              "; + echo "

              SNS 공유

              "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/facebook.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/twitter.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/gplus.png'); + echo ""; + echo "
              \n"; + } + echo "
              "; + echo "
              \n"; + // 위시리스트 + 공유 버튼 끝 + + echo "
              "; + + if ($this->view_it_icon) { + echo "
              ".item_icon($row)."
              \n"; + } + + echo "
              \n"; + + echo "
            • \n"; +} + +if ($i >= 1) echo "
            \n"; + +if ($i === 0) echo "

            등록된 상품이 없습니다.

            \n"; +?> + + + \ No newline at end of file diff --git a/skin/shop/basic/list.sort.skin.php b/skin/shop/basic/list.sort.skin.php new file mode 100644 index 000000000..b5ba4c0fd --- /dev/null +++ b/skin/shop/basic/list.sort.skin.php @@ -0,0 +1,45 @@ +', 0); +?> + + +
            +

            상품 정렬

            + + + + +
            + \ No newline at end of file diff --git a/skin/shop/basic/list.sub.skin.php b/skin/shop/basic/list.sub.skin.php new file mode 100644 index 000000000..0989cdcbe --- /dev/null +++ b/skin/shop/basic/list.sub.skin.php @@ -0,0 +1,12 @@ +', 0); +?> + +
              +
            • +
            • +
            +'.$row['ca_name'].' ('.$row2['cnt'].')'; + $exists = true; +} + +if ($exists) { + + // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 + add_stylesheet('', 0); +?> + + + + + +'; + if ($cnt) { + $str .= ''.$row['ca_name'].''; + $sql2 = " select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id like '{$row['ca_id']}%' and ca_use = '1' and length(ca_id) = $len4 order by ca_order, ca_id "; + $result2 = sql_query($sql2); + $k=0; + while ($row2=sql_fetch_array($result2)) { + $str .= ''.$row2['ca_name'].''; + $k++; + } + } else { + $str .= ''.$row['ca_name'].''; + } + $str .= ''; + $exists = true; + } +} + +if ($exists) { + // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 + add_stylesheet('', 0); +?> + + + + + +'.$row['ca_name'].''; + $exists = true; +} + +if ($exists) { + + // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 + add_stylesheet('', 0); +?> + + + + + +', 0); +?> + + +list_mod >= 2) { // 1줄 이미지 : 2개 이상 + if ($i%$this->list_mod == 0) $sct_last = 'sct_last'; // 줄 마지막 + else if ($i%$this->list_mod == 1) $sct_last = 'sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = 'sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
              css}\">\n"; + } else { + echo "\n"; + +if($i == 0) echo "

              등록된 상품이 없습니다.

              \n"; +?> + \ No newline at end of file diff --git a/skin/shop/basic/main.20.skin.php b/skin/shop/basic/main.20.skin.php new file mode 100644 index 000000000..e6bcf1e5b --- /dev/null +++ b/skin/shop/basic/main.20.skin.php @@ -0,0 +1,280 @@ +', 0); + +/* +상품리스트가 일정 시간마다 위로 롤링되는 스킨 +롤링되기 위해서는 상품이 2줄 이상이어야 함 +*/ +?> + + +
                +
              • +
              • +
              + + + +1 && $i%$this->list_mod == 0) + $sct_last = ' sct_last'; // 줄 마지막 + + if ($i == 1) { + if ($this->css) { + echo "
              type}\" class=\"{$this->css}\">\n"; + } else { + echo "
              type}\" class=\"sct smt_20\">\n"; + } + echo "
                \n"; + } + + if ($i>1 && $i%$this->list_mod == 1) { + echo "
              \n"; + echo "\n"; + echo "
              \n"; +} + +if($i == 0) echo "

              등록된 상품이 없습니다.

              \n"; +?> + + + \ No newline at end of file diff --git a/skin/shop/basic/main.30.skin.php b/skin/shop/basic/main.30.skin.php new file mode 100644 index 000000000..33ece4711 --- /dev/null +++ b/skin/shop/basic/main.30.skin.php @@ -0,0 +1,162 @@ +', 0); + +// 관련상품 스킨은 사품을 한줄에 하나만 표시하며 해당 상품에 관련상품이 등록되어 있는 경우 기본으로 7개까지 노출합니다. +add_javascript('', 10); +?> + + += 2) { // 1줄 이미지 : 2개 이상 + if ($i%$list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
                css}\">\n"; + } else { + echo "
                  \n"; + } + } + + echo "
                • \n"; + + echo "
                  \n"; + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_img) { + echo get_it_image($row['it_id'], $this->img_width, $this->img_height, '', '', stripslashes($row['it_name']))."\n"; + } + + if ($this->href) { + echo "\n"; + } + + // 할인율 표시 ( 전화문의가 아니며 판매가격 과 시중가격 이 있을때 표시 (시중가격-판매가격)/시중가격*100 ) + if ($row['it_cust_price'] && $row['it_price'] && !$row['it_tel_inq']) { + + $sale_per = round( (((int) $row['it_cust_price'] - get_price($row))/$row['it_cust_price']) * 100 , 1).'%'; + + echo ''.$sale_per.''.PHP_EOL; + } + + if ($this->view_it_icon) { + // 품절 + if (is_soldout($row['it_id'], true)) { + echo 'SOLD OUT'; + } + } + echo "
                  \n"; + + echo "
                  \n"; + + // 사용후기 평점표시 + if ($this->view_star && $star_score) { + echo "
                  고객평점\"별점
                  \n"; + } + + if ($this->view_it_id) { + echo "
                  <".stripslashes($row['it_id']).">
                  \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
                  ".stripslashes($row['it_basic'])."
                  \n"; + } + + if ($this->view_it_cust_price || $this->view_it_price) { + + echo "
                  \n"; + + if ($this->view_it_cust_price && $row['it_cust_price']) { + echo "".display_price($row['it_cust_price'])."\n"; + } + + if ($this->view_it_price) { + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + } + echo "
                  \n"; + } + + + // 위시리스트 + 공유 버튼 시작 { + echo "
                  \n"; + echo "\n"; + if ($this->view_sns) { + echo "\n"; + } + + echo "
                  "; + if ($this->view_sns) { + $sns_top = $this->img_height + 10; + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
                  "; + echo "

                  SNS 공유

                  "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/facebook.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/twitter.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/gplus.png'); + echo ""; + echo "
                  \n"; + } + echo "
                  "; + echo "
                  \n"; + // } 위시리스트 + 공유 버튼 끝 + + echo "
                  \n"; + + if ($this->view_it_icon) { + echo "
                  ".item_icon($row)."
                  \n"; + } + + echo "
                • \n"; +} + +if ($i >= 1) echo "
                \n"; + +if($i == 0) echo "

                등록된 상품이 없습니다.

                \n"; +?> + + + + diff --git a/skin/shop/basic/main.40.skin.php b/skin/shop/basic/main.40.skin.php new file mode 100644 index 000000000..23f3045e9 --- /dev/null +++ b/skin/shop/basic/main.40.skin.php @@ -0,0 +1,154 @@ +', 0); + +// 관련상품 스킨은 사품을 한줄에 하나만 표시하며 해당 상품에 관련상품이 등록되어 있는 경우 기본으로 7개까지 노출합니다. +add_javascript('', 10); +?> + + += 2) { // 1줄 이미지 : 2개 이상 + if ($i%$list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
                  css}\">\n"; + } else { + echo "
                    \n"; + } + } + + echo "
                  • \n"; + + echo "
                    \n"; + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_img) { + echo get_it_image($row['it_id'], $this->img_width, $this->img_height, '', '', stripslashes($row['it_name']))."\n"; + } + + if ($this->href) { + echo "\n"; + } + + echo "
                    + \n"; + echo "
                    \n"; + + echo "
                    \n"; + + if ($this->view_it_icon) { + // 품절 + if (is_soldout($row['it_id'], true)) { + echo 'SOLD OUT'; + } + } + echo "
                    \n"; + + echo "
                    \n"; + + // 사용후기 평점표시 + if ($this->view_star && $star_score) { + echo "
                    고객평점\"별점
                    \n"; + } + + if ($this->view_it_id) { + echo "
                    <".stripslashes($row['it_id']).">
                    \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
                    ".stripslashes($row['it_basic'])."
                    \n"; + } + + if ($this->view_it_cust_price || $this->view_it_price) { + + echo "
                    \n"; + if ($this->view_it_price) { + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + } + echo "
                    \n"; + } + + + // 위시리스트 + 공유 버튼 시작 { + echo "
                    \n"; + echo "\n"; + if ($this->view_sns) { + echo "\n"; + } + + echo "
                    "; + if ($this->view_sns) { + $sns_top = $this->img_height + 10; + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
                    "; + echo "

                    SNS 공유

                    "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/facebook.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/twitter.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/gplus.png'); + echo ""; + echo "
                    \n"; + } + echo "
                    "; + echo "
                    \n"; + // } 위시리스트 + 공유 버튼 끝 + + echo "
                    \n"; + + if ($this->view_it_icon) { + echo "
                    ".item_icon($row)."
                    \n"; + } + + echo "
                  • \n"; +} + +if ($i >= 1) echo "
                  \n"; + +if($i == 0) echo "

                  등록된 상품이 없습니다.

                  \n"; +?> + + + \ No newline at end of file diff --git a/skin/shop/basic/main.50.skin.php b/skin/shop/basic/main.50.skin.php new file mode 100644 index 000000000..eb8bfb031 --- /dev/null +++ b/skin/shop/basic/main.50.skin.php @@ -0,0 +1,83 @@ +', 0); +?> + + +1 && $i%$this->list_mod == 0) + $sct_last = ' sct_last'; // 줄 마지막 + if ($i == 1) { + if ($this->css) { + echo "
                    css}\">\n"; + } else { + echo "\n"; +if($i == 0) echo "

                    등록된 상품이 없습니다.

                    \n"; +?> + + + \ No newline at end of file diff --git a/skin/shop/basic/mainbanner.10.skin.php b/skin/shop/basic/mainbanner.10.skin.php new file mode 100644 index 000000000..2e2691b85 --- /dev/null +++ b/skin/shop/basic/mainbanner.10.skin.php @@ -0,0 +1,137 @@ +', 0); +add_javascript('', 10); +add_stylesheet('', 10); + +$max_width = $max_height = 0; +$bn_first_class = ' class="bn_first"'; +$bn_slide_btn = ''; +$bn_sl = ' class="bn_sl"'; +$main_banners = array(); + +for ($i=0; $row=sql_fetch_array($result); $i++) +{ + $main_banners[] = $row; + + // 테두리 있는지 + $bn_border = ($row['bn_border']) ? ' class="sbn_border"' : '';; + // 새창 띄우기인지 + $bn_new_win = ($row['bn_new_win']) ? ' target="_blank"' : ''; + + $bimg = G5_DATA_PATH.'/banner/'.$row['bn_id']; + $item_html = ''; + + if (file_exists($bimg)) + { + $banner = ''; + $size = getimagesize($bimg); + + if($size[2] < 1 || $size[2] > 16) + continue; + + if($max_width < $size[0]) + $max_width = $size[0]; + + if($max_height < $size[1]) + $max_height = $size[1]; + + $item_html .= ''; + } + + $banner_style = $max_height ? 'style="min-height:'.($max_height + 25).'px"' : ''; + if ($i==0) echo '
                    '.PHP_EOL; + + echo '
                    '.PHP_EOL; + echo '
                    + +
                    '.PHP_EOL; + echo '
                    '.PHP_EOL; +?> + + + substr($ca_id,0,2), + 'ca_id2' => substr($ca_id,0,4), + 'ca_id3' => substr($ca_id,0,6), + ); +} else if( $is_item_view && isset($it) && is_array($it) ) { + $navi_datas = get_shop_navigation_data(true, $it['ca_id']); + $ca_ids = array( + 'ca_id' => substr($it['ca_id'],0,2), + 'ca_id2' => substr($it['ca_id'],0,4), + 'ca_id3' => substr($it['ca_id'],0,6) + ); +} + +$location_class = array(); +if($is_item_view){ + $location_class[] = 'view_location'; // view_location는 리스트 말고 상품보기에서만 표시 +} else { + $location_class[] = 'is_list is_right'; // view_location는 리스트 말고 상품보기에서만 표시 +} + +// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 +add_stylesheet('', 0); +add_javascript('', 10); +?> + +
                    + 메인으로 + + + + + + + + + + + + + + + + + +
                    + \ No newline at end of file diff --git a/skin/shop/basic/personalpay.skin.php b/skin/shop/basic/personalpay.skin.php new file mode 100644 index 000000000..c16812194 --- /dev/null +++ b/skin/shop/basic/personalpay.skin.php @@ -0,0 +1,34 @@ +', 0); +?> + += 2) { // 1줄 이미지 : 2개 이상 + if ($i%$list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + echo "
                      \n"; + } + + $href = G5_SHOP_URL.'/personalpayform.php?pp_id='.$row['pp_id'].'&page='.$page; +?> +
                    • +
                      +
                      +
                      +
                    • + 1) echo "
                    \n"; + +if($i == 1) echo "

                    등록된 개인결제가 없습니다.

                    \n"; \ No newline at end of file diff --git a/skin/shop/basic/relation.10.skin.php b/skin/shop/basic/relation.10.skin.php new file mode 100644 index 000000000..4c4840127 --- /dev/null +++ b/skin/shop/basic/relation.10.skin.php @@ -0,0 +1,109 @@ +', 0); +add_javascript('', 10); +?> + + +list_mod >= 2) { // 1줄 이미지 : 2개 이상 + if ($i%$this->list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$this->list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
                      css}\">\n"; + } else { + echo "\n"; + +if($i == 1) echo "

                      등록된 상품이 없습니다.

                      \n"; +?> + + \ No newline at end of file diff --git a/skin/shop/basic/search.skin.php b/skin/shop/basic/search.skin.php new file mode 100644 index 000000000..66f624fa0 --- /dev/null +++ b/skin/shop/basic/search.skin.php @@ -0,0 +1,134 @@ + + + + + +
                      +

                      검색 결과

                      + +
                      +
                      +
                      + + + +
                      + + + + + + 상세검색을 선택하지 않거나, 상품가격을 입력하지 않으면 전체에서 검색합니다.
                      + 검색어는 최대 30글자까지, 여러개의 검색어를 공백으로 구분하여 입력 할수 있습니다. +
                      +
                      +
                      + 검색범위 + > + > + > + > + 상품가격 (원) + + 원 ~ + + 원 +
                      +
                      +
                      + +
                      + +
                      + + + + +
                      + +
                      + set_is_page(true); + $list->set_view('it_img', true); + $list->set_view('it_name', true); + $list->set_view('it_basic', true); + $list->set_view('it_cust_price', false); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + $list->set_view('star', true); + echo $list->run(); + } + else + { + $i = 0; + $error = '

                      '.$list_file.' 파일을 찾을 수 없습니다.
                      관리자에게 알려주시면 감사하겠습니다.

                      '; + } + + if ($i==0) + { + echo '
                      '.$error.'
                      '; + } + + $query_string = 'qname='.$qname.'&qexplan='.$qexplan.'&qid='.$qid; + if($qfrom && $qto) $query_string .= '&qfrom='.$qfrom.'&qto='.$qto; + $query_string .= '&qcaid='.$qcaid.'&q='.urlencode($q); + $query_string .='&qsort='.$qsort.'&qorder='.$qorder; + echo get_paging($config['cf_write_pages'], $page, $total_page, $_SERVER['SCRIPT_NAME'].'?'.$query_string.'&page='); + ?> +
                      + +
                      + + + \ No newline at end of file diff --git a/skin/shop/basic/style.css b/skin/shop/basic/style.css new file mode 100644 index 000000000..73c55206b --- /dev/null +++ b/skin/shop/basic/style.css @@ -0,0 +1,969 @@ +@charset "utf-8"; + +/* 리스트 공통 */ +.lists-row{margin-right:-10px;margin-left:-10px} +.lists-row .col-row-0,.lists-row .col-row-1,.lists-row .col-row-2,.lists-row .col-row-3,.lists-row .col-row-4,.lists-row .col-row-5,.lists-row .col-row-6,.lists-row .col-row-7,.lists-row .col-row-8,.lists-row .col-row-9,.lists-row .col-row-10{position:relative;min-height:1px;padding-left:10px;*padding-left:0;padding-right:10px;*padding-right:0;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:0;} +.lists-row .col-row-0,.lists-row .col-row-1{width:100%} +.lists-row .col-row-2{width:50%} +.lists-row .col-row-3{width:33.33333333%} +.lists-row .col-row-4{width:25%} +.lists-row .col-row-5{width:20%} +.lists-row .col-row-6{width:16.66666667%} +.lists-row .col-row-7{width:14.28571428%} +.lists-row .col-row-8{width:12.5%} +.lists-row .col-row-9{width:11.11111111%} +.lists-row .col-row-10{width:10%} +.row-clear{clear:both!important} +.lists-row .sct_img img{max-width:100%;height:auto} + +/* aside:gnb */ +#gnb {margin-bottom:15px;background:#fff;border:1px solid #e8e8e8;border-top:0} +#gnb h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.gnb_1dli {position:relative;word-wrap:break-word} +.gnb_1dli_on {color:#fff;text-decoration:none} +.gnb_1da {display:block;padding:0 20px;line-height:48px;color:#010101;text-decoration:none;font-size:1.167em} +.gnb_1da i {position:absolute;right:0;top:0;display:inline-block;color:#c4c4c4;padding:15px;font-size:1.45em} + +.gnb_1dam {background:url('img/gnb_bg.png') center right no-repeat} +.gnb_1dli_on .gnb_1da {background-color:#f5f5f5;color:#3a8afd;font-weight:bold;text-decoration:none} +.gnb_1dli_on .gnb_1da:after {position:absolute;left:-1px;top:0;content:"";background:#3a8afd;width:3px;height:100%} + +.gnb_1dli_on .gnb_1dam {text-decoration:none} +.gnb_2dul {display:none;z-index:1000;position:absolute;border:1px solid #e8e8e8;padding:10px} +.gnb_1dli_over .gnb_2dul, .gnb_1dli_over2 .gnb_2dul {display:inline-block;top:0;left:263px;width:200px;background:#fff} +.gnb_1dli_over .gnb_2dul:after, .gnb_1dli_over2 .gnb_2dul:after {content:"";position:absolute;top:10px;left:-6px;display:inline-block;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #fff} +.gnb_1dli_over .gnb_2dul:before, .gnb_1dli_over2 .gnb_2dul:before {content:"";position:absolute;top:9px;left:-7px;display:inline-block;width:0;height:0;border-top:7px solid transparent;border-bottom:7px solid transparent;border-right:7px solid #e8e8e8} + +.gnb_2da {} +.gnb_1dli_over .gnb_2da {display:block;padding:5px 10px;line-height:20px;font-size:1.083em} +.gnb_2da:focus, .gnb_2da:hover {text-decoration:none;color:#3a8afd} + +/* 오늘 본 상품 */ +#stv {position:relative;height:100%} +#stv .li_empty {text-align:center;line-height:100px} +#stv_pg {display:block;position:fixed;right:0;bottom:0;width:229px;text-align:center;margin:10px 0 0;padding:15px;line-height:20px;background:#fff} +.stv_item {display:none;padding:15px;word-break:break-all;border-bottom:1px solid #f6f6f6} +.stv_item:after {display:block;visibility:hidden;clear:both;content:""} +.stv_item .prd_img {display:inline-block;float:left;margin-right:10px} +.stv_item .prd_cnt {display:inline-block;float:left} +.stv_item .prd_cnt span {display:block;max-width:105px} +.stv_item .prd_cnt .prd_name {font-weight:bold;margin-bottom:3px} + +#stv_btn {position:absolute;top:10px;right:10px;width:60px;height:50px} +#up {position:absolute;top:0;left:0;background:url('img/btn_sb_prev.png') no-repeat 50% 50%;width:30px;height:30px;text-indent:-999px;overflow:hidden;border:0} +#down {position:absolute;top:0;right:0;background:url('img/btn_sb_next.png') no-repeat 50% 50%;width:30px;height:30px;text-indent:-999px;overflow:hidden;border:0} + +/* 이벤트 링크 */ +#sev {margin:20px 0;text-align:center} +#sev header {margin:0 0 20px} +#sev header:after {display:block;visibility:hidden;clear:both;content:""} +#sev h2 {float:left;font-size:1.5em;margin:0 0 10px 0;display:inline-block;line-height:1em} +#sev h2:after {display:block;visibility:hidden;clear:both;content:""} +#sev ul:after {display:block;visibility:hidden;clear:both;content:""} +#sev>ul {margin:0 -10px} +#sev .ev_li {float:left;padding:0 10px;width:33.333%} +#sev .ev_li:first-child {margin-left:0} +#sev .ev_li .sev_img img {width:100%;height:auto} +#sev .ev_prd {border:1px solid #ddd;text-align:center;background:#fff} +#sev .ev_prd li {position:relative;display:block;padding:15px;text-align:left;vertical-align:top;border-bottom:1px solid #f6f6f6} +#sev .ev_prd li:last-child {border-bottom:0} +#sev .ev_prd li:after {display:block;visibility:hidden;clear:both;content:""} +#sev .ev_prd .ev_prd_tit {display:block;color:#000;font-size:1.1em;margin-bottom:5px} +#sev .ev_prd .ev_prd_img {float:left;display:inline-block} +#sev .ev_prd .ev_txt_wr {float:left;max-width:139px;margin-left:10px} +#sev .ev_prd .ev_prd_price {font-weight:bold;display:block;margin:5px 0 10px;font-size:1.25em;font-weight:bold} +#sev .ev_prd .sev_more {color:#3a8afd;background:#fff;display:block;text-align:center} + + +/* 커뮤니티 링크 */ +#scomm {padding:20px} +#scomm h2 {margin:0 0 5px} +#scomm li {display:block;margin:3px} +#scomm li a {line-height:25px;color:#555} +#scomm li a:hover {color:#be334a} + +/* 메인배너 */ +#main_bn {border:1px solid #e3e5e8;position:relative;margin:19px 0 30px} +#main_bn:after {display:block;visibility:hidden;clear:both;content:""} +#main_bn .slide-wrap {padding:0;margin:0} +#main_bn .slide-wrap img {max-width:100%;height:auto} +#main_bn .owl_pager {position:absolute;bottom:0px;left:0;width:100%;background:#fff;border-top:1px solid #e3e5e8} +#main_bn .owl_pager ul:after {display:block;visibility:hidden;clear:both;content:""} +#main_bn .owl_pager li {float:left;position:relative;width:20%;border-left:1px solid #e3e5e8;text-align:center;line-height:45px;font-size:1.2em} +#main_bn .owl_pager li:first-child {border-left:0} +#main_bn .owl_pager li a {display:block} +#main_bn .owl_pager li a:after {content:"";position:absolute;top:0;left:0;width:100%;height:2px;background:#e3e5e8} +#main_bn .owl_pager li.active a {color:#3a8afd} +#main_bn .owl_pager li.active a:after {background:#3a8afd;top:-1px} + +.btn_wr {background:rgba(0,0,0,0.5);display:inline-block;position:absolute;right:20px;bottom:65px;border-radius:30px;padding:3px 5px} +#main_bn .btn_wr{z-index:2} +.btn_wr .pager-prev {margin-left:5px;font-weight:bold} +.btn_wr .pager-next {margin-right:5px;font-weight:bold} +.btn_wr .pager-prev, .btn_wr .pager-next, #slide-counter {float:left;display:inline-block;padding:5px;color:#fff} +#slide-counter {margin:0 5px} + +/*서브배너*/ +#sbn_side {position:relative;width:100%;margin-bottom:20px} +.sb_bn {} +.sb_bn img {width:100%;height:auto} +#sbn_side h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sbn_side .bx-controls {position:absolute;bottom:10px;left:15px} +#sbn_side .bx-pager-item {display:inline-block} +#sbn_side .bx-pager-item a {float:left;width:8px;height:8px;margin-right:5px;border-radius:50%;background:#fff;text-indent:-9999px;opacity:0.5} +#sbn_side .bx-pager-item a.active {opacity:1} +#sbn_side .bx-controls-direction {display:none} + +/*장바구니*/ +#sbsk {position:relative} +#sbsk li {position:relative;border-bottom:1px solid #f6f6f6;padding:15px} +#sbsk li:after {display:block;visibility:hidden;clear:both;content:""} +#sbsk .go_cart {position:absolute;top:11px;right:15px;display:inline-block;height:28px;line-height:22px;border:1px solid #d5d9dd;color:#3a8afd;border-radius:2px;background:#fff;padding:2px 5px} +#sbsk .btn_buy {padding:15px;font-weight:bold;text-align:center} +#sbsk .btn_buy .btn_submit {width:100%;height:40px} +#sbsk .li_empty {text-align:center;line-height:100px} +#sbsk .prd_img {display:inline-block;float:left;margin-right:10px} +#sbsk .prd_cnt {display:inline-block;float:left} +#sbsk .prd_cnt a, #sbsk .prd_cnt span {display:block;max-width:105px} +#sbsk .prd_cnt .prd_name {font-weight:bold;margin-bottom:3px} +#sbsk .cart_del {border:0;width:35px;height:35px;text-align:center;position:absolute;right:0;bottom:0;color:#c5c8ca;background:#fff;font-size:1.25em} + +/*위시리스트*/ +#wish {} +#wish li {position:relative;border-bottom:1px solid #f6f6f6;padding:15px} +#wish li:after {display:block;visibility:hidden;clear:both;content:""} +#wish .li_empty {text-align:center;line-height:100px} +#wish .prd_img {display:inline-block;float:left;margin-right:10px} +#wish .prd_cnt {display:inline-block;float:left} +#wish .prd_cnt a {display:block;max-width:105px} +#wish .prd_cnt .prd_name {font-weight:bold;margin-bottom:3px} + +/* ##### main(nn).skin.php, list.(nn).skin.php 공통 적용 시작 ##### */ + +/* 공통 */ +.sct_wrap {position:relative;margin:0 0 20px} +.sct_wrap .sctrl {position:absolute;top:0;right:0} /* 애니메이션 효과 사용 시 재생 정지 버튼 등 */ +.sct_wrap:after {display:block;visibility:hidden;clear:both;content:""} +.sct_wrap header {padding:10px 0 20px} +.sct_wrap header:after {display:block;visibility:hidden;clear:both;content:""} +.sct_wrap h2 {float:left;font-size:1.5em;margin:0 0 10px 0;display:inline-block;line-height:1em} +.sct_wrap h2:after {display:block;visibility:hidden;clear:both;content:""} +.sct_wrap h2 a {text-decoration:none} + +#sct {clear:both} + +.sct {clear:both;margin:0;padding:0;list-style:none} +.sct:after {display:block;visibility:hidden;clear:both;content:""} +.sct_li {position:relative} +.sct_noitem {padding:100px 0;text-align:center} +.sct img {position:relative} /* 리스트뷰 갤러리뷰 변경 시 ie6,7 에서 이미지 사라지는 문제 해결하기 위해 */ +.shop_icon {display:inline-block;color:#fff;line-height:20px;padding:0 5px;font-size:0.92em;margin:1px;border-radius:2px} +.shop_icon_1 {background:#3ec1d3} +.shop_icon_2 {background:#ffb722} +.shop_icon_3 {background:#2dd49f} +.shop_icon_4 {background:#556ee6} +.shop_icon_5 {background:#ff5081} + +.shop_icon_soldout {position:absolute;z-index:1;top:0;left:0;width:100%;height:100%;background:#000;background:rgba(0,0,0,0.5);text-align:center;line-height:215px;color:#fff;font-size:18px;font-weight:bold;letter-spacing:1px} +.shop_icon_soldout.h160{line-height:160px} +.shop_icon_coupon {background:#d45959} + +/* 재생/정지/이전/다음 버튼 */ +.sctrl {margin:0;padding:0;list-style:none} +.sctrl:after {display:block;visibility:hidden;clear:both;content:""} +.sctrl li {position:relative;float:left} +.sctrl button {position:relative;margin:0;padding:0;width:20px;height:20px;border:0;cursor:pointer;overflow:hidden} +.sctrl button span {position:absolute;top:0;left:0;width:20px;height:20px;border:0;background:url('img/is_button.gif') no-repeat} +.sctrl button.sctrl_play span {background-position:-60px 0} +.sctrl button.sctrl_play span.sctrl_on {background-position:-60px -30px} +.sctrl button.sctrl_stop span {background-position:-90px 0} +.sctrl button.sctrl_stop span.sctrl_on {background-position:-90px -30px} +.sctrl button.sctrl_prev span {background-position:-120px 0} +.sctrl button.sctrl_prev span.sctrl_on {background-position:-120px -30px} +.sctrl button.sctrl_next span {background-position:-150px 0} +.sctrl button.sctrl_next span.sctrl_on {background-position:-150px -30px} + +/* 메인리스트 별점 공통 */ +.sct_li .sct_star img, .sct_li img.sit_star{width:72px !important;height:auto} + +/* 상품 목록 스킨 10 */ +.sct_10 {margin:25px 0} +.sct_10.lists-row{margin-right:-10px;margin-left:-10px} +.sct_10 .sct_li {position:relative;float:left;margin-bottom:40px;text-align:left} +.sct_10 .sct_last {margin-right:0} +.sct_10 .sct_clear {clear:both} +.sct_10 .sct_a {text-decoration:none} +.sct_10 .sct_a:focus, .sct_10 .sct_a:hover {text-decoration:none} + +.sct_10 .sct_img {position:relative;text-align:center} +.sct_10 .sct_img a {display:block} +.sct_10 .sct_cart {display:none;position:absolute;left:0;bottom:0;border:0;width:100%;padding:15px 0;background:#000;background:rgba(0,0,0,0.5);color:#fff;font-size:1em;font-weight:bold} +.sct_10 .sct_img:hover .sct_cart {display:block} +.sct_10 .sct_cart i {display:inline-block;margin-right:5px;font-size:1.2em} +.sct_10 .sct_disc {position:absolute;right:15px;bottom:15px;background:red;color:#fff;padding:0 8px;line-height:24px;font-weight:bold;font-size:1.2em;background:#000;background:rgba(0,0,0,0.5)} + +.sct_10 .sct_ct_wrap {position:relative} +.sct_10 .sct_ct_wrap:after {display:block;visibility:hidden;clear:both;content:""} +.sct_10 .sct_star {margin: 10px 0 5px} +.sct_10 .sct_txt {border-bottom:1px solid #d9dde2;font-size:1.1em;margin:10px 0;padding-bottom:10px} +.sct_10 .sct_basic {margin-bottom:5px;color:#6e7f88} +.sct_10 .sct_bottom {position:relative;min-height:20px} +.sct_10 .sct_cost {margin:5px 0 10px;font-size:1.25em;font-weight:bold} +.sct_10 .sct_dict {display:block;text-decoration:line-through;font-weight:normal;font-size:0.85em;color:#858a8d} + +.sct_10 .sct_sns_wrap {display:none;width:100%;height:100%;position:fixed;top:0;left:0;z-index:999} +.sct_10 .sct_sns {position:absolute;top:50%;left:50%;background:#fff;text-align:center;width:245px;max-height:300px;margin-left:-125px;margin-top:-180px;overflow-y:auto;border-radius:5px;-webkit-box-shadow:1px 1px 18px rgba(0,0,0,0.2);-moz-box-shadow: 1px 1px 18px rgba(0,0,0,0.2);box-shadow: 1px 1px 18px rgba(0,0,0,0.2);border:1px solid #dde7e9;background:#fff;border-radius:3px} +.sct_10 .sct_sns h3 {padding:15px;border-bottom:1px solid #e8e8e8;text-align:left} +.sct_10 .sct_sns a {display:inline-block;border-radius:50%;width:50px;height:50px;line-height:25px;text-align:center;padding:10px 0;margin:20px 5px} +.sct_10 .sct_sns .share-facebook {background:#415b92} +.sct_10 .sct_sns .share-twitter {background:#35b3dc} +.sct_10 .sct_sns .share-googleplus {background:#ea3838} +.sct_10 .sct_sns img {width:24px} +.sct_10 .sct_sns_bg {background:rgba(0,0,0,0.1);width:100%;height:100%} +.sct_10 .sct_sns_cls {position:absolute;right:0;top:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff} + +.sct_10 .sct_op_btn {position:absolute;right:5px;bottom:0} +.sct_10 .sct_op_btn>button {border:0;width:25px;height:20px;font-size:1.25em;text-align:center;color:#949494;background:transparent} + +/* 상품 목록 스킨 20 */ +.sct_20 .sct_li {position:relative;float:left;margin:0 25px 15px 0} +.sct_20 .sct_last {margin:0 0 15px !important} +.sct_20 .sct_clear {clear:both} +.sct_20 .sct_a {display:block;position:relative;text-decoration:none} +.sct_20 .sct_a:focus, .sct_20 .sct_a:hover {text-decoration:none} +.sct_20 .sct_img {} +.sct_20 .sct_icon {position:absolute;top:10px;left:-5px;margin:0 !important} +.sct_20 .sct_icon img {display:block;margin:0 0 3px} +.sct_20 .sct_id {display:block;padding:5px 10px 0;background:#f2f5f9} +.sct_20 .sct_txt {padding:10px;background:#f2f5f9} +.sct_20 .sct_basic {padding:0 10px 5px;background:#f2f5f9;line-height:1.5em} +.sct_20 .sct_cost {display:block;padding:0 10px 10px;background:#f2f5f9;font-weight:bold} +.sct_20 .sct_dict {text-decoration:line-through;display:block;margin:0 0 5px;color:#999;font-weight:normal} +.sct_20 .sct_sns {position:absolute;bottom:10px;right:10px} + +/* 상품 목록 스킨 30 */ +.sct_30 .sct_li {position:relative;float:left;margin:0 16px 15px 0;border:1px solid #e9e9e9;background:#f5f6fa} +.sct_30 .sct_last {margin:0 0 15px !important} +.sct_30 .sct_clear {clear:both} +.sct_30 .sct_arw_toleft {display:block;z-index:2;position:absolute;top:20px;left:221px;width:10px;height:19px;background:url('img/icon_arw_toleft.gif') no-repeat} +.sct_30 .sct_a {text-decoration:none} +.sct_30 .sct_img {position:absolute;top:0;left:0} +.sct_30 .sct_icon {position:absolute;bottom:25px;left:-5px;margin:0 !important} +.sct_30 .sct_icon img {display:block;margin:0 0 3px} +.sct_30 .sct_txt {display:inline-block;margin:0 0 20px} +.sct_30 .sct_basic {margin:0 0 15px;padding:0;line-height:1.5em} +.sct_30 .sct_cost {display:block;margin:0 0 10px;font-weight:bold} +.sct_30 .sct_dict {text-decoration:line-through;display:block;margin:0 0 5px;color:#999;font-weight:normal} +.sct_30 .sct_sns {position:absolute;bottom:20px;right:10px} + +/* 상품 목록 스킨 40 */ +.sct_40 {margin:20px 0} +.sct_40 .sct_clear {border-top:1px solid #dadada} +.sct_40 .sct_li {position:relative;padding:15px 0;border-bottom:1px solid #dadada} +.sct_40 .sct_li:after {display:block;visibility:hidden;clear:both;content:""} +.sct_40 .sct_a {text-decoration:none} +.sct_40 .sct_a:focus, .sct_40 .sct_a:hover {text-decoration:none} + +.sct_40 .sct_img {text-align:center;float:left;margin-right:20px} +.sct_40 .sct_img a {display:block;position:relative;z-index: 9999;} +.sct_40 .sct_cart {position:absolute;right:0;bottom:0;border:0;width:150px;padding:15px 0;background:#000;background:rgba(0,0,0,0.5);color:#fff;font-size:1em;font-weight:bold;z-index:99999} +.sct_40 .list-10-btn .sct_cart{z-index:1;top:40px;right:10px;bottom:initial;padding:8px 0;width:140px;border:1px solid #1c70e9;background:#3a8afd;color:#fff;cursor:pointer;border-radius:3px} +.sct_40 .list-10-btn .sct_cart:hover {background:#2375eb} +.sct_40 .list-10-btn .sct_cart i{display:none} +.sct_40 .sct_img:hover .sct_cart {display:block} +.sct_40 .sct_cart i {display:inline-block;margin-right:5px;font-size:1.2em} +.sct_40 .sct_disc {position:absolute;right:15px;bottom:15px;background:red;color:#fff;padding:0 8px;line-height:24px;font-weight:bold;font-size:1.2em;background:#000;background:rgba(0,0,0,0.5)} +.sct_40 .sit_icon_li{margin-top:10px} + +.sct_40 .sct_ct_wrap {position:relative} +.sct_40 .sct_ct_wrap:after {display:block;visibility:hidden;clear:both;content:""} +.sct_40 .sct_star {margin:10px 0 5px} +.sct_40 .sct_txt {font-size:1.1em;margin:10px 0;padding-bottom:10px} +.sct_40 .sct_txt a{font-weight:600;font-size:1.2em} +.sct_40 .sct_basic {margin-bottom:5px;color:#6e7f88} +.sct_40 .sct_cost {position:absolute;right:200px;top:15px;font-size:1.35em;font-weight:bold} +.sct_40 .sct_dict {text-decoration:line-through;font-weight:normal;display:block;font-size:0.85em;color:#858a8d} + +.sct_40 .sct_sns_wrap {display:none;width:100%;height:100%;position:fixed;top:0;left:0;z-index:999} +.sct_40 .sct_sns {position:absolute;top:50%;left:50%;background:#fff;text-align:center;width:245px;max-height:300px;margin-left:-125px;margin-top:-180px;overflow-y:auto;border-radius:5px;-webkit-box-shadow:1px 1px 18px rgba(0,0,0,0.2);-moz-box-shadow: 1px 1px 18px rgba(0,0,0,0.2);box-shadow: 1px 1px 18px rgba(0,0,0,0.2);border:1px solid #dde7e9;background:#fff;border-radius:3px} +.sct_40 .sct_sns h3 {padding:15px;border-bottom:1px solid #e8e8e8;text-align:left} +.sct_40 .sct_sns a {display:inline-block;border-radius:50%;width:50px;height:50px;line-height:25px;text-align:center;padding:10px 0;margin:20px 5px} +.sct_40 .sct_sns .share-facebook {background:#415b92} +.sct_40 .sct_sns .share-twitter {background:#35b3dc} +.sct_40 .sct_sns .share-googleplus {background:#ea3838} +.sct_40 .sct_sns img {width:24px} +.sct_40 .sct_sns_bg {background:rgba(0,0,0,0.1);width:100%;height:100%} +.sct_40 .sct_sns_cls {position:absolute;right:0;top:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff} + +.sct_40 .sct_op_btn {position:absolute;right:20px;bottom:20px} +.sct_40 .sct_op_btn>button {border:0;width:25px;height:20px;font-size:1.25em;text-align:center;color:#949494;background:transparent} + + + +/* 개인결제 목록 */ +.sct_pv .sct_li {position:relative;float:left;margin:0 18px 15px 0} +.sct_pv .sct_last {margin:0 0 15px !important} +.sct_pv .sct_clear {clear:both} +.sct_pv .sct_a {display:inline-block;position:relative;text-decoration:none;font-size:1.1em} +.sct_pv .sct_a:focus, .sct_pv .sct_a:hover {text-decoration:none} +.sct_pv .sct_img {margin:0 0 10px} +.sct_pv .sct_txt {margin:0 0 5px} +.sct_pv .sct_icon {margin:0 0 10px} +.sct_pv .sct_id {display:block;margin:0 0 5px} +.sct_pv .sct_basic {margin:0 0 10px} +.sct_pv .sct_cost {display:block;margin:5px 0 10px;font-size:1.25em;font-weight:bold} +.sct_pv .sct_dict {text-decoration:line-through;display:block;margin:0 0 5px;color:#999;font-weight:normal} +.sct_pv .sct_sns {} + +/* 메인 상품 목록 스킨 10 */ +.smt_10 {margin:0 -5px} +.smt_10 .sct_li {position:relative;float:left;width:215px;margin-right:15px;margin-bottom:15px;text-align:left} +.smt_10 .sct_last {margin-right:0} +.smt_10 .sct_clear {clear:both} +.smt_10 .sct_a {text-decoration:none} +.smt_10 .sct_a:focus, .smt_10 .sct_a:hover {text-decoration:none} +.smt_10 .sct_ct_wrap {position:relative} +.smt_10 .sct_ct_wrap:after {display:block;visibility:hidden;clear:both;content:""} + +.smt_10 .sct_img {position:relative;text-align:center} +.smt_10 .sct_img a {display:block} +.smt_10 .sct_cart {display:none;position:absolute;left:0;bottom:0;border:0;width:100%;padding:15px 0;background:#000;background:rgba(0,0,0,0.5);color:#fff;font-size:1em;font-weight:bold} +.smt_10 .sct_img:hover .sct_cart {display:block} +.smt_10 .sct_li.overlay .sct_cart{display:none !important} +.smt_10 .sct_cart i {display:inline-block;margin-right:5px;font-size:1.2em} +.smt_10 .sct_disc {position:absolute;right:15px;bottom:15px;background:red;color:#fff;padding:0 8px;line-height:24px;font-weight:bold;font-size:1.2em;background:#000;background:rgba(0,0,0,0.5)} + +.smt_10 .sct_star {margin: 10px 0 5px} +.smt_10 .sct_txt {border-bottom:1px solid #d9dde2;font-size:1.1em;margin:10px 0;padding-bottom:10px} +.smt_10 .sct_basic {margin-bottom:5px;color:#6e7f88} +.smt_10 .sct_cost {margin:5px 0 10px;font-size:1.25em;font-weight:bold} +.smt_10 .sct_dict {text-decoration:line-through;font-weight:normal;display:block;font-size:0.85em;color:#858a8d} + +.smt_10 .sct_sns_wrap {display:none;width:100%;height:100%;position:fixed;top:0;left:0;z-index:999} +.smt_10 .sct_sns {position:absolute;top:50%;left:50%;background:#fff;text-align:center;width:245px;max-height:300px;margin-left:-125px;margin-top:-180px;overflow-y:auto;border-radius:5px;-webkit-box-shadow:1px 1px 18px rgba(0,0,0,0.2);-moz-box-shadow: 1px 1px 18px rgba(0,0,0,0.2);box-shadow: 1px 1px 18px rgba(0,0,0,0.2);border:1px solid #dde7e9;background:#fff;border-radius:3px} +.smt_10 .sct_sns h3 {padding:15px;border-bottom:1px solid #e8e8e8;text-align:left} +.smt_10 .sct_sns a {display:inline-block;border-radius:50%;width:50px;height:50px;line-height:25px;text-align:center;padding:10px 0;margin:20px 5px} +.smt_10 .sct_sns .share-facebook {background:#415b92} +.smt_10 .sct_sns .share-twitter {background:#35b3dc} +.smt_10 .sct_sns .share-googleplus {background:#ea3838} +.smt_10 .sct_sns img {width:24px} +.smt_10 .sct_sns_bg {background:rgba(0,0,0,0.1);width:100%;height:100%} +.smt_10 .sct_sns_cls {position:absolute;right:0;top:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff} + +.smt_10 .sct_op_btn {position:absolute;right:5px;bottom:0} +.smt_10 .sct_op_btn>button {border:0;width:25px;height:20px;font-size:1.25em;text-align:center;color:#949494;background:transparent} + +.sct_cartop_wr {position:absolute;top:0;left:0;z-index:3;width:100%;height:100%;padding:10px;text-align:left;background:rgba(0,0,0,0.5);opacity:0.98} +.sct_cartop_wr .it_option {width:100%;height:35px;margin-bottom:5px;} +.sct_cartop_wr .cartopt_cart_btn {width:100%;border:1px solid #1c70e9;padding:8px 5px;margin-bottom:5px;background:#3a8afd;color:#fff;border-radius:3px} +.sct_cartop_wr .cartopt_close_btn {width:100%;border:1px solid #1c70e9;padding:8px 5px;background:#fff;color:#1c70e9;border-radius:3px} + +/* 메인 상품 목록 스킨 20 */ +.smt_20 {position:relative;overflow-y:hidden;margin:0 -5px} +.smt_20 .sct_ul {width:100%;position:absolute;top:0;left:0;margin:0;padding:0;list-style:none} +.smt_20 .sct_ul_first {display:block;top:0} +.smt_20 .sct_li {position:relative;float:left;width:215px;margin-right:15px;margin-bottom:15px;text-align:left} +.smt_20 .sct_last {margin:0 0 15px !important} +.smt_20 .sct_clear {clear:both} +.smt_20 .sct_a {display:inline-block;position:relative;text-decoration:none} +.smt_20 .sct_a:focus, .smt_20 .sct_a:hover {text-decoration:none} +.smt_20 .sct_img {position:relative;text-align:center} +.smt_20 .sct_img a {display:block} +.smt_20 .sct_cart {display:none;position:absolute;left:0;bottom:0;border:0;width:100%;padding:15px 0;background:#000;background:rgba(0,0,0,0.5);color:#fff;font-size:1em;font-weight:bold} +.smt_20 .sct_img:hover .sct_cart {display:block} +.smt_20 .sct_txt {border-bottom:1px solid #d9dde2;font-size:1.1em;margin:10px 0;padding-bottom:10px} +.smt_20 .sct_basic {margin-bottom:5px;color:#6e7f88} +.smt_20 .sct_cost {margin:5px 0 10px;font-size:1.25em;font-weight:bold} +.smt_20 .sct_dict {text-decoration:line-through;display:block;font-size:0.85em;color:#858a8d} + +.smt_20 .sct_sns {margin-bottom:10px} +.smt_20 .sct_sns a {display:inline-block;border-radius:50%;width:30px;height:30px;line-height:28px;margin-right:5px;text-align:center} +.smt_20 .sct_sns .share-facebook {background:#415b92} +.smt_20 .sct_sns .share-twitter {background:#35b3dc} +.smt_20 .sct_sns .share-googleplus {background:#ea3838} +.smt_20 .sct_sns img {width:20px} + +.smt_20 .sct_icon {margin:0 0 10px} +.smt_20 .sct_id {display:block;margin:0 0 5px} + + +/* 메인 상품 목록 스킨 30 */ +.smt_30 {position:relative} +.smt_30 li {position:relative;min-height:50px;padding:10px 15px;background:#fff} +.smt_30 li:after {display:block;visibility:hidden;clear:both;content:""} +.smt_30 .sct_clear {clear:both} +.smt_30 .sct_img {float:left;width:80px;margin-right:10px} +.smt_30 .sct_img img {width:100%;height:auto} +.smt_30 .sct_cnt {display:inline-block;float:left;max-width:143px;line-height:20px} +.smt_30 .sct_txt a {display:block;font-size:1em;color:#000;max-height:40px;overflow:hidden;text-overflow:ellipsis;list-style:none} +.smt_30 .sct_cost {font-weight:bold;font-size:1.2em} + + +/* 메인 상품 목록 스킨 40 */ +.smt_40 {background:#fff;padding:20px;border:1px solid #e3e5e8} +.smt_40 .sct_li {position:relative;float:left;width:20%;margin:0 8px} +.smt_40 .sct_last {} +.smt_40 .sct_clear {clear:both} +.smt_40 .sct_img {position:relative;text-align:center} +.smt_40 .sct_star {margin:10px 0 5px} +.smt_40 .sct_txt {display:block;margin:5px 0;font-size:1.1em} +.smt_40 .sct_cost {margin:5px 0;font-size:1.25em;font-weight:bold} + + +/* 관련상품 목록 스킨 10 */ +#sit_rel {position:relative;border:1px solid #e8e8e8;padding:35px;margin-top:20px;background:#fff} +#sit_rel:after {display:block;visibility:hidden;clear:both;content:""} +#sit_rel h2 {font-size:1.6em;margin:0 0 30px;text-align:center} +#sit_rel .bx-wrapper {margin:0 auto} +#sit_rel .bx-controls-direction {position:absolute;top:25px;right:35px} +#sit_rel .bx-prev {display:inline-block;width:30px;height:30px;border:1px solid #dee3eb;border-right:0;text-indent:-999px;overflow:hidden;background:url('img/select_arrow_left.png') no-repeat 50% 50%} +#sit_rel .bx-next {display:inline-block;width:30px;height:30px;border:1px solid #dee3eb;text-indent:-999px;overflow:hidden;background:url('img/select_arrow_right.png') no-repeat 50% 50%} +.scr_10 li img {width:100%;height:auto} +.scr_10 .sct_txt {display:block;margin:5px 0;font-size:1.1em} +.scr_10 .sct_cost {margin:5px 0;font-size:1.25em;font-weight:bold} + +/* ##### main(nn).skin.php, list.(nn).skin..php 공통 적용 끝 ##### */ + +/* 상품 목록 */ +#sct {margin:0} +.sct_admin {text-align:right} +.sct_admin a {} + +/* 상품 목록 현재 위치 */ +#sct_location {display:inline-block;float:right;padding:12px 0;position:absolute;right:0;top:12px} +#sct_location .go_home {display:inline-block;font-size:1.4em;color:#a2a2a2;line-height:17px;text-decoration:none;vertical-align:top;padding:0 12px} +#sct_location i.dividing-line {vertical-align:top;font-size:1.2em;color:#a2a2a2;display:inline-block;margin:0;line-height:17px} +#sct_location select {float:left;border:1px solid #d3d3d3;height:26px;padding:0 5px;margin:0 12px} +#sct_location.is_right select{float:right} +#sct_location.view_location{display:block;float:none!important;position:relative;top:0;left:0} +#sct_location.view_location:after{display:block;visibility:hidden;clear:both;content:""} +.view_location .go_home{float:left} +.view_location i.dividing-line{float:left} +.view_location .shop_select_to_html.shop_hover_selectbox{float:left} +.shop_select_to_html{position:relative;display:inline-block} +.shop_select_to_html span{padding:10px 20px 15px} +.shop_select_to_html .menulist{position:absolute;top:20px;display:none;opacity:0;transition:all .2s ease-in-out} +.view_location .shop_select_to_html .menulist{left:0} +.is_right .shop_select_to_html .menulist{right:0} +.shop_select_to_html:hover .category_title,.shop_select_to_html:hover .category_title i{color:#69aa6f} +.shop_select_to_html:hover .menulist{display:block;opacity:1;transition:all .2s ease-in-out} +.shop_select_to_html .menulist{background-color:#fff;border-radius:5px;box-shadow:0 0 0 1px rgba(68,88,112,0.11);box-sizing:border-box;margin-top:4px;overflow:hidden;padding:6px 0;-webkit-transition:all .2s cubic-bezier(0.5,0,0,1.25),opacity .15s ease-out;transition:all .2s cubic-bezier(0.5,0,0,1.25),opacity .15s ease-out;z-index:9;white-space:nowrap;width:auto} +.shop_select_to_html .menulist ul.wide{display:inline-block!important;width:146px;vertical-align:top;min-height:360px} +.shop_select_to_html .menulist ul.left-border{border-left:1px dashed #e6e9ed} +.shop_select_to_html .option{font-weight:400;line-height:40px;list-style:none;min-height:40px;outline:none;text-align:left;-webkit-transition:all .2s;transition:all .2s} +.shop_select_to_html .option:hover,.shop_select_to_html .option.focus,.shop_select_to_html .option.selected.focus{background-color:#f6f7f9} +.shop_select_to_html .option.selected,.shop_select_to_html .option.selected a{font-weight:700;color:#69aa6f} +.shop_select_to_html .option.disabled{background-color:transparent;color:#90a1b5;cursor:default} +.shop_select_to_html .option a{display:block;padding-left:28px;padding-right:49px} +.shop_select_to_html .category_title{color:#4F4F4F;font-size:1.1em} +.shop_select_to_html .category_title i{margin-left:5px;color:#a2a2a2} + +.sct_here {font-weight:bold} +.sct_bg {padding-right:15px !important;background:url('img/sct_bg_toright.gif') right 50% no-repeat} + +/* 상품 목록 카테고리 목록 */ +.sct_ct {clear:both;margin:10px 0 20px;background:#fff;border:1px solid #d3d3d3;border-top:2px solid #000;padding:10px} +.sct_ct h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.sct_ct ul:after {display:block;visibility:hidden;clear:both;content:""} +.sct_ct a {text-decoration:none} +.sct_ct_parent {font-weight:bold} +.sct_ct_here {color:#ff3600 !important} + +#sct_ct_1 li {float:left;width:20%;border-right:1px solid #f6f6f6} +#sct_ct_1 li:nth-child(5n) {border-right:0} +#sct_ct_1 li a {display:block;padding:0 10px;line-height:40px;font-weight:bold} +#sct_ct_1 li a:hover {color:#3a8afd} + +#sct_ct_2 li {margin:0 0 10px} +#sct_ct_2 a {display:inline-block;width:120px} + +#sct_ct_3 li {float:left;margin:0 10px 10px 0;width:120px} + +/* 상품 정렬 리스트 스타일 선택 공통 */ +#sct_sortlst {clear:both;background:#fff;border:1px solid #e3e5e8} +#sct_sortlst:after {display:block;visibility:hidden;clear:both;content:""} + +/* 상품 정렬 */ +#sct_sort {float:left;width:80%} +#sct_sort:after {display:block;visibility:hidden;clear:both;content:""} +#sct_sort h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sct_sort ul {margin:0;padding:0 0 0 1px;list-style:none} +#sct_sort ul:after {display:block;visibility:hidden;clear:both;content:""} +#sct_sort li {float:left;position:relative;margin-left:-1px;height:45px;padding:15px 0;line-height:15px} +#sct_sort li a {border-left:1px solid #ddd;display:block;padding:0 10px} +#sct_sort li a:hover {color:#be334a} +#sct_sort li:first-child a {border:0} + +/* 상품 리스트 스타일 선택 */ +#sct_lst {float:right;margin:0 0;padding:0;list-style:none} +#sct_lst:after {display:block;visibility:hidden;clear:both;content:""} +#sct_lst li {position:relative;float:left} +#sct_lst button {position:relative;margin:0;padding:0;width:45px;height:45px;border:0;cursor:pointer;background:#fff;color:#adadad;font-size:15px} +#sct_lst button:hover {color:#000} +#sct_lst button.sct_lst_list {} +#sct_lst button .icon {display:block} + +/* 상품 상세보기 */ +#sit {margin:0 0 10px} +.sit_admin {position:absolute;right:0;top:2px;text-align:right} +.sit_admin a {line-height:35px;padding:0 10px} +.sit_empty {padding:60px 0;text-align:center} + +.is_search #wrapper_title, .is_item #wrapper_title{display:none} + +/* 상품 상세보기 - 개요 */ +#sit_ov_from {background:#fff;border-bottom:1px solid #e3e3e3;clear:both} +#sit_ov_wrap {width:1200px;margin:0 auto;padding:45px;border-top:1px solid #e3e3e3} +#sit_ov_wrap:after {display:block;visibility:hidden;clear:both;content:""} + +/* 상품 상세보기 - 이미지 미리보기 */ +#sit_pvi {float:left;position:relative} +#sit_pvi_big {float:right;text-align:center} +#sit_pvi_big a {display:none} +#sit_pvi_big a.visible {display:block} +#sit_pvi_big #popup_item_image {display:inline-block;position:absolute;bottom:0;right:0;width:43px;height:43px;line-height:43px;background:#fff;color:#8c9195;border:1px solid #e0e0e0;font-size:1.4em} +#sit_pvi_big img {width:500px;height:auto} +#sit_pvi_thumb {float:left;margin:0;padding:0;list-style:none;text-align:center} +#sit_pvi_thumb:after {display:block;visibility:hidden;clear:both;content:""} +#sit_pvi_thumb li {margin:0 15px 15px 0} +#sit_pvi_thumb img {border:1px solid #dbdbdb} +#sit_pvi_thumb img:hover {border:1px solid #010101} + +#sit_pvi_nwbig {padding:10px 0;text-align:center} +#sit_pvi_nwbig span {display:none} +#sit_pvi_nwbig span.visible {display:inline} +#sit_pvi_nw ul {margin:0 0 20px;text-align:center;padding:0 10px;list-style:none} +#sit_pvi_nw ul:after {display:block;visibility:hidden;clear:both;content:""} +#sit_pvi_nw li {display:inline-block;margin:0 0 1px 1px} +#sit_pvi_nw li img {width:60px;height:60px} + +/* 상품 상세보기 - 간략정보 및 구매기능 */ +#sit_ov {position:relative;float:right;width:448px;height:auto !important;height:355px;min-height:355px;padding-bottom:20px} +#sit_ov h3 {margin:0 0 10px} + +#sit_title {margin:0 0 10px;font-size:2.4em} +#sit_desc {margin:0 0 10px;padding:0;color:#474747;font-size:1.167em} +#sit_opt_info {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} + +#sit_star_sns {position:relative} +#sit_star_sns span {display:inline-block;margin:0 5px 0 0;color:#666;letter-spacing:0} +#sit_star_sns .sit_star {position:relative;top:-2px;margin:0 5px 0 0} + +#sit_star_sns a {display:inline-block;vertical-align:middle} +#sit_star_sns .btn_sns_share {float:left;background:transparent;width:35px;height:25px;border:0;color:#4b5259;font-size:1.6em;font-weight:bold} +#sit_star_sns .btn_sns_share:hover {color:#3a8afd} +#sit_star_sns .sns_area {display:none;position:absolute;top:45px;right:0;max-width:175px;text-align:center;background:#fff;border:1px solid #e2e2e2;padding:10px;z-index:10} +#sit_star_sns .sns_area:before {content:"";position:absolute;top:-8px;right:13px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #e2e2e2 transparent} +#sit_star_sns .sns_area:after {content:"";position:absolute;top:-7px;right:13px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent} +#sit_star_sns .sns_area a {display:inline-block;width:35px;height:35px;line-height:35px;margin-bottom:5px;background:#eee;text-align:center;border-radius:50%} +#sit_star_sns .sns_area a img {width:24px;height:auto} +#sit_star_sns .sns_area #sit_btn_rec {font-size:15px} +#sit_star_sns .sns_area .share-googleplus {background:#ea3838} +#sit_star_sns .sns_area .share-facebook {background:#415b92} +#sit_star_sns .sns_area .share-twitter {background:#35b3dc} + +#sit_btn_opt {position:absolute;right:0;bottom:0} +#btn_wish {float:left;position:relative;display:inline-block;padding-right:5px;color:#4b5259;width:35px;height:25px;text-align:center;font-size:1.25em;font-weight:bold} +#btn_wish i {font-size:1.6em;font-weight:bold} +#btn_wish .btn_wish_num {position:absolute;right:0;bottom:-2px;margin:0;padding:0 2px;height:17px;line-height:15px;border-radius:30px;background:#fff;color:#4b5259;font-size:0.75em} + +.sit_info {padding:10px 0;border-top:1px solid #e2e2e2;margin:10px 0 0;border-bottom:1px solid #e2e2e2} +.sit_info .tr_price {border-bottom:1px solid #e2e2e2} +.sit_info .tr_price th, +.sit_info .tr_price td {padding-bottom:15px} + +.sit_ov_tbl {width:100%;border:0;border-collapse:collapse;color:#666} +.sit_ov_tbl th {font-weight:normal;text-align:left} +.sit_ov_tbl td {padding:10px 0} +.sit_ov_tbl td strong {color:#000;line-height:5px;vertical-align:top;font-size:1.25em} +.sit_ov_ro {padding:2px 2px 3px;border:0;background:transparent;text-align:right;vertical-align:middle} +.sit_ov_opt {padding:2px 2px 3px;border:0;background:transparent;vertical-align:middle} +.sit_ov_input {margin:0 1px 0 0;padding:2px 2px 3px;border:1px solid #b8c9c2;background:transparent;vertical-align:middle} +#sit_ov_tbl button {margin:0 1px 0 0} + +.sit_option {padding:10px 0;margin:10px 0 0} +.sit_option label {display:block;margin:0 0 5px;color:#666} +.sit_option label.label-title{display:none} +.sit_option select {width:100%;margin:0 0 10px;height:50px;padding:0 10px;border:1px solid #cdcdcd; +-webkit-appearance:none; /* 화살표 없애기 for chrome*/ +-moz-appearance:none; /* 화살표 없애기 for firefox*/ +appearance:none; /* 화살표 없애기 공통*/ +background:url('img/select_arrow.png') no-repeat 96% 50%/* 화살표 아이콘 추가 */ +} +.sit_option select::-ms-expand {display:none/* 화살표 없애기 for IE10, 11*/} + +.sit_option h3 {font-size:1.083em} +.sit_sel_btn {position:relative} /* 선택옵션용 추가 버튼 */ +.sit_sel_btn button {position:absolute;top:-51px;right:0 !important;right:15px} + +#sit_sel_option h3 {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#sit_tot_price {font-size:1.167em;line-height:45px;font-weight:bold;text-align:right} +#sit_tot_price:after {display:block;visibility:hidden;clear:both;content:""} +#sit_tot_price span {float:left} +#sit_tot_price strong {font-size:1.5em;margin-left:15px} + +#sit_ov_soldout {padding:20px 0;margin:10px 0;color:#ff3061;background:#fff6f6;font-weight:bold;text-align:center} + +#sit_ov_btn:after {display:block;visibility:hidden;clear:both;content:""} +#sit_ov_btn button {width:186px;float:left;margin-right:5px;height:50px;margin-bottom:10px;font-weight:bold;font-size:1.25em} +.sit_btn_buy {background:#3a8afd;border-radius:3px;border:1px solid #1c70e9;color:#fff} +.sit_btn_buy:hover {background:#2176f1} +.sit_btn_cart {background:#fff;border-radius:3px;border:1px solid #98a3b3;color:#000} +.sit_btn_cart:hover {background:#f3f3f3} +#sit_btn_alm {float:left;display:inline-block;width:186px;height:50px;margin-left:5px;line-height:50px;margin-bottom:10px;font-weight:bold;font-size:1.25em;background:#d50c0c;border-radius:3px;color:#fff;border:0;text-align:center} +.sit_btn_wish {float:left;display:inline-block;width:65px;height:50px;margin-bottom:10px;line-height:50px;color:#8c9195;font-size:1.6em;border:1px solid #98a3b3;text-align:center;border-radius:3px;font-weight:bold} +.sit_btn_wish:hover {color:red} + +/* 상품 상세보기 - 다른 상품 보기 */ +#sit_siblings {clear:both;width:100%;border-top:1px solid #f1f3f6;background:#fff;text-align:center;position:relative} +#sit_siblings:after {display:block;visibility:hidden;clear:both;content:""} +#sit_siblings h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#sit_siblings a {display:block;position:relative;padding:0;margin: 15px;line-height:35px;color:#999} +#sit_siblings a#siblings_prev {float:left;padding-left:20px} +#sit_siblings a#siblings_prev:after {content:"";background:url('img/sit_siblings.jpg') no-repeat;position:absolute;left:0;top:10px;width:10px;height:15px;display:inline-block} +#sit_siblings a#siblings_next {float:right;padding-right:20px} +#sit_siblings a#siblings_next:after {content:"";background:url('img/sit_siblings.jpg') -14px 0px no-repeat;position:absolute;right:0;top:10px;width:10px;height:15px;display:inline-block} +#sit_siblings a span {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} + +#sit_info {display:inline-flex;position:relative;width:100%;min-height:600px;margin-top:20px;margin-bottom:30px;border:1px solid #e8e8e8;background:#fff} +#sit_info:after {display:block;visibility:hidden;clear:both;content:""} + +#sit_tab {width:928px;display:table-cell} +#sit_tab:after {display:block;visibility:hidden;clear:both;content:""} +#sit_tab .tab_tit {border-bottom:1px solid #e8e8e8;background:#fff;padding:0 10px} +#sit_tab .tab_tit:after {display:block;visibility:hidden;clear:both;content:""} +#sit_tab .tab_tit li {display:inline-block;float:left} +#sit_tab .tab_tit li button {display:block;width:100%;position:relative;font-size:1.2em;padding:10px 15px;border:0;color:#666;background:#fff;line-height:38px;text-align:center;z-index:1} +#sit_tab .tab_tit li .selected {background:#fff;z-index:2;border-bottom-color:#fff;color:#000;font-weight:bold} +#sit_tab .tab_tit li .selected:after {content:"";position:absolute;left:0;bottom:0;width:100%;height:3px;background:#3a8afd;display:inline-block} +#sit_tab .tab_con {background:#fff;padding:15px} +#sit_tab .item_use_count, #sit_tab .item_qa_count {display:inline-block;min-width:20px;height:20px;font-size:0.75em;line-height:20px;padding:0 5px;background:#eee;border-radius:10px;color:#777} + +#sit_buy {display:table-cell;width:270px;border-left:1px solid #e8e8e8;vertical-align:top} +.sit_buy_inner {position:relative;top:0 !important;vertical-align:top} +.sit_side_option {padding:15px 15px 10px;border-bottom:1px solid #ebeff3} +.sit_side_option h3 {margin-bottom:10px} +.sit_side_option label {display:block;margin:0 0 5px;color:#666} +.sit_side_option label.label-title{display:none} +.sit_side_option select {width:100%;margin:0 0 10px;height:50px;padding:0 10px;border:1px solid #cdcdcd; +-webkit-appearance:none; /* 화살표 없애기 for chrome*/ +-moz-appearance:none; /* 화살표 없애기 for firefox*/ +appearance:none; /* 화살표 없애기 공통*/ +background:url('img/select_arrow.png') no-repeat 96% 50%/* 화살표 아이콘 추가 */} +.sit_side_option select::-ms-expand {display:none/* 화살표 없애기 for IE10, 11*/} + +.sit_sel_option {overflow-y:auto;height:300px} +.sit_sel_option h3 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.sit_sel_option:after {display:block;visibility:hidden;clear:both;content:""} +.sit_sel_option li {position:relative;padding:15px;border-bottom:1px solid #e6e9ed} +.sit_sel_option li:after {display:block;visibility:hidden;clear:both;content:""} +.sit_sel_option .sit_opt_del {position:absolute;top:0;right:0;width:30px;height:30px;font-size:15px;border:0;border-left:1px solid #e6e9ed;border-bottom:1px solid #e6e9ed;background:#fff;color:#c6c8ca} +.sit_sel_option .opt_name {font-weight:bold;line-height:28px} +.sit_sel_option .num_input {float:left;border:0;height:30px;border-top:1px solid #e4e4e4;border-bottom:1px solid #e4e4e4;text-align:center} +.sit_sel_option .sit_opt_prc {display:block;float:right;width:100px;padding:0 3px;text-align:right;line-height:30px;font-size:1.183em;font-weight:bold} +.sit_sel_option button {float:left;width:30px;height:30px;border:1px solid #bdc9dc;border-radius:0;background:#fff;color:#666;font-size:0.92em} +.sit_sel_option button:hover {color:#000} + +.sum_section {padding:15px;z-index:3} +.sum_section:after {display:block;visibility:hidden;clear:both;content:""} +.sit_tot_price {font-weight:bold;padding-bottom:10px;line-height:25px;font-size:1.167em;text-align:right} +.sit_tot_price strong {font-size: 1.5em;margin-left:15px} +.sit_tot_price span {float:left} +.sit_order_btn button {display:block;width:100%;padding:15px 0;font-size:1.25em;font-weight:bold} +.sit_order_btn .sit_btn_cart {margin-bottom:5px} + +/* 상품 재입고 알림 (SMS) */ +#sit_sms_new {} +#sit_sms_new .form_01 {padding:20px} +#sit_sms_new #sms_agree {padding:5px 0 20px} +#sit_sms_new li strong {display:inline-block;margin:10px 0} +#sit_sms_new textarea {line-height:1.5em;color:#555} +#sit_sms_new .prd_name {background:#f3f3f3;padding:15px 20px;font-weight:bold;font-size:1.167em} +#sit_sms_new .chk_box input[type="checkbox"]:checked + label span {background:url('img/chk.png') no-repeat 50% 50% #3a8afd} + +/* 상품 상세보기 - 상품정보 */ +#sit_inf {margin:20px 0} +#sit_inf h2 {position:absolute;font-size:0;line-height:0;content:""} +#sit_inf h3 {position:absolute;font-size:0;line-height:0;content:""} + +#sit_inf_basic {margin:0 0 20px;line-height:1.7em} +#sit_inf_explan {margin:0 0 10px;width:auto !important;line-height:1.7em;overflow:hidden} /* ie6 미대응시 #sit_inf_explan {margin:0 0 10px} 만으로 충분 */ +#sit_inf_explan img {max-width:100%;height:auto} + +#sit_inf_open {width:100%;border:0;border-top:1px solid #777;border-collapse:collapse} +#sit_inf_open th {padding:10px;border-bottom:1px solid #e5e5e5;background:#f3f3f3;vertical-align:top;text-align:left} +#sit_inf_open td {padding:10px;border-bottom:1px solid #e5e5e5;background:#fff;vertical-align:top} + +/* 상품 상세보기 - 사용후기 */ +#sit_use {} +#sit_use h2 {position:absolute;font-size:0;line-height:0;content:""} +#sit_use h3 {position:absolute;font-size:0;line-height:0;content:""} + +.sit_use_top {position:relative;background:#fff;border:2px solid #efeff1;margin:0 0 15px;padding:15px;min-height:90px;vertical-align:middle} +.sit_use_top h4 {font-size:1.2em;margin-bottom:10px} +.sit_use_top h4 span {color:#aaa;font-size:0.85em;font-weight:normal} +.sit_use_top .sit_star {height:20px} +.sit_use_top .st_bg {background:#666} + +#sit_use_wbtn {position:absolute;top:20px;right:30px} +#sit_use_wbtn a {padding:0 20px;line-height:45px;font-weight:bold;font-size:1.167em} + +#sit_use_ol {margin:0 0 5px;padding:0;border-top:1px solid #e0e0e0;list-style:none} +.sit_use_li {position:relative;padding:10px 0;padding-left:110px;min-height:120px;border-bottom:1px solid #e0e0e0} +.sit_use_li:after {display:block;visibility:hidden;clear:both;content:""} +.sit_use_li_title {position:absolute;right:20px;bottom:20px;border:1px solid #ddd;padding:8px 10px;border-radius:3px;color:#666;font-size:0.92em;background:#fff} +.sit_use_li_title:hover {background:#6b99ee;border-color:#6b99ee;color:#fff} + +.sit_thum {margin:0;position:absolute;top:10px;left:0} +.sit_use_dl:after {display:block;visibility:hidden;clear:both;content:""} +.sit_use_dl dt {position:absolute;font-size:0;line-height:0;content:""} +.sit_use_dl dd {color:#7f7f7f;line-height:1.5em} +.sit_use_dl .sit_use_star {margin:0 0 5px} +.sit_use_dl .sit_use_tit {font-weight:bold;font-size:1.167em;color:#000 !important} + +.sit_use_con {display:none;margin-right:110px;margin-bottom:10px} +.sit_use_p {margin:10px 0;padding:10px 0} +.sit_use_cmd {} + +.sit_use_reply {position:relative;border-top:1px dotted #bbb;margin:10px 0 0;padding:10px 0 0 40px} +.use_reply_icon {position:absolute;top:10px;left:5px;background:url('./img/use_reply.png') no-repeat 0 0;width:28px;height:17px;text-indent:-999px;overflow:hidden} +.use_reply_tit {font-weight:bold;line-height:1.5em;padding-right:100px} +.use_reply_name {font-size:0.92em;color:#777;margin:5px;position:absolute;top:10px;right:0} +.use_reply_p {padding:10px 0;background:#fff;line-height:1.5em} + +#sit_use_write_star:after {display:block;visibility:hidden;clear:both;content:""} +#sit_use_write_star li {float:left;width:33.333%} +#sit_use_write_star li img {width:100px} + +/* 상품 상세보기 - 상품문의 */ +#sit_qa {margin:20px 0} +#sit_qa h2 {position:absolute;font-size:0;line-height:0;content:""} +#sit_qa h3 {position:absolute;font-size:0;line-height:0;content:""} + +#sit_qa_ol {margin:0 0 5px;padding:0;border-top:1px solid #f0f0f0;list-style:none} +.sit_qa_li:after {display:block;visibility:hidden;clear:both;content:""} +.sit_qa_li {position:relative;border-bottom:1px solid #f0f0f0;padding:15px 10px} +.sit_qa_li_title {display:block;float:left;width:80%;text-align:left;background:none;border:0;line-height:25px;font-weight:bold;font-size:1.167em} + +.sit_qa_dl {float:right;width:20%;line-height:30px;color:#7f7f7f;text-align:right;margin:0} +.sit_qa_dl:after {display:block;visibility:hidden;clear:both;content:""} +.sit_qa_dl dt {position:absolute;font-size:0;line-height:0;content:""} +.sit_qa_dl dd {display:inline-block;margin-left:10px} +.sit_qaa_done {display:inline-block;height:30px;line-height:30px;background:#f6bb42;color:#fff;padding:0 8px;margin-right:10px;font-size:12px;font-weight:normal;border-radius:3px} +.sit_qaa_yet {display:inline-block;height:30px;line-height:30px;background:#ccd1d9;color:#fff;padding:0 8px;margin-right:10px;font-size:12px;font-weight:normal;border-radius:3px} + +.sit_qa_con {display:none;clear:both} +.sit_qa_p {margin:10px 0;background:#f3f3f3;line-height:1.5em} +.sit_qa_p .qa_alp {position:absolute;top:13px;left:15px;font-size:2em;color:#000} +.sit_qa_qaa {padding:15px 20px;padding-left:50px;position:relative;min-height:50px;border-top:1px solid #fff} +.sit_qa_qaq {padding:15px 20px;padding-left:50px;position:relative;min-height:50px} +.sit_qa_con textarea {display:none} +.sit_qa_cmd {text-align:right} + +.sit_qa_pw {display:none;position:absolute;top:30px;left:175px;padding:10px;width:348px;border:1px solid #000;background:#fff;text-align:center} +.sit_qa_pw span {display:block;margin:0 0 5px} + +#sit_qa_wbtn {text-align:right;margin:0 0 20px} +#sit_qa_wbtn a {padding:0 20px;line-height:45px;font-weight:bold;font-size:1.167em} + +#sit_qa_write {} +#sit_qa_write #iq_subject {width:100%} +#sit_qa_write .chk_box input[type="checkbox"]:checked + label span {background:url('img/chk.png') no-repeat 50% 50% #3a8afd} + +/* 상품 상세보기 - 배송정보 */ +#sit_dvr {margin:20px 0} +#sit_dvr h2 {position:absolute;font-size:0;line-height:0;content:""} + +/* 상품 상세보기 - 교환정보 */ +#sit_ex {margin:20px 0} +#sit_ex h2 {position:absolute;font-size:0;line-height:0;content:""} + + +/* 사용후기 모음 */ +#sps_sch {margin:0 0 10px} +#sps_sch a {display:inline-block;padding:0 8px;height:40px;line-height:40px;vertical-align:top;border-radius:3px;background:#434a54;color:#fff;font-weight:bold;text-decoration:none} +#sps_sch .sch_wr {width:300px;border:1px solid #d0d3db;border-radius:3px;display:inline-block;background:#fff} +#sps_sch:after {display:block;visibility:hidden;clear:both;content:""} +#sps_sch select {float:left;border:0;width:175px;height:40px;margin-right:5px;border:1px solid #d0d3db;border-radius:3px} +#sps_sch .sch_input {width:258px;height:38px;border:0;padding:0;background-color:transparent;float:left} +#sps_sch .sch_btn {height:38px;float:left;background:none;border:0;width:40px;font-size:15px} + +#sps {} +#sps ol {margin:0;padding:0;list-style:none} +#sps li {position:relative;padding:15px;border-bottom:1px solid #f0f0f0;background:#fff} +#sps li:after {display:block;visibility:hidden;clear:both;content:""} + +.sps_img {position:absolute;top:15px;left:15px} +.sps_img_inner {float:left;position:relative} +.sps_img a span {position:absolute;font-size:0;line-height:0;overflow:hidden} +.sps_img .prd_detail {position:absolute;right:0;bottom:0;border:0;color:#fff;background:#078601;width:34px;height:34px;text-align:center;opacity:0.8} +.sps_img .prd_detail:hover {opacity:1} + +.review_detail_cnt {display:none;position:fixed;width:100%;height:100%;top:0;left:0;z-index:999;background:rgba(0,0,0,0.1)} +.review_detail_in {position:absolute;top:50%;left:50%;width:590px;max-height:450px;background:#fff;text-align:left;margin-left:-300px;margin-top:-180px;overflow-y:auto;border-radius:3px;border:1px solid #dde7e9;background:#fff;border-radius:3px} +.review_detail_in h3 {padding:15px;border-bottom:1px solid #e8e8e8;font-size:1.4em} +.review_cnt {padding:25px} +.rd_cls {position:absolute;top:0;right:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff} + +.review_tp_cnt {position:relative;padding:0 0 10px;margin-bottom:15px;border-bottom:1px solid #f1f1f1} +.review_tp_cnt>span {font-size:1.2em;display:block} +.review_tp_cnt:after {display:block;visibility:hidden;clear:both;content:""} +.review_tp_cnt .sps_opt_btn_more {position:absolute;top:0;right:0;border:0;padding:5px 5px 5px 10px;background:#fff;color:#c4c8cb;font-size:1.4em} +.review_tp_cnt .sps_opt_li {display:none;position:absolute;top:40px;right:0;border:1px solid #b8bfc4} +.review_tp_cnt .sps_opt_li:before {content:"";position:absolute;top:-8px;right:5px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #b8bfc4 transparent} +.review_tp_cnt .sps_opt_li:after {content:"";position:absolute;top:-6px;right:5px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent} +.review_tp_cnt .sps_opt_li li {border-bottom:1px solid #f1f1f1;padding:10px !important;color:#6b757c} + +.review_summ {background:#fcfcfc;border:2px solid #efeff1;padding:10px} +.review_bt_cnt {margin:15px 0} + +.sps_reply {margin-top:10px;padding-top:10px;border-top:1px dotted #bbb} +.sps_reply .sps_img {text-align:right;width:70px} +.sps_reply .sps_section h2 {background:url('./img/use_reply.png') no-repeat 0 0;text-indent:30px;line-height:1.5em} + +#sps dl {margin:5px 0} +#sps dl:after {display:block;visibility:hidden;clear:both;content:""} +#sps dt {float:left} +#sps dd {float:left;margin:0 10px 0 0;color:#999} +#sps dd img {position:relative;top:-2px} + +.sps_section {float:left;width:100%;padding-left:115px} +.sps_section .sps_pd_name {display:block;color:#3a8afd;padding:10px 0 5px} +.sps_section .sps_rv_tit {display:block;font-size:1.2em;font-weight:bold} +.sps_section .sps_rv_thum {position:absolute;top:15px;right:15px} +.sps_section p {padding:0;width:100%} +.sps_con_full {padding:0;height:auto !important} +.sps_con_btn {clear:both;margin:5px 0} +.sps_con_btn:after {display:block;visibility:hidden;clear:both;content:""} +.sps_con_btn .sps_dl {float:left} +.sps_con_btn button.review_detail {float:right;border-radius:3px;border:1px solid #d4d6db;color:#666;font-size:0.92em;padding:5px 7px;background:#fff} +.sps_con_btn button.review_detail:hover {background:#6b99ee;border-color:#6b99ee;color:#fff} + +/* 상품문의 모음 */ +#sqa_sch {margin:0 0 10px} +#sqa_sch a {display:inline-block;padding:0 8px;height:40px;line-height:40px;vertical-align:top;border-radius:3px;background:#434a54;color:#fff;font-weight:bold;text-decoration:none} +#sqa_sch .sch_wr {width:300px;border:1px solid #d0d3db;border-radius:3px;display:inline-block;background:#fff} +#sqa_sch:after {display:block;visibility:hidden;clear:both;content:""} +#sqa_sch select {float:left;border:0;width:175px;height:40px;margin-right:5px;border:1px solid #d0d3db;border-radius:3px} +#sqa_sch .sch_input {width:258px;height:38px;border:0;padding:0;background-color:transparent;float:left} +#sqa_sch .sch_btn {height:38px;float:left;background:none;border:0;width:40px;font-size:15px} + +#sqa {margin-bottom:20px} +#sqa ol {margin:0;padding:0;list-style:none} +#sqa li {position:relative;padding:15px 20px 15px 15px;border-bottom:1px solid #f0f0f0;background:#fff} +#sqa li:after {display:block;visibility:hidden;clear:both;content:""} +#sqa li .sit_qaa_yet {position:absolute;right:20px;top:20px;margin-right:0} +#sqa li .sit_qaa_done {position:absolute;right:20px;top:20px;margin-right:0} + +.sqa_img {float:left;margin:0 10px 0 0} +.sqa_img span {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#sqa dl {margin:5px 0} +#sqa dl:after {display:block;visibility:hidden;clear:both;content:""} +#sqa dt {float:left} +#sqa dd {float:left;margin:0 10px 0 0;color:#999} + +#sqa dd img {position:relative;top:-2px} +.sqa_con {margin:10px 0;background:#f3f3f3;line-height:1.5em} +.sqa_con .qa_alp {position:absolute;top:13px;left:15px;font-size:2em;color:#000} + +.sqa_section {float:left;width:1100px} +.sqa_section h2 {padding-right:70px;font-size:1.2em;font-weight:bold} +.sqa_section .sqa_con {line-height:1.7em} +.sqa_section p {padding:0;width:100%} +.sqa_con_full {padding:0;height:auto !important} +.sqa_con_btn button {border:1px solid #ddd;padding:5px 8px;color:#666;font-size:0.92em;margin:5px 0;background:#fff} +.sqa_con_btn button:hover {background:#6b99ee;border-color:#6b99ee;color:#fff} + +/* 상품검색 */ +#ssch {margin:20px 0} +#ssch h2 {font-size:1.8em;line-height:30px;margin:10px 0} +#ssch h2 .ssch_result_total {float:right;color:#6f6f6f;font-size:0.55em;font-weight:normal} +#ssch h2 strong {color:#ff005a} +#ssch_frm {background:#fff;border:1px solid #e3e5e8} +#ssch_frm .ssch_scharea {padding:15px;border-bottom:1px solid #e3e5e8} +#ssch_frm .ssch_scharea:after {display:block;visibility:hidden;clear:both;content:""} +#ssch_frm .ssch_scharea label {display:inline-block;margin:0 8px 0 0} +#ssch_frm .ssch_scharea .ssch_input {height:45px;padding:0 10px;margin-right:5px;border:1px solid #d0d3db;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)} +#ssch_frm .ssch_scharea .btn_submit {width:90px;height:45px;margin-right:5px;padding:0 5px;font-weight:bold;border:1px solid #2e3745;background:#434a54} + +#ssch_frm .ssch_left {} +#ssch_frm .ssch_option {padding:15px;border-bottom:1px solid #e3e5e8} +#ssch_frm .ssch_option .ssch_input {height:32px;padding:0 10px;margin-right:5px;border:1px solid #d0d3db;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)} + +#ssch_frm p {padding:15px;color:#737373;border-bottom:1px solid #e3e5e8} + +#ssch_cate {background:#fff;border-bottom:1px solid #e3e5e8;padding:15px} +#ssch_cate ul:after {display:block;visibility:hidden;clear:both;content:""} +#ssch_cate li {float:left;width:20%;border-right:1px solid #f6f6f6} +#ssch_cate li:nth-child(5n) {border-right:0} +#ssch_cate li span {font-weight:normal} +#ssch_cate a {display:block;padding:0 10px;line-height:40px} +#ssch_cate a:hover {color:#3a8afd} + +#ssch_sort {float:left;width:80%} +#ssch_sort:after {display:block;visibility:hidden;clear:both;content:""} +#ssch_sort h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#ssch_sort ul {margin:0;padding:0 0 0 1px;list-style:none} +#ssch_sort ul:after {display:block;visibility:hidden;clear:both;content:""} +#ssch_sort li {float:left;position:relative;margin-left:-1px;height:45px;padding:15px 0;line-height:15px} +#ssch_sort li a {border-left:1px solid #ddd;display:block;padding:0 10px} +#ssch_sort li:hover:after {content:"";position:absolute;left:0;bottom:-1px;width:100%;height:2px;background:#3a8afd} +#ssch_sort li:hover a {color:#3a8afd} +#ssch_sort li:first-child a {border:0} + +#ssch_sort_all {margin:0;padding:0 15px;list-style:none} +#ssch_sort_all:after {display:block;visibility:hidden;clear:both;content:""} +#ssch_sort_all li {float:left;position:relative;margin-left:-1px;height:45px;padding:15px 0;line-height:15px} +#ssch_sort_all li a {display:block;padding:0 10px} +#ssch_sort_all li:hover:after {content:"";position:absolute;left:0;bottom:-1px;width:100%;height:2px;background:#3a8afd} +#ssch_sort_all li:hover a {color:#3a8afd} +#ssch_sort_all li:first-child a {border:0} + +/*쿠폰존 리스트*/ +.couponzone_list {margin:0 0 20px;position:relative} +.couponzone_list h2 {padding:15px 20px;font-size:1.25em;border:1px solid #e3e5e8;background:#fff} +.couponzone_list p {position:absolute;top:5px;right:0;margin:15px 20px;color:#666} +.couponzone_list ul {padding:30px;margin:0;list-style:none;background:#fff;border:1px solid #e3e5e8;border-top:0} +.couponzone_list ul:after {display:block;visibility:hidden;clear:both;content:""} +.couponzone_list ul li {float:left;width:262px;margin:0 0 30px 30px;background:#fff} +.couponzone_list ul li:nth-child(4n+1) {clear:both;margin-left:0} +.couponzone_list ul li img {width:100%;height:auto;line-height:1.2em;border-radius:5px 5px 0 0} +.couponzone_list ul li .cp_inner {border:1px solid #ddd;border-radius:5px; +-webkit-box-shadow:0px 1px 6px 0 #dedede; +-moz-box-shadow:0px 1px 6px 0 #dedede; +box-shadow:0px 1px 6px 0 #dedede +} +.couponzone_list ul li .coupon_img {position:relative;height:98px;overflow:hidden;border-bottom:1px dashed #ccc} +.couponzone_list ul li .coupon_tit {position:absolute;top:0;left:0;width:100%;height:98px;padding-top:30px;text-align:center;font-weight:bold;text-overflow:ellipsis;overflow:hidden;white-space:nowrap} +.couponzone_list ul li .coupon_tit strong {display:inline-block;font-size:1.3em} +.couponzone_list ul li .coupon_tit .cp_evt, +.couponzone_list ul li .coupon_tit .cp_evt b {font-size:1.4em} +.couponzone_list ul li .cp_cnt {padding:10px} +.couponzone_list ul li .coupon_date {display:inline-block;float:right;padding:2px 3px;margin:5px 0px;font-size:0.92em;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:#777} +.couponzone_list ul li .coupon_target {display:inline-block;margin:5px 0px} +.couponzone_list ul li .coupon_target>button {display:inline-block;max-width:125px;padding:2px 3px;font-size:0.92em;border:0;border-radius:3px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap} +.couponzone_list ul li .coupon_target .cp_1 {background:#edfbde;color:#8cc152}/*카테고리할인*/ +.couponzone_list ul li .coupon_target .cp_2 {background:#fbdef3;color:#c15293}/*개별상품할인*/ +.couponzone_list ul li .coupon_target .cp_3 {background:#fbf1de;color:#c18b52}/*주문금액할인*/ +.couponzone_list ul li .coupon_target .cp_4 {background:#f2defb;color:#7c52c1}/*배송비할인*/ + +.couponzone_list ul li .coupon_info {display:none;position:absolute;min-width:235px;background:#fff;border:1px solid #000;padding:15px} +.couponzone_list ul li .coupon_info:after {display:block;visibility:hidden;clear:both;content:""} +.couponzone_list ul li .coupon_info h4 {font-size:1.2em;margin-bottom:10px} +.couponzone_list ul li .coupon_info ul {padding:0;margin:0;position:relative;border:0} +.couponzone_list ul li .coupon_info li {width:auto;margin:0;float:inherit;color:#5e5e5e;line-height:18px} +.couponzone_list ul li .coupon_info li a {text-decoration:underline;color:#5e5e5e} +.couponzone_list ul li .coupon_info .coupon_info_cls {position:absolute;right:0;top:0;color:#c7c9cc;border:0;background:#fff;padding:10px;font-size:1.2em} + +.couponzone_list ul li .coupon_btn {text-align:center} +.couponzone_list ul li .coupon_btn .btn02 {width:100%;height:42px;line-height:28px;margin-top:15px;border:0;color:#fff;background:#3a8afd;border-radius:5px;font-weight:bold} +.couponzone_list ul li .coupon_btn .btn02:hover {background:#2176f1;color:#fff} +.couponzone_list ul li .coupon_btn .disabled {background:#c6c6c6;border:1px;color:#fff;border-color:#c6c6c6} +.couponzone_list ul li .coupon_btn .disabled:hover {background:#c6c6c6;border:1px;color:#fff;border-color:#c6c6c6} +.couponzone_list .no_coupon {position:relative;padding:100px 0;text-align:center;color:#999} diff --git a/skin/social/img/chk.png b/skin/social/img/chk.png new file mode 100644 index 000000000..2841a67f3 Binary files /dev/null and b/skin/social/img/chk.png differ diff --git a/skin/social/social_register_member.skin.php b/skin/social/social_register_member.skin.php index 8885783ed..b5363e79c 100644 --- a/skin/social/social_register_member.skin.php +++ b/skin/social/social_register_member.skin.php @@ -1,7 +1,7 @@ add_stylesheet('', 12); add_stylesheet('', 13); add_javascript('', 10); +add_javascript('', 14); +if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipin'] || $config['cf_cert_hp'])) + add_javascript('', 15); -$email_msg = $is_exists_email ? '등록할 이메일이 중복되었습니다.다른 이메일을 입력해 주세요.' : ''; +$email_msg = $is_exists_email ? '등록할 이메일이 중복되었습니다.다른 이메일을 입력해 주세요.' : ''; ?> - -
                      - - + + \ No newline at end of file diff --git a/skin/social/style.css b/skin/social/style.css index 75f0951e8..d331544fa 100644 --- a/skin/social/style.css +++ b/skin/social/style.css @@ -82,7 +82,7 @@ /*회원가입 */ #sns_register {margin:0 0 10px;padding:0;text-align:center;border-radius:3px} #sns_register:after {display:block;visibility:hidden;clear:both;content:""} -#sns_register h2 {float:left;display:inline-block;text-align:left;width:50%;height:56px;line-height:56px;padding:0 20px;font-size:1.2em} +#sns_register h2 {float:left;display:inline-block;text-align:left;width:50%;height:56px;padding:0 20px;font-size:1.2em;line-height: 4em;} #sns_register .sns-wrap {display:inline-block;float:left;width:50%;height:56px;line-height:53px;margin:0;text-align:right;padding:0 20px} #sns_register .sns-wrap:after {display:block;visibility:hidden;clear:both;content:""} #sns_register .sns-icon {display:inline-block;height:30px;line-height:30px;width:30px;margin:0 3px;text-align:right;color:#fff;border-radius:2px} @@ -95,6 +95,67 @@ #sns_register .sns-payco {background-color:#df0b00;background-position:0 0} #sns_register .txt {position:absolute;line-height:0;font-size:0;vertical-align:middle;overflow:hidden} + +/* 회원가입 약관 */ +.social_register {margin:0 auto} +.social_register:after {display:block;visibility:hidden;clear:both;content:""} +.social_register .btn_confirm .btn_submit, +.social_register .btn_confirm .btn_close {float:left;height:50px !important;width:49.5%;font-weight:bold;font-size:1.083em} +.social_register .btn_confirm {text-align:left} +.social_register .btn_confirm .btn_submit {margin-left:1%} + +#fregisterform p {position:relative;text-align:center;color:#fff;height:50px;line-height:50px;font-size:1.1em;background:#f2838f;margin:0 0 10px;border-radius:5px;font-weight:bold} +#fregisterform p:before {content:"";position:absolute;top:0;left:0;width:5px;height:50px;border-radius:5px 0 0 5px;background:#da4453} +#fregisterform p i {font-size:1.2em;vertical-align:middle} +#fregisterform section {margin:10px auto 15px;border:1px solid #dde7e9;position:relative;border-radius:3px} +#fregister_chkall {position:relative;text-align:center;background:#f5f7fa;line-height:50px;border:1px solid #e5e9f0;border-radius:3px;margin-bottom:15px} +#fregisterform h2 {text-align:left;padding:20px;border-bottom:1px solid #dde7e9;font-size:1.2em} +#fregisterform textarea {display:block;padding:20px;width:100%;height:150px;background:#fff;border:0;line-height:1.6em} +#fregister_private {position:relative} +#fregister_private div {padding:20px;background:#fff} +#fregister_private table {width:100%;border-collapse:collapse;font-size:1em;} +#fregister_private table caption {position:absolute;font-size:0;line-height:0;overflow:hidden} +#fregister_private table th {background:#f7f7f9;width:33.33%;color:#000;padding:10px;border:1px solid #d8dbdf} +#fregister_private table td {border:1px solid #e7e9ec;padding:10px;border-top:0} + +.fregister_agree {position:absolute;top:0;right:0} +.fregister_agree input[type="checkbox"] + label {color:#676e70} +.fregister_agree input[type="checkbox"] + label:hover {color:#2172f8} +.fregister_agree input[type="checkbox"] + label span {position:absolute;top:20px;right:15px;width:17px;height:17px;display:block;background:#fff;border:1px solid #999;border-radius:3px} +.fregister_agree input[type="checkbox"]:checked + label {color:#000} +.fregister_agree input[type="checkbox"]:checked + label span {background:url('./img/chk.png') no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} +.fregister_agree.chk_all input[type="checkbox"] + label span {top:18px} + +.chk_li {padding-left:20px} + +#sns_register .login-sns, +#sns_register h2 {border:0 !important} + +/* 회원가입 입력 */ +#register_form {background:#fff;margin-bottom:20px} +#register_form h2 {padding:20px;border-bottom:1px solid #dde7e9} +.register_form_inner {background:#f7f7f7;border:1px solid #dde7e9;border-radius:3px} +.register_form_inner ul {padding:20px} +.register_form_inner label {display:block;margin-bottom:10px;line-height:24px} +.register_form_inner label.inline {display:inline} + +#fregisterform .cert_desc {color:#3a8afd;} +#fregisterform .cert_req {margin-left:5px;line-height:35px;} +#fregisterform #msg_certify {margin:5px 0;padding:5px;border:1px solid #dbecff;background:#eaf4ff;text-align:center} +#fregisterform .frm_address {margin:5px 0 0} +#fregisterform #mb_addr3 {display:inline-block;margin:5px 0 0;vertical-align:middle} +#fregisterform #mb_addr_jibeon {display:block;margin:5px 0 0} +#fregisterform .btn_confirm {text-align:center} +#fregisterform .form_01 div {margin:0 0 20px} +#fregisterform .captcha {display:block;margin:5px 0 0} +#fregisterform .reg_mb_img_file img {max-width:100%;height:auto} +#reg_mb_icon, #reg_mb_img {float:right} + +.tooltip_icon {display:inline-block;vertical-align:baseline;color:#b3b5b8;border:0;font-size:1.4em;background:transparent;cursor:pointer} +.tooltip_icon:hover {color:#448bf5} +.tooltip {position:relative;width:auto;color:#fff;background:#000;padding:10px;font-size:small;line-height:18px;display:none;position:absolute;z-index:9;font-weight:normal;margin-left:15px;margin-top:10px} +.tooltip:before {content:"";position:absolute;top:0;left:-10px;width:0;height:0;border-style:solid;border-top:0px solid transparent;border-bottom:10px solid transparent;border-left:0;border-right:10px solid #000} + /*기존 계정에 연결하기*/ /* Styles for Accordion */ @@ -109,7 +170,7 @@ .mbskin .toggle .toggle-title.active .right_i i {background:url("./img/plus_minus.png") 0 0 no-repeat} .mbskin .all_agree {position:relative;display:block;margin-bottom:6px;background:#fff;border:1px solid #c6cacc;border-top:0;padding:13px 15px;line-height:20px} -#register_member .sns_tbl {background:#fff;margin:10px 0;border:1px solid #c6cacc} +.sns_tbl {background:#fff;margin:10px 0;border:1px solid #c6cacc} .sns_tbl table {border:0} .sns_tbl caption {padding:0 20px;line-height:45px;font-size:1.083em;border-bottom:1px solid #e2e2e2;color:#253dbe;background:#fcfcfc} .sns_tbl th {width:100px;text-align:right;padding:10px} @@ -135,11 +196,11 @@ #sns-link-pnl .connect-fg .connect-desc {margin:0 0 10px;padding:15px;border:1px solid #d6e9c6;background:#dff0d8;color:#3c763d} #sns-link-pnl .connect-fg .connect-title {margin-top:25px;margin-bottom:10px;font-size:1.667em;font-weight:bold;text-align:center} -.mbskin .member_connect:after {display:block;visibility:hidden;clear:both;content:""} -.mbskin .member_connect {margin-top:80px;background:#d9d9d9;border-radius:3px;padding:10px;text-align:left} -.mbskin .member_connect .strong {font-size:1em;font-weight:bold;margin:0 0 10px} -.mbskin .member_connect button {color:#fff;border:0;padding:6px 20px 7px;border:1px solid #6446e7;font-weight:bold;background:#6f50e7;border-radius:3px;font-size:0.91em} -.mbskin .member_connect button:hover {background:#6446e7} +.member_connect:after {display:block;visibility:hidden;clear:both;content:""} +.member_connect {margin-top:80px;background:#d9d9d9;border-radius:3px;padding:10px;text-align:left} +.member_connect .strong {font-size:1em;font-weight:bold;margin:0 0 10px} +.member_connect button {color:#fff;border:0;padding:6px 20px 7px;border:1px solid #6446e7;font-weight:bold;background:#6f50e7;border-radius:3px;font-size:0.91em} +.member_connect button:hover {background:#6446e7} html.remodal-is-locked {overflow-y:scroll !important} diff --git a/skin/visit/shop_basic/style.css b/skin/visit/shop_basic/style.css new file mode 100644 index 000000000..a8b4436f9 --- /dev/null +++ b/skin/visit/shop_basic/style.css @@ -0,0 +1,12 @@ +@charset "utf-8"; + +/* 방문자 집계 */ +#visit {position:relative} +#visit .btn_admin {position:absolute;top:0;right:20px;height:25px;line-height:25px;padding:0 5px;border-radius:3px} +#visit h2 {font-size:1.2em;margin-bottom:20px;text-align:left;color:#fff;position:relative} +#visit dl {padding:10px 0} +#visit dl:after {display:block;visibility:hidden;clear:both;content:""} +#visit dt {float:left;width:50%;text-align:left;line-height:23px;height:23px;color:#e3e3e3} +#visit dt span {display:inline-block;width:5px;height:5px;border-radius:50%;vertical-align:middle;margin-right:10px;background:#3a8afd} +#visit dd {float:left;width:50%;padding:0 5px;text-align:right;text-align:right;font-weight:bold;line-height:23px;height:23px;font-size:0.92em} +#visit dd strong {display:inline-block;padding:0 5px;border-radius:20px;line-height:15px;color:#fff} diff --git a/skin/visit/shop_basic/visit.skin.php b/skin/visit/shop_basic/visit.skin.php new file mode 100644 index 000000000..8d42edd72 --- /dev/null +++ b/skin/visit/shop_basic/visit.skin.php @@ -0,0 +1,25 @@ +', 0); +?> + + +
                      +

                      접속자집계

                      +
                      +
                      오늘
                      +
                      +
                      어제
                      +
                      +
                      최대
                      +
                      +
                      전체
                      +
                      +
                      + 관리자 +
                      + \ No newline at end of file diff --git a/theme/basic/css/default.css b/theme/basic/css/default.css index 3f6107dc7..9efda9dce 100644 --- a/theme/basic/css/default.css +++ b/theme/basic/css/default.css @@ -86,6 +86,14 @@ border:1px solid #558ab7 !important; #hd_sch #sch_stx {float:left;width:385px;height:45px;padding-left:10px;border-radius:30px 0 0 30px;background:#2c2c2c;border:0;border-right:0;font-size:1.25em;color:#fff} #hd_sch #sch_submit {float:left;width:60px;height:45px;border:0;background:#2c2c2c;color:#fff;border-radius:0 30px 30px 0;cursor:pointer;font-size:16px} +#hd_define {float:left} +#hd_define:after {display:block;visibility:hidden;clear:both;content:""} +#hd_define li {float:left;font-size:1.083em;line-height:14px;border-right:1px solid #4a4a4a;position:relative;text-align:center;margin:15px 10px 15px 0;padding-right:10px} +#hd_define li:last-child {padding-right:0;margin-right:0;border-right:0} +#hd_define li a {display:inline-block;color:#919191} +#hd_define li.active a {color:#fff} + + #hd_qnb {float:right;text-align:right} #hd_qnb:after {display:block;visibility:hidden;clear:both;content:""} #hd_qnb li {float:left;font-size:1.083em;line-height:14px;border-right:1px solid #4a4a4a;position:relative;text-align:center;margin:15px 10px 15px 0;padding-right:10px} @@ -158,10 +166,10 @@ box-shadow:0 2px 5px rgba(0,0,0,0.2)} /* 중간 레이아웃 */ #wrapper {} #container_wr:after {display:block;visibility:hidden;clear:both;content:""} -#container_wr {margin:0 auto;height:100%;zoom:1} +#container_wr {margin:0 auto;zoom:1} #aside {float:right;width:235px;padding:0;height:100%;margin:20px 0 20px 20px} -#container {position:relative;float:left;min-height:500px;height:auto !important;margin:20px 0;height:500px;font-size:1em;width:930px;zoom:1} +#container {position:relative;float:left;min-height:500px;height:auto !important;margin:20px 0;font-size:1em;width:930px;zoom:1} #container:after {display:block;visibility:hidden;clear:both;content:""} #container_title {font-size:1.333em;margin:0 auto;font-weight:bold} #container_title span {margin:0 auto 10px;display:block;line-height:30px} @@ -395,7 +403,8 @@ box-shadow:0 1px 10px rgba(0,0,0,.1)} .new_win .new_win_con2 {margin:20px 0} .new_win .btn_confirm:after {display:block;visibility:hidden;clear:both;content:""} .new_win .win_btn {text-align:center} -.new_win .btn_close {height:45px;width:60px;overflow:hidden;cursor:pointer} +.new_win .cert_btn {margin-bottom:30px;text-align:center} +.new_win .btn_close {padding:0 20px;height:45px;overflow:hidden;cursor:pointer} .new_win .btn_submit {padding:0 20px;height:45px;font-weight:bold;font-size:1.083em} /* 검색결과 색상 */ diff --git a/theme/basic/css/default_shop.css b/theme/basic/css/default_shop.css new file mode 100644 index 000000000..69919d158 --- /dev/null +++ b/theme/basic/css/default_shop.css @@ -0,0 +1,1282 @@ +@charset "utf-8"; + +/* 초기화 */ +html {overflow-y:scroll} +body {margin:0;padding:0;font-size:0.75em;font-family:'Malgun Gothic', dotum, sans-serif} +html, h1, h2, h3, h4, h5, h6, form, fieldset, img {margin:0;padding:0;border:0} +h1, h2, h3, h4, h5, h6 {font-size:1em;font-family:'Malgun Gothic', dotum, sans-serif} +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {display:block} +ul {margin:0;padding:0;list-style:none} +ol,li,dl,dt,dd {margin:0;padding:0} +legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} +label, input, button, select, img {vertical-align:middle} +input, button {margin:0;padding:0;font-family:'Malgun Gothic', dotum, sans-serif;font-size:1em} +button {cursor:pointer} +textarea, select {font-family:'Malgun Gothic', dotum, sans-serif;font-size:1em} +select {margin:0} +p {margin:0;padding:0;word-break:break-all} +hr {display:none} +pre {overflow-x:scroll;font-size:1.1em} +a {color:#000;text-decoration:none} + +*, :after, :before { +-webkit-box-sizing:border-box; +-moz-box-sizing:border-box; +box-sizing:border-box; +} + +input[type=text],input[type=password], textarea { +-webkit-transition:all 0.30s ease-in-out; +-moz-transition:all 0.30s ease-in-out; +-ms-transition:all 0.30s ease-in-out; +-o-transition:all 0.30s ease-in-out; +outline:none; +} + +input[type=text]:focus,input[type=password]:focus, textarea:focus,select:focus { +-webkit-box-shadow:0 0 5px #9ed4ff; +-moz-box-shadow:0 0 5px #9ed4ff; +box-shadow:0 0 5px #9ed4ff; +border:1px solid #558ab7 !important; +} + +.placeholdersjs {color:#aaa !important} +#hd, #wrapper, #ft {min-width:1200px} + +#hd_pop, +#hd_wrapper, +#tnb .inner, + +#gnb .gnb_wrap, +#container_wr, +#ft_wr {width:1200px} + +/* 팝업레이어 */ +#hd_pop {z-index:1000;position:relative;margin:0 auto;width:1200px;height:0} +#hd_pop h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.hd_pops {position:absolute;border:1px solid #e9e9e9;background:#fff} +.hd_pops img {max-width:100%} +.hd_pops_con {} +.hd_pops_footer {padding:0;background:#000;color:#fff;text-align:left;position:relative} +.hd_pops_footer:after {display:block;visibility:hidden;clear:both;content:""} +.hd_pops_footer button {padding:10px;border:0;color:#fff} +.hd_pops_footer .hd_pops_reject {background:#000;text-align:left} +.hd_pops_footer .hd_pops_close {background:#393939;position:absolute;top:0;right:0} + +/* 상단 레이아웃 */ +#hd {background:#212020} +#hd_h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#hd_wrapper {position:relative;margin:0 auto} +#hd_wrapper:after {display:block;visibility:hidden;clear:both;content:""} + +#logo {float:left;padding:30px 0 0} +.hd_sch_wr {float:left;padding:30px 0;width:445px;margin-left:65px} +#hd_sch h3 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#hd_sch {border-radius:30px;overflow:hidden} +#hd_sch #sch_str {float:left;width:385px;height:45px;padding-left:15px;border-radius:30px 0 0 30px;background:#2c2c2c;border:0;border-right:0;font-size:1.2em;color:#fff} +#hd_sch #sch_submit {float:left;width:60px;height:45px;border:0;background:#2c2c2c;color:#fff;border-radius:0 30px 30px 0;cursor:pointer;font-size:16px} + +#tnb {border-bottom:1px solid #383838;margin:0 auto} +#tnb:after {display:block;visibility:hidden;clear:both;content:""} +#tnb .inner {margin:0 auto} + +#hd_define {float:left} +#hd_define:after {display:block;visibility:hidden;clear:both;content:""} +#hd_define li {float:left;font-size:1.083em;line-height:14px;border-right:1px solid #4a4a4a;position:relative;text-align:center;margin:15px 10px 15px 0;padding-right:10px} +#hd_define li:last-child {padding-right:0;margin-right:0;border-right:0} +#hd_define li a {display:inline-block;color:#919191} +#hd_define li.active a {color:#fff} + +#hd_qnb {float:right;text-align:right} +#hd_qnb:after {display:block;visibility:hidden;clear:both;content:""} +#hd_qnb li {float:left;font-size:1.083em;line-height:14px;border-right:1px solid #4a4a4a;position:relative;text-align:center;margin:15px 10px 15px 0;padding-right:10px} +#hd_qnb li:last-child {padding-right:0;margin-right:0;border-right:0} +#hd_qnb li a {display:inline-block;color:#919191} + +.hd_login {position:absolute;right:0;top:45px} +.hd_login>li {float:left;position:relative;margin:0 5px} +.hd_login>li.login a {color:#3a8afd;padding:10px;border-radius:3px;border:1px solid #3a8afd} +.hd_login>li a {color:#fff} +.hd_login>li.shop_login {margin-top:-15px} +.hd_login .fa-shopping-cart {font-size:1.6em} +.hd_login .count {display:inline-block;position:absolute;top:-5px;right:-10px;line-height:12px;padding:0 5px;border-radius:10px;background:#ff1a21;color:#fff;min-width:16px;height:14px;font-size:0.85em} + +#hd_menu {position:relative;background:#000;width:1200px;margin:0 auto} +#hd_menu:after {display:block;visibility:hidden;clear:both;content:""} +#hd_menu button#menu_open {float:left;width:265px;height:50px;border:0;background:#3a8afd;text-align:left;color:#fff;padding:0 20px;font-weight:bold;font-size:1.167em} +.hd_menu {float:left;display:inline-block;width:935px;font-size:1.083em} +.hd_menu:after {display:block;visibility:hidden;clear:both;content:""} +.hd_menu li {float:left;width:20%;padding:12px 0;line-height:26px;text-align:center} +.hd_menu li:last-child a {border-right:0} +.hd_menu li a {display:block;color:#fff;border-right:1px solid #333} + + +/*사이드 메뉴*/ +#side_menu {height:100%;position:fixed;top:0;right:0;background:#fff;border-left:1px solid #e5e7ea;z-index:120;padding-left:50px;-webkit-box-shadow:0 1px 5px #d6d6d6; +-moz-box-shadow:0 1px 5px #d6d6d6; +box-shadow:0 1px 5px #d6d6d6} + +#quick {position:absolute;top:50%;left:0;width:50px;margin-top:-157.5px} +#quick li {position:relative} +#quick li button {width:50px;height:50px;border:0;font-size:1.325em;background:#fff;color:#495057} +#quick .qk_tit {display:none;position:absolute;top:12px;right:60px;white-space:pre;padding:0 15px;line-height:30px;background:#8b929c;color:#fff;font-size:0.75em;border-radius:5px} +#quick .qk_tit:after {content:"";position:absolute;top:10px;right:-8px;display:inline-block;width:0;height:0;border-style:solid;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #8b929c;color:transparent} +#quick li:hover .qk_tit {display:block} + +#tabs_con {height:100%;text-align:left} + +.side_mn_wr1 {display:none;width:230px;overflow-y:auto;height:100%} +.side_mn_wr2 {display:none;width:230px;overflow-y:auto;height:100%} +.side_mn_wr3 {display:none;width:230px;overflow-y:auto;height:100%} +.side_mn_wr4 {display:none;width:230px;overflow-y:auto;height:100%} +.btn_sm_on i {color:#3a8afd} + +.qk_con {display:none;position:relative;width:230px;height:100%;background:#fff;border-left:1px solid #f0f0f0} +.qk_con h2.s_h2 {position:relative;margin:0;font-size:1.25em;padding:15px;border-bottom:1px solid #e5e7ea} +.qk_con h2.s_h2 span {display:inline-block;min-width:20px;padding:2px 8px;border-radius:30px;text-align:center;background:#eff5ff;color:#3b8afc;font-size:0.7em;font-weight:normal;vertical-align:text-bottom} +.qk_con_wr {padding:0;height:100%;overflow-y:auto} +.qk_con_wr .btn_side_shop {position:relative;width:100%;height:30px;background:none;border:0;text-align:left;font-weight:bold} +.qk_con_wr .btn_side_shop span {position:absolute;top:5px;right:0;padding:0 5px;line-height:20px;border-radius:10px;color:#fff;background:#ed1c24} +.qk_con_wr .con_close {position:fixed;top:0;right:230px;width:50px;height:50px;border:0;background:none;font-size:25px;color:#dedede} +.qk_con_wr .con_close:hover {color:rgba(0,0,0,0.8)} +.qk_con_wr .side_tnb {padding:25px} +.qk_con_wr .side_tnb li a {display:block;line-height:28px;color:#465168;padding:5px 0} +.qk_con_wr .side_tnb li:hover a {color:#3a8afd} + +#category {display:none;position:absolute;border:1px solid #c5d6da;width:100%;background:#fff;z-index:1000;-webkit-box-shadow:0 2px 5px rgba(0,0,0,0.2); +-moz-box-shadow:0 2px 5px rgba(0,0,0,0.2); +box-shadow:0 2px 5px rgba(0,0,0,0.2)} +#category h2 {font-size:1.3em;padding:15px 20px;border-bottom:1px solid #e7eeef} +#category ul:after {display:block;visibility:hidden;clear:both;content:""} +#category ul li:nth-child(5n+1) {border-left:0} +#category .cate_li_1 {float:left;width:20%;min-height:150px;padding:20px;border-left:1px solid #e7eeef} +#category .cate_li_1_a {font-size:1.2em;display:block;position:relative;margin-bottom:10px;font-weight:bold;color:#3a8afd} +#category .cate_li_2 {line-height:2em} +#category .cate_li_2 a {color:#555} +#category .close_btn {position:absolute;top:0;right:0;width:50px;height:50px;background:#fff;color:#b6b9bb;border:0;vertical-align:top;font-size:18px} +#category_all_bg {display:none;background:rgba(0,0,0,0.1);width:100%;height:100%;position:fixed;left:0;top:0;z-index:999} +#category .no-cate{text-align:center;padding:15px} + + +/* 중간 레이아웃 */ +/* #wrapper {z-index:5;margin:0 auto;width:1200px;position:relative} */ +#wrapper {z-index:5;position:relative;width:100%;background:#f6f6f6} +#wrapper.is_community{background:#fff} +#wrapper:after {display:block;visibility:hidden;clear:both;content:""} +#wrapper_title {padding:20px 0;font-size:2em;font-weight:bold} + +.lt_wr {width:49%} +.lt_wr:nth-child(2n+1) {clear:both} + +/* aside + wrapper */ +#aside {position:absolute;top:0;left:0;margin:0 10px 0 0;width:265px} +#side_pd {position:relative;border:1px solid #dde7e9;background:#fff;border-radius:3px;margin-bottom:15px} +#side_pd h2 {border-bottom:1px solid #e8e8e8;padding:15px} +#side_pd .bx-wrapper {padding-bottom:10px;height:400px;overflow:hidden} +#side_pd .bx-controls {display:inline-block;position:absolute;right:10px;top:12px} +#side_pd .bx-prev {display:inline-block;width:20px;height:20px;text-indent:-9999em;background:url('../img/btn_prev.png') no-repeat} +#side_pd .bx-next {display:inline-block;width:20px;height:20px;text-indent:-9999em;background:url('../img/btn_next.png') no-repeat} + +#container {position:relative;margin:0 auto;width:1200px;min-height:500px;height:auto !important} +#container:after {display:block;visibility:hidden;clear:both;content:""} +#container .shop-content {position:relative;padding:1px 0} +#container .is_index {margin-left:285px} +.shop-content #bo_v{margin-top:20px} + +#idx_hit {overflow:hidden} +#idx_hit:after {display:block;visibility:hidden;clear:both;content:""} +#idx_hit .owl-prev {position:absolute;top:50%;left:0;width:36px;height:36px;margin-top:-20px;text-indent:-9999em;background:url('../img/btn_idx_left.png') no-repeat} +#idx_hit .owl-next {position:absolute;top:50%;right:0;width:36px;height:36px;margin-top:-20px;text-indent:-9999px;background:url('../img/btn_idx_right.png') no-repeat} + + +.sale_prd h2 {font-size:1.167em;margin:20px 0 10px} +.st_bg {display:inline-block;width:1px;height:10px;margin:0 10px;background:#e2e1e0;vertical-align:-1px} + +/* 텍스트 크기 조절 */ +#text_size {display:none;position:absolute;top:-31px;left:-1px} +#text_size button {padding:0 10px;height:30px;border:1px solid #cfded8;border-bottom:0;background:#000;color:#fff;cursor:pointer} + +/* 하단 레이아웃 */ +#ft {background:#212020;margin:0 auto;text-align:center} +#ft h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#ft_wr {max-width:1240px;margin:0;padding:40px 0;position:relative;display:inline-block;text-align:left} +#ft_wr:after {display:block;visibility:hidden;clear:both;content:""} +#ft_wr .ft_cnt {width:25%;float:left;padding:0 20px} + +#ft_link {text-align:left} +#ft_link a {display:block;color:#fff;line-height:2em;font-weight:bold} +#ft_company h2 {font-size:1.2em;margin-bottom:20px} +#ft_company {font-weight:normal;color:#e3e3e3;line-height:2em} +#ft_catch {margin:20px 0 10px} +#ft_copy {text-align:center;width:1200px;margin:0 auto;padding:20px 0;color:#5b5b5b;font-size:0.92em;border-top:1px solid #383838} +#top_btn {position:absolute;bottom:0;left:0;border:0;border-top:1px solid #e5e7ea;margin-top:-25px;width:50px;height:50px;background:none;font-size:20px;color:#dedede} +#top_btn:hover {border-color:#3059c7;background:#3059c7;color:#fff} + +/* 쇼핑몰 회원가입 */ +#container .register{margin-bottom:30px} +#register_form .register_form_inner{background:#fff} +.register #register_form{background-color:initial} + +/* 쇼핑몰 비회원 주문조회 */ +#mb_login_od_wr {margin:20px auto 0;border:1px solid #dde7e9;width:360px;background:#fff;text-align:center} +#mb_login_od_wr h2 {font-size:1.25em;margin:20px 0 10px} +/*#mb_login_od_wr #mb_login_od {padding:0 35px}*/ +#mb_login_od_wr .frm_input {width:100%;margin:10px 0 0} +#mb_login_od_wr .btn_submit {width:100%;margin:10px 0 0;height:45px;font-weight:bold;font-size:1.25em} +#mb_login_od_wr p {background:#f3f3f3;margin:20px 0 0;padding:15px 20px;line-height:1.5em} + +#mb_login #sns_login {margin-top:0;border-color:#edeaea;padding:25px} +#mb_login #sns_login:after {display:block;visibility:hidden;clear:both;content:""} +#mb_login #sns_login h3 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#mb_login #sns_login .sns-wrap {margin:0 !important} +#mb_login #sns_login .sns-icon {width:49% !important;float:left !important} +#mb_login #sns_login .sns-icon:nth-child(odd) {margin-right:2%} +#mb_login #sns_login .txt {font-size:0.95em;padding-left:5px !important;border-left:0 !important} + +/*쇼핑몰 비회원 구매*/ +#mb_login_notmb {width:360px;margin:30px auto;padding:20px 30px;background:#fff;border:1px solid #dde7e9} +#mb_login_notmb h2 {font-size:1.25em;margin:10px 0;text-align:center} +#mb_login_notmb p {text-align:left} +#mb_login_notmb label {text-align:left} +#guest_privacy {border:1px solid #ccc;text-align:left;line-height:1.6em;color:#666;background:#fafafa;padding:10px;height:150px;margin:10px 0;overflow-y:auto} +#mb_login_notmb .btn_submit {display:block;text-align:center;margin-top:10px;line-height:45px} + +/* 쇼핑몰 로그인 */ +.mb_log_cate h2 {width:50%;float:left;padding:20px 0;text-align:center} +.mb_log_cate .join {width:50%;float:left;padding:20px 0;text-align:center;background:#f7f7f7;color:#6e6e6e} +.mb_log_cate:after {display:block;visibility:hidden;clear:both;content:""} +.mbskin .chk_box input[type="checkbox"] + label span{position:relative} + +/* 새글 */ +.is_community .tbl_head01 td {color:#666;padding:10px 5px;border-top:1px solid #ecf0f1;border-bottom:1px solid #ecf0f1;border-left:0 none;line-height:1.4em;height:60px;word-break:break-all} + +/* 글쓰기 및 글보기 */ +.is_community .chk_box input[type="checkbox"] + label span{top:2px;left:0} +.is_community .bo_fx{margin-bottom:20px} + +/* 화면낭독기 사용자용 */ +#hd_login_msg {position:absolute;top:0;left:0;width:1px;height:1px;overflow:hidden} +.msg_sound_only, .sound_only {display:inline-block !important;position:absolute;top:0;left:0;margin:0 !important;padding:0 !important;font-size:0;line-height:0;border:0 !important;overflow:hidden !important} + +/* 본문 바로가기 */ +#skip_to_container a {z-index:100000;position:absolute;top:0;left:0;width:1px;height:1px;font-size:0;line-height:0;overflow:hidden} +#skip_to_container a:focus, #skip_to_container a:active {width:100%;height:75px;background:#21272e;color:#fff;font-size:2em;font-weight:bold;text-align:center;text-decoration:none;line-height:3.3em} + +/* 이미지 등비율 리사이징 */ +.img_fix {width:100%;height:auto} + +/* 캡챠 자동등록(입력)방지 기본 -pc */ +#captcha {display:inline-block;position:relative} +#captcha legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} +#captcha #captcha_img {height:40px;border:1px solid #898989;vertical-align:top;padding:0;margin:0} +#captcha #captcha_mp3 {margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;background:url('../../../img/captcha2.png') no-repeat;text-indent:-999px;border-radius:3px} +#captcha #captcha_reload {margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;background:url('../../../img/captcha2.png') no-repeat 0 -40px;text-indent:-999px;border-radius:3px} +#captcha #captcha_key {margin:0 0 0 3px;padding:0 5px;width:90px;height:40px;border:1px solid #ccc;background:#fff;font-size:1.333em;font-weight:bold;text-align:center;border-radius:3px;vertical-align:top} +#captcha #captcha_info {display:block;margin:5px 0 0;font-size:0.95em;letter-spacing:-0.1em} + +/* ckeditor 단축키 */ +.cke_sc {margin:0 0 5px;text-align:right} +.btn_cke_sc {display:inline-block;padding:0 10px;height:23px;border:1px solid #ccc !important;background:#fafafa !important;color:#000 !important;text-decoration:none !important;line-height:1.9em;vertical-align:middle} +.cke_sc_def {margin:0 0 5px;padding:10px;border:1px solid #ccc;background:#f2f5f9;text-align:center} +.cke_sc_def dl {margin:0 0 5px;text-align:left} +.cke_sc_def dl:after {display:block;visibility:hidden;clear:both;content:""} +.cke_sc_def dt, .cke_sc_def dd {float:left;margin:0;padding:5px 0;border-bottom:1px solid #e9e9e9} +.cke_sc_def dt {width:20%;font-weight:bold} +.cke_sc_def dd {width:30%} + +/* ckeditor 태그 기본값 */ +#bo_v_con ul {display:block;list-style-type:disc;margin-top:1em;margin-bottom:1em;margin-left:0;margin-right:0;padding-left:40px} +#bo_v_con ol {display:block;list-style-type:decimal;margin-top:1em;margin-bottom:1em;margin-left:0;margin-right:0;padding-left:40px} +#bo_v_con li {display:list-item} + +/* Mobile화면으로 */ +#mobile_cng {display:block;margin:0.3em;padding:0.5em 0;border:1px solid #eee;border-radius:2em;background:#fff;color:#000;font-size:2em;text-decoration:none;text-align:center} + +/* 목록 바로가기 */ +.sanchor {margin:30px 0 20px;padding:0} +.sanchor:after {display:block;visibility:hidden;clear:both;content:""} +.sanchor li {float:left;width:20%;text-align:center;list-style:none} +.sanchor li a {display:block;position:relative;height:60px;margin-left:-1px;background-color:#f7f7f7;border:1px solid #cdcdcd;border-bottom:1px solid #000;font-size:1.25em;color:#666;line-height:58px;text-align:center;z-index:1} +.sanchor li .sanchor_on {margin:0 0 0 -1px;border:1px solid #000;background:#fff;z-index:2;border-bottom-color:#fff;color:#000;font-weight:bold} +.sanchor li a .item_qa_count,.sanchor li a .item_use_count {display:inline-block;background:#aaa;padding:0 5px;line-height:23px;border-radius:15px;color:#fff;min-width:23px;font-size:12px} +.sanchor li .sanchor_on .item_qa_count,.sanchor li .sanchor_on .item_use_count {background:#55bfb1} + +/* 콘텐츠별 스타일 */ +.cnt_cmt {display:inline-block;margin:0 0 0 3px;font-weight:bold} + +/* 버튼 */ +a.btn,.btn {line-height:35px;height:35px;padding:0 10px;text-align:center;font-weight:bold;border:0;font-size:1.4em; +-webkit-transition:background-color 0.3s ease-out; +-moz-transition:background-color 0.3s ease-out; +-o-transition:background-color 0.3s ease-out; +transition:background-color 0.3s ease-out} + +a.btn01 {display:inline-block;padding:7px;border:1px solid #bababa;border-radius:3px;background:#fff;color:#717171;text-decoration:none;vertical-align:middle} +a.btn01:focus, a.btn01:hover {text-decoration:none} +button.btn01 {display:inline-block;margin:0;padding:7px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none} +a.btn02 {display:inline-block;padding:7px;background:#3a8afd;color:#fff;border-radius:3px;text-decoration:none;vertical-align:middle} +a.btn02:focus, .btn02:hover {text-decoration:none} +button.btn02 {display:inline-block;margin:0;padding:7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none} + +.btn_confirm {text-align:center} /* 서식단계 진행 */ + +.btn_submit {border:1px solid #1c70e9;background:#3a8afd;color:#fff;cursor:pointer;border-radius:3px} +.btn_submit:hover {background:#2375eb} +.btn_close {border:1px solid #dcdcdc;cursor:pointer;border-radius:3px;background:#fff} +a.btn_close {text-align:center;line-height:50px} + +a.btn_cancel {display:inline-block;background:#969696;color:#fff;text-decoration:none;vertical-align:middle} +button.btn_cancel {display:inline-block;background:#969696;color:#fff;text-decoration:none;vertical-align:middle} +.btn_cancel:hover {background:#aaa} +a.btn_frmline, button.btn_frmline {display:inline-block;width:128px;padding:0 5px;height:40px;border:0;background:#434a54;border-radius:3px;color:#fff;text-decoration:none;vertical-align:top} /* 우편번호검색버튼 등 */ +a.btn_frmline {} +button.btn_frmline {font-size:1em} +a.btn_frmline {line-height:24px} + +/* 게시판용 버튼 */ +a.btn_b01,.btn_b01 {display:inline-block;color:#bababa;text-decoration:none;vertical-align:middle;border:0;background:transparent} +.btn_b01:hover, .btn_b01:hover {color:#000} +a.btn_b02,.btn_b02 {display:inline-block;background:#253dbe;padding:0 10px;color:#fff;text-decoration:none;border:0;vertical-align:middle} +a.btn_b02:hover, .btn_b02:hover {background:#0025eb} +a.btn_b03, .btn_b03 {display:inline-block;background:#fff;border:1px solid #b9bdd3;color:#646982;text-decoration:none;vertical-align:middle} +a.btn_b03:hover, .btn_b03:hover {background:#ebedf6} +a.btn_b04, .btn_b04 {display:inline-block;background:#fff;border:1px solid #ccc;color:#707070;text-decoration:none;vertical-align:middle} +a.btn_b04:hover, .btn_b04:hover {color:#333;background:#f9f9f9} +a.btn_admin,.btn_admin {display:inline-block;color:#d13f4a;text-decoration:none;vertical-align:middle} /* 관리자 전용 버튼 */ +.btn_admin:hover, a.btn_admin:hover {color:#ff3746} + +/* 선택수정 버튼 */ +.btn_list {margin:0 auto;width:93%} +.btn_list input, .btn_list button {background:none repeat scroll 0 0 #617D46;border:0 none;color:#FFFFFF;height:28px;line-height:2.2em;padding:0 15px;vertical-align:middle} + +/* 기본테이블 */ +.tbl_wrap table {width:100%;border-collapse:collapse;border-spacing:0} +.tbl_wrap caption {padding:10px 0;font-weight:bold;text-align:left} + +.tbl_head01 {margin:0 0 10px} +.tbl_head01 table {} +.tbl_head01 caption {padding:0;font-size:0;line-height:0;overflow:hidden} +.tbl_head01 thead th {padding:12px 0;border-top:2px solid #000;border-bottom:1px solid #d3d3d3;background:#fff;color:#383838;font-size:0.95em;text-align:center;letter-spacing:-0.1em} +.tbl_head01 thead a {color:#383838} +.tbl_head01 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head01 tfoot th, .tbl_head01 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center} +.tbl_head01 tbody th {padding:10px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head01 td {padding:15px 5px;border-top:1px solid #f3f3f3;border-left:1px solid #f3f3f3;line-height:1.5em;word-break:break-all} +.tbl_head01 td:first-child {border-left:0} +.tbl_head01 a {} + +.tbl_head02 {margin:0 0 10px} +.tbl_head02 caption {padding:0;font-size:0;line-height:0;overflow:hidden} +.tbl_head02 thead th {padding:7px;background:#f3f3f3;border-top:1px solid #d3d3d3;border-bottom:1px solid #d3d3d3} +.tbl_head02 thead a {color:#383838} +.tbl_head02 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head02 tfoot th, .tbl_head02 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center} +.tbl_head02 tbody th {padding:5px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head02 td {padding:5px 3px;border-bottom:1px solid #e9e9e9;line-height:1.4em;word-break:break-all} +.tbl_head02 a {} + +.tbl_head03 {margin:0 0 10px} +.tbl_head03 table {border-bottom:1px solid #d3d3d3} +.tbl_head03 caption {padding:0;font-size:0;line-height:0;overflow:hidden} +.tbl_head03 thead th {padding:20px 0;border-top:2px solid #959da6;border-bottom:1px solid #d3d3d3;color:#383838;font-size:1.2em;text-align:center;letter-spacing:-0.1em} +.tbl_head03 thead a {color:#383838} +.tbl_head03 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head03 tfoot th, .tbl_head03 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center} +.tbl_head03 tbody th {padding:10px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head03 td {background:#fff;background-clip:padding-box;padding:25px 15px;border-top:1px solid #ccd2d9;border-left:1px solid #f6f6f6;line-height:1.5em;word-break:break-all} +.tbl_head03 td:first-child {border-left:0} +.tbl_head03 a {} + +/* 폼 테이블 */ +.tbl_frm01 {margin:0 0 20px} +.tbl_frm01 table {width:100%;border-collapse:collapse;border-spacing:0} +.tbl_frm01 th {width:90px;padding:5px 10px;background:none;text-align:right;font-weight:normal} +.tbl_frm01 td {padding:5px 10px;background:transparent} +.wr_content textarea, +.tbl_frm01 textarea, +.form_01 textarea, +.frm_input {border:1px solid #d0d3db;background:#fff;color:#000;vertical-align:middle;border-radius:3px;padding:5px; +-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)} +.tbl_frm01 textarea {padding:2px 2px 3px} +.frm_input {height:45px} + +.full_input, .frm_address {width:100%} +.half_input {width:49.5%} +.tbl_frm01 textarea {width:100%;height:100px} +.tbl_frm01 a {text-decoration:none} +.tbl_frm01 .frm_address {margin-top:5px} +.tbl_frm01 .frm_file {display:block;margin-bottom:5px} +.tbl_frm01 .frm_info {display:block;padding:0 0 5px;line-height:1.4em} + +/*기본리스트*/ +.list_01 li {position:relative;border:1px solid #dbdbdb;border-radius:3px;margin:8px 0;padding:10px 15px;list-style:none} +.list_01 li:after {display:block;visibility:hidden;clear:both;content:""} +.list_01 li:hover {background:#f9f9f9} + +.list_02 ul:after {display:block;visibility:hidden;clear:both;content:""} +.list_02 li {float:left;width:225px;margin:10px 0 20px 18px} +.list_02 li:nth-child(5n+1) {clear:both;margin-left:0} + +/*폼 리스트*/ +.form_01 h2 {margin:0 0 10px;font-size:1.25em} +.form_01 li {margin:10px 0} +.form_01 li:after {display:block;visibility:hidden;clear:both;content:""} +.form_01 li .right_input {float:right} +.form_01 textarea {height:100px;width:100%} +.form_01 .frm_label {display:inline-block;width:130px} +.form_01 .form_left {float:left;width:49.5%} +.form_01 .form_right {float:right;width:49.5%} + +/* 자료 없는 목록 */ +.empty_table {padding:50px 0 !important;text-align:center;color:#777 !important} +.empty_list, .empty_li {padding:20px 0 !important;text-align:center !important;color:#777 !important} + +/* 필수입력 */ +.required, textarea.required {background-image:url('../img/require.png') !important;background-repeat:no-repeat !important;background-position:right top !important} + +/* 테이블 그리드 padding 0 5px 고려한 넓이 */ +.grid_1 {width:40px} +.grid_2 {width:90px} +.grid_3 {width:140px} +.grid_4 {width:190px} +.grid_5 {width:240px} +.grid_6 {width:290px} +.grid_7 {width:340px} +.grid_8 {width:390px} +.grid_9 {width:440px} +.grid_10 {width:490px} +.grid_11 {width:540px} +.grid_12 {width:590px} +.grid_13 {width:640px} +.grid_14 {width:690px} +.grid_15 {width:740px} +.grid_16 {width:790px} +.grid_17 {width:840px} +.grid_18 {width:890px} + +/* 테이블 항목별 정의 */ +.td_board {width:120px;text-align:center} +.td_chk {width:30px;text-align:center} +.td_date {width:60px;text-align:center} +.td_datetime {width:110px;text-align:center} +.td_default {width:60px;text-align:center} +.td_dvr {width:100px;text-align:center} +.td_group {width:100px;text-align:center} +.td_imgsmall {width:60px;text-align:center} +.td_num {width:80px;text-align:center} +.td_numbig {width:100px;text-align:center} +.td_nick {width:100px;text-align:center} +.td_name {width:100px;text-align:left} +.td_namesmall {width:50px;text-align:left} +.td_mb_id {width:100px;text-align:center} +.td_mng {width:80px;text-align:center} +.td_mngsmall {width:100px;text-align:center} +.td_statsmall {width:50px;text-align:center} + +.text_left {text-align:left !important} +.text_center {text-align:center !important} +.text_right {text-align:right !important} + +/* 새창 기본 스타일 */ +.new_win {position:relative;background:#fff} +.new_win .tbl_wrap {margin:0 20px} +.new_win #win_title {font-size:1.3em;height:50px;line-height:30px;padding:10px 20px;background:#fff;color:#000;-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1); +-moz-box-shadow:0 1px 10px rgba(0,0,0,.1); +box-shadow:0 1px 10px rgba(0,0,0,.1)} +.new_win #win_title .sv {font-size:0.75em;line-height:1.2em} +.new_win .win_ul {margin-bottom:15px;padding:0 20px} +.new_win .win_ul:after {display:block;visibility:hidden;clear:both;content:""} +.new_win .win_ul li {float:left;background:#fff;text-align:center;padding:0 10px;border:1px solid #d6e9ff;border-radius:30px;margin-left:5px} +.new_win .win_ul li:first-child {margin-left:0} +.new_win .win_ul li a {display:block;padding:8px 0;color:#6794d3} +.new_win .win_ul .selected {background:#3a8afd;border-color:#3a8afd;position:relative;z-index:5} +.new_win .win_ul .selected a {color:#fff;font-weight:bold} +.new_win .win_desc {position:relative;margin:10px;border-radius:5px;font-size:1em;background:#f2838f;color:#fff;line-height:50px;text-align:left;padding:0 20px} +.new_win .win_desc i {font-size:1.2em;vertical-align:baseline} +.new_win .win_desc:after {content:"";position:absolute;left:0;top:0;width:4px;height:50px;background:#da4453;border-radius:3px 0 0 3px} +.new_win .frm_info {font-size:0.92em;color:#919191} +.new_win .win_total {float:right;display:inline-block;line-height:30px;font-weight:normal;font-size:0.75em;color:#3a8afd;background:#f6f6f6;padding:0 10px;border-radius:5px} +.new_win .new_win_con {margin:20px 0;padding:20px} +.new_win .new_win_con:after {display:block;visibility:hidden;clear:both;content:""} +.new_win .new_win_con2 {margin:20px 0 0} +.new_win .btn_confirm:after {display:block;visibility:hidden;clear:both;content:""} +.new_win .win_btn {text-align:center;padding-bottom:30px} +.new_win .btn_close {padding:0 20px;height:45px;overflow:hidden;cursor:pointer} +.new_win .btn_submit {padding:0 20px;height:45px;font-weight:bold;font-size:1.083em} + + +/* 자바스크립트 alert 대안 */ +#validation_check {margin:100px auto;width:500px} +#validation_check h1 {margin-bottom:20px;font-size:1.3em} +#validation_check p {margin-bottom:20px;padding:30px 20px;border:1px solid #e9e9e9;background:#fff} + +/* 사이드뷰 */ +.sv_wrap {display:inline-block;position:relative;font-weight:normal} +.sv_wrap .sv {z-index:1000;display:none;margin:5px 0 0;border:1px solid #283646;background:#111} +.sv_wrap .sv a {display:inline-block !important;margin:0 !important;padding:3px !important;width:94px;border-bottom:1px solid #283646;color:#fff !important} +.sv_wrap a:focus, .sv_wrap a:hover, .sv_wrap a:active {text-decoration:none !important} +.sv_on {display:block !important;position:absolute;top:10px;left:20px;width:auto;height:auto !important} +.sv_nojs .sv {display:block} + +/* 페이징 */ +.pg_wrap {margin:10px 0 30px;text-align:center} +.pg_wrap:after {display:block;visibility:hidden;clear:both;content:""} +.pg {text-align:center} +.pg_page, .pg_current,.qa_page {display:inline-block;vertical-align:middle;background:#eee;border:1px solid #eee} +.pg a:focus, .pg a:hover {text-decoration:none} +.pg_page,.qa_page {color:#959595;font-size:1.083em;height:30px;line-height:28px;padding:0 5px;min-width:30px;text-decoration:none;border-radius:3px} +.pg_page:hover,.qa_page:hover {background-color:#fafafa} +.pg_start {text-indent:-999px;overflow:hidden;background:url('../img/btn_first.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_prev {text-indent:-999px;overflow:hidden;background:url('../img/btn_prev.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_end {text-indent:-999px;overflow:hidden;background:url('../img/btn_end.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_next {text-indent:-999px;overflow:hidden;background:url('../img/btn_next.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_start:hover,.pg_prev:hover,.pg_end:hover,.pg_next:hover {background-color:#fafafa} + +.pg_current {display:inline-block;background:#3a8afd;border:1px solid #3a8afd;color:#fff;font-weight:bold;height:30px;line-height:30px;padding:0 10px;min-width:30px;border-radius:3px} + +/* 팁 */ +.tooltip_icon {display:inline-block;vertical-align:middle;color:#b3b5b8;border:0;font-size:1.4em;background:transparent;cursor:pointer} +.tooltip_icon:hover {color:#448bf5} +.tooltip {position:relative;width:auto;color:#fff;background:#000;padding:10px;font-size:small;line-height:18px;display:none;position:absolute;z-index:9;font-weight:normal;margin-left:15px;margin-top:20px} +.tooltip:before {content:"";position:absolute;top:0;left:-10px;width:0;height:0;border-style:solid;border-top:0px solid transparent;border-bottom:10px solid transparent;border-left:0;border-right:10px solid #000} + +.tooltip_txt {position:relative;text-align:left;color:#fff;height:50px;line-height:50px;font-size:1.1em;background:#f2838f;margin:0 0 10px;padding:0 20px;border-radius:5px;font-weight:bold} +.tooltip_txt:before {content:"";position:absolute;top:0;left:0;width:5px;height:50px;border-radius:5px 0 0 5px;background:#da4453} +.tooltip_txt i {font-size:1.2em;vertical-align:middle} + + +/* ########## 쇼핑몰 컨텐츠 ########## */ +/* 인덱스 이미지 출력 */ +#sidx_img {margin:0 0 20px} +#sidx_img img {max-width:100%;height:auto} + + +/* 상품 메일 추천하기 */ +#sit_rec_new {} +#sit_rec_new th, +#sit_rec_new td {display:block;width:100%} +#sit_rec_new th {text-align:left;margin-top:20px;margin-bottom:5px} +#sit_rec_new textarea {width:100%;min-height:100px} +#sit_rec_new .win_btn {margin:20px 0} + +/* 마이페이지 */ +#smb_my {position:relative;margin-bottom:30px} +#smb_my:after {display:block;visibility:hidden;clear:both;content:""} + +/* 마이페이지 aside */ +#smb_my_ov {position:relative;float:left;margin:0 10px 0 0;width:265px;border:1px solid #e8e8e8;background:#fff;margin-right:20px} +#smb_my_ov h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#smb_my_ov .smb_me {display:block;background:#fff;border-bottom:1px solid #e8e8e8;padding:20px;text-align:center;font-size:1.167em} +#smb_my_ov .smb_me img {width:45px;border-radius:50%} +#smb_my_ov .smb_me .my_ov_name {display:inline-block;margin-bottom:10px;line-height:28px} +#smb_my_ov .smb_me a {display:inline-block;font-size:0.85em;height:28px;line-height:22px;border:1px solid #d5d9dd;color:#8a8a8a;border-radius:2px;padding:2px 5px} +#smb_my_ov .smb_me a.smb_info {color:#3a8afd} + +#smb_private:after {display:block;visibility:hidden;clear:both;content:""} +#smb_private {padding:10px 0} +#smb_private li {text-align:left;position:relative;text-align:left} +#smb_private a {display:block;background:#fff;color:#465168;line-height:20px;padding:10px 20px 10px 25px} +#smb_private a strong {display:inline-block;float:right;max-width:87px;overflow:hidden;white-space:nowrap;text-overflow:clip;color:#3a8afd;padding:0 5px;border-radius:15px;font-size:0.92em} +#smb_private a:hover strong {background:#4b8bff} +#smb_private li a:hover {color:#4b8bff} +#smb_private li a:hover:after {position:absolute;left:0;top:0;width:2px;height:100%;background:#3a8afd;content:""} +#smb_private li i {width:25px;color:#8c9eb0;margin-right:5px} +#smb_private li:hover i {color:#3a8afd} +#smb_private .win_point strong {background:#37bc9b;color:#fff} +#smb_private .win_memo strong {background:#ff8b77;color:#fff} +#smb_private .win_scrap strong {background:#8cc152;color:#fff} +#smb_private .win_coupon strong {background:#a352c1;color:#fff} + +#smb_my_ov h3 {font-size:1.2em;padding:20px 20px 10px;border-top:1px solid #e8e8e8} +#smb_my_ov .op_area {border-top:0;padding:0 20px;line-height:18px;color:#555} +#smb_my_ov .op_area:after {display:block;visibility:hidden;clear:both;content:""} +#smb_my_ov .op_area dt {margin:5px 0;padding-top:5px;font-weight:bold;color:#8c9eb0;line-height:20px} +#smb_my_ov .op_area dd {margin:5px 0;padding-bottom:10px;border-bottom:1px dashed #e5e5e5} +#smb_my_ovaddt {border-bottom:0 !important} +#smb_my_ovaddd {border-bottom:0 !important} + +.withdrawal {display:block;padding:10px 20px;border-top:1px solid #e8e8e8;color:#c7c7c7} + +/* 마이페이지 list */ +#smb_my_list {float:left;width:915px} + +#smb_my_od h2 {margin:0 0 10px;font-size:1.25em} +#smb_my_od {position:relative;margin:0 0 50px} +.smb_my_od {background:#fff} +.smb_my_od li {padding:15px;border-bottom:1px solid #ececec} +.smb_my_od li:last-child {border-bottom:0} +.smb_my_od li:after {display:block;visibility:hidden;clear:both;content:""} +.smb_my_od li:hover {background:#fff6f6} +.smb_my_od .smb_my_od_li {float:left;line-height:18px} +.smb_my_od .smb_my_od_li1 {width:140px;text-align:center} +.smb_my_od .smb_my_od_li2 {width:75%;padding:0 20px} +.smb_my_od .smb_my_od_li3 {width:80px;float:right;text-align:center} + +.smb_my_od .ord_num, +.smb_my_od .ord_name {font-size:1.2em;font-weight:bold;letter-spacing:-0.5px} +.smb_my_od .date {color:#b5b5b5} +.smb_my_od .cost {color:#3a8afd;font-weight:bold} +.smb_my_od .misu {color:#6d6d6d} + +#smb_my_wish {position:relative;margin-bottom:30px} +#smb_my_wish h2 {font-size:1.25em;padding:0 0 20px;border-bottom:1px solid #d9dde2} +#smb_my_wish li {position:relative;background:#fff;border-bottom:1px solid #ececec;padding:15px} +#smb_my_wish li:after {display:block;visibility:hidden;clear:both;content:""} +#smb_my_wish .smb_my_chk {display:inline-block;float:left;margin-right:10px;color:red} +#smb_my_wish .smb_my_img {float:left;margin-right:20px} +#smb_my_wish .smb_my_tit {margin:5px 0;font-size:1.167em;font-weight:bold} +#smb_my_wish .smb_my_price {font-weight:bold;font-size:1.2em;margin-bottom:30px} +#smb_my_wish .smb_my_date {font-size:1em;color:#777} +.smb_my_more {position:absolute;top:0;right:0} +.smb_my_more a {display:block;background:url('../img/more-btn.gif') no-repeat 0 2px;padding-left:20px;height:30px} +#smb_my_wish li .wish_del {position:absolute;right:20px;top:50px;font-size:1.4em;color:#b2b2b2} +#smb_ws_act {text-align:center;margin:20px 0 30px} +#smb_ws_act .btn01 {width:180px;height:50px;font-weight:bold;font-size:1.167em;border:1px solid #98a3b3;border-radius:3px} +#smb_ws_act .btn02 {width:180px;height:50px;font-weight:bold;font-size:1.167em;border:1px solid #1c70e9;border-radius:3px;background:#3a8afd} + + +/* 장바구니 주문서 공통 */ +.od_prd_list .td_chk {} +.od_prd_list .td_prd {border-left:0;position:relative;padding-left:120px;min-height:100px} +.od_prd_list .td_prd .sod_img {position:absolute;top:25px;left:20px} +.od_prd_list .td_prd .sod_name {min-height:80px} +.od_prd_list .td_prd .prd_name {font-size:1.4em} +.od_prd_list .total_prc {color:#000;font-weight:bold;font-size:1.4em} + +.sod_opt {margin:5px 0} +.sod_opt ul {display:inline-block;margin:0;padding:0;list-style:none} +.sod_opt li {color:#000;padding:3px 0;line-height:1.3em} +.sod_opt li:before {content:"옵션";display:inline-block;margin:1px 5px 2px 0;padding:3px;border-radius:3px;background:#e2eaf6;line-height:1em;color:#3a8afd} +.sod_option_btn .mod_options {height:30px;margin:5px 0 0;padding:0 5px;border:1px solid #d4d6db;color:#606060;background:#fff;border-radius:3px} +.cp_btn {padding:0 10px;border:1px solid #d4d6db;color:#3a8afd;background:#fff;height:26px;border-radius:3px} +.cp_cancel {padding:0 10px;border:1px solid #aaa;color:#666;background:#fff;height:26px;border-radius:3px} + +/* 장바구니 */ +#sod_bsk {margin-bottom:30px} +.btn_cart_del {padding:20px 0;border-bottom:1px solid #ccd2d9} +.btn_cart_del button {height:30px;padding:0 10px;border:1px solid #d4d6db;border-radius:5px;background:#fff;color:#666} +#sod_bsk_list {position:relative} +#sod_bsk #sod_bsk_tot {border:1px solid #212a37;margin:20px 0} +#sod_bsk #sod_bsk_tot ul:after {display:block;visibility:hidden;clear:both;content:""} +#sod_bsk #sod_bsk_tot li {float:left;width:33.333%;background:#4a505a;color:#fff;border-left:1px solid #212a37;text-align:right;padding:25px;font-size:1.167em} +#sod_bsk #sod_bsk_tot li:first-child {border:0} +#sod_bsk #sod_bsk_tot li span {display:inline-block;float:left} +#sod_bsk #sod_bsk_tot .sod_bsk_cnt {width:33.335%;background:#212a37} +#sod_bsk_act {text-align:center;margin-bottom:30px} +#sod_bsk_act .btn_submit {height:50px;padding:0 10px;width:160px;font-weight:bold;font-size:1.25em} +#sod_bsk_act .btn01 {height:50px;line-height:50px;padding:0 10px;width:160px;font-weight:bold;font-size:1.25em} +#sod_bsk_act p {margin:0 0 10px} + +/* 장바구니 선택사항수정 */ +#sod_bsk_list #mod_option_frm {z-index:10000;position:fixed;top:50%;left:50%;width:540px;height:auto !important;height:500px;max-height:500px;margin-left:-280px; +margin-top:-150px;border:1px solid #dde7e9;border-radius:3px;background:#fff;overflow-y:auto;overflow-x:inherit} +#sod_bsk_list .mod_option_bg {content:"";position:fixed;left:0;top:0;width:100%;height:100%;background:rgba(0,0,0,0.1);display:block;z-index:9999} +#mod_option_frm h2 {border-bottom:1px solid #e8e8e8;padding:0 20px;line-height:50px;font-size:1.25em} + +.option_wr {padding:20px 20px 0} +.option_wr h3 {font-size:1.167em;margin-bottom:10px} +.option_wr .get_item_options, +.option_wr .get_item_supply {margin-bottom:10px} +.option_wr label {display:block;margin:10px 0 5px} +.option_wr select {width:100%;border:1px solid #d4d4d4;height:48px} + +#sit_opt_added {margin:0;padding:0;border-bottom:0;list-style:none} +#sit_opt_added li {padding:10px 15px;background:#f9f9f9;border:1px solid #e6e9ed;margin:10px 0;position:relative} +#sit_opt_added li:after {display:block;visibility:hidden;clear:both;content:""} +#sit_opt_added li .opt_name {line-height:28px;font-weight:bold} +#sit_opt_added li .opt_count {} +#sit_opt_added button {float:left;width:30px;height:30px;border:1px solid #bdc9dc;border-radius:0;background:#fff;color:#666;font-size:0.92em} +#sit_opt_added button:hover {color:#000} +#sit_opt_added .num_input {float:left;border:0;height:30px;border-top:1px solid #e4e4e4;border-bottom:1px solid #e4e4e4;text-align:center} +#sit_opt_added .sit_opt_del {position:absolute;right:0;top:0;font-size:15px;border:0;border-left:1px solid #e6e9ed;border-bottom:1px solid #e6e9ed} +#sit_opt_added .sit_opt_del:hover {color:#be334a} +#sit_opt_added .sit_opt_prc {display:block;float:right;width:100px;padding:0 3px;text-align:right;line-height:30px;font-size:1.183em;font-weight:bold} + +#mod_option_frm #sit_sel_option {margin:20px 20px 10px} +#mod_option_frm #sit_tot_price {float:left;display:inline-block;margin:0 20px 20px} +#mod_option_frm #sit_opt_added {} +#mod_option_frm .btn_confirm {float:right;display:inline-block;margin:0 20px 20px;background:yellow} +#mod_option_frm .btn_confirm .btn_submit {width:100px;height:40px;font-size:1.167em;font-weight:bold;cursor:pointer} +#mod_option_frm .btn_confirm .btn_close {position:absolute;top:0;right:0;width:50px;height:50px;border:0;background:none;font-size:1.25em;border-radius:0} +#mod_option_frm .btn_confirm .btn_close:hover {background:#f3f3f3} + +/* 주문서 작성 */ +#sod_frm {} +#sod_frm p {margin:0 0 10px} +#sod_frm .od_prd_list {margin-bottom:20px} +#sod_list {position:relative} +#sod_list #cp_frm {z-index:10000;position:absolute;top:50%;left:50%;width:540px;height:auto !important;height:500px;max-height:500px;margin-left:-270px;margin-top:-150px;border:1px solid #dde7e9;border-radius:3px;background:#fff;overflow-y:auto;overflow-x:inherit} + +.od_coupon h3{border-bottom: 1px solid #cdcdcd;padding: 0 20px;line-height: 50px;margin: 0 0 15px;font-size: 1.25em;text-align:left; +-webkit-box-shadow: 1px 2px 2px #eee; +-moz-box-shadow: 1px 2px 2px #eee; +box-shadow: 1px 2px 2px #eee;} +.od_coupon .btn_close {position: absolute;top: 0;right: 0;width: 50px;height: 50px;border: 0;background: none;border-left: 1px solid #cdcdcd;font-size: 1.25em;} +.od_coupon .btn_close:hover{background:#f3f3f3} +.od_coupon .tbl_head02{margin:20px} +.od_coupon .cp_apply{padding: 0 5px;border: 1px solid #38b2b9;color: #38b2b9;background: #fff;height: 23px;line-height: 21px;} +.od_coupon td,#sod_frm_pay .od_coupon td{text-align:left;border-left:0;padding:7px} +#sod_frm_pay .od_coupon th{width:auto;text-align:center;padding: 7px;background: #f3f3f3;border-top: 1px solid #d3d3d3;border-bottom: 1px solid #d3d3d3;} +.od_coupon .td_numbig,#sod_frm_pay .od_coupon .td_numbig{text-align:center;} +.od_coupon .td_mngsmall{width:60px} + +/* 주문서 작성 - 왼쪽 */ +.sod_left {display:inline-block;float:left;width:840px;margin-right:20px;vertical-align:top} + +/* 주문서 작성 - 주문하시는 분 */ +#sod_frm .tbl_frm01 {padding:20px 10px} +#sod_frm .tbl_frm01 th,#sod_frm .tbl_frm01 td {text-align:left;padding:10px;vertical-align:top} +#sod_frm .tbl_frm01 th{padding:0px 10px} +#sod_frm .tbl_frm01 td input {width:100%} +#sod_frm .tbl_frm01 td .addr input {width:20%} +#sod_frm .tbl_frm01 td .addr button {background:#434a54;color:#fff;width:128px;height:45px;border:0;border-radius:3px} + +/* 주문서 작성 - 받으시는 분 */ +#sod_frm_taker .tbl_frm01 {padding:20px 10px} +#sod_frm_taker .tbl_frm01 .choice_place {display:block;background:#edf3fc;padding:10px 15px;border:1px solid #d1ddee;margin:0 10px 10px} +#sod_frm_taker .tbl_frm01 .choice_place:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm_taker .tbl_frm01 .choice_place .chk_box {float:left;display:inline-block;width:85%;line-height:30px} +#sod_frm_taker .tbl_frm01 .choice_tit {float:left;display:inline-block;width:15% !important;line-height:30px} +#sod_frm_taker .tbl_frm01 .choice_place input[type="radio"] + label span {top:7px} +#sod_frm_taker .tbl_frm01 .choice_place input, +#sod_frm_taker .tbl_frm01 .choice_place label {margin-left:10px} +#sod_frm_taker .tbl_frm01 .btn_frmline {padding:0;width:80px;height:30px;line-height:28px;background:#fff;border:1px solid #d4d6db;color:#606060;text-align:center;float:right} + +#sod_frm_taker .tbl_frm01 td input {width:100%} +#sod_frm_taker .tbl_frm01 td .addr input {width:20%} +#sod_frm_taker .tbl_frm01 td .addr button {background:#434a54;color:#fff;width:128px;height:45px;border:0;border-radius:3px} +#sod_frm_taker .tbl_frm01 td .ad_choice {padding:5px 0} +#sod_frm_taker .tbl_frm01 td .ad_choice input {width:auto} + +#sod_frm_orderer, #sod_frm_taker {margin:0 0 30px;border:1px solid #e3e5e8;background:#fff} +#sod_frm section h2 {border-bottom:1px solid #e2e4e7;font-size:1.167em;padding:20px} +#sod_frm_orderer #od_addr_jibeon, +#sod_frm_taker #od_b_addr_jibeon {display:inline-block;margin:5px 0 0} + +/* 5.4.1.3 버전이후 추가 css */ +#sod_frm div.tbl_frm01, #sod_frm_taker div.tbl_frm01{padding:0px 10px !important} +#sod_frm .tbl_frm01 th, #sod_frm .tbl_frm01 td{padding:10px;line-height:45px} +#sod_frm .tbl_frm01 th{width:94px} +#sod_frm #od_name,#sod_frm #od_tel,#sod_frm #od_hp,#sod_frm #od_pwd,#sod_frm #od_b_name,#sod_frm #od_b_tel,#sod_frm #od_b_hp,#sod_frm #ad_subject,#sod_frm #od_hope_date{width:40%} +#sod_frm #od_zip,#sod_frm #od_b_zip{width:90px} +#sod_frm .tbl_frm01 td .btn_address {background:#434a54;color:#fff;width:128px;height:45px;border:0;border-radius:3px} +#sod_frm #od_memo{min-height:100px} +#sod_frm_taker .order_choice_place{position:relative;background:#edf3fc;border:1px solid #d1ddee;padding-left:10px} +#sod_frm_taker .tbl_frm01 .btn_frmline{float:none;position:absolute;top:8px;right:10px} +#sod_frm #sod_bsk_tot:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm #sod_bsk_tot li{position:relative;float:left;background:#fff;width:33.333%;height:70px;text-align:center;border-bottom:1px solid #e7ebf1;padding:15px 0} +#sod_frm #sod_bsk_tot li:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm #sod_bsk_tot li span{display:block;color:#777;margin-bottom:5px;font-weight:bold} +#sod_frm #sod_bsk_tot .sod_bsk_sell,#sod_frm #sod_bsk_tot .sod_bsk_coupon{border-right:1px solid #e7ebf1} +#sod_frm #sod_bsk_tot .sod_bsk_point,#sod_frm #sod_bsk_tot .sod_bsk_cnt{width:100%;clear:both;height:40px;padding:0 15px;line-height:40px;text-align:right} +#sod_frm #sod_bsk_tot li:last-child {border-bottom:0 none} +#sod_frm #sod_bsk_tot .sod_bsk_point span,#sod_frm #sod_bsk_tot .sod_bsk_cnt span {float:left;margin:0} +#sod_frm #sod_bsk_tot .sod_bsk_coupon:before{display:block;content:"-";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#ff006c;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size: 16px;line-height: 14px;} +#sod_frm #sod_bsk_tot .sod_bsk_dvr:before{display:block;content:"+";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#ff006c;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size: 16px;line-height: 14px;} +#sod_frm #sod_bsk_tot .sod_bsk_cnt strong{color:#ff006c;font-size:1.25em} +#sod_frm_pay {position:relative;margin:10px 0} +#sod_frm #sod_frm_pay h2 {position:absolute;border:0;font-size:0;line-height:0;content:""} +#sod_frm_pay .pay_tbl table{width:100%;border-collapse:collapse} +#sod_frm_pay .pay_tbl th{text-align:left;padding:10px;width:80px;border-bottom:1px solid #e7ebf1;background:#fff;font-weight:bold;color:#777} +#sod_frm_pay .pay_tbl td{text-align:right;padding: 10px;height:30px;border-bottom:1px solid #e7ebf1;background:#fff} +#sod_frm_pay .pay_tbl td .cp_cancel{margin:0 0 0 2px} +#sod_frm_pay .pay_tbl td .btn_frmline{padding: 0 7px;border: 1px solid #38b2b9;color: #38b2b9;background: #fff;height: 23px;line-height: 21px;margin: 0;} +#od_tot_price{margin:10px 0;background:#fff;line-height:40px;text-align:right;padding:0 10px} +#od_tot_price span{float:left;font-weight:bold} +#od_tot_price strong{font-size:1.5em;color:#ff006c} +#sod_frm #sod_frm_pt_alert {margin:5px 0;color:#38b2bb } +#od_pay_sl h3{font-size:1.167em;margin:20px 0 5px} +#od_pay_sl input[type="radio"]{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden;text-indent:-999px;left: 0;z-index: -1px;} +#od_pay_sl .lb_icon {display: inline-block;float:left;width:50%;background:#fff;border:1px solid #eceff4;margin:-1px 0 0 -1px;cursor: pointer;height:60px;position:relative;padding-left:65px;padding-top:20px;z-index:1} +#od_pay_sl input[type="radio"]:checked+.lb_icon {border:1px solid #ff006c;z-index:3} +#sod_frm_paysel {} +#sod_frm_paysel legend {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_frm_paysel .KPAY{background:url('../../../img/kpay.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .PAYNOW{background:url('../../../img/paynow.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .PAYCO{background:url('../../../img/payco.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .inicis_lpay{background:url('../../../img/lpay_logo.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .inicis_kakaopay{position:relative;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .inicis_kakaopay em{position:absolute;top:15px;left:45px;width:70px;height:30px;background:url('../../../img/kakao.png') no-repeat 50% 50% #ffeb00;overflow:hidden;text-indent:-999px;border-radius:30px} +#sod_frm_paysel .kakaopay_icon{background:url('../../../img/kakao.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .naverpay_icon{background:url('../../../img/ico-default-naverpay.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .bank_icon{background:url('../../../img/pay_icon1.png') no-repeat 15px 50% #fff} +#sod_frm_paysel .vbank_icon{background:url('../../../img/pay_icon2.png') no-repeat 15px 50% #fff} +#sod_frm_paysel .iche_icon{background:url('../../../img/pay_icon2.png') no-repeat 15px 50% #fff} +#sod_frm_paysel .hp_icon{background:url('../../../img/pay_icon3.png') no-repeat 24px 50% #fff} +#sod_frm_paysel .card_icon{background:url('../../../img/pay_icon4.png') no-repeat 17px 50% #fff} +#forderform .sod_right #sod_bsk_tot {border:1px solid #e3e5e8} +#forderform .od_pay_buttons_el{margin-top:20px;border:1px solid #e3e5e8;background:#fff;padding:10px} +#forderform .od_pay_buttons_el h3{font-size:1.167em;margin:0px 0 5px} +#forderform #sod_frm_pt{border-top:1px solid #e3e5e8} + +.sod_right .pay_tbl{border:1px solid #e3e5e8;border-bottom:0 none} +.sod_right #od_tot_price{border:1px solid #e3e5e8} +#sod_frm_pay .od_pay_buttons_el:after{display:block;visibility:hidden;clear:both;content:""} +#sod_frm_pay .sod_frm_point{margin-top:20px;border:1px solid #e3e5e8} +#sod_frm_pay .sod_frm_point div{background:#fff;padding:10px;text-align:left;text-align:right} +#sod_frm_pay .sod_frm_point div:after {display:block;visibility:hidden;clear:both;content:''} +#sod_frm_pay .sod_frm_point div label{float:left;line-height:30px;font-weight:bold} +#sod_frm_pay .sod_frm_point div span{display:block} +#sod_frm_pay .sod_frm_point div span:after {display:block;visibility:hidden;clear:both;content:''} +#sod_frm_pay .sod_frm_point div strong{float:left;color:#666} +#sod_frm_pay .sod_frm_point .max_point_box em{font-style:normal !important} +#sod_frm_pay .sod_frm_point #od_temp_point{height:30px;text-align:right;padding:0 5px;border:1px solid #ccc;} + +/* 주문서 작성 - 오른쪽 */ +.sod_right {display:inline-block;float:left;width:340px;height:100%;vertical-align:top} + +.sod_right #sod_bsk_tot {border:1px solid #3a8afd} +.sod_right #sod_bsk_tot:after {display:block;visibility:hidden;clear:both;content:""} +.sod_right .sod_info li {position:relative;float:left;background:#fff;width:33.333%;height:70px;text-align:center;border-bottom:1px solid #e7ebf1;padding:15px 0} +.sod_right .sod_info li:after {display:block;visibility:hidden;clear:both;content:""} +.sod_right .sod_info li span {display:block;color:#777;margin-bottom:5px;font-weight:bold;color:#000} +.sod_right .sod_info .sod_bsk_sell, .sod_right .sod_info .sod_bsk_coupon {border-right:1px solid #e7ebf1} +.sod_right .sod_info .sod_bsk_coupon:before {display:block;content:"-";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#9da6c9;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size:16px;line-height:14px} +.sod_right .sod_info .sod_bsk_dvr:before {display:block;content:"+";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#9da6c9;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size:16px;line-height:14px} +.sod_right .sod_info .sod_bsk_cnt strong {font-size:1.25em} + +.sod_right .sod_info_bt {clear:both;padding:10px 15px;background:#fff} +.sod_right .sod_info_bt:after {display:block;visibility:hidden;clear:both;content:""} +.sod_right .sod_info_bt li {} +.sod_right .sod_info_bt li:after {display:block;visibility:hidden;clear:both;content:""} +.sod_right .sod_info_bt li span {display:inline-block;float:left;width:50%;line-height:28px;text-align:left;font-weight:bold;color:#000} +.sod_right .sod_info_bt li strong {display:inline-block;float:left;width:50%;line-height:28px;text-align:right} + +.sod_right .sod_info_option {clear:both;border-top:1px solid #e7ebf1} +.sod_right .sod_info_option h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.sod_right .sod_info_option ul {padding:10px 15px;background:#fff} +.sod_right .sod_info_option li {margin-bottom:5px} +.sod_right .sod_info_option li:after {display:block;visibility:hidden;clear:both;content:""} +.sod_right .sod_info_option .sod_ifop_tit {display:inline-block;float:left;width:50%;line-height:28px;text-align:left;font-weight:bold} +.sod_right .sod_info_option .sod_ifop_tit .btn_frmline {width:auto;height:30px;color:#3a8afd;background:#fff;border:1px solid #d4d6db} +.sod_right .sod_info_option .sod_ifop_tit .cp_cancel {width:auto;height:30px;border:1px solid #d4d6db;padding:0 5px;margin-left:5px;color:#b1b1b1;vertical-align:baseline} +.sod_right .sod_info_option .sod_ifop_tit .od_coupon {z-index:10000;position:absolute;top:50%;left:50%;min-width:300px;height:auto !important;height:500px;max-height:500px;margin-left:-200px;margin-top:-150px;border:1px solid #dde7e9;border-radius:3px;background:#fff;overflow-y:auto;overflow-x:inherit} +.sod_right .sod_info_option .sod_ifop_tit .od_coupon>td {text-align:left} +.sod_right .sod_info_option>td, .sod_right .sod_info_option .sod_ifop_t {display:inline-block;float:left;width:50%;line-height:28px;text-align:right} +.sod_right .sod_info_option>td {text-align:right;padding:10px;height:30px} +.sod_right .sod_info_option>td .cp_cancel {margin:0 0 0 2px} +.sod_right .sod_info_option>td .btn_frmline {padding:0 7px;border:1px solid #38b2b9;color:#38b2b9;background:#fff;height:23px;line-height:21px;margin:0} + + +/* 주문서 작성 - 포인트사용 */ +#sod_point {clear:both;background:#fff;margin-top:10px;border:1px solid #e3e5e8} +#sod_point h2 {font-size:1.167em;padding:15px;border-bottom:1px solid #e3e5e8} +#sod_point h2:after {display:block;visibility:hidden;clear:both;content:''} + +#sod_point .point_tit {vertical-align:baseline;float:left;line-height:28px} +#sod_point .point_tit label {vertical-align:baseline} +#sod_point .point_ipt {float:right;display:inline-block;margin-left:35px;text-align:left;text-align:right;font-weight:normal} +#sod_point .point_ipt:after {display:block;visibility:hidden;clear:both;content:''} +#sod_point .point_ipt #od_temp_point {width:100px;height:30px;text-align:right;padding:0 5px;border:1px solid #d0d3db;border-radius:3px} + +#sod_frm_pt {padding:20px} +/* +#sod_frm_pt strong {display:inline-block;width:45%;color:#000;line-height:28px;text-align:left} +#sod_frm_pt span {display:inline-block;width:55%;color:#000;text-align:right} +#sod_frm_pt span:after {display:block;visibility:hidden;clear:both;content:''} +*/ +#sod_frm_pt .max_point_box em {font-style:normal !important} + +/* 주문서 작성 - 결제수단 */ +/* #sod_frm_pay {position:relative;margin:10px 0 0;background:#fff;border:1px solid #e3e5e8} */ +#sod_frm_pay {position:relative;margin:10px 0 0} +#sod_frm_pay h2 {font-size:1.167em;padding:15px;border-bottom:1px solid #e3e5e8} +#sod_frm_pay .tooltip_txt {height:auto;line-height:18px;font-weight:normal;font-size:1em;padding:10px 20px;margin:10px} +#sod_frm_pay .tooltip_txt i {float:left;line-height:36px;font-size:2em;margin-right:15px} +#sod_frm_pay .tooltip_txt:before {height:100%} +#sod_frm_pay input[type="radio"] {} +#sod_frm_pay .lb_icon {display:inline-block;position:relative;cursor:pointer;z-index:1} +#sod_frm_pay input[type="radio"]:checked+.lb_icon {color:#3a8afd;z-index:3} +#sod_frm_pay input[type="radio"] + label span {top:7px} + +#sod_frm_paysel {} +#sod_frm_paysel legend {position:absolute;font-size:0;line-height:0;overflow:hidden} +/* +#sod_frm_paysel .PAYCO {display:inline-block;width:75px;background:url('../../../img/payco.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px;border-radius:30px;border:1px solid #fa1417} +#sod_frm_paysel .PAYNOW {display:inline-block;width:75px;background:url('../../../img/paynow.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px;border-radius:30px;border:1px solid #c01734} +#sod_frm_paysel .kakaopay_icon {display:inline-block;width:60px;background:url('../../../img/kakao.png') no-repeat 50% 50% #ffeb00;overflow:hidden;text-indent:-999px;border-radius:30px} +#sod_frm_paysel .KPAY {display:inline-block;width:58px;background:url('../../../img/kpay.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px;border-radius:30px;border:1px solid #22096a} +#sod_frm_paysel .inicis_lpay {display:inline-block;width:50px;background:url('../../../img/lpay_logo.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px;border-radius:30px;border:1px solid #009bd7} +*/ +#sod_frm_paysel ul.pay_way {margin:0;padding:15px} +#sod_frm_paysel ul.pay_way input[type="radio"] + label span {top:7px} +#sod_frm_paysel ul:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm_paysel li {position:relative;line-height:28px;text-align:left;list-style:none} + +#settle_bank {border:1px solid #e3e5e8;border-top:0 none;background:#fff;padding:10px;clear:both;line-height:32px} +#settle_bank:after {display:block;visibility:hidden;clear:both;content:''} +#settle_bank label {float:left;width:30%;line-height:30px} +#settle_bank select, #settle_bank input {width:70%;height:32px;margin:0 0 5px;border:1px solid #e3e5e8;border-radius:3px;text-align:left} +#settle_bank option {padding:3px 0} +#settle_bank #od_deposit_name {height:32px;padding:0 5px;border:1px solid #e3e5e8} + +#display_pay_button {background:#fff;padding:20px;border:1px solid #e3e5e8;border-top:0} +#display_pay_button .btn_submit {width:100%;height:50px;font-weight:bold;font-size:1.25em;cursor:pointer;border:1px solid #3a8afd} +#display_pay_button .btn01 {width:100%;height:50px;line-height:38px;font-weight:bold;font-size:1.25em;margin:5px 0;border:1px solid #ccd1d9} + +.display_setup_message {margin:0 0 10px;padding:15px;border:1px solid #fccdff;background:#ffeef9} +.display_setup_message strong {display:block;margin:0 0 10px} + +#sod_frm_taker td input[type="radio"], #sod_frm_taker td input[type="checkbox"]{width:auto;-webkit-appearance:radio;-webkit-border-radius:initial} +#sod_frm_taker label {display:inline-block;font-weight:normal;margin-right:1em} +#sod_frm_same {margin:0 0 10px} + +#sod_frm #display_pay_process {text-align:center} +#sod_frm #display_pay_process span {display:block;margin:5px 0 0} + +#od_tot_price {background:#e5f0ff;line-height:20px;text-align:right;padding:15px} +#od_tot_price span {float:left;font-weight:bold} +#od_tot_price strong {font-size:1.5em;color:#ff006c} +#sod_frm_pay_info {margin:0 0 10px} + +#sod_frm_pay #sc_coupon_frm, #sod_frm_pay #od_coupon_frm {z-index:10000;position:absolute;top:0;right:0;width:500px;height:auto !important;height:500px;max-height:500px;border:1px solid #000;background:#fff;overflow-y:auto} +#sod_frm_deli {position:relative;line-height:2em} + +#sod_frm_escrow {margin:30px 0 0} +#sod_frm #sod_frm_escrow h2 {margin:0;border:0} +#sod_frm #sod_frm_escrow p {margin:5px 0} +#display_pay_process {padding:20px;text-align:center} +/* 위시리스트 */ +#sod_ws {} +.sod_ws_img {width:90px;text-align:center} +#sod_ws_act {text-align:center;margin:20px 0 30px} +#sod_ws_act button {height:50px;width:180px;font-weight:bold;font-size:1.167em;border-radius:3px} +#sod_ws_act .btn01 {border:1px solid #98a3b3} +#sod_ws_act .btn02 {border:1px solid #1c70e9;background:#3a8afd} + +#sod_ws li .info_link {display:block;margin:10px 0 5px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:#646464;font-weight:bold} +#sod_ws li .info_date {color:#646464;font-size:0.92em} +#sod_ws li .wish_chk {position:absolute;top:0;left:0;width:30px;text-align:center;line-height:35px;color:#f00} +#sod_ws li .wish_info {padding:0 35px 10px 30px;position:relative;border-bottom:1px solid #e0e0e0;margin-top:10px;height:45px} +#sod_ws li .wish_del {position:absolute;top:0;right:0;width:35px;height:35px;line-height:35px;text-align:center;background:#e6e6e6;display:block;font-size:1.25em;color:#777} +#sod_ws li .wish_del:hover {background:#777;color:#fff} + +/* 배송지 목록 */ +#sod_addr .tbl_wrap {margin:30px} +#sod_addr .td_mng .sel_address {color:#fff;background:#fff;border:1px solid #19bc9b;color:#19bc9b;padding:0 5px;height:26px;border-radius:3px} +#sod_addr .td_mng .del_address {display:inline-block;border:1px solid #aaa;color:#888;padding:0 5px;height:26px;line-height:24px;vertical-align:middle;border-radius:3px} +#sod_addr input[type="radio"] {position:absolute;left:0;z-index:-1;visibility:hidden;width:0;height:0;overflow:hidden;text-indent:-999px} +#sod_addr .default_lb {display:inline-block;background:#fff;border:1px solid #1c70e9;color:#3a8afd;cursor:pointer;position:relative;padding:0 5px;height:26px;line-height:24px;border-radius:3px} +#sod_addr input[type="radio"]:checked+.default_lb {background:#3476be;color:#fff} +#sod_addr td {height:40px;vertical-align:top} +#sod_addr .td_name {width:100px} +#sod_addr .frm_input {height:30px} +#sod_addr .td_sbj {width:155px;text-align:left} +#sod_addr .td_sbj .chk_box {display:inline-block;float:left} +#sod_addr .td_sbj .chk_box input[type="checkbox"]:checked + label span {background:url(../img/chk.png) no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} +#sod_addr .ad_tel {display:block;color:#666} +#sod_addr .td_mng {width:100px;padding:10px} +#sod_addr .td_mng .mng_btn {width:100%;margin:2px 0} + +/* 주문내역 */ +#sod_v {margin-bottom:30px} +#sod_v:after {display:block;visibility:hidden;clear:both;content:''} +#sod_v td {text-align:center} +#sod_v td a {font-weight:bold} +#sod_v .basic_tbl {text-align:center} +.status_01 {display:inline-block;background:#edfbde;color:#8cc152;padding:0 5px;line-height:20px;font-size:0.92em;border-radius:5px} +.status_02 {display:inline-block;background:#84c93a;color:#fff;padding:0 5px;line-height:20px;font-size:0.92em;border-radius:5px} +.status_03 {display:inline-block;background:#e2f6f2;color:#16b494;padding:0 5px;line-height:20px;font-size:0.92em;border-radius:5px} +.status_04 {display:inline-block;background:#e2eaf6;color:#3a8afd;padding:0 5px;line-height:20px;font-size:0.92em;border-radius:5px} +.status_05 {display:inline-block;background:#3a8afd;color:#fff;padding:0 5px;line-height:20px;font-size:0.92em;border-radius:5px} +.status_06 {display:inline-block;background:#fff;color:red;padding:0 5px;line-height:20px;font-size:0.92em;border-radius:5px} + +/* 주문상세내역 */ +#sod_fin {} +#sod_fin_no {margin:0 0 20px;padding:15px;border:1px solid #d6e2f4;background:#edf3fc;font-size:1.2em;border-radius:5px;color:#3a8afd} + +#sod_sts_wrap {margin:0 0 10px;text-align:right} +#sod_sts_explan {display:none} + +#sod_fin_legend {padding:20px;line-height:20px;background:#fff;margin:10px 0;border:1px solid #e9e9e9;text-align:left} +#sod_fin_legend:after {display:block;visibility:hidden;clear:both;content:''} +#sod_fin_legend dt {clear:both;float:left;margin:0 0 5px;width:50px;font-weight:bold} +#sod_fin_legend dd {float:left;margin:0} + +#sod_fin #sod_bsk_tot li {background:#fff;border-bottom:1px solid #e7ebf1;height:40px;padding:0 15px;line-height:40px;text-align:right} +#sod_fin #sod_bsk_tot li span {float:left;clear:both;color:#777} +#sod_fin #sod_bsk_tot li strong {} +#sod_fin #sod_bsk_tot .sod_bsk_cnt strong {color:#ff006c;font-size:1.25em} + +#sod_bsk_tot2 {border:1px solid #3a8afd;margin-bottom:20px} +#sod_bsk_tot2 li {background:#fff;padding:0 15px;line-height:40px;text-align:right} +#sod_bsk_tot2 li span {float:left;clear:both;font-size:1em} +#sod_bsk_tot2 li strong {font-size:1em} +#sod_bsk_tot2 li.sod_fin_tot {background:#e5f0ff;border-top:1px solid #c6d7ef} +#sod_bsk_tot2 li#alrdy {border-bottom:0 !important} +#sod_bsk_tot2 li#alrdy div {padding:5px 0 15px;text-align:right} +#sod_bsk_tot2 li#alrdy div p {position:relative;background:#d6e3f3;padding:0 10px;margin-bottom:1px} +#sod_bsk_tot2 li.sod_fin_tot strong {color:#3a8afd;font-size:1.2em} + +#request_form {position:relative} +#request_form div {display:none;z-index:10000;position:absolute;top:23px;left:0;padding:20px 0;width:520px;border:1px solid #000;background:#f2f5f9;text-align:center} +#request_form .frm_input {width:300px;background:#fff !important} +#request_form .btn_frmline, #request_form .btn_cancel {vertical-align:middle !important} +#request_form .btn_frmline {padding:0 10px;line-height:1.6em} + +#sod_req_btn {margin:0 0 10px} +#sod_req_btn button {background:#626870} + +#sod_req_log {margin:0 0 20px} +#sod_req_log ul {margin:0;padding:0;border-top:1px solid #e9e9e9;background:#f2f5f9;list-style:none} +#sod_req_log li {padding:10px 10px 20px;border:1px solid #e9e9e9;border-top:0} +#sod_req_log h3 {margin:20px 0 10px} +.sod_req_log_view table {margin:0} +.sod_req_log_view caption {padding:10px 0;font-size:1em;font-weight:bold;text-align:left;line-height:1em} +.sod_req_log_view caption span {color:#ff3061} +.sod_req_log_view th {border-top:1px solid #e9e9e9;background:#f7f7f7 !important;color:#000 !important;text-align:center} +.sod_req_log_view td {background:#fff;color:#000} +.sod_req_log_view p {padding:10px 15px;border-bottom:1px solid #e9e9e9;background:#fff;color:#000} +.sod_req_log_view .sod_req_it {width:270px} +.sod_req_log_view button {margin:0;padding:0;border:0;background:transparent;color:#ff3061;text-decoration:underline;vertical-align:middle;cursor:pointer} + +#sod_fin_list h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_fin_list .td_prd {border-left:0;position:relative;padding-left:90px;min-height:100px} +#sod_fin_list .sod_img {position:absolute;top:25px;left:20px} +#sod_fin_list .sod_name a {font-weight:bold;line-height:1.5em} +#sod_fin_list .sod_name .sod_opt:before {content:"옵션";display:inline-block;margin:1px 5px 2px 0;padding:3px;border-radius:3px;background:#e2eaf6;line-height:1em;color:#3a8afd} +#sod_fin_list #th_itst {width:80px} + +#sod_fin_view {border:1px solid #e9e9e9} +#sod_fin_view h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_fin_view h3 {margin:0 0 10px} +#sod_fin_view .basic_tbl th {padding:0 10px;border-top:1px solid #eee;border-bottom:1px solid #eee;background:#f2f5f9;text-align:left} + +#sod_fin_pay {margin:0 0 20px;background:#fff;border:1px solid #e3e5e8} +#sod_fin_pay h3 {background:#fff;font-size:1.167em;padding:15px 20px;border-bottom:1px solid #e3e5e8} +#sod_fin_pay ul {margin:0;padding:15px 20px} +#sod_fin_pay li {line-height:24px;padding:5px 0} +#sod_fin_pay li:after {display:block;visibility:hidden;clear:both;content:""} +#sod_fin_pay li>span, #sod_fin_pay li>strong {display:inline-block;float:left} +#sod_fin_pay li>strong {margin-right:10px;width:50px} +#sod_fin_pay li>span {width:238px} +#sod_fin_pay li .letter-2px{letter-spacing:-2px} +a.btn_frmline.is-long-text{height:auto;width:160px} + +#sod_fin_orderer, #sod_fin_receiver, #sod_fin_dvr {margin:0 0 20px} +#sod_fin_orderer .tbl_wrap, #sod_fin_receiver .tbl_wrap, #sod_fin_dvr .tbl_wrap {padding:20px} +#sod_fin_dvr .tbl_wrap {padding:20px} +#sod_fin .sod_left h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_fin .sod_left h3 {background:#fff;font-size:1.167em;padding:15px 20px;border:1px solid #e3e5e8;border-bottom:0} +#sod_fin .sod_left .tbl_head01 {background:#fff;border:1px solid #e3e5e8} +#sod_fin .sod_left th {padding:10px 0;border:0;text-align:left;width:100px;color:#666;background:#fff} +#sod_fin .sod_left td {padding:10px 0;border:0;background:#fff} + +#sod_fin_dvr .dvr_link {color:#ff3061;text-decoration:underline} + +#sod_fin_cancel {text-align:center} +#sod_fin_cancel .sod_fin_c_btn {height:50px;border:1px solid #bababa;border-radius:3px;font-weight:bold;width:100%;background:none;color:#5e6b6f} +#sod_fin_cancel .sod_fin_c_btn:hover {background:#fff} +#sod_fin_cancel h2 {padding:15px;border-bottom:1px solid #e8e8e8;text-align:left} +#sod_fin_cancel p {text-align:center;background:#ffe0e0;border:2px solid #d50c0c;padding:15px;color:#d50c0c;font-size:1.167em;font-weight:bold} + +#sod_cancel_pop {display:none;width:100%;height:100%;position:fixed;top:0;left:0;z-index:999} +#sod_fin_cancelfrm {position:absolute;top:50%;left:50%;background:#fff;text-align:center;width:245px;max-height:300px;margin-left:-125px;margin-top:-180px;overflow-y:auto;border-radius:5px;-webkit-box-shadow:1px 1px 18px rgba(0,0,0,0.2);-moz-box-shadow:1px 1px 18px rgba(0,0,0,0.2);box-shadow:1px 1px 18px rgba(0,0,0,0.2);border:1px solid #dde7e9;background:#fff;border-radius:3px} +#sod_fin_cancelfrm form {padding:20px} +.sod_fin_bg {background:rgba(0,0,0,0.1);width:100%;height:100%} +.sod_cls_btn {position:absolute;right:0;top:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff} + +#sod_fin_cancelfrm .frm_input {background:#fff;margin:0 0 5px;width:100%} +#sod_fin_cancelfrm .btn_frmline {background:#5e6b6f;color:#fff;border:0;padding:10px;width:100%;cursor:pointer} +#sod_fin_test {padding:10px} + +/* 주문상세내역 중 현금영수증 발급 */ +#scash {} +#scash section {padding:10px 0} +#scash h2 {margin:0 0 10px;text-align:center} +#scash .basic_tbl th {padding:0 10px;border-top:1px solid #eee;border-bottom:1px solid #eee;background:#f2f5f9;text-align:left} +#scash_apply {padding:10px 0 20px;text-align:center} +#scash_apply button {padding:10px;border:0;background:#565e60;color:#fff} +#scash_copy {text-align:center} + +/* 배너 인덱스 출력 */ +#sbn_idx {} + +/* 쇼핑몰 이벤트 */ +#sev {} +.sev_admin {margin:0 0 10px;text-align:right} +.sev_admin a {line-height:35px;padding:0 10px} + +/* 쿠폰 */ +#coupon {text-align:center} +#coupon h1 {text-align:left} +#coupon ul:after {display:block;visibility:hidden;clear:both;content:""} +#coupon li {padding:15px;border-bottom:1px solid #ececec;text-align:left} +#coupon .cou_top {margin-bottom:10px} +#coupon .cou_tit {font-size:1.25em;font-weight:bold} +#coupon .cou_pri {font-size:1.25em;color:#3a8afd;font-weight:bold;float:right} +#coupon .cou_target {color:#8cc152;background:#edfbde;padding:5px;line-height:20px;font-size:0.92em;border-radius:5px} +#coupon .cou_date {float:right;color:#888d92} +#coupon .btn_close {margin:20px auto} + +/* 모바일일때 피시버전 주문폼 */ +.sod_frm_mobile .sod_list{margin:10px 0} +.sod_frm_mobile .sod_list .sod_li{background:#fff;border-bottom:1px solid #e5e5e5;margin:10px 0} +.sod_frm_mobile .sod_list .li_name{font-size:1.083em} +.sod_frm_mobile .sod_list .li_op_wr{position:relative;padding:10px 10px 0 110px;min-height:75px} +.sod_frm_mobile .sod_list .li_op_wr .chk_box{position:absolute;top:10px;left:10px} +.sod_frm_mobile .sod_list .total_img{position:absolute;top:10px;left:35px} +.sod_frm_mobile .sod_list .mod_options{padding:0 7px;border:1px solid #d4d6db;border-radius:3px;color:#606060;background:#fff;line-height:24px;margin:5px 0 0;font-size:.923em} +.sod_frm_mobile .sod_list .li_prqty{padding:10px;border-top:1px solid #f8f8f8} +.sod_frm_mobile .sod_list .li_prqty:after{display:block;visibility:hidden;clear:both;content:''} +.sod_frm_mobile .sod_list .li_prqty_sp{float:left;width:50%;display:block;line-height:20px;padding:0 5px;text-align:right} +.sod_frm_mobile .sod_list .li_prqty_sp span{float:left;color:#696969} +.sod_frm_mobile .sod_list .prqty_sc,.sod_frm_mobile .sod_list .prqty_price{border-right:1px solid #e5e5e5} +.sod_frm_mobile .sod_list .total_price{background:#f2f7ff;display:block;clear:both;margin:0 10px 10px;text-align:right;padding:5px 10px;line-height:20px} +.sod_frm_mobile .sod_list .total_price span{float:left} +.sod_frm_mobile .sod_list .total_price strong{font-size:1.25em;color:#3a8afd} +.sod_frm_mobile .sod_opt{padding:5px 10px 5px 35px} +.sod_frm_mobile .sod_opt li{color:#777;margin:3px 0;line-height:1.3em} +.sod_frm_mobile .sod_opt li:before{content:"옵션";display:inline-block;margin:1px 5px 2px 0;font-size:11px;padding:0 5px;border-radius:3px;background:#e2eaf6;line-height:20px;color:#3a8afd} +.sod_frm_mobile .sod_opt .opt_name:before{content:"옵션";display:inline-block;margin:1px 5px 2px 0;font-size:11px;padding:0 5px;border-radius:3px;background:#e2eaf6;line-height:20px;color:#3a8afd} +.sod_frm_mobile #sod_frm_orderer,.sod_frm_mobile #sod_frm_taker{margin:0 0 30px;border:1px solid #e3e5e8;background:#fff} +.sod_frm_mobile #sod_frm_orderer #od_addr_jibeon,.sod_frm_mobile #sod_frm_taker #od_b_addr_jibeon{display:inline-block;margin:5px 0 0} +.sod_frm_mobile #m_sod_bsk_tot{background:#4a505a;color:#fff} +.sod_frm_mobile #m_sod_bsk_tot:after{display:block;visibility:hidden;clear:both;content:""} +.sod_frm_mobile #m_sod_bsk_tot dt{float:left;width:40%;padding:10px;line-height:20px;clear:both} +.sod_frm_mobile #m_sod_bsk_tot dd{float:left;width:60%;padding:10px;text-align:right;line-height:20px} +.sod_frm_mobile #m_sod_bsk_tot .sod_bsk_cnt{font-weight:700;margin-top:5px;line-height:25px;background:#212a37} +.sod_frm_mobile #m_sod_bsk_tot .sod_bsk_cnt strong{color:#3a8afd;font-size:1.25em} +.sod_frm_mobile .sod_list .li_op_wr{padding-left:100px} +.sod_frm_mobile .sod_list .total_img{left:10px} +.sod_frm_mobile .sod_opt{padding-left:10px} +.sod_frm_mobile #m_sod_frm_paysel{margin:10px 0} +.sod_frm_mobile #m_sod_frm_paysel h3{background:#fff;padding:15px 10px;border:1px solid #e3e5e8;border-bottom:0} +.sod_frm_mobile #m_sod_frm_paysel ul{margin:0;background:#fff;padding:10px;border:1px solid #e3e5e8} +.sod_frm_mobile #m_sod_frm_paysel ul:after{display:block;visibility:hidden;clear:both;content:""} +.sod_frm_mobile #m_sod_frm_paysel li{float:left;padding:5px;width:46%;height:25px} +.sod_frm_mobile #m_sod_frm_paysel .KPAY{background:url(../../../img/kpay.png) no-repeat;width:37px;height:15px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%} +.sod_frm_mobile #m_sod_frm_paysel .PAYNOW{background:url(../../../img/paynow.png) no-repeat;width:46px;height:15px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%} +.sod_frm_mobile #m_sod_frm_paysel .PAYCO{background:url(../../../img/payco.png) no-repeat 1px;width:46px;height:15px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%} +.sod_frm_mobile #m_sod_frm_paysel .inicis_lpay{background:url(../../../img/lpay_logo.png) no-repeat;width:35px;height:12px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%} +.sod_frm_mobile #m_sod_frm_paysel .inicis_kakaopay{background:url(../../../img/kakao.png) no-repeat 50% 50% #f4dc34;border-radius:30px;height:22px;width:74px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +.sod_frm_mobile #m_sod_frm_paysel .kakaopay_icon{background:url(../../../img/kakao.png) no-repeat 50% 50% #f4dc34;border-radius:30px;height:22px;width:74px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +.sod_frm_mobile #m_sod_frm_paysel .naverpay_icon{background:url(../../../img/ico-default-naverpay.png) no-repeat 50% 50% #fff;border-radius:30px;height:22px;width:50px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +.sod_frm_mobile #m_sod_frm_paysel .samsung_pay{margin-left:-23px;background:url(../../../img/samsungpay.png) no-repeat 24px 3px;height:25px;width:106px;display:inline-block;overflow:hidden;text-indent:-999px} +.sod_frm_mobile #sod_frm_pay{border-top:1px solid #f3f3f3} +.sod_frm_mobile #sod_frm_pay h2{margin:10px 0;font-size:1.25em} +.sod_frm_mobile #sod_frm_pay .cp_btn1,.sod_frm_mobile #sod_frm_pay .cp_cancel1{margin-top:0} +.sod_frm_mobile .odf_tbl{position:relative} +.sod_frm_mobile .odf_tbl table{background:#fff;width:100%;border-collapse:collapse;border-bottom:1px solid #ccc} +.sod_frm_mobile .odf_tbl table th{border-top:1px solid #eceff4;padding:10px;text-align:left;width:120px;font-weight:400} +.sod_frm_mobile .odf_tbl table td{border-top:1px solid #eceff4;padding:7px 10px;text-align:right} +.sod_frm_mobile#sod_frm #sod_frm_pt_alert{margin:10px 0;text-align:left;color:#fff;line-height:18px;background:#f2838f;padding:10px 10px 10px 13px;border-radius:5px;position:relative} +.sod_frm_mobile #sod_frm_pt_alert::before{content:"";position:absolute;top:0;left:0;width:5px;height:50px;border-radius:5px 0 0 5px;background:#da4453;height:100%} +.sod_frm_mobile#sod_frm .sod_frm_point{padding:10px 0;clear:both;border:0 none} +.sod_frm_mobile .sod_frm_point div{background:#fff;border:1px solid #e3e5e8;padding:10px;text-align:right} +.sod_frm_mobile .sod_frm_point div:after{display:block;visibility:hidden;clear:both;content:''} +.sod_frm_mobile .sod_frm_point div label{float:left;line-height:30px} +.sod_frm_mobile .sod_frm_point div span{display:block;margin:5px 0} +.sod_frm_mobile .sod_frm_point div span:after{display:block;visibility:hidden;clear:both;content:''} +.sod_frm_mobile .sod_frm_point .max_point_box em{font-style:normal!important} +.sod_frm_mobile .sod_frm_point div strong{float:left;color:#666;font-weight:400} +.sod_frm_mobile .sod_frm_point #od_temp_point{height:30px;border:1px solid #d0d3db;text-align:right;background:#fff;border-radius:3px;-webkit-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1);-moz-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1);box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1)} +.sod_frm_mobile #settle_bank{background:#fff;border:1px solid #e3e5e8;padding:10px;clear:both;line-height:30px} +.sod_frm_mobile #settle_bank:after{display:block;visibility:hidden;clear:both;content:''} +.sod_frm_mobile #settle_bank select{height:30px;margin:0 0 5px;width:100%;border:1px solid #d0d3db} +.sod_frm_mobile #settle_bank #od_deposit_name{height:30px;border:1px solid #d0d3db;text-align:center;border-radius:3px;float:right;-webkit-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1);-moz-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1);box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1)} +.sod_frm_mobile #settle_bank label{float:left;line-height:30px} +.sod_frm_mobile #sod_frm_pt_info{border-top:0} +.sod_frm_mobile .od_coupon{position:absolute;top:0;left:0;background:#fff;width:100%;z-index:99;border-radius:0 0 3px 3px;-webkit-box-shadow:1px 1px 5px rgba(0,0,0,0.4);-moz-box-shadow:1px 1px 5px rgba(0,0,0,0.4);box-shadow:1px 1px 5px rgba(0,0,0,0.4)} +.sod_frm_mobile .od_coupon h3{height:45px;line-height:45px;font-size:1.167em;background:#333;color:#fff;padding:0 15px;text-align:left} +.sod_frm_mobile .od_coupon .tbl_head02 .btn_frmline{background:#3b67c2;color:#fff;border:0;padding:0 5px;line-height:25px} +.sod_frm_mobile .od_coupon .tbl_head02 td{text-align:left} +.sod_frm_mobile .od_coupon .tbl_head02 th{width:auto!important} +.sod_frm_mobile .od_coupon .tbl_head02 .td_mngsmall{width:60px;text-align:center} +.sod_frm_mobile .od_coupon .tbl_head02 .td_numbig{width:80px;text-align:right} +.sod_frm_mobile .od_coupon .btn_confirm{margin:20px} +.sod_frm_mobile .od_coupon .btn_confirm .btn_submit{height:40px;font-size:1.167em;font-weight:700;width:100%} +.sod_frm_mobile .od_coupon .btn_confirm .btn_close{position:absolute;top:0;right:0;width:45px;height:45px;border:0;background:none;color:#fff;font-size:1.25em} +.sod_frm_mobile .cp_btn,.sod_frm_mobile .cp_btn1{padding:0 7px;border:1px solid #d4d6db;border-radius:3px;color:#3a8afd;background:#fff;line-height:24px;margin:5px 0 0;font-size:.923em} +.sod_frm_mobile .cp_apply{padding:0 5px;border:1px solid #3a8afd;color:#3a8afd;background:#fff;height:23px;line-height:21px} +.sod_frm_mobile .cp_cancel,.sod_frm_mobile .cp_cancel1{padding:0 7px;border:1px solid #d4d6db;border-radius:3px;color:#aaa;background:#fff;line-height:24px;margin:5px 0 0 2px;font-size:.923em} +.sod_frm_mobile #sod_frm_escrow{margin:10px} +.sod_frm_mobile #sod_frm_escrow h2{font-size:1.25em} +.sod_frm_mobile #od_pay_sl h3{font-size:1.25em} +.sod_frm_mobile .sod_list .li_name{border-bottom:1px solid #dcdcdc;line-height:1.3em;padding:10px;font-size:1.083em} +#sod_frm.sod_frm_mobile .odf_list .frm_input{width:100%!important} +#sod_frm.sod_frm_mobile input[type="radio"],.sod_frm_mobile #sod_frm.sod_frm_mobile input[type="checkbox"]{width:auto;-webkit-appearance:radio;-webkit-border-radius:initial} +#sod_frm.sod_frm_mobile #od_memo{min-height:50px} +.sod_frm_mobile .od_prd_list{margin:10px;background:#fff;padding:15px} +.sod_frm_mobile .od_prd_list .td_chk{border-left:0} +.sod_frm_mobile .od_prd_list .td_prd{border-left:0;position:relative;padding-left:90px;min-height:100px} +.sod_frm_mobile .od_prd_list .td_prd .sod_img{position:absolute;top:15px;left:0} +.sod_frm_mobile .od_prd_list .td_prd .sod_name{min-height:80px} +.sod_frm_mobile .od_prd_list .td_prd .prd_name{font-size:1.167em} +.sod_frm_mobile .od_prd_list .total_prc{color:#ff006c;font-weight:700;font-size:1.167em} +.sod_frm_mobile #sod_frm_orderer{padding:10px;border-bottom:1px solid #d6d3d3} +.sod_frm_mobile #sod_frm_taker{padding:10px;border-bottom:1px solid #d6d3d3;border-top:1px solid #f3f3f3} +.sod_frm_mobile #sod_frm_taker h2,.sod_frm_mobile #sod_frm_orderer h2{margin:10px 0;font-size:1.25em} +.sod_frm_mobile .odf_list label,.sod_frm_mobile .odf_list strong{display:block;margin:7px 0 5px;color:#444;font-weight:400} +.sod_frm_mobile .odf_list .frm_input{width:100%;margin:0 0 5px} +.sod_frm_mobile .odf_list .dlv_slt{background:#edf3fc;position:relative;border:1px solid #d1ddee;margin:5px 0;padding:10px} +.sod_frm_mobile .odf_list .dlv_slt strong{margin:0;font-weight:700;line-height:30px} +.sod_frm_mobile .odf_list .dlv_slt div label{display:inline-block;margin:3px 0;color:#000} +.sod_frm_mobile #order_address{display:block;position:absolute;top:5px;right:5px;text-align:center;border:1px solid #d4d6db;background:#fff;border-radius:3px;color:#606060;height:30px;line-height:28px;margin:5px 0 0;padding:0 5px} +.sod_frm_mobile .odf_list .ad_default{display:inline-block;margin:0} +.sod_frm_mobile .odf_list .btn_addsch{position:absolute;top:5px;right:5px;border-radius:3px;height:30px} +.sod_frm_mobile .odf_list .add_num{position:relative;display:block} +.sod_frm_mobile .odf_list textarea{border:1px solid #ccc;background:#fff;color:#000;vertical-align:middle;border-radius:3px;padding:5px;width:100%;height:70px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)} +.sod_frm_mobile .sod_ta_wr{background:#fff;margin-bottom:1em} +.sod_frm_mobile .btn_confirm{margin:0 0 10px} +.sod_frm_mobile .btn_submit{width:100%;height:45px;font-size:1.167em;font-weight:700;margin:5px 0;border-radius:4px} +.sod_frm_mobile .btn_cancel,.sod_frm_mobile .btn01{width:100%;height:45px;line-height:43px;font-size:1.167em;font-weight:700;padding:0;border-radius:4px} +.sod_frm_mobile #sod_frm_escrow{margin:10px} +.sod_frm_mobile #sod_frm_escrow h2{font-size:1.25em} +.sod_frm_mobile #od_pay_sl h3{font-size:1.25em} +.sod_frm_mobile #od_tot_price{background:none;font-weight:700} + +html.no-overflowscrolling #sc_coupon_frm, html.no-overflowscrolling #od_coupon_frm {height:auto;max-height:10000px !important} /* overflow 미지원 기기 대응 */ +#sod_frm_pay_info {margin:0 0 10px} + +/* 네이버페이 */ +.itemform-naverpay {margin:15px 0;clear:both} +.cart-naverpay {margin-top:15px} + +/* theme.config.php 파일에서 G5_COMMUNITY_USE 를 false로 한 경우 1:1 문의와 게시판 css 처리 */ +#bo_list table td, #fqalist table td {border-left:0;border-right:0} +#bo_v_top .btn_admin, #bo_list .btn_admin {padding-top:0} + +/* 개인결제 */ +.pesonal {background:#fff;border:1px solid #e3e5e8;margin-bottom:30px} +.pesonal h2 {border-bottom:1px solid #e2e4e7;font-size:1.167em;padding:20px} +.pesonal .tbl_frm01 {padding:20px 10px;margin:0} +.pesonal th {text-align:left} +.pesonal td {text-align:left;font-weight:bold} +.pesonal td input {width:100%} +.pesonal .half_tr {width:50%} + +#personal_pay {background:#fff;border:1px solid #e3e5e8} +#personal_pay h2 {background:#fff;border-bottom:1px solid #e2e4e7;font-size:1.167em;padding:20px} +#personal_pay input[type="radio"] {} +#personal_pay .lb_icon {position:relative;display:inline-block;cursor:pointer;z-index:1} +#personal_pay input[type="radio"]:checked+.lb_icon {z-index:3} + +#personal_pay legend {position:absolute;font-size:0;line-height:0;overflow:hidden} +#personal_pay .KPAY {width:58px;background:url('../../../img/kpay.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#personal_pay .PAYNOW {width:75px;background:url('../../../img/paynow.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px;border-radius:30px} +#personal_pay .PAYCO {width:75px;background:url('../../../img/payco.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px;border-radius:30px} +#personal_pay .kakaopay_icon {width:60px;background:url('../../../img/kakao.png') no-repeat 50% 50% #ffeb00;overflow:hidden;text-indent:-999px;border-radius:30px} +#personal_pay .pay_way {border-bottom:1px solid #e2e4e7} +#personal_pay #display_pay_button {border:0} + + +/* input, radio */ +.selec_chk {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box {position:relative} +.chk_box input[type="checkbox"] {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box input[type="checkbox"] + label {position:relative;padding-left:20px;color:#676e70} +.chk_box input[type="checkbox"] + label:hover{color:#2172f8} +.chk_box input[type="checkbox"] + label span {position:absolute;top:2px;left:0;width:15px;height:15px;display:block;margin:0;background:#fff;border:1px solid #d0d4df;border-radius:3px} +.chk_box input[type="checkbox"]:checked + label {color:#000} +.chk_box input[type="checkbox"]:checked + label span {background:url('../img/chk.png') no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} + +.chk_box input[type="radio"] {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box input[type="radio"] + label {position:relative;padding-left:23px;display:inline-block;color:#676e70} +.chk_box input[type="radio"] + label span {position:absolute;top:0;left:0;width:15px;height:15px;display:block;background:#fff;border:1px solid #cdd6df;border-radius:50%} +.chk_box input[type="radio"]:checked + label {color:#305af9} +.chk_box input[type="radio"]:checked + label span:before {width:7px;height:7px;background:#305af9;content:'';position:absolute;top:3px;left:3px;border-radius:50%} + diff --git a/theme/basic/css/mobile.css b/theme/basic/css/mobile.css index e37088e53..fe161442d 100644 --- a/theme/basic/css/mobile.css +++ b/theme/basic/css/mobile.css @@ -321,6 +321,7 @@ box-shadow:0 1px 10px rgba(0,0,0,.1)} .new_win .win_btn {clear:both;padding:10px 0 30px;text-align:center} .new_win .win_btn a {display:inline-block;height:45px;line-height:40px;font-weight:bold} +.new_win .cert_btn {text-align:center} .new_win .btn_close {width:60px;height:45px;overflow:hidden;cursor:pointer} .new_win .btn_submit {padding:0 20px;height:45px;font-weight:bold;font-size:1.083em} diff --git a/theme/basic/css/mobile_shop.css b/theme/basic/css/mobile_shop.css new file mode 100644 index 000000000..ee8c659ca --- /dev/null +++ b/theme/basic/css/mobile_shop.css @@ -0,0 +1,1030 @@ +@charset "utf-8"; + +/* 초기화 */ +body {margin:0;padding:0;font-size:0.813em;height:100%;font-family:HelveticaNeue-Light,AppleSDGothicNeo-Light,'Malgun Gothic','맑은 고딕',sans-serif;;background:#f8f8f8;min-width:320px;-webkit-text-size-adjust: none; } +body.is_hidden{overflow:hidden} +html, h1, h2, h3, h4, h5, h6, form, fieldset {margin:0;padding:0;border:0} +h1, h2, h3, h4, h5, h6 {font-size:1em} +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {display:block} +header ul, nav ul, footer ul {margin:0;padding:0;list-style:none} +legend {position:absolute;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} +label, input, button, select {vertical-align:middle} +input, button {margin:0;padding:0;font-size:1em} +button,input[type=submit] {cursor:pointer;font-family:HelveticaNeue-Light,AppleSDGothicNeo-Light,'Malgun Gothic','맑은 고딕',sans-serif} +input[type=text], input[type=password], input[type=submit], input[type=image], button {-webkit-appearance:none} +textarea, select {font-size:1em;font-family:HelveticaNeue-Light,AppleSDGothicNeo-Light,'Malgun Gothic','맑은 고딕',sans-serif} +textarea {border-radius:0;-webkit-appearance:none} +select{background:#fff} +p {margin:0;padding:0;word-break:break-all} +hr {display:none} +pre {overflow-x:scroll;font-size:1.1em} +a:link, a:visited {color:#000;text-decoration:none} +ul,li,dl,dt,dd {padding:0;margin:0} +ul {list-style:none} + +*, :after, :before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; +} + +input[type=text],input[type=password], textarea { + -webkit-transition:all 0.30s ease-in-out; + -moz-transition:all 0.30s ease-in-out; + -ms-transition:all 0.30s ease-in-out; + -o-transition:all 0.30s ease-in-out; + outline:none; +} + +input[type=text]:focus,input[type=password]:focus, textarea:focus,select:focus { + -webkit-box-shadow:0 0 5px #9ed4ff; + -moz-box-shadow:0 0 5px #9ed4ff; + box-shadow:0 0 5px #9ed4ff; + border:1px solid #558ab7 !important; +} + +/*safari*/ +input, textarea { + -webkit-appearance: none; + -webkit-border-radius: 0; +} + +/* 팝업레이어 */ +#hd_pop {z-index:1000;position:relative;margin:0 auto;width:100%;height:0px} +#hd_pop h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +.hd_pops {position:absolute;border:1px solid #e9e9e9;background:#fff} +.hd_pops_con {} +.hd_pops img {max-width:100%;height:auto} +.hd_pops_footer {padding:10px 0;background:#000;color:#fff;text-align:right} +.hd_pops_footer button {margin-right:5px;padding:5px 10px;border:0;background:#393939;color:#fff} + +/* 상단 레이아웃 */ +#hd {position:relative;background:#212020} +#hd h1 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} + +#hd #logo a{display:block;text-align:center;padding:15px;height:55px;vertical-align:top} +#hd #logo img {max-height:100%;width:auto;vertical-align:top} + +#btn_hdcate {height:55px;width:40px;border:0;background:0;font-size:18px;vertical-align:top;position:absolute;top:0;left:5px;color:#fff;} +#btn_hdsch {position:absolute;top:0;left:45px;color:#fff;font-size:18px;border:0;background:none;height:55px;width:40px} +#btn_hdcart {position:absolute;top:0px;right:5px;color:#fff;font-size:18px;display:block;width:40px;line-height:55px;text-align:center} +#btn_hduser {position:absolute;top:0px;right:45px;color:#fff;font-size:18px;display:block;width:40px;line-height:55px;text-align:center;background:none;border:0} +#hd_btn .cart-count {position:absolute;top:20%;right:0px;display:block;height:16px;line-height:16px;border-radius:8px;background:#ff4444;font-size:10px;color:#fff;padding:0 5px} + +#hd_sch {display:none;position:absolute;top:0;left:0;text-align:center;padding:0 0 10px;width:100%;background:#212020;padding:10px 50px 10px 10px} +#hd_sch h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#hd_sch .sch_inner {position:relative} +#hd_sch #sch_str {width:100%;height:35px;background:#3a3838;border:0;padding:0 10px 0 40px;color:#000;color:#fff} +#hd_sch .sch_submit {position:absolute;top:0;left:0;width:40px;height:35px;border:0;border-radius:0 3px 3px 0;cursor:pointer;background:none;font-size:15px;color:#878786} +#hd_sch .btn_close {position:absolute;top:10px;right:0px;width:50px;height:35px;border:0;background:none;color:#c2bbb5;font-size:18px} + + +/*카테고리*/ +.menu {display:none;position:fixed;top:0;height:100%;z-index:99999;-webkit-backface-visibility:hidden;width:100%;background:#efefef} +.menu .menu_wr{;width:100%;height:100%;overflow-y:auto;background:#eee;position:relative;z-index:199919; + -webkit-box-shadow: 0 0 5px rgba(55,55,5,0.4)); + -moz-box-shadow: 0 0 5px rgba(55,55,5,0.4)); + box-shadow: 0 0 5px rgba(55,55,5,0.4);} +.menu .menu_close {position:absolute;top:50%;right:0px;width:40px;height:40px;background:none;color:#fff;font-size:20px;margin-top:-20px;border:0;z-index:199999} + +.cate {background:#fff;border-bottom:1px solid #e1e1e1} +.cate a {display:block;color:#333;padding:0 10px;border-bottom:1px solid #efefef} +.cate li {position:relative;line-height:40px} +.cate li button {position:absolute;top:0;right:0;background:url;border:0;width:30px;height:40px;overflow:hidden;border:0;background:url(../img/mobile/gnb_bg.png) no-repeat 50% 50%;text-indent:-9999px} +.cate li button.ct_cl {background:url(../img/mobile/gnb_bg2.png) no-repeat 50% 50%} + +.sub_cate {display:none} +.sub_cate a {border-bottom:1px solid #efefef;background:url(../img/btn_next.gif) no-repeat 21px 17px;padding-left:30px} +.sub_cate2 a {padding-left:40px;background-position:31px 17px} +.sub_cate3 a {padding-left:50px;background-position:41px 17px} +.sub_cate4 a {padding-left:60px;background-position:51px 17px} + +#cate_tnb {background:#fff;border-bottom:1px solid #e1e1e1;margin:10px 0} +#cate_tnb:after {display:block;visibility:hidden;clear:both;content:""} +#cate_tnb li {border-bottom:1px solid #efefef;float:left;width:50%;line-height:43px;padding:0 10px 0 50px;position:relative} +#cate_tnb li:nth-child(2n+1) {clear:both;border-right:1px solid #efefef} +#cate_tnb li i {position:absolute;top:0;left:0;width:50px;text-align:center;color:#a5a8ac;line-height:42px;font-size:16px} + +/* 중간 레이아웃 */ +#container {padding:0 0 10px} +#container_title {margin:0;font-size:1.5em;text-align:left;font-weight:bold;border-bottom:1px solid #e7e7e7;background:#fff;padding:15px;font-size:1.25em;line-height:20px;text-overflow: ellipsis;overflow: hidden;white-space: nowrap; +-webkit-box-shadow: 0 0 5px #eee; +-moz-box-shadow: 0 0 5px #eee; +box-shadow:0 0 5px #eee} +.fixed #container_title{position:fixed;top:0;left:0;width:100%;z-index:999} +#container.fixed {padding-top:60px;} +#container.idx-container {padding:0px;} + +/* 내용관리 */ +#ctt {margin:10px 0;padding:10px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.ctt_admin {margin:0 5px;text-align:right} +#ctt header h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#ctt_con {padding:10px 0} +.ctt_img {text-align:center} + +/* 하단 레이아웃 */ +#ft {background:#212020;padding:20px;text-align:left} +#ft h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#ft p {margin:0;padding:10px 0;line-height:1.8em;color:#e3e3e3;font-size:0.92em} +#ft_logo {padding:20px 0 0} +#ft_company {} +#ft_company a {display:inline-block;padding-right:10px;line-height:1em;color:#fff} +#ft_company a:first-child {border:0} +#device_change {background:#302e2e;display:block;text-align:center;padding:10px;color:#afafaf;border-radius:5px} + +/* 목록 바로가기 */ +.sanchor {margin:0 0 5px;padding:0} +.sanchor:after {display:block;visibility:hidden;clear:both;content:""} +.sanchor li {float:left;list-style:none;width:25%;border-top:2px solid #000;text-align:center; overflow:hidden; white-space:nowrap;letter-spacing:0.2em;font-size:0.93em} +.sanchor a {display:block;padding:10px;border-left:1px solid #ededed;border-bottom:1px solid #ededed;background:#fcfcfc;text-decoration:none;color:#484848} +.sanchor a:focus, .sanchor a:hover {background:#eee;text-decoration:none} +.sanchor a.sanchor_on {background:#fff;text-decoration:none;border-bottom:1px solid #fff} + +/* ####### 쇼핑몰 컨텐츠 ####### */ +.st_bg {display:inline-block;width:1px;height:10px;margin:0 10px;background:#e2e1e0;vertical-align:-1px} + +/* 장바구니 주문서 공통 */ +#sod_chk {margin:10px} +.sod_list {margin:10px 0} +.sod_list .sod_li {background:#fff;border-bottom:1px solid #e5e5e5;margin:10px 0} +.sod_list .li_name {font-size:1.083em} +.sod_list .li_op_wr {position:relative;padding:10px 10px 0 110px;min-height:90px} +.sod_list .li_op_wr .chk_box {position:absolute;top:10px;left:10px} +.sod_list .total_img {position:absolute;top:10px;left:35px} +.sod_list .mod_options {padding:0 7px;border:1px solid #d4d6db;border-radius:3px;color:#606060;background:#fff;line-height:24px;margin:5px 0 0;font-size:0.923em} +.sod_list .li_prqty {padding:10px ;border-top:1px solid #f8f8f8} +.sod_list .li_prqty:after {display:block;visibility:hidden;clear:both;content:''} +.sod_list .li_prqty_sp {float:left;width:50%;display:block;line-height:20px;padding:0 5px;text-align :right} +.sod_list .li_prqty_sp span {float:left;color:#696969} +.sod_list .prqty_sc,.sod_list .prqty_price {border-right:1px solid #e5e5e5} +.sod_list .total_price {background:#f2f7ff;display:block;clear:both;margin:0 10px 10px;text-align:right;padding:5px 10px;line-height:20px} +.sod_list .total_price span {float:left} +.sod_list .total_price strong {font-size:1.25em;color:#3a8afd} +.sod_opt {padding:5px 10px 5px 35px} +.sod_opt li {color:#777;margin:3px 0;line-height:1.3em} +.sod_opt li:before {content:"옵션";display:inline-block;margin:1px 5px 2px 0;font-size:11px;padding:0 5px;border-radius:3px;background:#e2eaf6;line-height:20px;color:#3a8afd} +.sod_opt .opt_name:before {content:"옵션";display:inline-block;margin:1px 5px 2px 0;font-size:11px;padding:0 5px;border-radius:3px;background:#e2eaf6;line-height:20px;color:#3a8afd} + +#sit_opt_added {margin:0;padding:0;border-bottom:0;background:#fff;list-style:none} +#sit_opt_added li {padding:10px 15px;margin:5px 0;border:1px solid #e6e9ed;background:#f9f9f9;position:relative} +#sit_opt_added li .opt_name {line-height:18px;padding:0 30px 5px 0;display:block} +#sit_opt_added li .opt_count {} +#sit_opt_added li .opt_count:after {display:block;visibility:hidden;clear:both;content:""} +#sit_opt_added button {float:left;width:30px;height:30px;border:1px solid #c1cdde;background:#fff;color:#666;font-size:0.92em} +#sit_opt_added button:hover {color:#000} +#sit_opt_added .num_input {float:left;border:0;height:30px;width:40px;border-top:1px solid #dee3eb;border-bottom:1px solid #dee3eb;text-align:center} +#sit_opt_added .sit_opt_del {border:0;font-size:15px;background:#fff;margin-left:3px;position:absolute;top:0;right:0;border-left:1px solid #e6e9ed;border-bottom:1px solid #e6e9ed} +#sit_opt_added .sit_opt_del:hover {color:#be334a} +#sit_opt_added .sit_opt_prc {float:right;display:block;padding:0 3px;text-align:right;line-height:30px;font-size:1.183em;font-weight:bold} + +/* 장바구니 */ +#mod_option_frm {z-index:10000;position:fixed;top:10%;left:5%;width:90%;height:auto !important;height:80%;max-height:80%;border:1px solid #dde7e9;border-radius:3px;background:#fff;overflow-y:auto;overflow-x:none} +#mod_option_frm h2 {border-bottom: 1px solid #e8e8e8;padding: 0 20px;line-height: 50px;font-size: 1.25em;} +#sod_bsk_list .mod_option_bg {content:"";position:fixed;left:0;top:0;width:100%;height:100%;background:rgba(0,0,0,0.1);display:block;z-index:9999} +#mod_option_frm #sit_sel_option{margin:15px } +#mod_option_frm #sit_tot_price{margin:15px } +#mod_option_frm h3{margin: 0 0 10px;color:#5772d5;} +#mod_option_frm .option_wr {margin:15px ; } +#mod_option_frm .option_wr label{margin: 0 0 5px;display:block} +#mod_option_frm .option_wr select{width:100%; height: 30px;border: 1px solid #d9d9d9;margin: 0 0 5px;} +#mod_option_frm .btn_confirm{margin:15px ; } +#mod_option_frm .btn_confirm .btn_submit{height:40px;font-size:1.167em;font-weight:bold;width:100%;} +#mod_option_frm .btn_confirm .btn_close{position: absolute; top: 0; right: 0;width: 50px;height: 50px;border: 0;background: none;font-size: 1.25em;border-radius: 0;} + +#sod_bsk .btn_del_wr{margin:10px } +#sod_bsk .go_shopping{margin: 10px} +#sod_bsk .go_shopping .btn01{height:45px;line-height:43px;font-size:1.167em;font-weight:bold;width:100%;text-align:center} +#m_sod_bsk_tot{background:#4a505a;color:#fff;} +#m_sod_bsk_tot:after{display:block;visibility:hidden;clear:both;content:""} +#m_sod_bsk_tot dt{float:left;width:40%;padding:10px ;line-height:20px;clear:both} +#m_sod_bsk_tot dd{float:left;width:60%;padding:10px;text-align:right;line-height:20px} +#m_sod_bsk_tot .sod_bsk_cnt{font-weight:bold;margin-top:5px;line-height:25px;background:#212a37} +#m_sod_bsk_tot .sod_bsk_cnt strong{color:#3a8afd;font-size:1.25em} +#sod_bsk_act {position:fixed;bottom:0;left:0;width:100%;background:#fff;z-index:90;border-top:1px solid #000; padding:10px 10px 10px 50%; +-webkit-box-shadow: 0 0 9px rgba(0,0,0,0.2); +-moz-box-shadow: 0 0 9px rgba(0,0,0,0.2); +box-shadow: 0 0 6px rgba(0,0,0,0.2);} +#sod_bsk_act .btn_submit{height:45px;font-size:1.167em;font-weight:bold;width:100%;border-radius:3px} +#sod_bsk_act .total{position:absolute;top:0;left:0;width:50%;padding:10px;text-align:left;color:#717171;line-height:20px;} +#sod_bsk_act .total strong{display:block;color:#000;font-size:1.154em;line-height:25px} +.naverpay-cart{text-align:center;padding:10px} + +/* 주문서 작성 */ +#sod_frm .sod_list .li_op_wr{padding-left:100px} +#sod_frm .sod_list .total_img {left:10px} +#sod_frm .sod_opt {padding-left:10px} + +#m_sod_frm_paysel {margin:10px 0;} +#m_sod_frm_paysel h3{background:#fff;padding:15px 10px ;border:1px solid #e3e5e8;border-bottom:0} +#m_sod_frm_paysel ul {margin:0 0 ;background:#fff;padding:10px;border:1px solid #e3e5e8} +#m_sod_frm_paysel ul:after {display:block;visibility:hidden;clear:both;content:""} +#m_sod_frm_paysel li {float:left;padding:5px ;width:46%;height:25px} +#m_sod_frm_paysel .KPAY{background:url('../../../img/kpay.png') no-repeat;width:37px;height:15px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%} +#m_sod_frm_paysel .PAYNOW{background:url('../../../img/paynow.png') no-repeat;width:46px;height:15px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%;} +#m_sod_frm_paysel .PAYCO{background:url('../../../img/payco.png') no-repeat 1px;width:46px;height:15px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%;} +#m_sod_frm_paysel .inicis_lpay{background:url('../../../img/lpay_logo.png') no-repeat;width:35px;height:12px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:100%;} +#m_sod_frm_paysel .inicis_kakaopay{background:url('../../../img/kakao.png') no-repeat 50% 50% #ffeb00;border-radius:30px;height:22px;width:74px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +#m_sod_frm_paysel .kakaopay_icon{background:url('../../../img/ico-mobile-kakaopay.png') no-repeat #fff;height:15px;width:43px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +#m_sod_frm_paysel .naverpay_icon{background:url('../../../img/ico-mobile-naverpay.png') no-repeat #fff;height:15px;width:40px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +#m_sod_frm_paysel .samsung_pay{margin-left:-23px;background:url('../../../img/samsungpay.png') no-repeat 24px 3px;height:25px;width:106px;display:inline-block;overflow:hidden;text-indent:-999px} + +#sod_frm_pay{padding:10px;;border-top:1px solid #f3f3f3} +#sod_frm_pay h2{margin:10px 0;font-size:1.25em} +#sod_frm_pay .cp_btn1,#sod_frm_pay .cp_cancel1{margin-top:0} +.odf_tbl{position:relative} +.odf_tbl table{background:#fff;width:100%;border-collapse:collapse;border-bottom:1px solid #ccc} +.odf_tbl table th{border-top:1px solid #eceff4;padding: 10px;text-align:left;width:120px;font-weight:normal} +.odf_tbl table td{border-top:1px solid #eceff4;padding:7px 10px;text-align:right} + +#sod_frm_pt_alert{margin:10px 0 10px;text-align:left;color:#fff;line-height: 18px;background: #f2838f;padding: 10px 10px 10px 13px;border-radius: 5px;position:relative} +#sod_frm_pt_alert::before {content: ""; position: absolute;top: 0;left: 0;width: 5px; height: 50px; border-radius: 5px 0 0 5px;background: #da4453;height:100%} + +.sod_frm_point {padding:10px 0;;clear:both} +.sod_frm_point div{background:#fff;border:1px solid #e3e5e8;padding:10px;text-align:right} +.sod_frm_point div:after {display:block;visibility:hidden;clear:both;content:''} +.sod_frm_point div label {float:left;line-height:30px} +.sod_frm_point div span {display:block;margin:5px 0} +.sod_frm_point div span:after {display:block;visibility:hidden;clear:both;content:''} +.sod_frm_point .max_point_box em{font-style:normal !important} +.sod_frm_point div strong{float:left;color:#666;font-weight:normal} +.sod_frm_point #od_temp_point{height:30px;border:1px solid #d0d3db;text-align:right;background:#fff;border-radius:3px; +-webkit-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1); +-moz-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1); +box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1);} + +#settle_bank{background:#fff;border:1px solid #e3e5e8;padding:10px;clear:both;line-height:30px} +#settle_bank:after {display:block;visibility:hidden;clear:both;content:''} +#settle_bank select{height:30px;margin:0 0 5px;width:100%;border:1px solid #d0d3db} +#settle_bank #od_deposit_name{height:30px;border:1px solid #d0d3db;text-align:center; border-radius:3px;float:right; +-webkit-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1); +-moz-box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1); +box-shadow:inset 1px 1px 5px rgba(0,0,0,0.1);} +#settle_bank label{float:left;line-height:30px} +#sod_frm_pt_info{border-top:0} +.od_coupon{position:absolute;top:0;left:0;background:#fff;width:100%;z-index:99;border-radius:0 0 3px 3px; +-webkit-box-shadow:1px 1px 5px rgba(0,0,0,0.4); +-moz-box-shadow: 1px 1px 5px rgba(0,0,0,0.4); +box-shadow: 1px 1px 5px rgba(0,0,0,0.4);} +.od_coupon h3{height:45px;line-height:45px;font-size:1.167em;background:#333;color:#fff;padding:0 15px;text-align:left} +.od_coupon .tbl_head02{} +.od_coupon .tbl_head02 .btn_frmline {background:#3b67c2;color:#fff;border:0;padding:0 5px;line-height:25px } +.od_coupon .tbl_head02 td{text-align:left} +.od_coupon .tbl_head02 th{width:auto !important} +.od_coupon .tbl_head02 .td_mngsmall{width:60px;text-align:center} +.od_coupon .tbl_head02 .td_numbig{width:80px;text-align:right} +.od_coupon .btn_confirm{margin:20px ; } +.od_coupon .btn_confirm .btn_submit{height:40px;font-size:1.167em;font-weight:bold;width:100%;} +.od_coupon .btn_confirm .btn_close{position:absolute;top:0;right:0;width:45px;height:45px;border:0;background:none;color:#fff;font-size:1.25em} + +.cp_btn ,.cp_btn1{padding: 0 7px; border: 1px solid #d4d6db;border-radius: 3px;color: #3a8afd;background: #fff; line-height: 24px; margin: 5px 0 0; font-size: 0.923em; } +.cp_apply{padding: 0 5px;border: 1px solid #3a8afd; color: #3a8afd;background: #fff;height: 23px; line-height: 21px;} +.cp_cancel,.cp_cancel1 {padding: 0 7px;border: 1px solid #d4d6db;border-radius: 3px; color: #aaa;background: #fff;line-height: 24px;margin: 5px 0 0 2px;font-size: 0.923em;} + +#sod_frm_escrow{margin:10px;} +#sod_frm_escrow h2{font-size:1.25em} +#od_pay_sl h3{font-size:1.25em} + +.sod_frm_mobile .sod_list .li_name{border-bottom:1px solid #dcdcdc;line-height:1.3em;padding:10px 10px;font-size:1.083em} +#sod_frm.sod_frm_mobile .odf_list .frm_input{width:100% !important} +#sod_frm.sod_frm_mobile input[type="radio"],#sod_frm.sod_frm_mobile input[type="checkbox"]{width:auto;-webkit-appearance:radio;-webkit-border-radius:initial} +#sod_frm.sod_frm_mobile #od_memo{min-height:50px} +#sod_frm .od_prd_list{margin:10px;background:#fff;padding:15px} +.od_prd_list .td_chk{border-left:0;} +.od_prd_list .td_prd{border-left:0;position:relative;padding-left:90px;min-height:100px} +.od_prd_list .td_prd .sod_img{position:absolute;top:15px;left:0} +.od_prd_list .td_prd .sod_name{min-height:80px} +.od_prd_list .td_prd .prd_name{font-size:1.167em} +.od_prd_list .total_prc{color:#ff006c;font-weight:bold;font-size:1.167em} + +#sod_frm_orderer{padding:10px;;border-bottom:1px solid #d6d3d3} +#sod_frm_taker{padding:10px;border-bottom:1px solid #d6d3d3;border-top:1px solid #f3f3f3} +#sod_frm_taker h2,#sod_frm_orderer h2{margin:10px 0;font-size:1.25em} +.odf_list li{} +.odf_list label,.odf_list strong{display:block;margin:7px 0 5px;color:#444;font-weight:normal} +.odf_list .frm_input{width:100%;margin:0 0 5px} +.odf_list .dlv_slt {background:#edf3fc;position:relative;border:1px solid #d1ddee;margin:5px 0;padding:10px} +.odf_list .dlv_slt strong{margin:0 ;font-weight:bold;line-height:30px} +.odf_list .dlv_slt div label{display:inline-block;margin:3px 0;color:#000} +.sod_frm_mobile #order_address{display:block;position:absolute;top:5px;right:5px;text-align:center;border: 1px solid #d4d6db;background:#fff;border-radius:3px;color:#606060;;height:30px;line-height:28px;margin:5px 0 0;padding:0 5px} +.odf_list .ad_default{display:inline-block;margin:0} +.odf_list .btn_addsch{position:absolute;top:5px;right:5px;border-radius:3px;height:30px;} +.odf_list .add_num{position:relative;display:block;} +.odf_list textarea{border: 1px solid #ccc;background: #fff;color: #000;vertical-align: middle;border-radius: 3px;padding: 5px;width:100%;height:70px; +-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} + +#sod_frm .sod_ta_wr{background: #fff} +#sod_frm .btn_confirm{;margin:0 10px 10px} +#sod_frm .btn_submit{width:100%;height:45px;font-size: 1.167em;font-weight: bold;margin:5px 0;border-radius:4px} +#sod_frm .btn_cancel,#sod_frm .btn01{width:100%;height:45px;line-height:43px;font-size:1.167em;font-weight: bold;padding:0;border-radius:4px} + +#sod_frm_escrow{margin:10px;} +#sod_frm_escrow h2{font-size:1.25em} +#od_pay_sl h3{font-size:1.25em} +.sod_frm_mobile #od_tot_price{background:none;font-weight:bold} + +/* 쿠폰 */ +#scp_list {text-align:center;background:#fff} +#scp_list .li_pd {position:relative;padding:10px} #scp_list h1 {text-align:left} +#scp_list .li_title {font-weight:bold;font-size:1.167em} +#scp_list ul:after {display:block;visibility:hidden;clear:both;content:""} +#scp_list .pd_price {position:absolute;top:10px;right:10px} +#scp_list li {padding:15px;border-bottom:1px solid #ececec;text-align:left} +#scp_list .pd_price strong {color:#ff006c;font-size:1.5em} +#scp_list .cou_top {margin-bottom:10px;position:relative} +#scp_list .li_target {color:#666;margin:5px 0 0;background:#f3f3f3;border-top:1px dotted #ccc;padding:5px 10px} #scp_list .cou_tit {font-size:1.25em;font-weight:bold} +#scp_list .pd_date {float:right;color:#777} #scp_list .cou_pri {font-size:1.25em;color:#3a8afd;font-weight:bold;position:absolute;top:0;right:0;} +#scp_list .cou_target {color:#8cc152;background:#edfbde;padding:5px;line-height:20px;font-size:0.92em;border-radius:5px} +#scp_list .cou_date {float:right;color:#888d92} +#scp_list .btn_close {margin:20px auto} + +/* 배송지 목록 */ +#sod_addr {} +#sod_addr ul {margin:0;padding:0;list-style:none} +#sod_addr li {position:relative;padding:0;border-bottom:1px solid #e9e9e9} +#sod_addr .addr_title {border-bottom:1px solid #ddd;padding:10px} +#sod_addr .ad_subject {height:30px;border:1px solid #bbb;padding:0 10px} +#sod_addr .ad_chk {position:absolute;top:17px;left:10px} +#sod_addr .addr_info {padding:15px} +#sod_addr .addr_name {margin:0 0 10px;font-weight:bold;font-size:1.083em} +#sod_addr .addr_addr {line-height:1.5em;margin:5px 0} +#sod_addr .addr_tel {margin:5px 0;color:#666} +#sod_addr .fa-mobile {font-size:14px} +#sod_addr .addr_btn {border-radius:0 0 3px 3px;padding:10px} +#sod_addr .addr_btn:after {display:block;visibility:hidden;clear:both;content:""} +#sod_addr .sel_address {width:32%;float:left;margin-right:1%;height:30px;background:none;border:1px solid #333;color:#333;padding:0 5px} +#sod_addr .del_address {display:block;width:32%;text-align:center;float:left;margin-right:1%;border:1px solid #aaa;background:none;color:#888;padding:0 5px;height:30px;line-height:28px;vertical-align:middle} +#sod_addr input[type="radio"] {position:absolute;width:0;height:0;overflow:hidden;visibility:hidden;text-indent:-999px;left:0;z-index:-1px} +#sod_addr .add_lb {display:inline-block;float:left;width:32%;text-align:center;border:1px solid #4162ff;color:#4162ff;height:30px;line-height:28px} +#sod_addr input[type="radio"]:checked+.add_lb {z-index:3;background:#4162ff;color:#fff} + +/* 주문내역 */ +#sod_v {} +#sod_v .td_stat {width:100px} +#sod_v_info {position:relative;text-align:left;color:#fff;line-height:18px;font-size:1.1em;background:#f2838f;margin:10px;padding:10px 20px;border-radius:5px;font-weight:bold} +#sod_v_info:before {content:"";position:absolute;top:0;left:0;width:5px;height:100%;border-radius:5px 0 0 5px;background:#da4453} +#sod_v_info i {font-size:1.2em;vertical-align:middle} + +/* 주문상세내역 */ +#sod_list_inq {} +#sod_list_inq .li_op_wr {padding-left:85px} +#sod_list_inq .total_img {left:10px} +#sod_list_inq .sod_opt {padding-left:10px} + +.sod_fin_list h2 {position:absolute;border:0;font-size:0;line-height:0;content:""} +.sod_fin_list .prqty_stat {display:inline-block;background: #edfbde; color: #8cc152;line-height: 24px;border-radius: 5px; border-radius: 5px;padding: 0 5px; font-weight: normal;font-size: 0.85em;margin:5px 0} +.sod_fin_list .li_opt {color:#777;margin:3px 0;line-height:1.3em;padding-right:50px} +#sod_sts_wrap {margin:10px} +#sod_sts_wrap .btn_wr {border-top:1px solid #bbb;text-align:center} +#sod_sts_explan_open {padding:0 10px;height:30px;border:1px solid #bbb;border-top:1px solid #e6e6e6;margin-top:-1px;color:#333;background:none} +#sod_sts_explan {display:none} +#sod_fin_legend {background:#edf3fc;border:1px solid #d6e2f4;border-radius:3px;margin:0 0 10px;padding:10px;line-height:20px;color:#3967ac} +#sod_fin_legend:after {display:block;visibility:hidden;clear:both;content:""} +#sod_fin_legend dt {float:left;width:20%} +#sod_fin_legend dd {float:left;width:80%} + +#sod_fin_pay,#sod_fin_orderer,#sod_fin_receiver,#sod_fin_receiver,#sod_fin_dvr{margin:10px;background:#fff;border:1px solid #e3e5e8} +#sod_fin_view h2 {position:absolute;border:0;font-size:0;line-height:0;content:""} +#sod_fin_view h3 {font-size:1.167em;padding:10px;border-bottom:1px solid #e3e5e8;line-height:1.5em} +#sod_fin_view .odf_tbl {padding:5px} +#sod_fin_view .odf_tbl .dvr_link{display:inline-block;line-height: 30px;color: #3a8afd;background: #fff;border: 1px solid #d4d6db;font-size: 0.93em;border-radius: 3px;padding:0 10px;} +#sod_fin_view table {background:#fff;width:100%;border-collapse:collapse;padding:10px 0;border:0} +#sod_fin_view table th {border:0;padding: 10px 0 10px 10px;text-align:left;width:100px;font-weight:normal} +#sod_fin_view table td {border:0;padding: 10px;text-align:left} + +#sod_fin_no {margin:10px;border:2px solid #d6e2f4;background:#edf3fc;color:#5a81bd;border-radius:3px;padding:10px 15px} +#sod_fin_no strong {font-size:1.167em} + +#sod_fin_tot {margin:10px} +#sod_fin_tot h2 {font-size:1.167em;margin:20px 0 10px} +#sod_fin_tot ul {background:#fff;border:1px solid #3a8afd;color:#000} +#sod_fin_tot li {padding:10px;line-height:25px;zoom:1} +#sod_fin_tot li:after {display:block;visibility:hidden;clear:both;content:""} +#sod_fin_tot #alrdy {background:#e5f0ff;font-weight:bold;border-top:1px solid #c6d7ef} +#sod_fin_tot #alrdy .right {margin-top:10px;text-align:right;font-weight:normal;font-size:0.9em} +#sod_fin_tot #alrdy .right p {position:relative;color:#333;margin:5px 0} +#sod_fin_tot #alrdy .right .title {position:absolute;left:0;padding-left:8px} +#sod_fin_tot strong {float:right} + +#sod_fin_cancel {margin:10px} +#sod_fin_cancel h2 {position:absolute;border:0;font-size:0;line-height:0;content:""} +#sod_fin_cancel h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_fin_cancel button {height:40px;border:1px solid #ddd;font-weight:bold;width:100%;background:none;color:#282828;font-weight:normal} +#sod_fin_cancel p {text-align:center;background:#ffe0e0;border:2px solid #d50c0c;padding:15px;color:#d50c0c;font-size:1.167em;font-weight:bold} +#sod_fin_cancelfrm {display:none;position:relative;margin:10px 0 0;text-align:center;background:#fff;padding:15px 75px 15px 15px} +#sod_fin_cancelfrm .frm_input {background:#fff;margin:0 0 5px;width:100%} +#sod_fin_cancelfrm .btn_frmline {background:#5e6b6f;color:#fff;border:0;padding:10px;width:55px;cursor:pointer;position:absolute;top:15px;right:15px;height:40px} +#sod_fin_test {padding:10px} + +/* 마이페이지 */ +#smb_my_ov {position:relative;background:#fff;margin-right:20px} +#smb_my_ov h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#smb_my_ov .my_name {display:block;background:#fff;border-bottom:1px solid #efefef;padding:15px 10px 15px 80px;font-size:1.167em} +#smb_my_ov .profile_img {display:inline-block;position:absolute;top:15px;left:15px} +#smb_my_ov .my_info_modi {position:absolute;bottom:0;right:-5px;text-align:center;background:#212020;width:20px;height:20px;line-height:20px;color:#fff;font-size:13px;border-radius:50%} +#smb_my_ov .my_name>strong {display:block} +#smb_my_ov .win_point {color:#c7d4e6;font-size:0.92em} +#smb_my_ov .win_point strong {color:#3a8afd} + +#smb_my_ov .my_name img {width:45px;border-radius:50%} +#smb_my_ov .my_name .my_ov_name {display:inline-block;margin-bottom:10px;line-height:28px} +#smb_my_ov .my_name a.smb_info {color:#3a8afd} +#smb_my_ov .smb_my_act {position:absolute;right:15px;top:20px;display:inline-block} +#smb_my_ov .smb_my_act li {display:inline-block;font-size:0.92em} +#smb_my_ov .smb_my_act li a {line-height:28px;height:30px;vertical-align:middle;padding:0 5px;margin:0;border-radius:3px} +#smb_my_ov .smb_my_act li a.btn_logout {display:inline-block;border:1px solid #4f93fd;color:#4f93fd} + +#smb_my {} +#smb_my .btn_more {display:block;height:43px;margin:15px;background:#eee;font-size:1.167em;color:#7f7e7e;line-height:43px;text-align:center;border-radius:3px} +#smb_my_ov {margin:0 0 20px} + +#smb_my_ov .my_pocou {background:#fff} +#smb_my_ov .my_pocou:after {display:block;visibility:hidden;clear:both;content:''} +#smb_my_ov .my_pocou li {width:50%;float:left;padding:15px;border-right:1px solid #efefef} +#smb_my_ov .my_pocou li:last-child {border-right:0} +#smb_my_ov .my_pocou li a{display:block;position:relative;line-height:20px} +#smb_my_ov .my_pocou li a span{display:inline-block;float:right;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:clip;padding:0 5px;line-height:20px;border-radius:35px;font-weight:normal;font-size:0.846em} +#smb_my_ov .my_pocou li.my_cou a span{background:#a352c1} +#smb_my_ov .my_pocou li.my_memo a span{background:#ff8b77} +#smb_my_ov .my_pocou li i {color:#8c9eb0;font-size:16px} + +#smb_my_ov .my_info {display:none;clear:both;width:100%;margin-top:-1px;background:#fff;padding:5px 20px 20px;border-bottom:1px solid #e6e6e6} +#smb_my_ov .my_info:after {display:block;visibility:hidden;clear:both;content:''} +#smb_my_ov .my_info_wr {float:left;width:50%;line-height:20px;padding-bottom:10px;margin:5px 0;border-bottom:1px dashed #e5e5e5} +#smb_my_ov .my_info_wr strong {display:block;vertical-align:top;padding:3px 0px;color:#8c9eb0} +#smb_my_ov .my_info_wr span {display:block;text-align:left} +#smb_my_ov .ov_addr {border-bottom:0} +#smb_my_ov .ov_addr a {color:#c7c7c7} + +#smb_my_ov .my_ov_btn {border-top:1px solid #efefef} +#smb_my_ov .my_ov_btn button {display:block;width:100%;border:0;border-bottom:1px solid #dde7e9;background:#fff;padding:15px;text-align:left;font-size:1.125em;font-weight:bold} +#smb_my_ov .my_ov_btn button i {display:inline-block;float:right} + +#smb_my_od h2 {font-size:1.167em;margin:10px} +#smb_my_wish h2 {font-size:1.167em;margin:30px 10px 10px} +.wishlist ul {margin:10px 10px 0} +.wishlist ul:after {display:block;visibility:hidden;clear:both;content:''} +.wishlist li {float:left;padding:5px;width:33.333%;text-align:center} +.wishlist li img {width:100%;height:auto;max-width:250px} +.wishlist li .info_link {display:block;font-weight:bold;margin:5px 0 2px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap} +.wishlist li .info_date {font-size:0.92em;color:#666} + +@media (max-width:970px) { + #smb_my_ov .my_info_wr {width:100%} +} + +/* 위시리스트 */ +#sod_ws {margin:10px 0} +#sod_ws li {position:relative;background:#fff;border-bottom:1px solid #e8e8e8;border-radius:3px} +#sod_ws .wish_img {position:absolute;top:50%;left:25px;z-index:10;width:70px;height:70px;margin-top:-35px;overflow:hidden;z-index:4} +#sod_ws .info_price {font-weight:bold;line-height:28px} +#sod_ws .wish_info {padding:10px 15px 10px 100px;min-height:90px} +#sod_ws .wish_chk {position:absolute;top:5px;left:5px;z-index:9} +#sod_ws .info_date {display:block;color:#777;font-size:0.92em} +#sod_ws .wish_prd {display:block;font-weight:bold;font-size:1.083em} +#sod_ws .wish_del {position:absolute;bottom:30px;right:10px} +#sod_ws .wish_del a {display:block;width:30px;height:30px;line-height:30px;background:transparent;border-radius:3px;color:#b2b2b2;text-align:center;font-size:1.25em} +#sod_ws .sold_out {display:inline-block;padding:3px 5px;background:#ff0000;color:#fff;border-radius:3px} + +#sod_ws_act {text-align:center;margin:10px} +#sod_ws_act:after {display:block;visibility:hidden;clear:both;content:''} +#sod_ws_act .btn01 {float:left;width:49%;height:50px;background:#fff;font-weight:bold;color:#000;border-radius:5px;border-radius:1px solid #98a3b3;font-weight:bold;font-size:1.25em} +#sod_ws_act .btn02 {float:right;width:49%;height:50px;border:1px solid #1c70e9;color:#fff;border-radius:5px;font-weight:bold;background:#3a8afd;font-weight:bold;font-size:1.25em} + +/* 주문내역 include */ +#sod_inquiry{border-bottom:1px solid #dde7e9} +#sod_inquiry li {background:#fff;border-top:1px solid #ececec;padding:15px;position:relative} +#sod_inquiry li:after {display:block;visibility:hidden;clear:both;content:''} +#sod_inquiry li .idtime_link {font-weight:bold;font-size:1.167em} +#sod_inquiry li .idtime_time {color:#999} +#sod_inquiry li .inq_wr:after {display:block;visibility:hidden;clear:both;content:''} +#sod_inquiry li .inquiry_name {margin:10px 0;} +#sod_inquiry li .inquiry_price {font-size:1.25em;font-weight:bold;color:#3a8afd;float:left} +#sod_inquiry li .inv_status {display:inline-block;float:right;margin: 0;font-weight:bold} +#sod_inquiry li .inv_inv {margin: 10px 0 0;display: block;border: 1px solid #e5ecf2;border-radius:3px;color:#4963b8;background:#f9fdff;padding:10px;} +#sod_inquiry li .inv_inv i {margin-right:5px} +#sod_inquiry .li_cancel{background:#fcf1f1} + +.status_01 {display:block;background:#edfbde;color:#8cc152;line-height:24px;border-radius:5px;border-radius:5px;padding:0 5px;font-weight:normal;font-size:0.85em} +.status_02 {display:block;background:#84c93a;color:#fff;line-height:24px;border-radius:5px;border-radius:5px;padding:0 5px;font-weight:normal;font-size:0.85em} +.status_03 {display:block;background:#5bd085;color:#16b494;line-height:24px;border-radius:5px;border-radius:5px;padding:0 5px;font-weight:normal;font-size:0.85em} +.status_04 {display:block;background:#e2eaf6;color:#3a8afd;line-height:24px;border-radius:5px;border-radius:5px;padding:0 5px;font-weight:normal;font-size:0.85em} +.status_05 {display:block;background:#3a8afd;color:#fff;line-height:24px;border-radius:5px;border-radius:5px;padding:0 5px;font-weight:normal;font-size:0.85em} +.status_06 {display:block;background:#fff;color:red;line-height:24px;border-radius:5px;border-radius:5px;padding:0 5px;font-weight:normal;font-size:0.85em} + +/* 주문상세내역 중 현금영수증 발급 */ +#scash {} +#scash section {padding:10px 0} +#scash h2 {margin:0 0 10px;text-align:center} +#scash .tbl_head01 th {padding:0 10px;border-top:1px solid #eee;border-bottom:1px solid #eee;background:#f2f5f9;text-align:left} +#scash_apply {padding:10px 0 15px;text-align:center} +#scash_apply button {padding:10px;border:0;background:#565e60;color:#fff} +#scash_copy {text-align:center} + +/* 화면낭독기 사용자용 */ +#hd_login_msg {position:absolute;top:0;left:0;width:1px;height:1px;overflow:hidden} +.msg_sound_only, .sound_only {display:inline-block !important;position:absolute;top:0;left:0;margin:0 !important;padding:0 !important;width:1px !important;height:1px !important;font-size:0;text-indent:-9999em;line-height:0;border:0 !important;overflow:hidden !important} + +/* 본문 바로가기 */ +#skip_to_container a {z-index:100000;position:absolute;font-size:0;line-height:0;overflow:hidden;left:0} +#skip_to_container a:focus, #skip_to_container a:active {width:100%;height:75px;background:#21272e;color:#fff;font-size:1.5em;font-weight:bold;text-align:center;text-decoration:none;line-height:3.3em} + +/* 이미지 등비율 리사이징 */ +.img_fix {width:100%;height:auto} + +/* 캡챠 자동등록(입력)방지 기본 -pc */ +#captcha {position:relative} +#captcha legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} +#captcha #captcha_img {height:40px;border:1px solid #898989;vertical-align:top;padding:0;margin:0} +#captcha #captcha_mp3 {margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;width:40px;height:40px;background:url('../../../img/captcha.png') no-repeat;text-indent:-999px;border-radius:3px} +#captcha #captcha_reload {margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;background:url('../../../img/captcha.png') no-repeat 0 -40px;text-indent:-999px;border-radius:3px} +#captcha #captcha_key {margin:0 0 0 3px;padding:0 5px;width:90px;height:40px;border:1px solid #ccc;background:#fff;font-size:1.333em;font-weight:bold;text-align:center;border-radius:3px;vertical-align:top} +#captcha #captcha_info {display:block;margin:3px 0 5px;font-size:0.95em;letter-spacing:-0.1em} + +/* ckeditor 태그 기본값 */ +#bo_v_con ul {display:block;list-style-type:disc;margin-top:1em;margin-bottom:1em;margin-left:0;margin-right:0;padding-left:40px} +#bo_v_con ol {display:block;list-style-type:decimal;margin-top:1em;margin-bottom:1em;margin-left:0;margin-right:0;padding-left:40px} +#bo_v_con li {display:list-item} + +/* 캡챠 자동등록(입력)방지 기본 - mobile */ +#captcha.m_captcha audio {display:block;margin:0 0 5px} + +/* Mobile화면으로 */ +#mobile_cng {display:block;margin:5px;padding:5px 0;border:1px solid #eee;border-radius:2em;background:#fff;color:#000;font-size:2em;text-decoration:none;text-align:center} + +/* ckeditor 단축키 */ +.cke_sc {margin:0 0 5px;text-align:right} +.btn_cke_sc {display:inline-block;padding:0 10px;height:23px;border:1px solid #ccc !important;background:#fafafa !important;color:#000 !important;text-decoration:none !important;line-height:1.9em;vertical-align:middle} +.cke_sc_def {margin:0 0 5px;padding:10px;border:1px solid #ccc;background:#f2f5f9;text-align:center} +.cke_sc_def dl {margin:0 0 5px;text-align:left} +.cke_sc_def dl:after {display:block;visibility:hidden;clear:both;content:""} +.cke_sc_def dt, .cke_sc_def dd {float:left;margin:0;padding:5px 0;border-bottom:1px solid #e9e9e9} +.cke_sc_def dt {width:20%;font-weight:bold} +.cke_sc_def dd {width:30%} + +/* 콘텐츠별 스타일 */ +.cnt_cmt {display:inline-block;margin:0 0 0 5px;font-weight:bold} + +/* 버튼 */ +.btn {display:inline-block;padding:0 5px;height:45px;line-height:43px;border-radius:3px} +a.btn01 {display:inline-block;padding:0 7px;border:1px solid #ccc;border-bottom:1px solid #aaa;background:#fff;color:#333;text-decoration:none;vertical-align:middle} +a.btn01:focus, a.btn01:hover {text-decoration:none} +button.btn01 {display:inline-block;margin:0;padding:7px;border:1px solid #ccc;background:#fff;color:#666;text-decoration:none} +a.btn02 {display:inline-block;padding:8px 7px 7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none;vertical-align:middle} +a.btn02:focus, .btn02:hover {text-decoration:none} +button.btn02 {display:inline-block;margin:0;padding:7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none} +.btn_confirm {text-align:center} /* 서식단계 진행 */ +.btn_submit {padding:0 5px;border:0;background:#3a8afd;border:1px solid #1c70e9;color:#fff;letter-spacing:-0.1em;border-radius:3px}} +fieldset .btn_submit {padding:0 7px;height:24px;line-height:1em} +a.btn_cancel {display:inline-block;padding:8px 7px 7px;border:1px solid #ccc;background:#fff;color:#000;text-decoration:none;vertical-align:middle} +button.btn_cancel {display:inline-block;padding:7px;border:1px solid #ccc;background:#fafafa;color:#000;vertical-align:top;text-decoration:none} +a.btn_frmline, button.btn_frmline {display:inline-block;padding:0 5px;height:1.9em;border:0;background:#fff;color:#3a8afd;border:1px solid #3a8afd;letter-spacing:-0.1em;text-decoration:none;vertical-align:top;line-height:1.9em} +.btn_close {border:1px solid #dcdcdc;cursor:pointer;border-radius:3px;background:#fff} +a.btn_close {text-align:center;line-height:50px} + +/* 우편번호검색버튼 등 */ +button.btn_frmline {font-size:1em} +.btn_top {margin:10px;text-align:right} +.btn_top li {display:inline-block} +.btn_top a,.btn_top .btn_submit {line-height:30px;padding:0 10px;border-radius:3px} +.btn_top .btn_cancel,.btn_top .btn_b01 {border:1px solid #aaa;background:none;color:#666;line-height:28px;background:#fff} + +/* 게시판용 버튼 */ +a.btn_b01,.btn_b01 {display:inline-block;background:#4c4f6f;color:#fff;text-decoration:none;vertical-align:middle} +.btn_b01:hover, .btn_b01:hover {} +a.btn_b02 ,.btn_b02 {display:inline-block;background:#ff506a;color:#fff;text-decoration:none;vertical-align:middle;border:0} +a.btn_b02:hover, .btn_b02:hover {} +a.btn_b03, .btn_b03 {display:inline-block;line-height:28px;border:1px solid #ed6478;color:#ed6478;background:none;text-decoration:none;vertical-align:middle} +a.btn_b03:hover, .btn_b03:hover {} +a.btn_admin {display:inline-block;background:#e8180c;color:#fff;text-decoration:none;vertical-align:middle} /* 관리자 전용 버튼 */ +a.btn_admin:focus, a.btn_admin:hover {} + +.is_community .btn_top {position:relative;height:50px;margin:0;padding:10px 15px;line-height:30px;background:#fff;color:#333;text-align:right; +-webkit-box-shadow:0 0 10px rgba(181, 181, 181, 0.4); +-moz-box-shadow:0 0 10px rgba(181, 181, 181, 0.4); +box-shadow:0 0 10px rgba(181, 181, 181, 0.4); +} +.is_community a.btn_admin {display:inline-block;color:#d13f4a;font-size:1.4em;background:transparent;text-decoration:none;vertical-align:middle} +.is_community .btn_bo_user > li {display:inline-block;float:none;text-align:center;margin-left:5px} +.is_community .all_chk.chk_box input[type="checkbox"] + label span{top:2px;left:0} +.is_community a.btn,.is_community .btn {line-height:35px;width:30px;height:35px;padding:0 5px;text-align:center;font-weight:bold;border:0;font-size:1.4em} +.is_community .more_opt{right:40px} +.is_community .chk_box input[type="checkbox"] + label {padding-left:20px;color:#676e70} +.is_community .all_chk {padding:10px 15px;} + +/* 기본테이블 */ +.tbl_wrap {margin:0 0 10px} +.tbl_wrap table {width:100%;border-collapse:collapse;border-spacing:0} +.tbl_wrap caption {padding:10px 0;color:#4b8b99;font-weight:bold;text-align:left} + +.tbl_head01 {margin:0 0 10px} +.tbl_head01 table {border-bottom:1px solid #d3d3d3} +.tbl_head01 caption {padding:0;font-size:0;line-height:0;overflow:hidden} +.tbl_head01 thead th {padding:12px 0;border-top:2px solid #000;border-bottom:1px solid #d3d3d3;background:#fff;color:#383838;font-size:0.95em;text-align:center;letter-spacing:-0.1em} +.tbl_head01 thead a {color:#383838} +.tbl_head01 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head01 tfoot th, .tbl_head01 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center} +.tbl_head01 tbody th {padding:10px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head01 td {padding:15px 5px;border-top:1px solid #f3f3f3;border-left:1px solid #f3f3f3;line-height:1.5em;word-break:break-all} +.tbl_head01 td:first-child {border-left:0} +.tbl_head01 a {} + +.tbl_head02 {margin:15px} +.tbl_head02 caption {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +.tbl_head02 thead th {padding:7px 0;border-top:1px solid #333;border-bottom:1px solid #ddd;background:#f3f3f3;color:#333;font-size:0.95em;text-align:center} +.tbl_head02 thead a {color:#383838} +.tbl_head02 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head02 tfoot th {border-top:1px solid #666;border-bottom:1px solid #666;background:#484848;color:#fff} +.tbl_head02 tfoot td {background:#484848;color:#fff;font-weight:bold;text-align:center} +.tbl_head02 tbody th {padding:5px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head02 td {padding:5px 3px;border-bottom:1px solid #e9e9e9;line-height:1.4em;word-break:break-all} + +.tbl_head03 {margin:0 0 10px} +.tbl_head03 table {border-bottom:1px solid #d3d3d3} +.tbl_head03 caption {padding:0;font-size:0;line-height:0;overflow:hidden} +.tbl_head03 thead th {padding:12px 0;border-top:2px solid #000;border-bottom:1px solid #d3d3d3;;color:#383838;font-size:0.95em;text-align:center;letter-spacing:-0.1em} +.tbl_head03 thead a {color:#383838} +.tbl_head03 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head03 tfoot th, .tbl_head03 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center} +.tbl_head03 tbody th {padding:10px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head03 td {padding:15px 5px;border-top:1px solid #f3f3f3;border-left:1px solid #f3f3f3;background:#fff;line-height:1.5em;word-break:break-all} +.tbl_head03 td:first-child {border-left:0} +.tbl_head03 a {} + +/* 폼 테이블 */ +.tbl_frm01 {} +.tbl_frm01 th {padding:10px 0;width:90px;border:1px solid #e9e9e9;border-left:0;text-align:left} +.tbl_frm01 td {padding:10px 5px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;background:transparent} +.wr_content textarea,.tbl_frm01 textarea,.form_01 textarea, .frm_input {border:1px solid #d0d3db;background:#fff;color:#000;vertical-align:middle;padding:5px;font-size:1.083em;max-width:100%;} +.frm_input {height:40px;} + +.tbl_frm01 a {text-decoration:none} +.tbl_frm01 .frm_address {margin-top:5px;width:100%} +.tbl_frm01 .frm_file {display:block;margin-bottom:5px;width:100%} +.tbl_frm01 .frm_info {display:block;padding:5px 0 0;color:#666;line-height:1.3em} + +/* 기본리스트 */ +.list_01 {padding:0 10px} +.list_01 li {background:#fff;border-radius:3px;margin:10px 0;padding:10px 15px; +-webkit-box-shadow: 0 1px 4px #cbd1df; +-moz-box-shadow: 0 1px 4px #cbd1df; +box-shadow:0 1px 4px #cbd1df;} + +/* 기본폼 */ +.form_01{margin:10px} +.form_01 div{margin:5px 0;position:relative} +.form_01 li{margin:5px 0;position:relative} +.form_01 textarea {width:100%;height:100px} +.frm_input {height:40px} +.full_input {width:100%} +.form_01 .frm_file {display:block;margin-bottom:5px;width:100%} +.form_01 select {height:40px;border-radius:3px} +.form_01 .frm_info {font-size:0.92em;color:#4162ff;text-align:left;margin:3px 0 10px;display:block;line-height:1.3em} + +/* 자료 없는 목록 */ +.empty_table {padding:50px 0 !important;text-align:center !important;color:#666 !important} +.empty_list {padding:50px 0 !important;text-align:center !important;color:#666 !important} + +/* 필수입력 */ +.required, textarea.required {background-image:url('../img/require.png') !important;background-repeat:no-repeat !important;background-position:right top !important} + +/* 테이블 그리드 padding 0 5px 고려한 넓이 */ +.grid_1 {width:40px} +.grid_2 {width:100px} +.grid_3 {width:120px} +.grid_4 {width:190px} +.grid_5 {width:240px} +.grid_6 {width:290px} +.grid_7 {width:340px} +.grid_8 {width:390px} +.grid_9 {width:440px} +.grid_10 {width:490px} +.grid_11 {width:540px} +.grid_12 {width:590px} +.grid_13 {width:640px} +.grid_14 {width:690px} +.grid_15 {width:740px} +.grid_16 {width:790px} +.grid_17 {width:840px} +.grid_18 {width:890px} + +/* 테이블 항목별 정의 */ +.td_chk {width:50px;text-align:center} +.td_group {width:100px;text-align:center} +.td_board {width:120px;text-align:center} +.td_statsmall {width:50px;text-align:center} +.td_num {width:50px;text-align:center} +.td_numbig {width:100px;text-align:center} +.td_mb_id {width:100px;text-align:center} +.td_nick {width:100px;text-align:center} +.td_name {width:100px;text-align:left} +.td_namesmall {width:100px;text-align:left} +.td_date {width:50px;text-align:center} +.td_datetime {width:170px;text-align:center} +.td_mngsmall {width:50px;text-align:center} +.td_mng {width:80px;text-align:center} +.td_stat {text-align:center} +.td_dvr {text-align:center} + +/* 새창 기본 스타일 */ +.new_win {} +.new_win #win_title {font-size:1.3em;min-height:50px;line-height:30px;padding:10px 20px;background:#fff;color:#000;-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1); +-moz-box-shadow:0 1px 10px rgba(0,0,0,.1); +box-shadow:0 1px 10px rgba(0,0,0,.1)} +.new_win #win_title .sv {font-size:0.75em;line-height:1.2em} +.new_win_con {margin:10px} + +.new_win .win_ul {margin:10px} +.new_win .win_ul li {display:inline-block} +.new_win .win_ul li a {display:block;line-height:24px;padding:0 10px} +.new_win .win_ul li .selected {background:#4162ff;color:#fff;border-radius:13px; +-webkit-box-shadow:0 0 5px rgba(65,98,255,0.8); +-moz-box-shadow:0 0 5px rgba(65,98,255,0.8); +box-shadow:0 0 8px rgba(65,98,255,0.8)} + +.new_win .win_desc {margin:5px 0;font-size:0.92em;color:#4162ff} +.new_win .win_btn {clear:both;margin:10px;text-align:center} +.new_win .win_btn a {display:inline-block;height:45px;line-height:45px;font-weight:bold} +.new_win .btn_close {height:45px;width:60px;overflow:hidden;cursor:pointer} +.new_win .btn_submit {padding:0 20px;height:45px;font-weight:bold;font-size:1.083em;vertical-align:top} + +/* 자바스크립트 alert 대안 */ +#validation_check {margin:100px auto;width:500px} +#validation_check h1 {margin-bottom:20px;font-size:1.3em} +#validation_check p {margin-bottom:20px;padding:30px 20px;border:1px solid #e9e9e9;background:#fff} + +/* 사이드뷰*/ +.sv_wrap {display:inline-block;position:relative;font-weight:normal} +.sv_wrap .sv {z-index:1000;display:none;margin:5px 0 0;border:1px solid #283646;background:#111} +.sv_wrap .sv a {display:inline-block !important;margin:0 !important;padding:5px !important;width:94px;border-bottom:1px solid #283646;color:#fff !important} +.sv_wrap a:focus, .sv_wrap a:hover, .sv_wrap a:active {text-decoration:none !important} +.sv_on {display:block !important;position:absolute;top:10px;left:20px;width:auto;height:auto !important} +.sv_nojs .sv {display:block} + +/* 페이징 */ +.pg_wrap {clear:both;display:block;padding:10px 0;text-align:center} +.pg_wrap:after {display:block;visibility:hidden;clear:both;content:""} +.pg {text-align:center} +.pg_page, .pg_current, .qa_page {display:inline-block;vertical-align:middle;background:#eee;border:1px solid #eee} +.pg a:focus, .pg a:hover {text-decoration:none} +.pg_page,.qa_page {color:#959595;font-size:1.083em;height:30px;line-height:28px;padding:0 5px;min-width:30px;text-decoration:none;border-radius:3px} +.pg_page:hover,.qa_page:hover {background-color:#fafafa} +.pg_start {text-indent:-999px;overflow:hidden;background:url('../img/btn_first.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_prev {text-indent:-999px;overflow:hidden;background:url('../img/btn_prev.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_end {text-indent:-999px;overflow:hidden;background:url('../img/btn_end.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_next {text-indent:-999px;overflow:hidden;background:url('../img/btn_next.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee} +.pg_start:hover,.pg_prev:hover,.pg_end:hover,.pg_next:hover {background-color:#fafafa} + +.pg_current {display:inline-block;background:#3a8afd;border:1px solid #3a8afd;color:#fff;font-weight:bold;height:30px;line-height:30px;padding:0 10px;min-width:30px;border-radius:3px} + +/* 상품상세 메뉴 floating */ +#info_top_layer {display:none;position:absolute;top:0;left:0;width:100%;background-color:#eee} +#form_btn_layer {display:none;position:absolute;top:0;left:0;width:100%;height:60px;background-color:#eee} + +/*현금영수증*/ +#kcp_req_rx .tbl_head01 tbody th {text-align:left} + +/*배송지목록*/ +#sod_addr .win_desc {padding:10px 20px} + +/*쇼핑몰레이아웃*/ +#mb_login .btn_submit {} +#bo_list,#bo_cate {margin-top:10px !important} +#fregisterform {} +#bo_w .btn_submit, #bo_w a.btn_cancel {padding:8px 7px} +#bo_w {padding:10px} +#fqalist {padding:0 10px} + +/*이벤트*/ +#sev_hhtml,#sev_thtml {padding:10px} +#sev_hhtml img,#sev_thtml img {width:100%} + +/*네이버페이*/ +.naverpay-item {padding-top:15px;clear:both} +#sod_bsk_act .naverpay-cart {margin-top:15px;clear:both;position:static} + +/*PC 주문서*/ + +#sod_frm .tbl_head03{padding:0;background:none} +#sod_frm .tbl_head03 .sod_opt {padding:5px 0} +#sod_frm_orderer .odpw_info{display:block;margin:0 0 7px;color:#3a8afd} +#sod_frm_orderer .tbl_frm01,#sod_frm_taker .tbl_frm01{background:#fff;padding:10px 0;margin:0} +#sod_frm_taker .choice_place{background:#edf3fc;margin:10px;padding:10px;border:1px solid #d1ddee} +#sod_frm_taker .choice_tit{display:block;font-weight:bold;margin:0 0 5px} +#sod_frm_orderer table th,#sod_frm_taker table th{border:0;padding:10px 5px;text-align:right;vertical-align:top} +#sod_frm_orderer table td,#sod_frm_taker table td{border:0;padding:5px 10px;vertical-align:middle} +.sod_right #sod_bsk_tot{margin:10px} +#sod_frm_taker textarea{width:100%;height:80px} + +#od_pay_sl input[type="radio"] {position:absolute;width:0;height:0;overflow:hidden;visibility:hidden;text-indent:-999px;left:0;z-index:-1px} +#od_pay_sl .lb_icon {display:inline-block;float:left;width:150px;background:#fff;border:1px solid #eceff4;margin:-1px 0 0 -1px;cursor:pointer;height:60px;position:relative;padding-left:65px;padding-top:20px;z-index:1} +#od_pay_sl input[type="radio"]:checked+.lb_icon {border:1px solid #ff006c;z-index:3} + +#sod_frm_paysel {} +#sod_frm_paysel legend {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#sod_frm_paysel .KPAY{background:url('../../../img/kpay.png') no-repeat 0 3px;width:67px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:35px auto} +#sod_frm_paysel .PAYNOW{background:url('../../../img/paynow.png') no-repeat 0 3px;width:74px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:45px auto;} +#sod_frm_paysel .PAYCO{background:url('../../../img/payco.png') no-repeat 0 3px;width:74px;;overflow:hidden;text-indent:-999px;display:inline-block;background-size:45px auto;} +#sod_frm_paysel .inicis_lpay{background:url('../../../img/lpay_logo.png') no-repeat 0 3px;width:65px;overflow:hidden;text-indent:-999px;display:inline-block;background-size:35px auto;} +#sod_frm_paysel .kakaopay_icon{background:url('../../../img/kakao.png') no-repeat 0 3px;width:74px;display:inline-block;overflow:hidden;text-indent:-999px;background-size:35px auto} +#sod_frm_paysel .samsung_pay{background:url('../../../img/samsungpay.png') no-repeat 0 3px;width:106px;display:inline-block;overflow:hidden;text-indent:-999px} + +#sod_bsk_tot:after {display:block;visibility:hidden;clear:both;content:""} +.sod_info li {position:relative;float:left;background:#fff;width:33.333%;height:70px;text-align:center;border-bottom:1px solid #e7ebf1;padding:15px 0} +.sod_info li:after {display:block;visibility:hidden;clear:both;content:""} +.sod_info li span {display:block;color:#777;margin-bottom:5px;font-weight:bold;color:#000} +.sod_info .sod_bsk_sell, .sod_info .sod_bsk_coupon {border-right:1px solid #e7ebf1} +.sod_info .sod_bsk_coupon:before {display:block;content:"-";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#9da6c9;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size:16px;line-height:14px} +.sod_info .sod_bsk_dvr:before {display:block;content:"+";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#9da6c9;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size:16px;line-height:14px} +.sod_info .sod_bsk_cnt strong {font-size:1.25em} + +.sod_info_bt {clear:both;padding:10px 15px;background:#fff} +.sod_info_bt:after {display:block;visibility:hidden;clear:both;content:""} +.sod_info_bt li {} +.sod_info_bt li:after {display:block;visibility:hidden;clear:both;content:""} +.sod_info_bt li span {display:inline-block;float:left;width:50%;line-height:28px;text-align:left;font-weight:bold;color:#000} +.sod_info_bt li strong {display:inline-block;float:left;width:50%;line-height:28px;text-align:right} + +.sod_info_option {clear:both;border-top:1px solid #e7ebf1} +.sod_info_option h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.sod_info_option ul {padding:10px 15px;background:#fff} +.sod_info_option li {margin-bottom:5px} +.sod_info_option li:after {display:block;visibility:hidden;clear:both;content:""} +.sod_info_option .sod_ifop_tit {display:inline-block;float:left;width:50%;line-height:28px;text-align:left;font-weight:bold} +.sod_info_option .sod_ifop_tit .btn_frmline {width:auto;height:30px;color:#3a8afd;background:#fff;border:1px solid #d4d6db;font-size:0.93em;border-radius:3px} +.sod_info_option .sod_ifop_tit .cp_cancel {width:auto;height:30px;border:1px solid #d4d6db;padding:0 5px;margin-left:5px;color:#b1b1b1;vertical-align:baseline} +.sod_info_option .sod_ifop_tit .od_coupon>td {text-align:left} +.sod_info_option>td, .sod_info_option .sod_ifop_t {display:inline-block;float:left;width:50%;line-height:28px;text-align:right} +.sod_info_option>td {text-align:right;padding:10px;height:30px} +.sod_info_option>td .cp_cancel {margin:0 0 0 2px} +.sod_info_option>td .btn_frmline {padding:0 7px;border:1px solid #38b2b9;color:#38b2b9;background:#fff;height:23px;line-height:21px;margin:0} + +.btn_address{background:#70aff2;border:1px solid #3476be;height:40px;color:#fff;padding:0 10px;font-size:1.083em;font-weight:bold} + +/* 5.4.1.3 버전이후 추가 css */ +#sod_frm div.tbl_frm01, #sod_frm_taker div.tbl_frm01{padding:0px 10px !important} +#sod_frm .tbl_frm01 th, #sod_frm .tbl_frm01 td{padding:10px;line-height:45px} +#sod_frm .tbl_frm01 th{width:94px} +#sod_frm #od_name,#sod_frm #od_tel,#sod_frm #od_hp,#sod_frm #od_pwd,#sod_frm #od_b_name,#sod_frm #od_b_tel,#sod_frm #od_b_hp,#sod_frm #ad_subject,#sod_frm #od_hope_date{width:50%} +#sod_frm #od_zip,#sod_frm #od_b_zip{width:90px} +#sod_frm .tbl_frm01 td .btn_address {background:#434a54;color:#fff;width:128px;height:45px;border:0;border-radius:3px} +#sod_frm #od_memo{min-height:100px} +#sod_frm_taker .order_choice_place{position:relative;background:#edf3fc;border:1px solid #d1ddee;padding:10px} +#sod_frm_taker .order_choice_place{line-height:23px} +#sod_frm_taker .tbl_frm01 #order_address{display:block;;text-align:center;border: 1px solid #3476be;color: #3476be;;height:30px;line-height:28px;margin:5px 0 0;background:none} +#sod_frm #sod_bsk_tot:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm #sod_bsk_tot li{position:relative;float:left;background:#fff;width:33.333%;height:70px;text-align:center;border-bottom:1px solid #e7ebf1;padding:15px 0} +#sod_frm #sod_bsk_tot li:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm #sod_bsk_tot li span{display:block;color:#777;margin-bottom:5px;font-weight:bold} +#sod_frm #sod_bsk_tot .sod_bsk_sell,#sod_frm #sod_bsk_tot .sod_bsk_coupon{border-right:1px solid #e7ebf1} +#sod_frm #sod_bsk_tot .sod_bsk_point,#sod_frm #sod_bsk_tot .sod_bsk_cnt{width:100%;clear:both;height:40px;padding:0 15px;line-height:40px;text-align:right} +#sod_frm #sod_bsk_tot li:last-child {border-bottom:0 none} +#sod_frm #sod_bsk_tot .sod_bsk_point span,#sod_frm #sod_bsk_tot .sod_bsk_cnt span {float:left;margin:0} +#sod_frm #sod_bsk_tot .sod_bsk_coupon:before{display:block;content:"-";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#ff006c;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size: 16px;line-height: 14px;} +#sod_frm #sod_bsk_tot .sod_bsk_dvr:before{display:block;content:"+";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#ff006c;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size: 16px;line-height: 14px;} +#sod_frm #sod_bsk_tot .sod_bsk_cnt strong{color:#ff006c;font-size:1.25em} +#sod_frm_pay {position:relative;margin:10px 0} +#sod_frm #sod_frm_pay h2 {position:absolute;border:0;font-size:0;line-height:0;content:""} +#sod_frm_pay .pay_tbl table{width:100%;border-collapse:collapse} +#sod_frm_pay .pay_tbl th{text-align:left;padding:10px;width:80px;border-bottom:1px solid #e7ebf1;background:#fff;font-weight:bold;color:#777} +#sod_frm_pay .pay_tbl td{text-align:right;padding: 10px;height:30px;border-bottom:1px solid #e7ebf1;background:#fff} +#sod_frm_pay .pay_tbl td .cp_cancel{margin:0 0 0 2px} +#sod_frm_pay .pay_tbl td .btn_frmline{padding: 0 7px;border: 1px solid #38b2b9;color: #38b2b9;background: #fff;height: 23px;line-height: 21px;margin: 0;} +#od_tot_price{margin:10px 0;background:#fff;line-height:40px;text-align:right;padding:0 10px} +#od_tot_price span{float:left;font-weight:bold} +#od_tot_price strong{font-size:1.5em;color:#ff006c} +#od_pay_sl h3{font-size:1.167em;margin:20px 0 5px} +#od_pay_sl input[type="radio"]{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden;text-indent:-999px;left: 0;z-index: -1px;} +#od_pay_sl .lb_icon {display: inline-block;float:left;width:50%;background:#fff;border:1px solid #eceff4;margin:-1px 0 0 -1px;cursor: pointer;height:60px;position:relative;padding-left:65px;padding-top:20px;z-index:1} +#od_pay_sl input[type="radio"]:checked+.lb_icon {border:1px solid #ff006c;z-index:3} +#sod_frm_paysel {} +#sod_frm_paysel legend {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sod_frm_paysel .KPAY{background:url('../../../img/kpay.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .PAYNOW{background:url('../../../img/paynow.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .PAYCO{background:url('../../../img/payco.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .inicis_lpay{background:url('../../../img/lpay_logo.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .inicis_kakaopay{background:url('../../../img/kakao.png') no-repeat 50% 50% #f4dc34;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .kakaopay_icon{background:url('../../../img/kakao.png') no-repeat 50% 50% #f4dc34;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .naverpay_icon{background:url('../../../img/ico-default-naverpay.png') no-repeat 50% 50% #fff;overflow:hidden;text-indent:-999px} +#sod_frm_paysel .bank_icon{background:url('../../../img/pay_icon1.png') no-repeat 15px 50% #fff} +#sod_frm_paysel .vbank_icon{background:url('../../../img/pay_icon2.png') no-repeat 15px 50% #fff} +#sod_frm_paysel .iche_icon{background:url('../../../img/pay_icon2.png') no-repeat 15px 50% #fff} +#sod_frm_paysel .hp_icon{background:url('../../../img/pay_icon3.png') no-repeat 24px 50% #fff} +#sod_frm_paysel .card_icon{background:url('../../../img/pay_icon4.png') no-repeat 17px 50% #fff} +#forderform .sod_right #sod_bsk_tot {border:1px solid #e3e5e8} +#forderform .od_pay_buttons_el{margin-top:20px;border:1px solid #e3e5e8;background:#fff;padding:10px} +#forderform .od_pay_buttons_el h3{font-size:1.167em;margin:0px 0 5px} +#forderform #sod_frm_pt{border-top:1px solid #e3e5e8} +#sod_frm_taker td input[type="radio"], #sod_frm_taker td input[type="checkbox"]{width:auto;-webkit-appearance:radio;-webkit-border-radius:initial} +#sod_frm_taker label {display:inline-block;font-weight:normal;margin-right:1em} + +#sod_frm #sod_bsk_tot{margin:10px;} +#sod_frm #sod_bsk_tot:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm #sod_bsk_tot li{position:relative;float:left;background:#fff;width:33.333%;height:70px;text-align:center;border-bottom:1px solid #e7ebf1;padding:15px 0} +#sod_frm #sod_bsk_tot li:after {display:block;visibility:hidden;clear:both;content:""} +#sod_frm #sod_bsk_tot li span{display:block;color:#777;margin-bottom:5px;font-weight:bold} +#sod_frm #sod_bsk_tot .sod_bsk_sell,#sod_frm #sod_bsk_tot .sod_bsk_coupon{border-right:1px solid #e7ebf1} +#sod_frm #sod_bsk_tot .sod_bsk_point,#sod_frm #sod_bsk_tot .sod_bsk_cnt{width:100%;clear:both;height:40px;padding:0 15px;line-height:40px;text-align:right} +#sod_frm #sod_bsk_tot .sod_bsk_point span,#sod_frm #sod_bsk_tot .sod_bsk_cnt span {float:left;margin:0} +#sod_frm #sod_bsk_tot .sod_bsk_coupon:before{display:block;content:"-";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#ff006c;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size: 16px;line-height: 14px;} +#sod_frm #sod_bsk_tot .sod_bsk_dvr:before{display:block;content:"+";position:absolute;top:25px;left:-10px;width:20px;height:20px;background:#fff;color:#ff006c;border-radius:50%;border:1px solid #e7ebf1;font-weight:bold;font-size: 16px;line-height: 14px;} +#sod_frm #sod_bsk_tot .sod_bsk_cnt strong{color:#ff006c;font-size:1.25em} +#sod_frm_pay .pay_tbl table{width:100%;border-collapse:collapse} +#sod_frm_pay .pay_tbl th{text-align:left;padding:10px;width:90px;border-bottom:1px solid #e7ebf1;background:#fff;font-weight:bold;color:#777} +#sod_frm_pay .pay_tbl td{text-align:right;padding: 10px;height:30px;border-bottom:1px solid #e7ebf1;background:#fff} +#sod_frm_pay .pay_tbl td .cp_cancel{margin:0 0 0 2px} +#sod_frm_pay .pay_tbl td .btn_frmline{padding: 0 7px;border: 1px solid #38b2b9;color: #38b2b9;background: #fff;height: 23px;line-height: 21px;margin: 0;} +#od_tot_price{margin:10px 0;background:#fff;line-height:40px;text-align:right;padding:0 10px} +#od_tot_price span{float:left;font-weight:bold} +#od_tot_price strong{font-size:1.5em;color:#ff006c} + +#od_tot_price {background:#e5f0ff;line-height:20px;text-align:right;padding:15px} +#od_tot_price span {float:left;font-weight:bold} +#od_tot_price strong {font-size:1.5em;color:#ff006c} +#sod_frm_pay_info {margin:0 0 10px} + +#sod_point {clear:both;background:#fff;margin:10px;border:1px solid #e3e5e8} +#sod_point h2 {font-size:1.167em;padding:15px;border-bottom:1px solid #e3e5e8} +#sod_point h2:after {display:block;visibility:hidden;clear:both;content:''} + +#sod_point .point_tit {vertical-align:baseline;float:left;line-height:28px} +#sod_point .point_tit label {vertical-align:baseline} +#sod_point .point_ipt {float:right;display:inline-block;margin-left:35px;text-align:left;text-align:right;font-weight:normal} +#sod_point .point_ipt:after {display:block;visibility:hidden;clear:both;content:''} +#sod_point .point_ipt #od_temp_point {width:100px;height:30px;text-align:right;padding:0 5px;border:1px solid #d0d3db;border-radius:3px} + +#sod_frm_pt .max_point_box em {font-style:normal !important} + +.sod_frm_pc #sod_frm_pay {position:relative;margin:10px;padding:0} +.sod_frm_pc #sod_frm_pay h2 {font-size:1.167em;padding:15px;margin:0;border-bottom:1px solid #e3e5e8} +.sod_frm_pc #sod_frm_pay .tooltip_txt {height:auto;line-height:18px;font-weight:normal;font-size:1em;padding:10px 20px;margin:10px} +.sod_frm_pc #sod_frm_pay .tooltip_txt:before {height:100%} +.sod_frm_pc #sod_frm_pay input[type="radio"] {} +.sod_frm_pc #sod_frm_pay .lb_icon {display:inline-block;position:relative;cursor:pointer;z-index:1} +.sod_frm_pc #sod_frm_pay input[type="radio"]:checked+.lb_icon {color:#3a8afd;z-index:3} +.sod_frm_pc #sod_frm_pay input[type="radio"] + label span {top:0px} +.sod_frm_pc .pay_way {padding:0 10px 10px} +.sod_frm_pc .pay_way li{margin:0 0 5px} +.sod_frm_pc #settle_bank {border:0;border-top:1px solid #e3e5e8;text-align:right;padding:0} +.sod_frm_pc #sod_frm_paysel {padding:0;} +.sod_frm_pc #settle_bank {padding:10px;} + +.sod_frm_pc #sod_frm_orderer .tbl_frm01 th{text-align:left} +.sod_frm_pc #sod_frm_taker .tbl_frm01 th{text-align:left} +.sod_frm_pc td .frm_input{width:100%} +.sod_frm_pc td #od_zip ,.sod_frm_pc td #od_b_zip{width:auto} +/* 팁 */ +.tooltip_icon {display:inline-block;vertical-align:middle;color:#b3b5b8;border:0;font-size:1.4em;background:transparent;cursor:pointer} +.tooltip_icon:hover {color:#448bf5} +.tooltip {position:relative;width:auto;color:#fff;background:#000;padding:10px;font-size:small;line-height:18px;display:none;position:absolute;z-index:9;font-weight:normal;margin-left:15px;margin-top:20px} +.tooltip:before {content:"";position:absolute;top:0;left:-10px;width:0;height:0;border-style:solid;border-top:0px solid transparent;border-bottom:10px solid transparent;border-left:0;border-right:10px solid #000} + +.tooltip_txt {position:relative;text-align:left;color:#fff;height:50px;line-height:50px;font-size:1.1em;background:#f2838f;margin:0 0 10px;padding:0 20px;border-radius:5px;font-weight:bold} +.tooltip_txt:before {content:"";position:absolute;top:0;left:0;width:5px;height:50px;border-radius:5px 0 0 5px;background:#da4453} +.tooltip_txt i {font-size:1.2em;vertical-align:middle} + +/*-- 개인결제 --*/ +/*모바일*/ +#m_sod_frm_orderer {margin:10px 0;border-top:1px solid #e7ebf1} +#m_sod_frm_orderer h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#m_sod_frm_orderer ul {background:#fff;margin:15px 0;border-bottom:1px solid #ccc;padding:10px 15px} +#m_sod_frm_orderer li {line-height:20px} +#m_sod_frm_orderer th {display:block;width:100% !important;font-weight:bold;border:0} +#m_sod_frm_orderer td {display:block;width:100% !important;text-align:left;padding:5px 10px;border:0;margin-bottom:10px} +#m_sod_frm_orderer td .frm_input {width:100%} +#m_pv_sod_frm .btn_confirm {margin:10px} +#m_pv_sod_frm .btn_confirm .btn_submit {width:100%;height:45px;font-size:1.167em;font-weight:bold;margin:0 0 3px} +#m_pv_sod_frm .btn_confirm .btn_cancel {width:100%;height:45px;line-height:43px;font-size:1.167em;font-weight:bold;padding:0} +#m_pv_sod_frm .pay_way {border-top:1px solid #e7ebf1} +#m_pv_sod_frm .pay_way li {padding:5px 0} + +/*피씨에서 모바일*/ +.pesonal {background:#fff;border-top:1px solid #e7ebf1;border-bottom:1px solid #e3e5e8;margin:10px 0} +.pesonal h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +.pesonal .tbl_frm01 {padding:10px;margin:0} +.pesonal tr {display:inline-block;width:100%;padding:0 5px;margin-bottom:20px} +.pesonal th {display:block;width:auto;text-align:left;padding:10px 0;font-weight:bold;border:0} +.pesonal td {display:block;padding:0;border:0} +.pesonal td input {width:100%} +.pesonal .half_tr {width:50%} +.sod_right .btn_confirm {margin:10px} +.sod_right .btn_submit, .sod_right .btn01 {width:100%;height:45px;font-size:1.167em;font-weight:bold;margin:5px 0;border-radius:4px;line-height:45px} + +/* input, radio */ +.selec_chk {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box {position:relative} +.chk_box input[type="checkbox"] + label {position:relative;padding-left:20px;color:#676e70} +.chk_box input[type="checkbox"] + label:hover {color:#2172f8} +.chk_box input[type="checkbox"] + label span {position:absolute;top:2px;left:0;width:15px;height:15px;display:block;margin:0;background:#fff;border:1px solid #d0d4df;border-radius:3px} +.chk_box input[type="checkbox"]:checked + label {color:#000} +.chk_box input[type="checkbox"]:checked + label span {background:url('../img/chk.png') no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} + +.chk_box input[type="radio"] {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box input[type="radio"] + label {position:relative;padding-left:23px;display:inline-block;color:#676e70} +.chk_box input[type="radio"] + label span {position:absolute;top:0;left:0;width:15px;height:15px;display:block;background:#fff;border:1px solid #cdd6df;border-radius:50%} +.chk_box input[type="radio"]:checked + label {color:#305af9} +.chk_box input[type="radio"]:checked + label span:before {width:7px;height:7px;background:#305af9;content:'';position:absolute;top:3px;left:3px;border-radius:50%} + diff --git a/theme/basic/head.php b/theme/basic/head.php index 098fd18ff..60836c4ab 100644 --- a/theme/basic/head.php +++ b/theme/basic/head.php @@ -6,6 +6,11 @@ if (G5_IS_MOBILE) { return; } +if(G5_COMMUNITY_USE === false) { + define('G5_IS_COMMUNITY_PAGE', true); + include_once(G5_THEME_SHOP_PATH.'/shop.head.php'); + return; +} include_once(G5_THEME_PATH.'/head.sub.php'); include_once(G5_LIB_PATH.'/latest.lib.php'); include_once(G5_LIB_PATH.'/outlogin.lib.php'); @@ -27,6 +32,14 @@ include_once(G5_LIB_PATH.'/popular.lib.php'); ?>
                      + + +
                      • FAQ
                      • Q&A
                      • diff --git a/theme/basic/head.sub.php b/theme/basic/head.sub.php index 27b45fc86..15f89cc3c 100644 --- a/theme/basic/head.sub.php +++ b/theme/basic/head.sub.php @@ -37,7 +37,7 @@ header("Pragma: no-cache"); // HTTP/1.0 '.PHP_EOL; + echo ''.PHP_EOL; echo ''.PHP_EOL; echo ''.PHP_EOL; } else { @@ -49,7 +49,11 @@ if($config['cf_add_meta']) echo $config['cf_add_meta'].PHP_EOL; ?> <?php echo $g5_head_title; ?> - +'.PHP_EOL; +?> @@ -64,11 +68,24 @@ var g5_bo_table = ""; var g5_sca = ""; var g5_editor = ""; var g5_cookie_domain = ""; + +var g5_theme_shop_url = ""; +var g5_shop_url = ""; + + +var g5_admin_url = ""; + ', 0); add_javascript('', 0); -add_javascript('', 0); +if (defined('_SHOP_')) { + if(!G5_IS_MOBILE) { + add_javascript('', 0); + } +} else { + add_javascript('', 0); +} add_javascript('', 0); add_javascript('', 0); add_javascript('', 0); diff --git a/theme/basic/img/btn_idx_left.png b/theme/basic/img/btn_idx_left.png new file mode 100644 index 000000000..20e1b49ba Binary files /dev/null and b/theme/basic/img/btn_idx_left.png differ diff --git a/theme/basic/img/btn_idx_right.png b/theme/basic/img/btn_idx_right.png new file mode 100644 index 000000000..c39d664f0 Binary files /dev/null and b/theme/basic/img/btn_idx_right.png differ diff --git a/theme/basic/img/btn_next.png b/theme/basic/img/btn_next.png new file mode 100644 index 000000000..2cfd49355 Binary files /dev/null and b/theme/basic/img/btn_next.png differ diff --git a/theme/basic/img/btn_prev.png b/theme/basic/img/btn_prev.png new file mode 100644 index 000000000..4fdda6491 Binary files /dev/null and b/theme/basic/img/btn_prev.png differ diff --git a/theme/basic/img/chk.png b/theme/basic/img/chk.png new file mode 100644 index 000000000..2841a67f3 Binary files /dev/null and b/theme/basic/img/chk.png differ diff --git a/theme/basic/img/mobile/btn_close.png b/theme/basic/img/mobile/btn_close.png new file mode 100644 index 000000000..22f13faae Binary files /dev/null and b/theme/basic/img/mobile/btn_close.png differ diff --git a/theme/basic/img/mobile/gnb_bg.png b/theme/basic/img/mobile/gnb_bg.png index 1c88ea4fc..9187d776b 100644 Binary files a/theme/basic/img/mobile/gnb_bg.png and b/theme/basic/img/mobile/gnb_bg.png differ diff --git a/theme/basic/img/mobile/gnb_bg2.png b/theme/basic/img/mobile/gnb_bg2.png index efcd812cb..cfa53654f 100644 Binary files a/theme/basic/img/mobile/gnb_bg2.png and b/theme/basic/img/mobile/gnb_bg2.png differ diff --git a/theme/basic/index.php b/theme/basic/index.php index dcdb8d525..c546f54e3 100644 --- a/theme/basic/index.php +++ b/theme/basic/index.php @@ -7,6 +7,11 @@ if (G5_IS_MOBILE) { return; } +if(G5_COMMUNITY_USE === false) { + include_once(G5_THEME_SHOP_PATH.'/index.php'); + return; +} + include_once(G5_THEME_PATH.'/head.php'); ?> diff --git a/theme/basic/js/theme.shop.list.js b/theme/basic/js/theme.shop.list.js new file mode 100644 index 000000000..536a35c01 --- /dev/null +++ b/theme/basic/js/theme.shop.list.js @@ -0,0 +1,319 @@ +var mainCart = mainCart || {}; + +mainCart.chr = function(code){ + return String.fromCharCode(code); +} + +jQuery(function ($) { + + var select_option_el = "select.it_option", + overclass = "overlay", + cartclass = "sct_cartop", + cart_btn_class = "sct_btn"; + + mainCart.add_wishitem = function(el) { + + var $el = $(el), + it_id = $el.data("it_id"); + + if(!it_id) { + alert("상품코드가 올바르지 않습니다."); + return false; + } + + $.post( + g5_theme_shop_url + "/ajax.action.php", + { it_id: it_id, action : "wish_update" }, + function(error) { + if(error != "OK") { + alert(error.replace(/\\n/g, "\n")); + return false; + } + + mainCart.update_wish_side(); + alert("상품을 위시리스트에 담았습니다."); + return; + } + ); + } + + mainCart.add_cart = function(frm) { + + var $frm = $(frm); + var $sel = $frm.find(select_option_el); + var it_name = $frm.find("input[name^=it_name]").val(); + var it_price = parseInt($frm.find("input[name^=it_price]").val()); + var id = ""; + var value, info, sel_opt, item, price, stock, run_error = false; + var option = sep = ""; + var count = $sel.length; + + if(count > 0) { + $sel.each(function(index) { + value = $(this).val(); + item = $(this).prev("label").text(); + + if(!value) { + run_error = true; + return false; + } + + // 옵션선택정보 + sel_opt = value.split(",")[0]; + + if(id == "") { + id = sel_opt; + } else { + id += mainCart.chr(30)+sel_opt; + sep = " / "; + } + + option += sep + item + ":" + sel_opt; + }); + + if(run_error) { + alert(it_name+"의 "+item+"을(를) 선택해 주십시오."); + return false; + } + + price = value[1]; + stock = value[2]; + } else { + price = 0; + stock = $frm.find("input[name^=it_stock]").val(); + option = it_name; + } + + // 금액 음수 체크 + if(it_price + parseInt(price) < 0) { + alert("구매금액이 음수인 상품은 구매할 수 없습니다."); + mainCart.add_cart_after(); + return false; + } + + // 옵션 선택정보 적용 + $frm.find("input[name^=io_id]").val(id); + $frm.find("input[name^=io_value]").val(option); + $frm.find("input[name^=io_price]").val(price); + + $.ajax({ + url: $(frm).attr("action"), + type: "POST", + data: $(frm).serialize(), + dataType: "json", + async: true, + cache: false, + success: function(data, textStatus) { + + mainCart.add_cart_after(frm); + + if(data.error != "") { + alert(data.error); + return false; + } + + mainCart.update_cart_side(); + + alert("상품을 장바구니에 담았습니다."); + }, + error : function(request, status, error){ + mainCart.add_cart_after(frm); + alert('false ajax :'+request.responseText); + } + }); + + return false; + } + + // 5.4 버전의 기본테마의 사이드바의 장바구니를 새로고침합니다. + mainCart.update_cart_side = function(){ + var ajax_url = g5_theme_shop_url || g5_shop_url; + + $.ajax({ + url: ajax_url + "/ajax.action.php", + type: "GET", + data: {"action":"refresh_cart"}, + dataType: "html", + async: true, + cache: false, + success: function(data, textStatus) { + var inner_html = $(data).filter(".sbsk").html(), + cart_count = $(data).find(".cart-count").text(); + + $(".qk_con_wr .sbsk").html(inner_html); + $(".hd_login .shop_cart .count").text(cart_count); + }, + error : function(request, status, error){ + alert("false ajax :"+request.responseText); + } + }); + + return true; + } + + mainCart.update_wish_side = function(){ + var ajax_url = g5_theme_shop_url || g5_shop_url; + + if (typeof g5_is_member == "undefined" || ! g5_is_member) { + return false; + } + + $.ajax({ + url: ajax_url + "/ajax.action.php", + type: "GET", + data: {"action":"refresh_wish"}, + dataType: "html", + async: true, + cache: false, + success: function(data, textStatus) { + var inner_html = $(data).filter(".side-wish").html(); + + $(".qk_con_wr .side-wish").html(inner_html); + }, + error : function(request, status, error){ + alert("false ajax :"+request.responseText); + } + }); + + return true; + } + + mainCart.add_cart_after = function(frm){ + var $over_rayers = $("."+overclass), + $cart_rayers = $("."+cartclass); + + $over_rayers.each(function(i) { + $(this).removeClass(overclass); + }); + + $cart_rayers.each(function(i) { + if( !(frm && $(this).find("select").length) ){ + $(this).html("").removeClass(cartclass); + } + }); + } + + $(document).on("click", ".btn_cart", function(e) { + e.preventDefault(); + + var $this = $(this), + it_id = $this.data("it_id"), + $sct_li = $this.closest("li.sct_li"), + $opt = $sct_li.find(".cart-layer"), + $btn = $sct_li.find("."+cart_btn_class); + + $(".cart-layer").not($opt).removeClass(cartclass).html(''); + $("li.sct_li").not($sct_li).removeClass(overclass); + + $.ajax({ + url: g5_theme_shop_url+"/ajax.action.php", + type: "POST", + data: { + "it_id" : it_id, + "action" : "get_item_option" + }, + dataType: "json", + async: true, + cache: false, + success: function(data, textStatus) { + if(data.error != "") { + alert(data.error); + return false; + } + + $sct_li.addClass(overclass); + $opt.addClass(cartclass).html(data.html); + + if(!data.option) { + mainCart.add_cart($opt.find("form").get(0)); + return; + } + + //$btn.css("display","none"); + //$opt.css("display","block"); + }, + error : function(request, status, error){ + alert('false ajax :'+request.responseText); + } + }); + }); + + $(document).on("change", "select.it_option", function() { + var $frm = $(this).closest("form"); + var $sel = $frm.find("select.it_option"); + var sel_count = $sel.length; + var idx = $sel.index($(this)); + var val = $(this).val(); + var it_id = $frm.find("input[name='it_id[]']").val(); + + // 선택값이 없을 경우 하위 옵션은 disabled + if(val == "") { + $frm.find("select.it_option:gt("+idx+")").val("").attr("disabled", true); + return; + } + + // 하위선택옵션로드 + if(sel_count > 1 && (idx + 1) < sel_count) { + var opt_id = ""; + + // 상위 옵션의 값을 읽어 옵션id 만듬 + if(idx > 0) { + $frm.find("select.it_option:lt("+idx+")").each(function() { + if(!opt_id) + opt_id = $(this).val(); + else + opt_id += mainCart.chr(30)+$(this).val(); + }); + + opt_id += mainCart.chr(30)+val; + } else if(idx == 0) { + opt_id = val; + } + + $.post( + g5_shop_url + "/itemoption.php", + { it_id: it_id, opt_id: opt_id, idx: idx, sel_count: sel_count }, + function(data) { + $sel.eq(idx+1).empty().html(data).attr("disabled", false); + + // select의 옵션이 변경됐을 경우 하위 옵션 disabled + if(idx+1 < sel_count) { + var idx2 = idx + 1; + $frm.find("select.it_option:gt("+idx2+")").val("").attr("disabled", true); + } + } + ); + } else if((idx + 1) == sel_count) { // 선택옵션처리 + if(val == "") + return; + + var info = val.split(","); + // 재고체크 + if(parseInt(info[2]) < 1) { + alert("선택하신 선택옵션상품은 재고가 부족하여 구매할 수 없습니다."); + return false; + } + } + }); + + $(document).on("click", ".cartopt_cart_btn", function(e) { + e.preventDefault(); + + mainCart.add_cart(this.form); + }); + + $(document).on("click", ".cartopt_close_btn", function(e) { + e.preventDefault(); + + mainCart.add_cart_after(); + + //$(this).closest(".sct_cartop").css("display","none"); + //$(this).closest("li.sct_li").find(".sct_btn").css("display", ""); + }); + + $(document).on("click", ".btn_wish", function(e) { + e.preventDefault(); + + mainCart.add_wishitem(this); + }); +}); \ No newline at end of file diff --git a/theme/basic/mobile/head.php b/theme/basic/mobile/head.php index e7a04353a..5144ddcb8 100644 --- a/theme/basic/mobile/head.php +++ b/theme/basic/mobile/head.php @@ -1,6 +1,12 @@
                      • 메뉴 준비 중입니다.
                        관리자모드 > 환경설정 > 메뉴설정에서 설정하세요.
                      • + +
                      • 쇼핑몰
                      • +
                      +
                      • FAQ
                      • 1:1문의
                      • diff --git a/theme/basic/mobile/index.php b/theme/basic/mobile/index.php index e694b610f..79684bab6 100644 --- a/theme/basic/mobile/index.php +++ b/theme/basic/mobile/index.php @@ -1,6 +1,11 @@ diff --git a/theme/basic/mobile/shop/_common.php b/theme/basic/mobile/shop/_common.php new file mode 100644 index 000000000..c607a69da --- /dev/null +++ b/theme/basic/mobile/shop/_common.php @@ -0,0 +1,6 @@ +쇼핑몰 설치 후 이용해 주십시오.

                        '); +define('_SHOP_', true); \ No newline at end of file diff --git a/theme/basic/mobile/shop/category.php b/theme/basic/mobile/shop/category.php new file mode 100644 index 000000000..28a09dccd --- /dev/null +++ b/theme/basic/mobile/shop/category.php @@ -0,0 +1,167 @@ + + +
                      '.PHP_EOL; + else + echo '

                      등록된 분류가 없습니다.

                      '.PHP_EOL; + ?> +
                      + + + + +
                      +
                      + diff --git a/theme/basic/mobile/shop/index.php b/theme/basic/mobile/shop/index.php new file mode 100644 index 000000000..95b13a214 --- /dev/null +++ b/theme/basic/mobile/shop/index.php @@ -0,0 +1,120 @@ + + + + + + + + +
                      +

                      히트상품

                      + set_mobile(true); + $list->set_type(1); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', false); + echo $list->run(); + ?> +
                      + + + + + +
                      +

                      추천상품

                      + set_mobile(true); + $list->set_type(2); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + echo $list->run(); + ?> +
                      + + + +
                      +

                      최신상품

                      + set_mobile(true); + $list->set_type(3); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_basic', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + echo $list->run(); + ?> +
                      + + + +
                      +

                      인기상품

                      + set_mobile(true); + $list->set_type(4); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_cust_price', false); + $list->set_view('it_price', true); + $list->set_view('it_icon', false); + $list->set_view('sns', false); + echo $list->run(); + ?> +
                      + + + +
                      +

                      할인상품

                      + set_mobile(true); + $list->set_type(5); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_cust_price', false); + $list->set_view('it_price', true); + $list->set_view('it_icon', false); + $list->set_view('sns', false); + echo $list->run(); + ?> +
                      + + + + + +
                      + +
                      + + + + + + +
                      +

                      + + + + + +
                      + +
                      + + + 마이페이지 + 장바구니 + +
                      +
                      + +
                      + +
                      + + + + + + + +
                      + +
                      +

                      뒤로

                      +
                      + +
                      +

                      정보

                      + + +

                      + 회사명 + 주소
                      + 사업자 등록번호
                      + 대표 + 전화 + 팩스
                      + + 통신판매업신고번호
                      + 개인정보 보호책임자 + + 부가통신사업신고번호 '.$default['de_admin_buga_no'].''; ?>
                      + Copyright © 2001-2013 . All Rights Reserved. +

                      + + PC 버전 + +
                      + + + + + +', 0); +?> + +
                      +

                      +
                        + +
                      • + "; + if ($list[$i]['is_notice']) + echo "".$list[$i]['subject'].""; + else + echo $list[$i]['subject']; + + if ($list[$i]['comment_cnt']) + + // if ($list[$i]['link']['count']) { echo "[{$list[$i]['link']['count']}]"; } + // if ($list[$i]['file']['count']) { echo "<{$list[$i]['file']['count']}>"; } + + if (isset($list[$i]['icon_new'])) echo " " . $list[$i]['icon_new']; + //if (isset($list[$i]['icon_hot'])) echo " " . $list[$i]['icon_hot']; + //if (isset($list[$i]['icon_file'])) echo " " . $list[$i]['icon_file']; + //if (isset($list[$i]['icon_link'])) echo " " . $list[$i]['icon_link']; + //if (isset($list[$i]['icon_secret'])) echo " " . $list[$i]['icon_secret']; + + echo ""; + + ?> +
                      • + + +
                      • 게시물이 없습니다.
                      • + +
                      + 전체보기 +
                      diff --git a/theme/basic/mobile/skin/latest/shop_basic/style.css b/theme/basic/mobile/skin/latest/shop_basic/style.css new file mode 100644 index 000000000..14aa0c43a --- /dev/null +++ b/theme/basic/mobile/skin/latest/shop_basic/style.css @@ -0,0 +1,14 @@ +@charset "utf-8"; + +/* 최근게시물 스킨 (latest) */ +.lt {position:relative;margin:40px 10px 20px;border:1px solid #dde7e9;background:#fff;position:relative} +.lt h2{font-size:1.25em;padding:10px 15px;line-height:27px;border-bottom:1px solid #e8e8e8;margin:0;text-align:left} +.lt ul {margin:0 0 10px;padding:0 15px;list-style:none} +.lt li{text-align:left;margin:0 0 1px;line-height:40px;;border-top:1px solid #e5ecee} +.lt li:first-child{border-top:0} +.lt li i{color:#9da4bc} +.lt li .fa-heart{color:#ff0000} +.lt li .new_icon{display:inline-block;padding: 0 3px;line-height:15px ;font-size:0.92em;color:#fff;background:#c56bed} +.lt li .cnt_cmt{color:#48a3d5} +.lt .empty_li {text-align:center;padding:50px 0;color:#555} +.lt .more_btn {position:absolute;top:10px;right:10px;line-height:25px;border:1px solid #d1d7e5;padding:0 8px;border-radius:3px;color:#3a8afd;} \ No newline at end of file diff --git a/theme/basic/mobile/skin/member/basic/img/icon_file.gif b/theme/basic/mobile/skin/member/basic/img/icon_file.gif new file mode 100644 index 000000000..244af004d Binary files /dev/null and b/theme/basic/mobile/skin/member/basic/img/icon_file.gif differ diff --git a/theme/basic/mobile/skin/member/basic/login.skin.php b/theme/basic/mobile/skin/member/basic/login.skin.php index 7efdb31f4..f70c69043 100644 --- a/theme/basic/mobile/skin/member/basic/login.skin.php +++ b/theme/basic/mobile/skin/member/basic/login.skin.php @@ -32,11 +32,77 @@ add_stylesheet('', + + + + + + +
                      +

                      비회원 구매

                      +

                      비회원으로 주문하시는 경우 포인트는 지급하지 않습니다.

                      + +
                      + +
                      + +
                      + + +
                      + + + + +
                      + + +
                      +

                      비회원 주문조회

                      + +
                      + 비회원 주문조회 + +
                      + + + + + + + +
                      +
                      + +
                      +

                      메일로 발송해드린 주문서의 주문번호 및 주문 시 입력하신 비밀번호를 정확히 입력해주십시오.

                      +
                      +
                      + + + +
              ', 0); +?> + +
              +
              + + + + + + + +
              +

              (필수) 추가 개인정보처리방침 안내

              +
              +
              + + + + + + + + + + + + + + + + + + + + +
              추가 개인정보처리방침 안내
              목적
              항목보유기간
              이용자 식별 및 본인여부 확인
              생년월일, 암호화된 개인식별부호(CI)회원 탈퇴 시까지
              +
              +
              + +
              + + +
              +
              + +
              +

              인증수단 선택하기

              + +
              + '; + if ($config['cf_cert_simple']) { + echo '' . PHP_EOL; + } + if ($config['cf_cert_hp']) + echo '' . PHP_EOL; + if ($config['cf_cert_ipin']) + echo '' . PHP_EOL; + echo '
              '; + echo '' . PHP_EOL; + } + ?> +
              + + + + + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/member/basic/password_lost.skin.php b/theme/basic/mobile/skin/member/basic/password_lost.skin.php index 10ccb24a8..97fc852cb 100644 --- a/theme/basic/mobile/skin/member/basic/password_lost.skin.php +++ b/theme/basic/mobile/skin/member/basic/password_lost.skin.php @@ -3,44 +3,115 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 add_stylesheet('', 0); -?> + +if($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipin'] || $config['cf_cert_hp'])) { ?> + + -
              -

              아이디 / 비밀번호 찾기

              +
              +

              이메일로 찾기

              회원가입 시 등록하신 이메일 주소를 입력해 주세요.
              해당 이메일로 아이디와 비밀번호 정보를 보내드립니다.

              - + +
              - -
              - - -
              -
              -
              -
              + - + \ No newline at end of file diff --git a/theme/basic/mobile/skin/member/basic/password_reset.skin.php b/theme/basic/mobile/skin/member/basic/password_reset.skin.php new file mode 100644 index 000000000..f7dfafdaa --- /dev/null +++ b/theme/basic/mobile/skin/member/basic/password_reset.skin.php @@ -0,0 +1,39 @@ +', 0); +?> + + +
              +
              +
              +
              +

              새로운 비밀번호를 입력해주세요.

              + +
              + 회원 아이디 : + + + + +
              +
              + +
              +
              +
              +
              + + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/member/basic/register.skin.php b/theme/basic/mobile/skin/member/basic/register.skin.php index 7f2c508ec..5fb762a94 100644 --- a/theme/basic/mobile/skin/member/basic/register.skin.php +++ b/theme/basic/mobile/skin/member/basic/register.skin.php @@ -14,7 +14,7 @@ add_stylesheet('',
              -

              회원가입약관 및 개인정보처리방침안내의 내용에 동의하셔야 회원가입 하실 수 있습니다.

              +

              회원가입약관 및 개인정보 수집 및 이용의 내용에 동의하셔야 회원가입 하실 수 있습니다.

              @@ -31,10 +31,10 @@ add_stylesheet('',
              -

              개인정보처리방침안내

              +

              개인정보 수집 및 이용

              - + @@ -49,7 +49,7 @@ add_stylesheet('', - + @@ -64,7 +64,7 @@ add_stylesheet('',
              - +
              @@ -84,7 +84,7 @@ add_stylesheet('', } if (!f.agree2.checked) { - alert("개인정보처리방침안내의 내용에 동의하셔야 회원가입 하실 수 있습니다."); + alert("개인정보 수집 및 이용의 내용에 동의하셔야 회원가입 하실 수 있습니다."); f.agree2.focus(); return false; } diff --git a/theme/basic/mobile/skin/member/basic/register_form.skin.php b/theme/basic/mobile/skin/member/basic/register_form.skin.php index 1ccc9a7a5..534a63933 100644 --- a/theme/basic/mobile/skin/member/basic/register_form.skin.php +++ b/theme/basic/mobile/skin/member/basic/register_form.skin.php @@ -3,14 +3,12 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 add_stylesheet('', 0); +add_javascript('', 0); +if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipin'] || $config['cf_cert_hp'])) + add_javascript('', 0); ?>
              - - - - - @@ -28,18 +26,18 @@ add_stylesheet('',

              사이트 이용정보 입력

              • - - placeholder="아이디"> + + placeholder="아이디 (필수)"> 영문자, 숫자, _ 만 입력 가능. 최소 3자이상 입력하세요.
              • - - placeholder="비밀번호"> + + placeholder="비밀번호 (필수)">
              • - - placeholder="비밀번호확인"> + + placeholder="비밀번호확인 (필수)">
              @@ -47,50 +45,69 @@ add_stylesheet('',

              개인정보 입력

                -
              • - - class="frm_input full_input " placeholder="이름"> - 아이핀 본인확인'.PHP_EOL; - if($config['cf_cert_hp']) - echo ''.PHP_EOL; +
              • + 간편인증'.PHP_EOL; + } + if ($config['cf_cert_hp']) + echo ''.PHP_EOL; + if ($config['cf_cert_ipin']) + echo ''.PHP_EOL; + echo '(필수)'; echo ''.PHP_EOL; } ?> - - 아이핀 본인확인 후에는 이름이 자동 입력되고 휴대폰 본인확인 후에는 이름과 휴대폰번호가 자동 입력되어 수동으로 입력할수 없게 됩니다. -
                본인확인성인인증 완료
                - + +
              • +
              • + + class="frm_input full_input " placeholder="이름 (필수)">
              • - + 공백없이 한글,영문,숫자만 입력 가능 (한글2자, 영문4자 이상)
                닉네임을 바꾸시면 앞으로 일 이내에는 변경 할 수 없습니다.
                - +
              • - + @@ -98,29 +115,29 @@ add_stylesheet('', - +
              • - - " maxlength="255" placeholder="홈페이지"> + + " maxlength="255" placeholder="홈페이지 (필수)">
              • - - " maxlength="20" placeholder="전화번호"> + + " maxlength="20" placeholder="전화번호 (필수)">
              • - +
              • - - - class="frm_input full_input " maxlength="20" placeholder="휴대폰번호"> - + + + class="frm_input full_input " maxlength="20" placeholder="휴대폰번호 (필수)"> + @@ -130,13 +147,13 @@ add_stylesheet('',
              • - 주소필수 - - class="frm_input " size="5" maxlength="6" placeholder="우편번호"> + 주소 (필수) + + class="frm_input " size="5" maxlength="6" placeholder="우편번호">
                - - class="frm_input frm_address " size="50" placeholder="주소">
                + + class="frm_input frm_address " size="50" placeholder="주소">

                @@ -154,8 +171,8 @@ add_stylesheet('',
                • - - + +
                • @@ -275,28 +292,44 @@ add_stylesheet('', + diff --git a/theme/basic/mobile/skin/outlogin/shop_basic/style.css b/theme/basic/mobile/skin/outlogin/shop_basic/style.css new file mode 100644 index 000000000..c1bd1cc40 --- /dev/null +++ b/theme/basic/mobile/skin/outlogin/shop_basic/style.css @@ -0,0 +1,33 @@ +@charset "utf-8"; +.ol {position:relative;margin:0 0 10px;position:relative} +#ol_before h2 {width:0;height:0;overflow:hidden} +#ol_after h2 {width:0;height:0;overflow:hidden} + +#ol_before{background:#212020;;color:#fff;padding-left:10px;} +#ol_before .ol_before_link{display:inline-block;margin:10px 3px;} +#ol_before .ol_before_link a{display:inline-block;padding:0 10px;line-height:33px;border-radius:3px} +#ol_before .ol_before_link .login{color:#fff;background:#3a8afd;line-height:35px} +#ol_before .ol_before_link .join{color:#fff;border:1px solid #787878} + +#ol_after_hd{background:#212020;margin-bottom:10px;padding:15px 10px 15px 70px;text-align:left;position:relative;color:#fff;line-height:20px;} +#ol_after_hd .nickname{color:#fff;display:block} +#ol_after_hd strong {color:#3a8afd} +#ol_after_hd .point{color:#c7d4e6;font-size:0.92em} +#ol_after_hd .profile_img{display:inline-block;position:absolute;top:15px;left:15px} +#ol_after_hd .profile_img img{border-radius:50%;width:40px;height:40px} +#ol_after_info{position:absolute;bottom:0;right:-5px;text-align:center;background:#212020;width:20px;height:20px;line-height:20px;color:#fff;font-size:13px;border-radius:50%} + +#ol_after_private {margin:10px 0 ;padding:0;list-style:none;} +#ol_after_private:after {display:block;visibility:hidden;clear:both;content:""} +#ol_after_private li {position:relative;float:left;width:50%;} +#ol_after_private li:first-child{border-right:1px solid #efefef} +#ol_after_private a {color:#333;line-height:43px;background:#fff;display:block;border-bottom:1px solid #ddd;text-align:center;padding:0 10px 0 40px;text-align:left} +#ol_after_private i{position:absolute;top:0;left:0;font-size:15px;line-height:43px;width:40px;text-align:center;color:#a5a8ac} +#ol_after_private strong{position:absolute;top:12px;right:10px;font-size:0.846em;padding:0 5px;background:#37bc9b;color:#fff;line-height:20px;border-radius:35px} +#ol_after_private .win_coupon strong{background:#a352c1} + +#ol_after_btn {position:absolute;top:20px;right:40px} +#ol_after_btn a{display:inline-block;padding:0 10px;line-height:28px;font-weight:bold;border:1px solid #787878;background:none;color:#fff;vertical-align:top;border-radius:3px} +#ol_after_btn .btn_admin {display:inline-block;padding:0 10px;border:0;text-align:center;margin:0;line-height:30px;background:#ff0000} + +#ol_after_logout{background:#fff;color:#555} diff --git a/theme/basic/mobile/skin/poll/basic/style.css b/theme/basic/mobile/skin/poll/basic/style.css index 784f66cdd..8a046860c 100644 --- a/theme/basic/mobile/skin/poll/basic/style.css +++ b/theme/basic/mobile/skin/poll/basic/style.css @@ -1,36 +1,5 @@ @charset "utf-8"; -/* ### 기본 스타일 커스터마이징 시작 ### */ -#poll a.btn_admin {} /* 관리자 전용 버튼 */ -#poll a.btn_admin:focus, #poll a.btn_admin:hover {} - -/* 폼 테이블 */ -#poll .tbl_frm table {} -#poll .tbl_frm .frm_address {} -#poll .tbl_frm .frm_file {} -#poll .tbl_frm .frm_info {} - -#poll .tbl_frm01 {} -#poll .tbl_frm01 caption {} -#poll .tbl_frm01 th {} -#poll .tbl_frm01 td {} -#poll .tbl_frm01 textarea, #poll .frm_input {} -#poll .tbl_frm01 textarea {} -#poll .tbl_frm01 a {} - -#poll .required, #poll textarea.required {} - -#poll .btn_confirm {} /* 서식단계 진행 */ -#poll .btn_submit {} -#poll .btn_cancel {} -#poll .btn_frmline {} /* 우편번호검색버튼 등 */ -#poll .win_btn {} /* 새창용 */ -#poll .win_btn a {} -#poll .win_btn button {} -#poll .win_btn input {} - -/* ### 기본 스타일 커스터마이징 끝 ### */ - /* 설문조사 스킨 */ #poll {background:#fff;border:1px solid #dde7e9;margin:15px 10px} #poll header {position:relative;padding:15px;border-bottom:1px solid #dde7e9} diff --git a/theme/basic/mobile/skin/qa/basic/list.skin.php b/theme/basic/mobile/skin/qa/basic/list.skin.php index 6d3b8cd3c..2f102f5e2 100644 --- a/theme/basic/mobile/skin/qa/basic/list.skin.php +++ b/theme/basic/mobile/skin/qa/basic/list.skin.php @@ -115,6 +115,11 @@ add_stylesheet('', 0); 게시물 검색 + + + diff --git a/theme/basic/mobile/skin/qa/basic/style.css b/theme/basic/mobile/skin/qa/basic/style.css index add0d9d45..4b0f4eebb 100644 --- a/theme/basic/mobile/skin/qa/basic/style.css +++ b/theme/basic/mobile/skin/qa/basic/style.css @@ -136,7 +136,8 @@ #bo_sch {background:#fff;border:1px solid #d0d3db;position:relative;margin:10px} #bo_sch:after {display:block;visibility:hidden;clear:both;content:""} #bo_sch legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} -#bo_sch .sch_input {float:left;width:100%;height:38px;border:0;padding:0;background-color:transparent;padding:0 0 0 10px} +#bo_sch select {border:0;height:38px;border-right:1px solid #f8f8f8;float:left;width:30%} +#bo_sch .sch_input {height:38px;border:0;padding:0;background-color:transparent;float:left;width:70%;padding:0 40px 0 10px} #bo_sch .sch_btn {height:38px;position:absolute;top:0;right:0;border:0;width:40px;background:none;font-size:15px} diff --git a/theme/basic/mobile/skin/shop/basic/boxbanner.skin.php b/theme/basic/mobile/skin/shop/basic/boxbanner.skin.php new file mode 100644 index 000000000..67053166b --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/boxbanner.skin.php @@ -0,0 +1,43 @@ +', 0); +?> + +

                  쇼핑몰 배너

                  '.PHP_EOL; +?> + + diff --git a/theme/basic/mobile/skin/shop/basic/boxtodayview.skin.php b/theme/basic/mobile/skin/shop/basic/boxtodayview.skin.php new file mode 100644 index 000000000..9598fc41e --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/boxtodayview.skin.php @@ -0,0 +1,96 @@ +', 0); +?> + + +
                  +

                  오늘 본 상품

                  + + + '.PHP_EOL; + echo '
                • '.PHP_EOL; + echo '
                  '; + echo $img; + echo '
                  '.PHP_EOL; + echo '
                • '.PHP_EOL; + + $tv_tot_count++; + } + if ($tv_tot_count > 0) echo '
                '.PHP_EOL; + ?> +
                + + + + + +

                없음

                + +
              + + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/couponzone.10.skin.php b/theme/basic/mobile/skin/shop/basic/couponzone.10.skin.php new file mode 100644 index 000000000..4518253a9 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/couponzone.10.skin.php @@ -0,0 +1,202 @@ +', 0); +?> + +
              +

              다운로드 쿠폰

              +

              회원이시라면 쿠폰 다운로드 후 바로 사용하실 수 있습니다.

              + + '.get_text($row3['it_name']).''; + $coupon_info_class = 'cp_2'; + break; + case '1': + $sql3 = " select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '{$row['cp_target']}' "; + $row3 = sql_fetch($sql3); + $cp_target = '카테고리할인'; + $cp_link = ''.get_text($row3['ca_name']).''; + $coupon_info_class = 'cp_1'; + break; + case '2': + $cp_link = $cp_target = '주문금액할인'; + $coupon_info_class = 'cp_3'; + break; + case '3': + $cp_link = $cp_target = '배송비할인'; + $coupon_info_class = 'cp_4'; + break; + } + + // 다운로드 쿠폰인지 + $disabled = ''; + if(is_coupon_downloaded($member['mb_id'], $row['cz_id'])) + $disabled = ' disabled'; + + // $row['cp_type'] 값이 있으면 % 이며 없으면 원 입니다. + $print_cp_price = $row['cp_type'] ? ''.$row['cp_price'].' %' : ''.number_format($row['cp_price']).' 원'; + + $coupon .= '
            • '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '
              '.$subj.''.PHP_EOL; + $coupon .= '
              '.$subj.'
              '.$print_cp_price.'
              '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '적용'.PHP_EOL; + $coupon .= '
              +

              '.$cp_target.'

              +
                +
              • 적용 : '.$cp_link.'
              • '; + + if( $row['cp_minimum'] ){ // 쿠폰에 최소주문금액이 있다면 + $coupon .= '
              • 최소주문금액 : '.number_format($row['cp_minimum']).'
              • '; + } + + $coupon .= '
              + +
              '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '
              기한다운로드 후 '.number_format($row['cz_period']).'일
              '.PHP_EOL; + //cp_1 카테고리할인 + //cp_2 개별상품할인 + //cp_3 주문금액할인 + //cp_4 배송비할인 + $coupon .= '
              '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '
            • '.PHP_EOL; + } + + if($coupon) + echo '
                '.PHP_EOL.$coupon.'
              '.PHP_EOL; + else + echo '

              사용할 수 있는 쿠폰이 없습니다.

              '; + ?> +
              + +
              +

              포인트 쿠폰

              +

              보유하신 회원 포인트를 쿠폰으로 교환하실 수 있습니다.

              + + '.get_text($row3['it_name']).''; + $cp_target = '개별상품할인'; + $coupon_info_class = 'cp_2'; + break; + case '1': + $sql3 = " select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '{$row['cp_target']}' "; + $row3 = sql_fetch($sql3); + $cp_link = ''.get_text($row3['ca_name']).''; + $cp_target = '카테고리할인'; + $coupon_info_class = 'cp_1'; + break; + case '2': + $cp_link = $cp_target = '주문금액할인'; + $coupon_info_class = 'cp_3'; + break; + case '3': + $cp_link = $cp_target = '배송비할인'; + $coupon_info_class = 'cp_4'; + break; + } + + // 다운로드 쿠폰인지 + $disabled = ''; + if(is_coupon_downloaded($member['mb_id'], $row['cz_id'])) + $disabled = ' disabled'; + + // $row['cp_type'] 값이 있으면 % 이며 없으면 원 입니다. + $print_cp_price = $row['cp_type'] ? ''.$row['cp_price'].' %' : ''.number_format($row['cp_price']).' 원'; + + $coupon .= '
            • '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '
              '.$subj.''.PHP_EOL; + $coupon .= '
              '.$subj.'
              '.$print_cp_price.'
              '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '적용'.PHP_EOL; + $coupon .= '
              +

              '.$cp_target.'

              +
                +
              • 적용 : '.$cp_link.'
              • '; + + if( $row['cp_minimum'] ){ // 쿠폰에 최소주문금액이 있다면 + $coupon .= '
              • 최소주문금액 : '.number_format($row['cp_minimum']).'
              • '; + } + + $coupon .= '
              + +
              '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '
              기한다운로드 후 '.number_format($row['cz_period']).'일
              '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '
              '.PHP_EOL; + $coupon .= '
            • '.PHP_EOL; + } + + if($coupon) + echo '
                '.PHP_EOL.$coupon.'
              '.PHP_EOL; + else + echo '

              사용할 수 있는 쿠폰이 없습니다.

              '; + ?> +
              + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/img/arr_down01.gif b/theme/basic/mobile/skin/shop/basic/img/arr_down01.gif new file mode 100644 index 000000000..7c2f73c2e Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/arr_down01.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/arr_up01.gif b/theme/basic/mobile/skin/shop/basic/img/arr_up01.gif new file mode 100644 index 000000000..beaff5f4c Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/arr_up01.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/best_btn.gif b/theme/basic/mobile/skin/shop/basic/img/best_btn.gif new file mode 100644 index 000000000..eee0d0c29 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/best_btn.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/btn_next.gif b/theme/basic/mobile/skin/shop/basic/img/btn_next.gif new file mode 100644 index 000000000..eb714a33b Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/btn_next.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/btn_next.png b/theme/basic/mobile/skin/shop/basic/img/btn_next.png new file mode 100644 index 000000000..4021e6ca0 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/btn_next.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/btn_prev.gif b/theme/basic/mobile/skin/shop/basic/img/btn_prev.gif new file mode 100644 index 000000000..cdc83748f Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/btn_prev.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/btn_prev.png b/theme/basic/mobile/skin/shop/basic/img/btn_prev.png new file mode 100644 index 000000000..f455793e1 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/btn_prev.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/del_btn.gif b/theme/basic/mobile/skin/shop/basic/img/del_btn.gif new file mode 100644 index 000000000..6a576483a Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/del_btn.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/facebook.png b/theme/basic/mobile/skin/shop/basic/img/facebook.png new file mode 100644 index 000000000..cf737d633 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/facebook.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/gplus.png b/theme/basic/mobile/skin/shop/basic/img/gplus.png new file mode 100644 index 000000000..8ab2fa6bc Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/gplus.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/icon_best.gif b/theme/basic/mobile/skin/shop/basic/img/icon_best.gif new file mode 100644 index 000000000..508f48f5e Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/icon_best.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/icon_cp.gif b/theme/basic/mobile/skin/shop/basic/img/icon_cp.gif new file mode 100644 index 000000000..61a3d233c Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/icon_cp.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/icon_discount.gif b/theme/basic/mobile/skin/shop/basic/img/icon_discount.gif new file mode 100644 index 000000000..d5bda31d4 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/icon_discount.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/icon_hit.gif b/theme/basic/mobile/skin/shop/basic/img/icon_hit.gif new file mode 100644 index 000000000..3712ed10f Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/icon_hit.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/icon_new.gif b/theme/basic/mobile/skin/shop/basic/img/icon_new.gif new file mode 100644 index 000000000..bf0ebd832 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/icon_new.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/icon_rec.gif b/theme/basic/mobile/skin/shop/basic/img/icon_rec.gif new file mode 100644 index 000000000..8a6a6c4a7 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/icon_rec.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/icon_secret.gif b/theme/basic/mobile/skin/shop/basic/img/icon_secret.gif new file mode 100644 index 000000000..c04899f14 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/icon_secret.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/icon_soldout.gif b/theme/basic/mobile/skin/shop/basic/img/icon_soldout.gif new file mode 100644 index 000000000..cd8ca8b7a Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/icon_soldout.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/item_bg.gif b/theme/basic/mobile/skin/shop/basic/img/item_bg.gif new file mode 100644 index 000000000..d6a4d1cbe Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/item_bg.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/item_btn.png b/theme/basic/mobile/skin/shop/basic/img/item_btn.png new file mode 100644 index 000000000..0d112766d Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/item_btn.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/loading.gif b/theme/basic/mobile/skin/shop/basic/img/loading.gif new file mode 100644 index 000000000..93dc39709 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/loading.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/mainlist_btn.gif b/theme/basic/mobile/skin/shop/basic/img/mainlist_btn.gif new file mode 100644 index 000000000..1c634018e Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/mainlist_btn.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/personal.jpg b/theme/basic/mobile/skin/shop/basic/img/personal.jpg new file mode 100644 index 000000000..6c21f566a Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/personal.jpg differ diff --git a/theme/basic/mobile/skin/shop/basic/img/prd_icon.png b/theme/basic/mobile/skin/shop/basic/img/prd_icon.png new file mode 100644 index 000000000..83c7ad03b Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/prd_icon.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/sbmn_bg.gif b/theme/basic/mobile/skin/shop/basic/img/sbmn_bg.gif new file mode 100644 index 000000000..f8afed770 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/sbmn_bg.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/sct_bg_toright.gif b/theme/basic/mobile/skin/shop/basic/img/sct_bg_toright.gif new file mode 100644 index 000000000..0d180544f Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/sct_bg_toright.gif differ diff --git a/theme/basic/mobile/skin/shop/basic/img/sns_fb.png b/theme/basic/mobile/skin/shop/basic/img/sns_fb.png new file mode 100644 index 000000000..9d8904804 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/sns_fb.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/sns_fb_s.png b/theme/basic/mobile/skin/shop/basic/img/sns_fb_s.png new file mode 100644 index 000000000..1ce297731 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/sns_fb_s.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/sns_goo.png b/theme/basic/mobile/skin/shop/basic/img/sns_goo.png new file mode 100644 index 000000000..75b523e04 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/sns_goo.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/sns_goo_s.png b/theme/basic/mobile/skin/shop/basic/img/sns_goo_s.png new file mode 100644 index 000000000..74235887d Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/sns_goo_s.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/sns_kakao.png b/theme/basic/mobile/skin/shop/basic/img/sns_kakao.png new file mode 100644 index 000000000..18c9f18c3 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/sns_kakao.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/sns_kakao_s.png b/theme/basic/mobile/skin/shop/basic/img/sns_kakao_s.png new file mode 100644 index 000000000..838b9697e Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/sns_kakao_s.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/sns_twt.png b/theme/basic/mobile/skin/shop/basic/img/sns_twt.png new file mode 100644 index 000000000..bf10f5bad Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/sns_twt.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/sns_twt_s.png b/theme/basic/mobile/skin/shop/basic/img/sns_twt_s.png new file mode 100644 index 000000000..53f691a62 Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/sns_twt_s.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/twitter.png b/theme/basic/mobile/skin/shop/basic/img/twitter.png new file mode 100644 index 000000000..8fbf0914b Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/twitter.png differ diff --git a/theme/basic/mobile/skin/shop/basic/img/use_reply.png b/theme/basic/mobile/skin/shop/basic/img/use_reply.png new file mode 100644 index 000000000..14a3908ad Binary files /dev/null and b/theme/basic/mobile/skin/shop/basic/img/use_reply.png differ diff --git a/theme/basic/mobile/skin/shop/basic/item.form.skin.php b/theme/basic/mobile/skin/shop/basic/item.form.skin.php new file mode 100644 index 000000000..2c2f105d1 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/item.form.skin.php @@ -0,0 +1,693 @@ +', 0); +add_javascript('', 10); +?> + + + + + + + + + + + + +
              + '; + $thumb_img .= ''.$thumb.''; + $thumb_img .= ''.PHP_EOL; + } + if ($thumb_img) + { + echo '
              '.PHP_EOL; + echo '
                '.PHP_EOL; + echo $thumb_img; + echo '
              '.PHP_EOL; + echo '
              '.PHP_EOL; + echo '
              '; + } + ?> + +
              +

              상품간략정보 및 구매기능

              +
              + +

              + +

              상품 선택옵션 개, 추가옵션

              + + +
              + + 고객평점 + + 사용후기 + + +
              + 위시리스트 + +
              + + + + + + 추천하기 +
              +
              +
              + + +
              +
              개인정보처리방침안내개인정보 수집 및 이용
              목적이용자 식별 및 본인여부 확인
              아이디, 이름, 비밀번호아이디, 이름, 비밀번호 회원 탈퇴 시까지
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */ + ?> + + + + + + + + 배송비결제'; + $sc_method = ''; + } + else + $sc_method = '주문시 결제'; + } + ?> + + + + + + + + + + + + + + + + + +
              제조사
              원산지
              브랜드
              모델
              판매가격판매중지
              판매가격전화문의
              시중가격
              판매가격 + + +
              재고수량
              포인트 + +
              최소구매수량
              최대구매수량
              +
              +
              + + +
              + '.$prev_title; + $next_title = $next_title.' '; + + echo $prev_href.$prev_title.$prev_href2; + echo $next_href.$next_title.$next_href2; + } else { + echo '이 분류에 등록된 다른 상품이 없습니다.'; + } + ?> + 확대보기 +
              + + +
              + +
              + +
              + +
              +
              + +
              +

              선택옵션

              +
              + +
              +
              + + + +
              +

              추가옵션

              +
              + + +
              +
              + + + +
              + +
                +
              • + + + + + +
                + +
                +
                + + + + + +0원 +
                +
              • +
              + + +
              + +
              + + + +

              상품의 재고가 부족하여 구매할 수 없습니다.

              + +
              + + + + + + 재입고알림 + + 위시리스트 + + + +
              +
              + +
              + + + +
              +
                +
              • +
              • +
              • +
              • +
              +
                + + +
              • +

                상품 정보

                + + +

                상품 상세설명

                +
                + +
                + + + +

                상품 정보 고시

                + + + $val) { + $ii_title = $info_array[$key][0]; + $ii_value = $val; + ?> + + + + + + +
                + + 상품 정보 고시 정보가 올바르게 저장되지 않았습니다.
                config.php 파일의 G5_ESCAPE_FUNCTION 설정을 addslashes 로
                변경하신 후 관리자 > 상품정보 수정에서 상품 정보를 다시 저장해주세요.

                '; + } + } + } //if + ?> +
              • + + +
              • +

                사용후기

                +
                +
              • + + + +
              • +

                상품문의

                +
                +
              • + + + + +
              • +

                배송/교환정보

                + +
                +

                배송정보

                + +
                + + + + + +
                +

                교환/반품

                + + +
                + + +
              • +
              +
              + + + + + +
              +

              관련상품

              +
              + set_query($sql); + echo $list->run(); + ?> +
              +
              + + + + + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/iteminfo.change.skin.php b/theme/basic/mobile/skin/shop/basic/iteminfo.change.skin.php new file mode 100644 index 000000000..7e49022b3 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/iteminfo.change.skin.php @@ -0,0 +1,11 @@ +', 0); +?> + +

              교환/반품

              +
              + +
              \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/iteminfo.delivery.skin.php b/theme/basic/mobile/skin/shop/basic/iteminfo.delivery.skin.php new file mode 100644 index 000000000..00895309d --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/iteminfo.delivery.skin.php @@ -0,0 +1,18 @@ +', 0); +?> + +

              배송정보

              + +
              + +
              + +

              교환/반품

              + +
              + +
              \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/iteminfo.info.skin.php b/theme/basic/mobile/skin/shop/basic/iteminfo.info.skin.php new file mode 100644 index 000000000..c024423af --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/iteminfo.info.skin.php @@ -0,0 +1,57 @@ +', 0); +?> + +

              상품설명

              + +
              + +
              + +
              + + + +
              + +
              + + + +

              상품 정보 고시

              + +
                + $val) { + $ii_title = $info_array[$key][0]; + $ii_value = $val; + ?> +
              • + + +
              • + +
              + + 상품 정보 고시 정보가 올바르게 저장되지 않았습니다.
              config.php 파일의 G5_ESCAPE_FUNCTION 설정을 addslashes 로
              변경하신 후 관리자 > 상품정보 수정에서 상품 정보를 다시 저장해주세요.

              '; + } + } + } //if + ?> + +
              + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/iteminfo.itemqa.skin.php b/theme/basic/mobile/skin/shop/basic/iteminfo.itemqa.skin.php new file mode 100644 index 000000000..21e622eaf --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/iteminfo.itemqa.skin.php @@ -0,0 +1,7 @@ +', 0); + +goto_url(shop_item_url($it_id).'#sit_qa'); \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/iteminfo.itemuse.skin.php b/theme/basic/mobile/skin/shop/basic/iteminfo.itemuse.skin.php new file mode 100644 index 000000000..fc9f4947f --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/iteminfo.itemuse.skin.php @@ -0,0 +1,7 @@ +', 0); + +goto_url(shop_item_url($it_id).'#sit_use'); \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/iteminfo.relation.skin.php b/theme/basic/mobile/skin/shop/basic/iteminfo.relation.skin.php new file mode 100644 index 000000000..9a877ea99 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/iteminfo.relation.skin.php @@ -0,0 +1,66 @@ +', 0); +?> + +

              관련상품

              + +
              + set_mobile(true); + $list->set_query($sql); + $list->set_view('sns', true); + echo $list->run(); + ?> +
              + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/itemqa.skin.php b/theme/basic/mobile/skin/shop/basic/itemqa.skin.php new file mode 100644 index 000000000..9e80154c4 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/itemqa.skin.php @@ -0,0 +1,151 @@ +', 0); +?> + + + + + +
              + + '; + + if($is_admin || $member['mb_id' ] == $row['mb_id']) { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } else { + $iq_question = '비밀글로 보호된 문의입니다.'; + $is_secret = true; + } + } else { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } + $iq_time = substr($row['iq_time'], 2, 8); + + $hash = md5($row['iq_id'].$row['iq_time'].$row['iq_ip']); + + $iq_stats = ''; + $iq_style = ''; + $iq_answer = ''; + + if ($row['iq_answer']) + { + $iq_answer = get_view_thumbnail(conv_content($row['iq_answer'], 1), $thumbnail_width); + $iq_stats = '답변완료'; + $iq_style = 'sit_qaa_done'; + $is_answer = true; + } else { + $iq_stats = '답변대기'; + $iq_style = 'sit_qaa_yet'; + $iq_answer = '답변이 등록되지 않았습니다.'; + $is_answer = false; + } + + if ($i == 0) echo '
                '; + ?> + +
              1. + +
                +
                작성자
                +
                +
                작성일
                +
                +
                상태
                +
                +
                + +
                +
                +
                + Q + 문의내용 + +
                + +
                + A + 답변 + +
                + +
                + + + + +
                +
              2. + + 0) echo '
              '; + + if (!$i) echo '

              상품문의가 없습니다.

              '; + ?> +
              + + + + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/itemqaform.skin.php b/theme/basic/mobile/skin/shop/basic/itemqaform.skin.php new file mode 100644 index 000000000..0fb5e2989 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/itemqaform.skin.php @@ -0,0 +1,59 @@ +', 0); +?> + + +
              +

              상품문의 쓰기

              + +
              + + + + + +
              +
                +
              • + 옵션 + > + +
              • +
              • + + 이메일을 입력하시면 답변 등록 시 답변이 이메일로 전송됩니다. +
              • +
              • + + 휴대폰번호를 입력하시면 답변 등록 시 답변등록 알림이 SMS로 전송됩니다. +
              • +
              • + + +
              • +
              • + + +
              • +
              +
              + +
              + + +
              +
              +
              + + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/itemqalist.skin.php b/theme/basic/mobile/skin/shop/basic/itemqalist.skin.php new file mode 100644 index 000000000..dbc384332 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/itemqalist.skin.php @@ -0,0 +1,144 @@ +', 0); +?> + + + + +
              +
              +
              + + + + + + +
              + 전체보기 +
              +
              + +
              + + + + '; + + if($is_admin || $member['mb_id' ] == $row['mb_id']) { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } else { + $iq_question = '비밀글로 보호된 문의입니다.'; + $is_secret = true; + } + } else { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } + + $it_href = shop_item_url($row['it_id']); + + if ($row['iq_answer']) + { + $iq_answer = get_view_thumbnail(conv_content($row['iq_answer'], 1), $thumbnail_width); + $iq_stats = '답변완료'; + $iq_style = 'sit_qaa_done'; + $is_answer = true; + } else { + $iq_stats = '답변대기'; + $iq_style = 'sit_qaa_yet'; + $iq_answer = '답변이 등록되지 않았습니다.'; + $is_answer = false; + } + + if ($i == 0) echo '
                '; + ?> +
              1. + + +
                +

                +
                + 작성자 + + 작성일 + +
                +
                + + + +
                + +
              2. + 0) echo '
              '; + if ($i == 0) echo '

              자료가 없습니다.

              '; + ?> +
              + + + + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/itemuse.skin.php b/theme/basic/mobile/skin/shop/basic/itemuse.skin.php new file mode 100644 index 000000000..8f6d5e3da --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/itemuse.skin.php @@ -0,0 +1,133 @@ +', 0); +?> + + + + + + +
              + + '; + ?> + +
            • + +
              +
              작성자
              +
              +
              작성일
              +
              +
              선호도
              +
              별<?php echo $is_star; ?>개
              +
              + + +
            • + + 0) echo ''; + + if (!$i) echo '

              사용후기가 없습니다.

              '; + ?> +
              + + + + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/itemuseform.skin.php b/theme/basic/mobile/skin/shop/basic/itemuseform.skin.php new file mode 100644 index 000000000..f0761fac0 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/itemuseform.skin.php @@ -0,0 +1,77 @@ +', 0); +?> + + +
              +

              사용후기 쓰기

              + +
              + + + + + +
              +
                +
              • + + +
              • +
              • + 내용 + +
              • +
              • + 평가 +
                  +
                • + > + + +
                • +
                • + > + + +
                • +
                • + > + + +
                • +
                • + > + + +
                • +
                • + > + + +
                • +
                +
              • +
              +
              + +
              + + +
              + +
              +
              + + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/itemuselist.skin.php b/theme/basic/mobile/skin/shop/basic/itemuselist.skin.php new file mode 100644 index 000000000..2cf91f729 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/itemuselist.skin.php @@ -0,0 +1,158 @@ +', 0); +?> + + + + +
              +
              +
              + + + + + +
              + 전체보기 +
              +
              + +
              + + + '; + ?> +
            • + + +
              +
              + 평가점수별<?php echo $star; ?>개 +
              + +
              + + +
              +
              +
              +

              사용후기

              +
              +
              + +
              +
              작성자
              +
              +
              작성일
              +
              +
              +
              + +
              + +

              + + 평가점수별<?php echo $star; ?>개 +

              +
              + +
              + + +
              +
              +

              +
              + +
              +
              + +
              +
              +
              + +
              +
              + +
              +
              +
              + +
              + +
              + 작성자 + + 작성일 + +
              +
              +
            • + + 0) echo ''; + if ($i == 0) echo '

              자료가 없습니다.

              '; + ?> +
              + + + + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/largeimage.skin.php b/theme/basic/mobile/skin/shop/basic/largeimage.skin.php new file mode 100644 index 000000000..3ed05184a --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/largeimage.skin.php @@ -0,0 +1,91 @@ +', 0); +?> + +
              +

              상품 이미지 새창 보기

              + +
              + + + + <?php echo $row['it_name']; ?> + + + +
              + + 0) { + echo '
                '; + foreach($thumbnails as $key=>$val) { + echo '
              • '.$val.'
              • '; + } + echo '
              '; + } + ?> + +
              + +
              +
              + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/list.10.skin.php b/theme/basic/mobile/skin/shop/basic/list.10.skin.php new file mode 100644 index 000000000..88885a0ad --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/list.10.skin.php @@ -0,0 +1,189 @@ +', 0); + +// 장바구니 또는 위시리스트 ajax 스크립트 +add_javascript('', 10); +?> + + + + + + + + +ca_id && isset($_COOKIE['ck_itemlist'.$this->ca_id.'_type'])) ? $_COOKIE['ck_itemlist'.$this->ca_id.'_type'] : ''; +if(!$is_gallery_list){ + $is_gallery_list = 'gallery'; +} +$li_width = ($is_gallery_list === 'gallery') ? intval(100 / $this->list_mod) : 100; +$li_width_style = ' style="width:'.$li_width.'%;"'; +$ul_sct_class = ($is_gallery_list === 'gallery') ? 'sct_10' : 'sct_10_list'; + +$i = 0; +foreach((array) $list as $row){ + if( empty($row) ) continue; + + $item_link_href = shop_item_url($row['it_id']); // 상품링크 + $star_score = $row['it_use_avg'] ? (int) get_star($row['it_use_avg']) : ''; //사용자후기 평균별점 + $is_soldout = is_soldout($row['it_id'], true); // 품절인지 체크 + + if ($i == 0) { + if ($this->css) { + echo "
                css}\">\n"; + } else { + echo "
                  \n"; + } + } + + + if($i % $this->list_mod == 0) + $li_clear = ' sct_clear'; + else + $li_clear = ''; + + echo "
                • \n"; + + if ($this->href) { + echo "\n"; + } + + // 사용후기 평점표시 + if ($this->view_star && $star_score) { + echo "
                  고객평점\"별점
                  \n"; + } + + if ($this->view_it_id) { + echo "
                  <".stripslashes($row['it_id']).">
                  \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
                  ".stripslashes($row['it_basic'])."
                  \n"; + } + if ($this->view_it_price) { + echo "
                  \n"; + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + echo "
                  \n"; + } + + // 위시리스트 + 공유 버튼 시작 { + echo "
                  \n"; + echo "\n"; + if ($this->view_sns) { + echo "\n"; + } + echo "
                  "; + if ($this->view_sns) { + $sns_top = $this->img_height + 10; + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
                  "; + echo "

                  SNS 공유

                  "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_MSHOP_SKIN_URL.'/img/facebook.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_MSHOP_SKIN_URL.'/img/twitter.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_MSHOP_SKIN_URL.'/img/gplus.png'); + echo get_sns_share_link('kakaotalk', $sns_url, $sns_title, G5_MSHOP_SKIN_URL.'/img/sns_kakao.png'); + echo ""; + echo "
                  \n"; + } + echo "
                  "; + echo "
                  \n"; + echo "
                  \n"; + // } 위시리스트 + 공유 버튼 끝 + + + echo "
                  \n"; + + if ($this->view_it_icon) { + echo "
                  ".item_icon($row)."
                  \n"; + } + echo "
                • \n"; + + $i++; +} + +if ($i > 0) echo "
                \n"; + +if($i == 0) echo "

                등록된 상품이 없습니다.

                \n"; +?> + + + + +', 0); +?> + +total_count > 0) { + $li_width = intval(100 / $this->list_mod); + $li_width_style = ' style="width:'.$li_width.'%;"'; + $k = 1; + $slide_btn = ''; + + for ($i=0; $row=sql_fetch_array($result); $i++) { + $is_soldout = is_soldout($row['it_id'], true); // 품절인지 체크 + + if($i == 0) { + echo ''.PHP_EOL; + echo '
                '.PHP_EOL; + echo '

                베스트상품

                '.PHP_EOL; + echo '
                '.PHP_EOL; + echo '
                '.PHP_EOL; + echo '
                  '.PHP_EOL; + } + + if($i > 0 && ($i % $this->list_mod == 0)) { + echo '
                '.PHP_EOL; + echo ''.PHP_EOL; + echo '
                '.PHP_EOL; + echo '
                '.$slide_btn.'
                '.PHP_EOL; + echo '
                '.PHP_EOL; + echo '
                '.PHP_EOL; + } +?> + + + +', 0); +?> + + +
                +

                상품 정렬

                + + +
                + + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/list.sub.skin.php b/theme/basic/mobile/skin/shop/basic/list.sub.skin.php new file mode 100644 index 000000000..940e9bedf --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/list.sub.skin.php @@ -0,0 +1,12 @@ +', 0); +?> + +
                  +
                • +
                • +
                + diff --git a/theme/basic/mobile/skin/shop/basic/listcategory.skin.php b/theme/basic/mobile/skin/shop/basic/listcategory.skin.php new file mode 100644 index 000000000..7f0213773 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/listcategory.skin.php @@ -0,0 +1,36 @@ +'.$row['ca_name'].' '.$row2['cnt'].''; + $exists = true; +} + +if ($exists) { + + // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 + add_stylesheet('', 0); +?> + + + + + +', 0); + +// 장바구니 또는 위시리스트 ajax 스크립트 +add_javascript('', 10); +?> + + + + + + + + +list_mod); +$li_width_style = ' style="width:'.$li_width.'%;"'; +$i=0; + +foreach((array) $list as $row){ + + if( empty($row) ) continue; + + $item_link_href = shop_item_url($row['it_id']); + $star_score = $row['it_use_avg'] ? (int) get_star($row['it_use_avg']) : ''; + $is_soldout = is_soldout($row['it_id'], true); // 품절인지 체크 + + if ($i == 0) { + if ($this->css) { + echo "
                  css}\">\n"; + } else { + echo "
                    \n"; + } + } + if($i % $this->list_mod == 0) + $li_clear = ' sct_clear'; + else + $li_clear = ''; + + echo "
                  • \n"; + + if ($this->href) { + echo "\n"; + } + + // 사용후기 평점표시 + if ($this->view_star && $star_score) { + echo "
                    \"별점
                    \n"; + } + + if ($this->view_it_id) { + echo "
                    <".stripslashes($row['it_id']).">
                    \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
                    ".stripslashes($row['it_basic'])."
                    \n"; + } + if ($this->view_it_price) { + echo "
                    \n"; + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + echo "
                    \n"; + } + + // 위시리스트 + 공유 버튼 시작 { + echo "
                    \n"; + echo "\n"; + if ($this->view_sns) { + echo "\n"; + } + echo "
                    "; + if ($this->view_sns) { + $sns_top = $this->img_height + 10; + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
                    "; + echo "

                    SNS 공유

                    "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_MSHOP_SKIN_URL.'/img/facebook.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_MSHOP_SKIN_URL.'/img/twitter.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_MSHOP_SKIN_URL.'/img/gplus.png'); + echo get_sns_share_link('kakaotalk', $sns_url, $sns_title, G5_MSHOP_SKIN_URL.'/img/sns_kakao.png'); + echo ""; + echo "
                    \n"; + } + echo "
                    "; + echo "
                    \n"; + echo "
                    \n"; + // } 위시리스트 + 공유 버튼 끝 + + echo "
                    \n"; + + if ($this->view_it_icon) { + echo "
                    ".item_icon($row)."
                    \n"; + } + echo "
                  • \n"; + + $i++; +} + +if ($i > 0) echo "
                  \n"; + +if($i == 0) echo "

                  등록된 상품이 없습니다.

                  \n"; +?> + + + diff --git a/theme/basic/mobile/skin/shop/basic/main.20.skin.php b/theme/basic/mobile/skin/shop/basic/main.20.skin.php new file mode 100644 index 000000000..566f683a8 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/main.20.skin.php @@ -0,0 +1,122 @@ +', 0); + +// 장바구니 또는 위시리스트 ajax 스크립트 +add_javascript('', 10); +?> + + + + + + + + + +list_mod); +$li_width_style = ' style="width:'.$li_width.'%;"'; +$i=0; + +foreach((array) $list as $row){ + + if( empty($row) ) continue; + + $item_link_href = shop_item_url($row['it_id']); + $star_score = $row['it_use_avg'] ? (int) get_star($row['it_use_avg']) : ''; + $is_soldout = is_soldout($row['it_id'], true); // 품절인지 체크 + + if ($i == 0) { + if ($this->css) { + echo "
                    css}\">\n"; + } else { + echo "\n"; + +if($i == 0) echo "

                    등록된 상품이 없습니다.

                    \n"; +?> + + diff --git a/theme/basic/mobile/skin/shop/basic/main.30.skin.php b/theme/basic/mobile/skin/shop/basic/main.30.skin.php new file mode 100644 index 000000000..f58f51a60 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/main.30.skin.php @@ -0,0 +1,137 @@ +', 0); +add_javascript('', 10); + +// 장바구니 또는 위시리스트 ajax 스크립트 +add_javascript('', 10); +?> + + + + + + +
                    + +list_mod); +$li_width_style = ' style="width:'.$li_width.'%;"'; +$i=0; + +foreach((array) $list as $row){ + + if( empty($row) ) continue; + + $item_link_href = shop_item_url($row['it_id']); + $star_score = $row['it_use_avg'] ? (int) get_star($row['it_use_avg']) : ''; + $is_soldout = is_soldout($row['it_id'], true); // 품절인지 체크 + + if ($i == 0) { + if ($this->css) { + echo "
                      css}\">\n"; + } else { + echo "\n"; + +if($i == 0) echo "

                      등록된 상품이 없습니다.

                      \n"; +?> + +
                    + + + diff --git a/theme/basic/mobile/skin/shop/basic/main.event.skin.php b/theme/basic/mobile/skin/shop/basic/main.event.skin.php new file mode 100644 index 000000000..800d5a491 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/main.event.skin.php @@ -0,0 +1,80 @@ +', 0); + add_javascript('', 10); +?> +
                    +

                    이벤트

                    +
                      +
                      '; + $href = G5_SHOP_URL.'/event.php?ev_id='.$row['ev_id']; + + $event_img = G5_DATA_PATH.'/event/'.$row['ev_id'].'_m'; // 이벤트 이미지 + + if (file_exists($event_img)) { // 이벤트 이미지가 있다면 이미지 출력 + echo ''.$row['ev_subject'].''.PHP_EOL; + } else { // 없다면 텍스트 출력 + echo ''; + if ($row['ev_subject_strong']) echo ''; + echo $row['ev_subject']; + if ($row['ev_subject_strong']) echo ''; + echo ''.PHP_EOL; + } + + // 이벤트 상품 + $sql2 = " select b.* + from `{$g5['g5_shop_event_item_table']}` a left join `{$g5['g5_shop_item_table']}` b on (a.it_id = b.it_id) + where a.ev_id = '{$row['ev_id']}' + order by it_id desc + limit 0, 3 "; + $result2 = sql_query($sql2); + for($k=1; $row2=sql_fetch_array($result2); $k++) { + if($k == 1) { + echo '
                        '.PHP_EOL; + } + + $item_href = shop_item_url($row2['it_id']); + + echo '
                      • '.PHP_EOL; + echo ''.get_it_image($row2['it_id'], 300, 300, get_text($row2['it_name'])).''.PHP_EOL; + echo '
                      • '.PHP_EOL; + } + if($k > 1) { + echo '
                      '.PHP_EOL; + } + + if($k == 1) { + echo '
                        '.PHP_EOL; + echo '
                      • 등록된 상품이 없습니다.
                      • '.PHP_EOL; + echo '
                      '.PHP_EOL; + } + + echo '
                      '.PHP_EOL; + + } + if ($i==0) + echo '
                    • 이벤트 없음
                    • '.PHP_EOL; + ?> +
                    +
                    + + +', 0); +add_javascript('', 10); +add_stylesheet('', 10); + +$max_width = $max_height = 0; +$bn_first_class = ' class="bn_first"'; +$bn_slide_btn = ''; +$bn_sl = ' class="bn_sl"'; +$main_banners = array(); + +for ($i=0; $row=sql_fetch_array($result); $i++) +{ + $main_banners[] = $row; + + if ($i==0) echo '
                    '.PHP_EOL; + + echo '
                    '.PHP_EOL; + echo '
                    '.PHP_EOL; +?> + + + +'.$row['ca_name'].''; + } +} +else + $str = $g5['title']; + +//if ($it_id) $str .= " > $it[it_name]"; + +// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 +add_stylesheet('', 0); +?> + +
                    + Home + +
                    diff --git a/theme/basic/mobile/skin/shop/basic/personalpay.skin.php b/theme/basic/mobile/skin/shop/basic/personalpay.skin.php new file mode 100644 index 000000000..70df094fc --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/personalpay.skin.php @@ -0,0 +1,37 @@ +', 0); +?> + + +\n"; + } + + if($i % $list_mod == 0) + $li_clear = ' sct_clear'; + else + $li_clear = ''; + + $href = G5_SHOP_URL.'/personalpayform.php?pp_id='.$row['pp_id'].'&page='.$page; +?> +
                  • > +
                    +
                    +
                    +
                  • + 0) echo "
                  \n"; + +if($i == 0) echo "

                  등록된 개인결제가 없습니다.

                  \n"; +?> + diff --git a/theme/basic/mobile/skin/shop/basic/relation.10.skin.php b/theme/basic/mobile/skin/shop/basic/relation.10.skin.php new file mode 100644 index 000000000..88fd35ee8 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/relation.10.skin.php @@ -0,0 +1,96 @@ +', 0); +?> + + + + + + + + + +list_mod); +$li_width_style = ' style="width:'.$li_width.'%;"'; + +for ($i=0; $row=sql_fetch_array($result); $i++) { + + $item_link_href = shop_item_url($row['it_id']); + + if ($i == 0) { + if ($this->css) { + echo "
                    css}\">\n"; + } else { + echo "\n"; + +if($i == 0) echo "

                    등록된 관련상품이 없습니다.

                    \n"; +?> + + + + diff --git a/theme/basic/mobile/skin/shop/basic/search.skin.php b/theme/basic/mobile/skin/shop/basic/search.skin.php new file mode 100644 index 000000000..0f07cb3b6 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/search.skin.php @@ -0,0 +1,134 @@ + + +
                    + +
                    + 검색 결과 건 +
                    + + +
                    +
                    + + + +
                    + + + +

                    + 상세검색을 선택하지 않거나, 상품가격을 입력하지 않으면 전체에서 검색합니다.
                    + 검색어는 최대 30글자까지, 여러개의 검색어를 공백으로 구분하여 입력 할수 있습니다. +

                    +
                    +
                    + 검색범위 + class="selec_chk"> + class="selec_chk"> + class="selec_chk"> + class="selec_chk"> +
                    + 상품가격 (원) + + 원 ~ + +
                    +
                    +
                    +
                    + + + +
                    + +
                    + + + +
                    + set_is_page(true); + $list->set_mobile(true); + $list->set_view('it_img', true); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_basic', true); + $list->set_view('it_cust_price', false); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + echo $list->run(); + } + else + { + $i = 0; + $error = '

                    '.$list_file.' 파일을 찾을 수 없습니다.
                    관리자에게 알려주시면 감사하겠습니다.

                    '; + } + + if ($i==0) + { + echo '
                    '.$error.'
                    '; + } + + $query_string = 'qname='.$qname.'&qexplan='.$qexplan.'&qid='.$qid.'&qbasic='.$qbasic; + if($qfrom && $qto) $query_string .= '&qfrom='.$qfrom.'&qto='.$qto; + $query_string .= '&qcaid='.$qcaid.'&q='.urlencode($q); + $query_string .='&qsort='.$qsort.'&qorder='.$qorder; + echo get_paging($config['cf_mobile_pages'], $page, $total_page, $_SERVER['SCRIPT_NAME'].'?'.$query_string.'&page='); + ?> +
                    + + +
                    + + + \ No newline at end of file diff --git a/theme/basic/mobile/skin/shop/basic/style.css b/theme/basic/mobile/skin/shop/basic/style.css new file mode 100644 index 000000000..164d339d6 --- /dev/null +++ b/theme/basic/mobile/skin/shop/basic/style.css @@ -0,0 +1,717 @@ +@charset "utf-8"; + +/* 오늘 본 상품 */ +#stv {position:relative;margin:10px 0;background:#fff;border-bottom:1px solid #e1e1e1} +#stv h2 {border-bottom:1px solid #efefef;padding:10px;line-height:30px;font-size:1.077em} +#stv_ul {padding:10px} +#stv_ul:after {display:block;visibility:hidden;clear:both;content:""} +#stv_ul li {float:left;width:20%;text-align:center} +#stv_ul li img {max-width:100%;height:auto} +#stv_pg {display:inline-block;text-align:center;margin:0 0 0 5px;line-height:20px;font-weight:normal;font-size:0.929em;color:#999} +.stv_item {display:none;padding:3px;word-break:break-all} +#up {position:absolute;top:0px;right:30px;height:50px;width:30px;border:0;background:none;color:#ccc} +#down {position:absolute;top:0px;right:0px;height:50px;width:30px;border:0;background:none;color:#ccc} +#stv .li_empty {text-align:center;padding:50px 0;color:#666} + +/*메인배너*/ +#main_bn {position:relative;text-align:center} +#main_bn .slide-wrap{display:none} +#main_bn img {max-width:100%;height:auto} +#main_bn .btn_wr {background:rgba(0,0,0,0.5);display:inline-block;position:absolute;z-index:1;right:15px;bottom:15px;border-radius:30px;padding:0;width:100px;line-height:30px} +#main_bn .btn_wr .pager-prev {float:left;display:inline-block;padding:0;color:#fff;width:25px} +#main_bn .btn_wr .pager-next {float:right;display:inline-block;padding:0;color:#fff;width:25px} +#main_bn #slide-counter {margin:0;width:50px;float:left;display:inline-block;padding:0;color:#fff} + +/*사이드배너*/ +#sbn_side {text-align:center;position:relative;margin:10px 0} +#sbn_side h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#sbn_side img {max-width:100%;height:auto} +#sbn_side .bx-pager {position:absolute;bottom:5px;left:0;width:100%} +#sbn_side .bx-pager .bx-pager-item {display:inline-block;margin:5px} +#sbn_side .bx-pager .bx-pager-link {display:block;width:8px;height:8px;text-indent:-999px;overflow:hidden;background:#fff;opacity:0.5;border-radius:5px} +#sbn_side .bx-pager .active {opacity:1} + +/*쇼핑몰 이벤트 */ +#sev {position:relative;margin:20px 0;text-align:center} +#sev h2 {font-size:1.25em;text-align:left;margin:40px 10px 10px;line-height:1em} +#sev .bx-wrapper {margin:0 10px} +#sev ul:after {display:block;visibility:hidden;clear:both;content:""} +#sev .ev_li {width:100%;height:100%} +#sev .ev_li .sev_img {display:grid} +#sev .ev_li .sev_img img {width:100%;height:auto} +#sev .ev_prd {border:1px solid #eaebed;border-bottom:1px solid #d8d8d8;text-align:center;padding:15px 10px;background:#fff} +#sev .ev_prd li {position:relative;display:inline-block;width:33.333%;float:left;padding:0 5px;text-align:center} +#sev .ev_prd li:after {display:block;visibility:hidden;clear:both;content:""} +#sev .ev_prd .ev_prd_tit {display:block;color:#000;font-size:1.1em;margin-bottom:5px} +#sev .ev_prd .ev_prd_img img {width:100%;height:auto} +#sev .ev_prd .ev_txt_wr {float:left;max-width:139px;margin-left:10px} +#sev .ev_prd .ev_prd_price {font-weight:bold;display:block;margin:5px 0 10px;font-size:1.25em;font-weight:bold} +#sev .ev_prd .sev_more {color:#3a8afd;background:#fff;display:block;text-align:center} + +#sev .bx-pager {position:absolute;top:0;right:10px} +#sev .bx-pager .bx-pager-item {display:inline-block;margin:5px} +#sev .bx-pager .bx-pager-link {display:block;width:8px;height:8px;text-indent:-999px;overflow:hidden;background:#adadad;border-radius:5px} +#sev .bx-pager .active {background:#000} + +#sev_list #sct_sort {position:relative;background:#fff;border-bottom:1px solid #e5e5e5} + +/* ##### maint.(nn).skin.php, list.(nn).skin.php 공통 적용 시작 ##### */ +/* 공통 */ +.sct_wrap {margin:10px 0 30px;zoom:1} +.sct_wrap:after {display:block;visibility:hidden;clear:both;content:""} +.sct_wrap h2 {font-size:1.25em;margin:20px 10px 10px} + +.sct {margin:10px 0;padding:0;list-style:none;zoom:1;clear:both} +.sct:after {display:block;visibility:hidden;clear:both;content:""} +.sct_li {position:relative} +.sct_noitem {padding:50px 0;text-align:center} +.sct_icon img {margin:0 1px 0 0} +.sct_sns a {display:inline-block;margin:0 2px;width:28px;height:28px;line-height:28px;border-radius:3px;font-size:0;text-align:center} +.share-facebook {background:#415b92} +.share-twitter {background:#35b3dc} +.share-googleplus {background:#d5503a} +.share-kakaotalk {background:#ffeb00} +.sct_sns img {width:20px;height:auto;vertical-align:middle} +.sct_sns button {margin:0 4px 0 0;padding:0;border:0} + +.shop_icon {display:inline-block;color:#fff;line-height:20px;padding:0 5px;font-size:0.92em;margin:1px;border-radius:2px} +.shop_icon_1 {background:#3ec1d3} +.shop_icon_2 {background:#ffb722} +.shop_icon_3 {background:#2dd49f} +.shop_icon_4 {background:#556ee6} +.shop_icon_5 {background:#ff5081} +.shop_icon_coupon {background:#b169e1} + +.mli_btn button {background:url(img/mainlist_btn.gif) no-repeat;width:30px;height:30px;border:none;text-indent:-9999px} +.mli_btn button.mli_pre {position:absolute;top:0;left:10px} +.mli_btn button.mli_next {background-position:-33px 0;position:absolute;top:0;right:10px} + +/* 상품 목록 스킨 10 */ +.sct_10 {margin:10px} +.sct_10 .sct_li {float:left;text-align:left;padding:5px;margin-bottom:10px} +.sct_10 .sct_li .li_wr {position:relative} +.sct_10 .sct_img {position:relative;margin-bottom:10px;font-size:0} +.sct_10 .sct_img img {width:100%;height:auto} +.sct_10 .sct_clear {clear:both} +.sct_10 .sct_id {margin:5px 0;font-size:0.92em;color:#666} +.sct_10 .sct_txt {font-size:1.083em;margin:0 0 10px;padding:5px 0 10px;line-height:1.3em;border-bottom:1px solid #e3e6e9} +.sct_10 .sct_basic {margin:10px 0;color:#6e7f88} +.sct_10 .sct_cost {margin:10px 0;font-weight:bold} +.sct_10 .sct_sns_wrap {display:none;width:100%;height:100%;position:fixed;top:0;left:0;z-index:999} +.sct_10 .sct_sns {position:absolute;top:50%;left:50%;background:#fff;text-align:center;width:250px;height:160px;margin-left:-125px;margin-top:-80px;overflow-y:auto;border-radius:5px;-webkit-box-shadow:1px 1px 18px rgba(0,0,0,0.2);-moz-box-shadow:1px 1px 18px rgba(0,0,0,0.2);box-shadow:1px 1px 18px rgba(0,0,0,0.2);border:1px solid #dde7e9;background:#fff;border-radius:3px} +.sct_10 .sct_sns h3 {padding:15px;border-bottom:1px solid #e8e8e8;text-align:left;line-height:20px;font-size:1.077em} +.sct_10 .sct_sns a {display:inline-block;border-radius:50%;width:50px;height:50px;line-height:25px;text-align:center;padding:13px 0;margin:20px 5px} +.sct_10 .sct_sns .share-facebook {background:#415b92} +.sct_10 .sct_sns .share-twitter {background:#35b3dc} +.sct_10 .sct_sns .share-googleplus {background:#ea3838} +.sct_10 .sct_sns img {width:24px} +.sct_10 .sct_sns_bg {background:rgba(0,0,0,0.1);width:100%;height:100%} +.sct_10 .sct_sns_cls {position:absolute;right:0;top:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff;margin:0;height:50px} + +.li_wr .sct_img{position:relative} +.shop_icon_soldout {position:absolute;z-index:1;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.5);justify-content:center;display:flex;align-items:center;text-align:center;color:#fff;font-size:18px;font-weight:bold;letter-spacing:1px} + +.sct_10 .sct_icon {margin:0 0 10px} +.li_more {text-align:center} + +.sct_10 .sct_op_btn {position:absolute;right:5px;bottom:0} +.sct_10 .sct_op_btn>button {border:0;width:25px;height:20px;font-size:1.25em;text-align:center;color:#949494;background:transparent} + +#item_load_msg {display:none} +.li_more_btn {margin:10px} +#btn_more_item {height:43px;width:100%;border:1px solid #ddd;font-size:1.167em;color:#282828;line-height:43px;background:none} + +.sct_10_list li {border-bottom:1px solid #d9dde2;width:100%;padding:10px;text-align:left} +.sct_10_list .li_wr {min-height:110px;padding-left:120px} +.sct_10_list .sct_sns_wrap {display:none;width:100%;height:100%;position:fixed;top:0;left:0;z-index:999} +.sct_10_list .sct_sns {position:absolute;top:50%;left:50%;background:#fff;text-align:center;width:250px;height:160px;margin-left:-125px;margin-top:-80px;overflow-y:auto;border-radius:5px;-webkit-box-shadow:1px 1px 18px rgba(0,0,0,0.2);-moz-box-shadow:1px 1px 18px rgba(0,0,0,0.2);box-shadow:1px 1px 18px rgba(0,0,0,0.2);border:1px solid #dde7e9;background:#fff;border-radius:3px} +.sct_10_list .sct_sns h3 {padding:15px;border-bottom:1px solid #e8e8e8;text-align:left} +.sct_10_list .sct_sns a {display:inline-block;border-radius:50%;width:50px;height:50px;line-height:25px;text-align:center;padding:13px 0;margin:20px 5px} +.sct_10_list .sct_sns .share-facebook {background:#415b92} +.sct_10_list .sct_sns .share-twitter {background:#35b3dc} +.sct_10_list .sct_sns .share-googleplus {background:#ea3838} +.sct_10_list .sct_sns img {width:24px} +.sct_10_list .sct_sns_bg {background:rgba(0,0,0,0.1);width:100%;height:100%} +.sct_10_list .sct_sns_cls {position:absolute;right:0;top:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff} +.sct_10_list .sct_img {position:absolute;top:0;left:0} +.sct_10_list .sct_img img {width:110px;height:auto} +.sct_10_list .li_wr {position:relative} +.sct_10_list .sct_star {margin:5px 0} +.sct_10_list .sct_id {margin:5px 10px;font-size:0.92em;color:#666} +.sct_10_list .sct_txt {font-size:1.077em;margin:5px 0;line-height:1.5em} +.sct_10_list .sct_cost {margin:5px 0;font-weight:bold} +.sct_10_list .sct_op_btn {position:absolute;right:0px;bottom:0px} +.sct_10_list .sct_op_btn>button {border:0;width:25px;height:20px;font-size:1.25em;text-align:center;color:#949494;background:transparent} +.sct_10_list li .sct_basic {color:#6e7f88} + +/* 상품 목록 스킨 20 */ +.sct_20 {background:#fff;border-bottom:1px solid #e5e5e5;padding:10px 0} +.sct_20 .sct_li {width:100%;padding:10px;text-align:left} +.sct_20 .sct_img {position:absolute;top:0;left:0} +.sct_20 .li_wr {position:relative} +.sct_20 .sct_star {margin:5px;padding-left:10px} +.sct_20 .sct_id {margin:5px 10px;font-size:0.92em;color:#666} +.sct_20 .sct_txt {font-size:1.077em;margin:5px 0;line-height:1.5em;padding-left:10px} +.sct_20 .sct_cost {margin:5px 0;font-weight:bold;padding-left:10px} +.sct_20 .sct_sns {margin:10px 0} +.sct_20 .li_wr.is_view_type_list {padding-left:130px;height:130px} +.sct_20 .li_wr.is_view_type_list .sct_img {width:130px} +.sct_20 .li_wr.is_view_type_list .sct_img a {display:block} +.sct_20 .li_wr.is_view_type_list img {width:100%;height:auto} + +/* 상품 목록 스킨 30 */ +.st_30_wr {background:#fff;padding:10px;position:relative;border-bottom:1px solid #e5e5e5;webkit-text-size-adjust:100%} +.sct_30 {margin:0} +.sct_30 .sct_li {padding:10px} +.sct_30 .sct_img img {max-width:100%;height:auto} +.st_30_wr .bx-pager {position:absolute;top:-30px;right:10px} +.st_30_wr .bx-pager .bx-pager-item {display:inline-block;margin:5px} +.st_30_wr .bx-pager .bx-pager-link {display:block;width:8px;height:8px;text-indent:-999px;overflow:hidden;background:#adadad;border-radius:5px} +.st_30_wr .bx-pager .active {background:#000} +.sct_30 .sct_star {margin:10px 0 5px} +.sct_30 .sct_txt {margin:5px 0;font-size:1.083em} +.sct_30 .sct_cost {font-weight:bold} + +/* 관련상품 목록 스킨 10 */ +#sit_rel {margin:20px 0;position:relative} +#sit_rel h2 {margin:10px} +#sit_rel .sct_wrap {background:#fff;border-bottom:1px solid #e5e5e5;padding-bottom:10px;margin:0} +.srl_10 {} +.srl_10:after {display:block;visibility:hidden;clear:both;content:""} +.srl_10 li {} +.srl_10 .li_wr {padding:10px} +.srl_10 li img {width:100%;height:auto} +.srl_10 .sct_txt {margin:10px 0} +.srl_10 .sct_cost {font-weight:bold} + +#sit_rel .bx-pager {position:absolute;top:0px;right:10px} +#sit_rel .bx-pager-item {display:inline-block;margin:5px} +#sit_rel .bx-pager-link {display:block;width:8px;height:8px;text-indent:-999px;overflow:hidden;background:#adadad;border-radius:5px} +#sit_rel .bx-pager .active {background:#000} + +/* 베스트상품 스킨 10 */ +#best_item {margin:10px 0;overflow:hidden;position:relative} +#best_item h2 {font-size:1.25em;margin:10px} +#best_item #sbest_list {width:100%;overflow:hidden} +#best_item .slide-wrap {margin:0px;overflow:hidden;position:relative;top:0;left:0;float:left} +#best_item .slide-wrap:after {display:block;visibility:hidden;clear:both;content:""} +#best_item .sct_best {width:100%;background:#fff;border-bottom:1px solid #e5e5e5;padding:10px 0;position:relative;padding:0;float:left} +#best_item .best_on {} + +.sct_best .sct_li {position:relative;float:left;padding:10px} +.sct_best .sct_last {margin:0 0 15px !important} +.sct_best .sct_clear {clear:both;margin-left:0} +.sct_best .sct_a {display:block;position:relative;text-decoration:none;font-weight:bold;text-overflow:ellipsis;overflow:hidden;white-space:nowrap} +.sct_best .sct_txt .sct_a {margin:0 0 5px} +.sct_best .sct_a img {width:100%;height:auto} +.sct_best .sct_id {display:block;margin:0 0 5px} +.sct_best .sct_basic {margin:0 0 10px} +.sct_best .sct_cost {display:block;margin:0 0 10px;font-size:0.917em} +.sct_best .sct_icon {margin:0 0 10px} +.sct_best .sct_sns {margin:15px 0 0} +.sct_best .sct_img {position:relative;margin:0 5px 5px} + +.bst_silde_btn {position:absolute;top:10px;right:10px} +.bst_silde_btn button {border:0;width:8px;height:8px;text-indent:-999px;overflow:hidden;background:#adadad;border-radius:5px;margin:3px} +.bst_silde_btn button.bst_sl {background:#000} + +/* 개인결제 목록 */ +#sct_pv {margin:10px 5px} +.sct_pv {margin:10px 0} +.sct_pv .sct_li {position:relative;float:left;position:relative;float:left;margin-bottom:10px} +.sct_pv .sct_img {padding:0 5px} +.sct_pv .sct_img a {} +.sct_pv .sct_img img {width:100%} +.sct_pv .sct_txt {padding:0 5px} +.sct_pv .sct_last {margin:0 0 15px !important} +.sct_pv .sct_clear {clear:both} +.sct_pv .sct_a {display:block;position:relative;margin:0 0 5px;text-decoration:none;font-weight:bold;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;line-height:20px} +.sct_pv .sct_id {display:block;margin:0 0 5px} +.sct_pv .sct_basic {margin:0 0 10px} +.sct_pv .sct_cost {display:block;margin:0 0 10px;padding:0 5px} +.sct_pv .sct_cost strike {display:block;margin:0 0 5px;color:#999;font-weight:normal} +.sct_pv .sct_icon {margin:0 0 10px} +/* ##### maint.(nn).skin.php, list.(nn).skin.php 공통 적용 끝 ##### */ + +/* 상품 목록 */ +#sct {margin:10px 0} +.sct_admin {margin:0 0 10px;text-align:right} +#sit_hhtml img {max-width:100%;height:auto} + +/* 상품 목록 현재 위치 */ +#sct_location {border:1px solid #e9e9e9;background:#f2f5f9;letter-spacing:-4px} +#sct_location a {display:inline-block;padding:5px 10px;text-decoration:none;letter-spacing:0 !important} +.sct_here {font-weight:bold} +.sct_bg {padding-right:13px !important;background:url('img/sct_bg_toright.gif') right 8px no-repeat} + +/* 상품 목록 카테고리 목록 */ +.sct_ct {text-align:center;width:100%;margin:10px 0} +.sct_ct h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +.sct_ct ul {list-style:none;border-bottom:1px solid #d9dce3} +.sct_ct ul:after {display:block;visibility:hidden;clear:both;content:""} +.sct_ct ul li {border-left:1px solid #f2f2f2;border-top:1px solid #f2f2f2;background:#fff;float:left;width:50%;text-align:left} +.sct_ct ul li:nth-child(2n+1) {clear:both;border-left:0} +.sct_ct a {text-decoration:none;display:block;color:#656565;padding:10px;position:relative;padding-right:25px;position:relative;line-height:20px} +.sct_ct .prd_cnt {position:absolute;top:10px;right:10px;display:inline-block;line-height:20px;padding:0 5px;border-radius:10px;color:#999} +.sct_ct_parent {font-weight:bold} +.sct_ct_here {color:#ff3600 !important} + +/* 상품 정렬 */ +#sct_sortlst {position:relative;background:#fff;border-bottom:1px solid #e5e5e5} + +#sct_sort {clear:both} +#sct_sort:after {display:block;visibility:hidden;clear:both;content:""} +#sct_sort h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#sct_sort button {height:40px;line-height:40px;border:0;padding:0 10px;background:#fff;border-right:1px solid #f8f8f8} +#sct_sort ul:before {content:"";position:absolute;top:-8px;left:30px;width:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #bbb transparent} +#sct_sort ul:after {content:"";position:absolute;top:-7px;left:30px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent} +#sct_sort ul {display:none;position:absolute;border:1px solid #bbb;z-index:99} +#sct_sort li {border-top:1px solid #eee} +#sct_sort li a {display:block;text-align:center;color:#666;background:#fff;border-color:#e9e9e9;padding:0 15px;line-height:40px} + +/* 상품 리스트 스타일 선택 */ +#sct_lst {position:absolute;top:0;right:0;padding:0;list-style:none} +#sct_lst:after {display:block;visibility:hidden;clear:both;content:""} +#sct_lst li {position:relative;float:left} +#sct_lst button {position:relative;padding:0;width:40px;height:40px;border:0;background:#fff;font-size:15px;color:#999} + +/* 상품 상세보기 */ +#sit {margin:0} +.sit_admin {margin:10px 10px 0;text-align:right} +.sit_empty {padding:30px 0;text-align:center} + +/* 상품상세 */ +#info_content {padding:0 10px 30px;zoom:1} +#info_content:after {display:block;visibility:hidden;clear:both;content:""} +#info_content h3 {margin:0 0 10px} +.if_tit {text-align:center;margin-top:10px;padding:10px;background:#f5f5f5;border:1px solid #e9e9e9} +.win_desc_if {border:1px solid #e9e9e9;padding:10px;border-top:none} +.win_desc {margin-top:10px} + +/* 상품 상세보기 - 개요 */ +#sit_ov_wrap {margin:0 0 20px} +#sit_ov_wrap:after {display:block;visibility:hidden;clear:both;content:""} + +/* 상품 상세보기 - 이미지 미리보기 */ +#sit_pvi {position:relative;margin:0;border-bottom:1px solid #e6e6e6;background:#fff;text-align:center} +#sit_pvi .btn_wr {background:rgba(0,0,0,0.5);display:inline-block;position:absolute;left:50%;bottom:15px;border-radius:30px;width:100px;line-height:30px;margin-left:-50px} +#sit_pvi .btn_wr .pager-prev {float:left;display:inline-block;padding:0;color:#fff;width:25px} +#sit_pvi .btn_wr .pager-next {float:right;display:inline-block;padding:0;color:#fff;width:25px} +#sit_pvi #slide-counter {margin:0;width:50px;float:left;display:inline-block;padding:0;color:#fff} + +#sit_pvi img{max-width:100%;height:auto;text-align:center} +#sit_pvi_nw h1 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#sit_pvi_nwbig {padding:10px 0;text-align:center} +#sit_pvi_nwbig span {display:none} +#sit_pvi_nwbig span.visible {display:inline} +#sit_pvi_nw ul {text-align:center;margin:0 0 20px;padding:0 10px;list-style:none;zoom:1} +#sit_pvi_nw ul:after {display:block;visibility:hidden;clear:both;content:""} +#sit_pvi_nw li {display:inline-block;margin:3px} +#sit_pvi_nw li img {width:60px;height:60px} + +/* 상품 상세보기 - 다른 상품 보기 */ +#sit_siblings {background:#fff;margin:0;text-align:center;position:relative} +#sit_siblings:after {display:block;visibility:hidden;clear:both;content:""} +#sit_siblings h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#sit_siblings a {display:inline-block;line-height:25px;padding-top:10px} +#sit_siblings a#siblings_prev {position:absolute;top:0;left:0} +#sit_siblings a#siblings_next {position:absolute;top:0;right:0} +#sit_siblings a span {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} + +/* 상품 상세보기 - sns */ +#sit_star_sns {position:relative} +#sit_star_sns span {display:inline-block;margin:0 5px 0 0;color:#666;letter-spacing:0;vertical-align:top} +#sit_star_sns .sit_star {position:relative;margin:0 5px 0 0;vertical-align:top} + +#sit_star_sns a {display:inline-block;vertical-align:middle} +#sit_star_sns .btn_sns_share {float:left;background:transparent;width:35px;height:25px;border:0;color:#4b5259;font-size:1.6em;font-weight:bold} +#sit_star_sns .btn_sns_share:hover {color:#3a8afd} +#sit_star_sns .sns_area {display:none;position:absolute;top:45px;right:0;width:200px;text-align:center;background:#fff;border:1px solid #e2e2e2;padding:10px;z-index:10} +#sit_star_sns .sns_area:before {content:"";position:absolute;top:-8px;right:13px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #e2e2e2 transparent} +#sit_star_sns .sns_area:after {content:"";position:absolute;top:-7px;right:13px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent} +#sit_star_sns .sns_area a {display:inline-block;width:35px;height:35px;line-height:35px;background:#eee;text-align:center;border-radius:50%;padding-top:5px} +#sit_star_sns .sns_area a img {width:24px;height:auto} +#sit_star_sns .sns_area #sit_btn_rec {font-size:15px;padding-top:0} +#sit_star_sns .sns_area .share-googleplus {background:#ea3838} +#sit_star_sns .sns_area .share-facebook {background:#415b92} +#sit_star_sns .sns_area .share-twitter {background:#35b3dc} + +.sit_btn_opt {position:absolute;right:0;bottom:0} +#btn_wish {float:left;position:relative;display:inline-block;padding-right:5px;color:#4b5259;width:35px;height:25px;text-align:center;font-size:1.25em;font-weight:bold} +#btn_wish i {font-size:1.6em;font-weight:bold} +#btn_wish .btn_wish_num {position:absolute;right:0;bottom:-2px;margin:0;padding:0 2px;min-width:18px;height:17px;line-height:15px;border-radius:30px;background:#fff;color:#4b5259;font-size:0.75em} + +/* 상품 상세보기 - 간략정보 및 구매기능 */ +#sit_ov {position:relative;height:auto !important;padding:20px;border-bottom:1px solid #e9e9e9;background:#fff} +#sit_ov h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#sit_ov h3 {margin:0 0 10px;color:#5772d5} +#sit_ov .sit_ov_wr {margin:0 0 10px;border-bottom:1px solid #f8f8f8} +.sit_option {margin:10px 0} +.sit_option label {display:block;margin:0 0 5px} +.sit_option select {width:100%;height:40px;border:1px solid #d4d4d4;margin:0 0 5px;padding:0 10px} + +#sit_title {display:block;margin:0 0 10px;font-size:1.5em;line-height:1.3em} +#sit_desc {margin:0 0 10px;color:#666;line-height:1.25em} +#sit_opt_info {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +.sit_icon {display:block;margin:0 0} +.sit_icon img {margin:0 1px 0 0;vertical-align:top;margin:0 1px} + +#sit_star {color:#b8afa2;font-size:0.95em;padding:0 10px;line-height:2.2em} +#sit_star span {display:inline-block;margin:0 5px 0 0;color:#666;letter-spacing:0} +#sit_star .sit_star {position:relative;top:-2px;margin:0 5px 0 0} +#sit_star a {display:inline-block;vertical-align:middle} +#sit_star button {margin:0;padding:0;border:0} + +.sit_ov_tbl {border-top:1px solid #f8f8f8;padding:10px 0;margin-top:20px;color:#777} +.sit_ov_tbl table {border-collapse:collapse;width:100%;border:0} +.sit_ov_tbl th {font-weight:normal;text-align:left;padding:5px 0} +.sit_ov_tbl td {padding:5px 15px} +.sit_ov_tbl tr:first-child td,.sit_ov_tbl tr:first-child th {border:none} +.sit_ov_ro {padding:2px 2px 3px;border:0;background:transparent;text-align:right;vertical-align:middle} +.sit_ov_opt {padding:2px 2px 3px;border:0;background:transparent;vertical-align:middle} +.sit_ov_input {height:1.8em;border:1px solid #b8c9c2;background:transparent;vertical-align:middle} +.sit_ov_tbl button {margin:0} + +#sit_tab {margin:20px 0} +#sit_tab .tab_tit:after {display:block;visibility:hidden;clear:both;content:""} +#sit_tab .tab_tit li {float:left;width:25%;text-align:center;border-bottom:1px solid #d9dce3} +#sit_tab .tab_tit li button {display:block;width:100%;position:relative;height:40px;background:#fff;border:0;color:#666;line-height:38px;text-align:center;z-index:1} +#sit_tab .tab_tit li .selected {background:#fff;z-index:2;color:#3a8afd;font-weight:bold;position:relative} +#sit_tab .tab_tit li .selected:before {content:'';position:absolute;bottom:-1px;left:0;width:100%;background:#3a8afd;height:3px} + +#sit_tab .tab_con {background:#fff;border-bottom:1px solid #e5e5e5;padding:15px} + +#btn_option {display:none;position:fixed;bottom:0;left:0;width:100%;background:#fff;z-index:90;border-top:1px solid #000; +-webkit-box-shadow:0 0 9px rgba(0,0,0,0.2) +-moz-box-shadow0 0 9px rgba(0,0,0,0.2); +box-shadow:0 0 6px rgba(0,0,0,0.2)} +#btn_option .sl_option {max-height:240px;overflow-y:auto;padding:10px} +#btn_option h3 {margin-bottom:10px} +#btn_option .btn_close {position:absolute;top:-25px;left:50%;width:60px;height:25px;margin-left:-30px;border:1px solid #000;border-bottom:0;background:#fff;border-radius:3px 3px 0 0} +.btn_cart_op {width:100%;text-align:center;font-weight:bold} +.btn_option_wr {position:fixed;bottom:0;left:0;width:100%;padding:10px;background:#fff;border-top:1px solid #000;z-index:88; +-webkit-box-shadow:0 0 9px rgba(0,0,0,0.2); +-moz-box-shadow:0 0 9px rgba(0,0,0,0.2); +box-shadow:0 0 6px rgba(0,0,0,0.2)} + +.sit_op_sl {width:100%;border-collapse:collapse} +.sit_op_sl th {font-weight:normal;text-align:left;padding:0 0 0 10px} +.sit_op_sl td {text-align:left;padding:9px 10px 9px 0} + +.sit_sel_btn {position:relative;top:-15px;right:-2px} /* 선택옵션용 추가 버튼 */ +.sit_sel_btn button {width:100%} + +#sit_ov_soldout {padding:20px;background:#fef5f7;color:#ff3061;font-weight:bold;text-align:center;margin-bottom:10px} +#sit_ov_btn {margin:0;text-align:center;z-index:100} +#sit_ov_btn:after {display:block;visibility:hidden;clear:both;content:""} +#sit_btn_cart {float:left;width:39%;margin-right:1%;line-height:50px;border:1px solid #98a3b3;color:#000;background:#fff;font-weight:bold;border-radius:3px} +#sit_btn_buy {float:left;width:39%;margin-right:1%;line-height:50px;font-weight:bold} +#sit_btn_phone {float:left;width:79%;margin-right:1%;line-height:50px;border:1px solid #3a8afd;color:#3a8afd;background:#fff;font-weight:bold;border-radius:3px} +#sit_btn_wish {float:left;width:20%;display:inline-block;line-height:50px;text-align:center;font-size:1.25em;border:1px solid #b3b3b3;font-weight:bold;border-radius:3px;background:#fff} +#sit_sel_option,#sit_tot_price {margin:10px 0;line-height:20px} +#sit_tot_price {text-align:right} +#sit_tot_price span {float:left} +#sit_tot_price strong {font-size:1.25em;color:#000} + +/* 상품 상세보기 - 상품정보 */ +#sit_inf_basic {margin:0 0 20px} +#sit_inf_explan {margin:0 0 10px;line-height:1.5em} +#sit_inf_explan img {max-width:100%;height:auto} +#sit_inf_open {margin:0;padding:0;list-style:none} +#sit_inf_open li {margin:0 0 1px;padding:8px 0;background:#fff;border:1px solid #f2f2f2;border-top:none;color:#727272} +#sit_inf_open li:after {display:block;visibility:hidden;clear:both;content:""} +#sit_inf_open strong {clear:both;float:left;padding:0 1%;width:28%;letter-spacing:-0.1em} +#sit_inf_open span {float:left;margin:0;padding:0 1%;width:68%} +#sit_inf h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#sit_inf h3 {position:absolute;font-size:0;line-height:0;content:""} + +#sit_inf_open {width:100%;border:0;border-top:1px solid #777;border-collapse:collapse;margin:10px 0 0} +#sit_inf_open th {padding:10px;border-bottom:1px solid #e5e5e5;background:#f3f3f3;vertical-align:top;text-align:left;width:30%} +#sit_inf_open td {padding:10px;border-bottom:1px solid #e5e5e5;background:#fff;vertical-align:top} + +@media (max-width:640px) { + #sit_inf_open th,#sit_inf_open td {display:block;width:100%} +} + +/* 상품 상세보기 - 사용후기 */ +.tit_no {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#sit_use h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#sit_use_ol {margin:0 0 5px;padding:0;border-top:1px solid #e9e9e9;list-style:none} +.sit_use_li {position:relative;padding:0 0 10px;border-bottom:1px solid #e9e9e9} +.sit_use_li_title {display:block;margin:0;padding:10px 10px 5px;width:100%;border:0;background:transparent;text-align:left;font-weight:bold;font-size:1.167em;line-height:1.35em} +.sit_use_dl {margin:0;padding:0 10px;position:relative;line-height:1.25em} +.sit_use_dl:after {display:block;visibility:hidden;clear:both;content:""} +.sit_use_dl dt {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +.sit_use_dl dd {float:left;margin:0 10px 0 0;color:#888;font-size:0.917em} +.sit_use_star {margin:0 !important;position:absolute;bottom:0;right:10px} +.sit_use_star img {width:80px} +.sit_use_con {display:none;padding:10px 0 0} +.sit_use_p {padding:10px;background:#f2f2f2} +.sit_use_cmd {text-align:right} +.sit_use_cmd a.btn01 {padding:5px} +#sit_use_wbtn {margin:0 0 10px} +#sit_use_wbtn:after {display:block;visibility:hidden;clear:both;content:""} +#sit_use_wbtn .btn01 {line-height:40px;width:49%;float:right;text-align:center;border-radius:3px} +#sit_use_wbtn .qa_wr {line-height:40px;width:49%;float:left;text-align:center;background:#3a8afd;color:#fff;border:1px solid #1c70e9;border-radius:3px} +#sit_use_write {} +#sit_use_write #is_subject {width:100%} +#sit_use_write ul {margin:5px 0 0} +#sit_use_write li {margin:0 0 5px} +#sit_use_write li label {display:inline-block;width:80px} +#sit_use_write #sit_use_write_star {margin:10px 0;padding:10px;background:#fff;list-style:none} +#sit_use_write_star:after {display:block;visibility:hidden;clear:both;content:""} +#sit_use_write_star li {float:left;width:50%} +#sit_use_write_star li img {vertical-align:middle} +.sit_use_reply {position:relative;border-top:1px dotted #bbb;margin:10px 0 0;padding:10px 0 0 40px} +.use_reply_icon {position:absolute;top:10px;left:5px;background:url('./img/use_reply.png') no-repeat 0 0;width:28px;height:17px;text-indent:-999px;overflow:hidden} +.use_reply_tit {font-weight:bold;line-height:1.5em} +.use_reply_name {font-size:0.92em;color:#777;margin:5px 0} +.use_reply_p {padding:10px;background:#f2f2f2;line-height:1.5em} + +/* 상품 상세보기 - 상품문의 */ +#sit_qa {} +#sit_qa h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#sit_qa_ol {margin:0 0 5px;padding:0;border-top:1px solid #e9e9e9;list-style:none} +.sit_qa_li {position:relative;padding:0 0 10px;border-bottom:1px solid #e9e9e9} +.sit_qa_li_title {display:block;margin:0;padding:10px 10px 5px;width:100%;border:0;background:transparent;text-align:left;font-weight:bold;font-size:1.167em;line-height:1.35em} +.sit_qa_dl {margin:0;padding:0 10px;position:relative} +.sit_qa_dl:after {display:block;visibility:hidden;clear:both;content:""} +.sit_qa_dl dt {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +.sit_qa_dl dd {float:left;margin:0 10px 0 0;color:#888;font-size:0.917em} +.sit_qa_dl dd.sit_qaa_yet,.sit_qa_dl dd.sit_qaa_done {position:absolute;bottom:0;right:0;background:#ccd1d9;padding:0 8px;line-height:30px;color:#fff;border-radius:4px} +.sit_qa_dl dd.sit_qaa_done {background:#f6bb42;color:#fff} +.sit_qa_con {display:none;padding:10px 0 0} +.sit_qa_p {margin:0 0 10px;background:#fff;padding:0 10px;background:#fbfbff} +.sit_qa_p strong {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +.sit_qa_p span.sit_alp{position:absolute;top:10px;left:0;color:#bbb;font-size:1.5em;font-weight:bold;width:25px;height:25px;line-height:25px;display:inline-block;border-radius:15px;text-align:center} +.sit_qa_qaq,.sit_qa_qaa {padding:15px 0 15px 30px;position:relative;min-height:70px} + +.sit_qa_qaa {border-top:1px dotted #eee} +.sit_qa_qaa span.sit_alp {} +.sit_qa_con textarea {display:none} +.sit_qa_cmd {text-align:right} +.sit_qa_cmd a.btn01 {padding:5px} +.sit_qa_pw {display:none;position:absolute;top:30px;left:175px;padding:10px;width:348px;border:1px solid #000;background:#fff;text-align:center} +.sit_qa_pw span {display:block;margin:0 0 5px} + +#sit_qa_wbtn {margin:0 0 10px} +#sit_qa_wbtn:after {display:block;visibility:hidden;clear:both;content:""} +#sit_qa_wbtn .btn01 {line-height:40px;width:49%;float:right;text-align:center;border-radius:3px} +#sit_qa_wbtn .qa_wr {line-height:40px;width:49%;float:left;text-align:center;background:#3a8afd;color:#fff;border:1px solid #1c70e9;border-radius:3px} + +/* 사용후기 모음 */ +#sps_sch {margin:15px} +#sps_sch a {display:inline-block;color:#3a8afd;font-weight:bold;border-bottom:1px solid #3a8afd;margin-top:10px} +#sps_sch .sch_wr {position:relative;background:#fff;border:1px solid #d0d3db} +#sps_sch .sch_wr:after {display:block;visibility:hidden;clear:both;content:""} +#sps_sch select {border:0;background:#fff;padding:9px 0;height:45px;border:1px solid #fff;border-right:1px solid #f8f8f8;float:left;width:40%} +#sps_sch .sch_input {height:45px;border:0;padding:0;background-color:transparent;float:left;width:60%;padding:0 40px 0 10px} +#sps_sch .sch_btn {position:absolute;top:0;right:0;width:45px;height:45px;border:0;background:none;font-size:15px} + +#sps {zoom:1} +#sps>ol {margin:10px 0;padding:0;border-top:1px solid #f8f8f8;list-style:none} +#sps>ol>li {position:relative;padding:10px;border-bottom:1px solid #e8e8e8;background:#fff} +#sps>ol>li:after {display:block;visibility:hidden;clear:both;content:""} + +.sps_img {position:absolute;top:10px;left:10px} +.sps_img span {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} + +.review_detail {margin-top:3px;border:0;background:transparent;font-weight:bold;color:#000;line-height:24px;font-size:1.083em} + +.review_detail_cnt {display:none;position:fixed;width:100%;height:100%;top:0;left:0;z-index:999;background:rgba(0,0,0,0.1)} +.review_detail_in {position:absolute;top:5%;left:0;width:100%;height:90%;padding:10px} +.review_detail_inner {position:relative;height:100%;background:#fff;text-align:left;overflow-y:auto;border-radius:3px;border:1px solid #dde7e9;border-radius:3px} +.review_detail_inner h3 {position:absolute;top:0;left:0;width:100%;padding:15px;border-bottom:1px solid #e8e8e8;background:#fff;font-size:1.4em;z-index:900} +.review_cnt {padding:60px 25px;max-height:100%;overflow-y:auto} +.rd_cls {position:absolute;top:0;right:0;color:#b5b8bb;border:0;padding:0 15px;height:55px;font-size:16px;background:none;z-index:9000;vertical-align:top} + +.review_tp_cnt {position:relative;padding:0 0 10px;margin-bottom:15px;border-bottom:1px solid #f1f1f1} +.review_tp_cnt>span {font-size:1.2em;display:block;line-height:24px;font-weight:bold} +.review_tp_cnt:after {display:block;visibility:hidden;clear:both;content:""} +.review_tp_cnt .sps_opt_btn_more {position:absolute;top:0;right:0;border:0;padding:5px 5px 5px 10px;background:#fff;color:#c4c8cb;font-size:1.4em} +.review_tp_cnt .sps_opt_li {display:none;position:absolute;top:40px;right:0;border:1px solid #b8bfc4;background:#fff} +.review_tp_cnt .sps_opt_li:before {content:"";position:absolute;top:-8px;right:5px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #b8bfc4 transparent} +.review_tp_cnt .sps_opt_li:after {content:"";position:absolute;top:-6px;right:5px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent} +.review_tp_cnt .sps_opt_li li {border-bottom:1px solid #f1f1f1;padding:10px !important;color:#6b757c} + +.review_summ {background:#fcfcfc;border:2px solid #efeff1;padding:10px} +.review_summ:after {display:block;visibility:hidden;clear:both;content:""} +.review_summ>img {float:left;margin-right:10px} +.review_summ>p {display:inline-block;width:auto !important;float:left;line-height:24px} +.review_summ>p span {display:block} +.review_bt_cnt {margin:15px 0} +.review_bt_cnt img {width:100%} + +.sps_reply {margin-top:10px;padding-top:10px;border-top:1px dotted #bbb} +.sps_reply .sps_img {text-align:right;width:70px} +.sps_reply .sps_section h2 {background:url('./img/use_reply.png') no-repeat 0 0;text-indent:30px;line-height:1.5em} + +.sps_info {margin-top:5px} +.sps_info span {display:inline-block;float:left;line-height:12px;color:#818181} +.sps_info .sps_if_wt {border-right:1px solid #eaeaea;padding-right:5px;margin-right:5px} + +.sps_dl dd {display:inline-block;float:left} +.sps_dl dd.sps_dd_wt {padding-right:5px;margin-right:5px;border-right:1px solid #eaeaea} + +.sps_section {min-height:70px;margin-left:80px;display:block} +.sps_section .is_use_reply {background:url('../mobile/shop/img/use_reply.png') no-repeat;text-indent:30px;line-height:1.5em} +.sps_section p {padding:0;width:100%} +.sps_con_full {padding:0;height:auto !important} + +.sps_con_btn button {} + +.sps_reply {margin-top:10px;padding-top:10px;border-top:1px dotted #bbb;position:relative} +.sps_reply .sps_img {width:50px;text-align:center} +.sps_reply .sps_section h2 {background:url('./img/use_reply.png') no-repeat 0 0;text-indent:30px;line-height:1.5em} +.sps_reply .sps_section {margin-left:70px;min-height:50px} +#sps_empty {text-align:center;color:#777;padding:50px 0} + +/* 상품문의 모음 */ +#sqa_sch {margin:15px} +#sqa_sch a {display:inline-block;color:#3a8afd;font-weight:bold;border-bottom:1px solid #3a8afd;margin-top:10px} +#sqa_sch .sch_wr {position:relative;background:#fff;border:1px solid #d0d3db} +#sqa_sch .sch_wr:after {display:block;visibility:hidden;clear:both;content:""} +#sqa_sch select {border:0;background:#fff;padding:9px 0;height:45px;border-right:1px solid #f8f8f8;float:left;width:40%} +#sqa_sch .sch_input {height:45px;border:0;padding:0;background-color:transparent;float:left;width:60%;padding:0 40px 0 10px} +#sqa_sch .sch_btn {position:absolute;top:0;right:0;width:45px;height:45px;border:0;background:none;font-size:15px} + +#sqa {zoom:1} +#sqa>ol {margin:10px 0;padding:0;border-top:1px solid #f8f8f8;list-style:none} +#sqa>ol>li {position:relative;min-height:80px;border-bottom:1px solid #e8e8e8;background:#fff} +#sqa>ol>li:after {display:block;visibility:hidden;clear:both;content:""} + +.sqa_img {position:absolute;top:10px;left:10px} +.sqa_img span {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} + +.sqa_info {margin-top:5px} +.sqa_info:after {display:block;visibility:hidden;clear:both;content:""} +.sqa_info span {display:inline-block;float:left;line-height:12px;color:#818181} +.sqa_info .sqa_if_wt {border-right:1px solid #eaeaea;padding-right:5px;margin-right:5px} + +.sqa_section {margin-left:70px;margin-right:40px;padding:10px;display:block;line-height:20px} +.sqa_section h2 {font-size:1.167em;font-weight:bold;margin:5px 0} +.sqa_con {margin:10px 0 0;background:#fbfbff;line-height:1.7em} +.sqa_section p {padding:0;width:100%} +.sqa_con_full {padding:0;height:auto !important} +.sqa_con_btn button {padding:5px 8px;color:#666;font-size:0.92em;margin:5px 0;background:#fff;position:absolute;top:10px;right:0;width:40px;height:50px;border:0} + +#sqa .sit_qaa_yet, #sqa .sit_qaa_done {margin-right:3px;display:inline-block;font-size:0.917em;background:#ccd1d9;padding:0 8px;line-height:30px;color:#fff;border-radius:4px;font-weight:normal} +#sqa .sit_qaa_done {background:#f6bb42;color:#fff} + +#sqa .sit_qa_qaq, #sqa .sit_qa_qaa {padding:10px 5px 10px 40px;position:relative} +#sqa .qa_alp {position:absolute;top:10px;left:0;font-weight:bold;display:block;width:40px;text-align:center;font-size:1.231em} +#sqa_empty {text-align:center;color:#777;padding:50px 0} + +/* 상품검색 */ +#ssch {margin:10px 0;position:relative} +#ssch_frm {border-bottom:1px solid #ddd;background:#fff;margin:10px 0} +#ssch_frm h2 {border-bottom:1px solid #ddd;padding:10px 15px;color:#666} +#ssch_frm h2 span {font-size:1.25em;color:#000} +#ssch_frm h2 strong {color:#d50c0c} +#ssch_frm div {padding:10px;line-height:30px} +#ssch_frm p {margin:10px 0 0;line-height:20px;color:#1f58fd;font-size:0.923em} +#ssch_frm .sch_wr {border-bottom:1px solid #e3e5e8;position:relative} +#ssch_frm #ssch_q {border-radius:0;width:100%;font-weight:bold;font-size:1.077em} +#ssch_frm .sch_submit {height:40px;padding:0 10px;font-weight:bold;position:absolute;top:10px;right:10px;border:0;background:none} +#ssch_frm .ssch_input {height:30px;border:1px solid #bbb;padding:0 10px;margin:3px 0} +#ssch_frm .chk_box label {margin-right:10px} +#ssch_frm .chk_box .frm_input {height:32px} + +#ssch_q {margin:0} +#ssch_ov {position:absolute;top:-50px;right:10px;line-height:20px;color:#6f6f6f;font-size:0.923em} + +#ssch_cate {text-align:center;width:100%;margin:10px 0} +#ssch_cate ul {list-style:none;border-bottom:1px solid #d9dce3} +#ssch_cate ul:after {display:block;visibility:hidden;clear:both;content:""} +#ssch_cate ul li {border-left:1px solid #f2f2f2;border-top:1px solid #f2f2f2;background:#fff;float:left;width:50%;text-align:left} +#ssch_cate ul li:nth-child(2n+1) {clear:both;border-left:0} +#ssch_cate a {text-decoration:none;display:block;color:#656565;padding:10px;position:relative;padding-right:25px;position:relative;line-height:20px} +#ssch_cate a span {position:absolute;top:10px;right:10px;display:inline-block;line-height:20px;padding:0 5px;border-radius:10px;color:#999} + +#ssch_sort {background:#fff;border-bottom:1px solid #ddd} +#ssch_sort button {height:40px;line-height:40px;border:0;padding:0 10px;background:#fff} +#ssch_sort ul:before {content:"";position:absolute;top:-8px;left:30px;width:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #bbb transparent} +#ssch_sort ul:after {content:"";position:absolute;top:-7px;left:30px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent} +#ssch_sort ul {display:none;position:absolute;border:1px solid #bbb;z-index:99} +#ssch_sort li {border-top:1px solid #eee} +#ssch_sort li a {display:block;text-align:center;color:#333;background:#fff;border:0;font-size:0.917em;padding:5px 10px;line-height:20px} + +/*배송교환정보*/ +#sit_dvex h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#sit_dvex h3 {text-align:center;padding:10px 0;background:#f3f3f3;margin:0 0 10px} +#sit_dvr {margin:0 0 10px} + +/* 로딩안내 레이어 */ +#loading_message {z-index:10000;position:absolute;top:0;left:0;background:#fff;opacity:0.7} +#loading_message img {position:relative;opacity:1.0} + +/* 알림 box */ +#fancyalert {display:block;z-index:10000;position:absolute;top:0;left:0} +#fancyalert_inner {display:table;z-index:2;position:relative} +#fancyalert_inner div {display:table-cell;vertical-align:middle;text-align:center} +#fancyalert_inner span {display:block;margin:0 auto;padding:30px;width:200px;background:#1f1f1f;color:#f0f1f2} +#fancyalert_inner button {margin:15px 0 0;padding:10px 30px;border:0;background:#000;color:#fff} +#fancyalert_bg {z-index:0;position:absolute;top:0;left:0;width:100%;height:100%;vertical-align:middle;background:#000;text-align:center;opacity:0.7} + +#sit_sms_new .tbl_frm01 th {width:100px} + +/*쿠폰존 리스트*/ +.couponzone_list {margin:10px 0;background:#fff;border-bottom:1px solid #ccc} +.couponzone_list h2 {border-bottom:1px solid #efefef;padding:10px;line-height:30px;font-size:1.077em} +.couponzone_list p {position:relative;text-align:left;color:#fff;line-height:18px;font-size:1.1em;background:#f2838f;margin:10px;padding:10px 20px;border-radius:5px;font-weight:bold} +.couponzone_list p:before {content:"";position:absolute;top:0;left:0;width:5px;height:100%;border-radius:5px 0 0 5px;background:#da4453} + +.couponzone_list ul {padding:0 10px 10px;margin:0;list-style:none;background:#fff} +.couponzone_list ul:after {display:block;visibility:hidden;clear:both;content:""} +.couponzone_list ul li {line-height:1.2em;margin:0 0 10px} +.couponzone_list ul li img {width:100%;height:auto;border-radius:3px 3px 0 0} +.couponzone_list ul li .cp_inner {border:1px solid #ddd;border-radius:5px; +-webkit-box-shadow:0px 1px 6px 0 #dedede; +-moz-box-shadow:0px 1px 6px 0 #dedede; +box-shadow:0px 1px 6px 0 #dedede +} + +.couponzone_list ul li .coupon_img {position:relative;height:120px;overflow:hidden;border-bottom:1px dashed #ccc} +.couponzone_list ul li .coupon_tit {position:absolute;top:0;left:0;width:100%;height:100%;padding-top:30px;text-align:center;font-weight:bold;text-overflow:ellipsis;overflow:hidden;white-space:nowrap} +.couponzone_list ul li .coupon_tit span {display:inline-block;margin-bottom:5px} +.couponzone_list ul li .coupon_tit .cp_evt, +.couponzone_list ul li .coupon_tit .cp_evt b {font-size:1.4em} +.couponzone_list ul li .cp_cnt {padding:10px} +.couponzone_list ul li .coupon_date {display:inline-block;float:right;padding:2px 3px;margin:5px 0px;font-size:0.92em;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:#777} +.couponzone_list ul li .coupon_target {display:inline-block;margin:5px 0px} +.couponzone_list ul li .coupon_target>button {display:inline-block;max-width:125px;padding:2px 3px;font-size:0.92em;border:0;border-radius:3px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap} +.couponzone_list ul li .coupon_target .cp_1 {background:#edfbde;color:#8cc152}/*카테고리할인*/ +.couponzone_list ul li .coupon_target .cp_2 {background:#fbdef3;color:#c15293}/*개별상품할인*/ +.couponzone_list ul li .coupon_target .cp_3 {background:#fbf1de;color:#c18b52}/*주문금액할인*/ +.couponzone_list ul li .coupon_target .cp_4 {background:#f2defb;color:#7c52c1}/*배송비할인*/ + +.couponzone_list ul li .coupon_info {display:none;position:absolute;min-width:235px;background:#fff;border:1px solid #000;padding:15px;z-index:99999} +.couponzone_list ul li .coupon_info:after {display:block;visibility:hidden;clear:both;content:""} +.couponzone_list ul li .coupon_info h4 {font-size:1.2em;margin-bottom:10px} +.couponzone_list ul li .coupon_info ul {padding:0;margin:0;position:relative;border:0} +.couponzone_list ul li .coupon_info li {width:auto;margin:0;float:inherit;color:#5e5e5e;line-height:18px} +.couponzone_list ul li .coupon_info li a {text-decoration:underline;color:#5e5e5e} +.couponzone_list ul li .coupon_info .coupon_info_cls {position:absolute;right:0;top:0;color:#c7c9cc;border:0;background:#fff;padding:10px;font-size:1.2em} + +.couponzone_list ul li .coupon_btn {text-align:center} +.couponzone_list ul li .coupon_btn .btn02 {width:100%;height:42px;line-height:28px;margin-top:15px;border:0;color:#fff;background:#3a8afd;border-radius:5px;font-weight:bold} +.couponzone_list ul li .coupon_btn .btn02:hover {background:#2176f1;color:#fff} +.couponzone_list ul li .coupon_btn .disabled {background:#c6c6c6;border:1px;color:#fff;border-color:#c6c6c6} +.couponzone_list ul li .coupon_btn .disabled:hover {background:#c6c6c6;border:1px;color:#fff;border-color:#c6c6c6} +.couponzone_list .no_coupon {position:relative;padding:100px 0;text-align:center;color:#999;background:none;font-weight:normal} +.couponzone_list .no_coupon:before {background:none} + +@media (min-width:640px)and (max-width:969px) { + .couponzone_list ul li {width:50%;float:left;padding:10px} + .couponzone_list ul li:nth-child(2n+1) {clear:both} +} + +@media (min-width:970px) { + .couponzone_list ul li {width:25%;float:left;padding:10px} + .couponzone_list ul li:nth-child(4n+1) {clear:both} +} + +/*재입고알림*/ +#sit_sms_new .prd_name {background:#edf3fc;margin:0 0 10px;border:1px solid #d6e2f4;border-radius:5px} +#sit_sms_new strong {display:block;margin:15px 0 10px} +#sit_sms_new #sms_agree {text-align:left;padding:0 0 10px !important} \ No newline at end of file diff --git a/theme/basic/mobile/tail.php b/theme/basic/mobile/tail.php index 8f413d417..7910e2512 100644 --- a/theme/basic/mobile/tail.php +++ b/theme/basic/mobile/tail.php @@ -1,5 +1,11 @@ diff --git a/theme/basic/shop/_common.php b/theme/basic/shop/_common.php new file mode 100644 index 000000000..3d77e83c4 --- /dev/null +++ b/theme/basic/shop/_common.php @@ -0,0 +1,20 @@ +\'\"\\\'\\\"\%\=\(\)\s]/", "", $sort); +} else { + $sort = ''; +} + +if (isset($_REQUEST['sortodr'])) { + $sortodr = preg_match("/^(asc|desc)$/i", $sortodr) ? $sortodr : ''; +} else { + $sortodr = ''; +} + +if (!defined('G5_USE_SHOP') || !G5_USE_SHOP) + die('

                    쇼핑몰 설치 후 이용해 주십시오.

                    '); + +define('_SHOP_', true); \ No newline at end of file diff --git a/theme/basic/shop/ajax.action.php b/theme/basic/shop/ajax.action.php new file mode 100644 index 000000000..0f5f37ff9 --- /dev/null +++ b/theme/basic/shop/ajax.action.php @@ -0,0 +1,353 @@ + ''))); + + break; + case 'cart_update' : + + // 보관기간이 지난 상품 삭제 + cart_item_clean(); + + // cart id 설정 + set_cart_id($sw_direct); + + if($sw_direct) + $tmp_cart_id = get_session('ss_cart_direct'); + else + $tmp_cart_id = get_session('ss_cart_id'); + + // 브라우저에서 쿠키를 허용하지 않은 경우라고 볼 수 있음. + if (!$tmp_cart_id) + { + die(json_encode(array('error' => '더 이상 작업을 진행할 수 없습니다.\n\n브라우저의 쿠키 허용을 사용하지 않음으로 설정한것 같습니다.\n\n브라우저의 인터넷 옵션에서 쿠키 허용을 사용으로 설정해 주십시오.\n\n그래도 진행이 되지 않는다면 쇼핑몰 운영자에게 문의 바랍니다.'))); + } + + $tmp_cart_id = preg_replace('/[^a-z0-9_\-]/i', '', $tmp_cart_id); + + // 레벨(권한)이 상품구입 권한보다 작다면 상품을 구입할 수 없음. + if ($member['mb_level'] < $default['de_level_sell']) + { + die(json_encode(array('error' => '상품을 구입할 수 있는 권한이 없습니다.'))); + } + + $count = (isset($_POST['it_id']) && is_array($_POST['it_id'])) ? count($_POST['it_id']) : 0; + + if ($count < 1) + die(json_encode(array('error' => '장바구니에 담을 상품을 선택하여 주십시오.'))); + + $ct_count = 0; + for($i=0; $i<$count; $i++) { + $it_id = isset($_POST['it_id'][$i]) ? safe_replace_regex($_POST['it_id'][$i], 'it_id') : ''; + $opt_count = (isset($_POST['io_id'][$it_id]) && is_array($_POST['io_id'][$it_id])) ? count($_POST['io_id'][$it_id]) : 0; + + // 상품정보 + $it = get_shop_item($it_id, false); + if(!$it['it_id']) + die(json_encode(array('error' => '상품정보가 존재하지 않습니다.'))); + + // 옵션정보를 얻어서 배열에 저장 + $opt_list = array(); + $sql = " select * from {$g5['g5_shop_item_option_table']} where it_id = '$it_id' order by io_no asc "; + $result = sql_query($sql); + $lst_count = 0; + for($k=0; $row=sql_fetch_array($result); $k++) { + $opt_list[$row['io_type']][$row['io_id']]['id'] = $row['io_id']; + $opt_list[$row['io_type']][$row['io_id']]['use'] = $row['io_use']; + $opt_list[$row['io_type']][$row['io_id']]['price'] = $row['io_price']; + $opt_list[$row['io_type']][$row['io_id']]['stock'] = $row['io_stock_qty']; + + // 선택옵션 개수 + if(!$row['io_type']) + $lst_count++; + } + + if($lst_count > 0 && !trim($_POST['io_id'][$it_id][$i]) && $_POST['io_type'][$it_id][$i] == 0) + die(json_encode(array('error' => '상품의 선택옵션을 선택해 주십시오.'))); + + for($k=0; $k<$opt_count; $k++) { + $post_ct_qty = isset($_POST['ct_qty'][$it_id][$k]) ? (int) $_POST['ct_qty'][$it_id][$k] : 0; + if ($post_ct_qty < 1) + die(json_encode(array('error' => '수량은 1 이상 입력해 주십시오.'))); + } + + // 바로구매에 있던 장바구니 자료를 지운다. + if($i == 0 && $sw_direct) + sql_query(" delete from {$g5['g5_shop_cart_table']} where od_id = '$tmp_cart_id' and ct_direct = 1 ", false); + + // 최소, 최대 수량 체크 + if($it['it_buy_min_qty'] || $it['it_buy_max_qty']) { + $sum_qty = 0; + for($k=0; $k<$opt_count; $k++) { + if(isset($_POST['io_type'][$it_id][$k]) && $_POST['io_type'][$it_id][$k] == 0){ + $post_ct_qty = isset($_POST['ct_qty'][$it_id][$k]) ? (int) $_POST['ct_qty'][$it_id][$k] : 0; + $sum_qty += $post_ct_qty; + } + } + + if($it['it_buy_min_qty'] > 0 && $sum_qty < $it['it_buy_min_qty']) + die(json_encode(array('error' => $it['it_name'].'의 선택옵션 개수 총합 '.number_format($it['it_buy_min_qty']).'개 이상 주문해 주십시오.'))); + + if($it['it_buy_max_qty'] > 0 && $sum_qty > $it['it_buy_max_qty']) + die(json_encode(array('error' => $it['it_name'].'의 선택옵션 개수 총합 '.number_format($it['it_buy_max_qty']).'개 이하로 주문해 주십시오.'))); + + // 기존에 장바구니에 담긴 상품이 있는 경우에 최대 구매수량 체크 + if($it['it_buy_max_qty'] > 0) { + $sql4 = " select sum(ct_qty) as ct_sum + from {$g5['g5_shop_cart_table']} + where od_id = '$tmp_cart_id' + and it_id = '$it_id' + and io_type = '0' + and ct_status = '쇼핑' "; + $row4 = sql_fetch($sql4); + + if(($sum_qty + $row4['ct_sum']) > $it['it_buy_max_qty']) + die(json_encode(array('error' => $it['it_name'].'의 선택옵션 개수 총합 '.number_format($it['it_buy_max_qty']).'개 이하로 주문해 주십시오.', './cart.php'))); + } + } + + // 장바구니에 Insert + // 바로구매일 경우 장바구니가 체크된것으로 강제 설정 + $ct_select = 0; + $ct_select_time = '0000-00-00 00:00:00'; + + // 장바구니에 Insert + $comma = ''; + $sql = " INSERT INTO {$g5['g5_shop_cart_table']} + ( od_id, mb_id, it_id, it_name, it_sc_type, it_sc_method, it_sc_price, it_sc_minimum, it_sc_qty, ct_status, ct_price, ct_point, ct_point_use, ct_stock_use, ct_option, ct_qty, ct_notax, io_id, io_type, io_price, ct_time, ct_ip, ct_send_cost, ct_direct, ct_select, ct_select_time ) + VALUES "; + + for($k=0; $k<$opt_count; $k++) { + $io_id = isset($_POST['io_id'][$it_id][$k]) ? preg_replace(G5_OPTION_ID_FILTER, '', $_POST['io_id'][$it_id][$k]) : ''; + $io_type = isset($_POST['io_type'][$it_id][$k]) ? preg_replace('#[^01]#', '', $_POST['io_type'][$it_id][$k]) : ''; + $io_value = isset($_POST['io_value'][$it_id][$k]) ? $_POST['io_value'][$it_id][$k] : ''; + + // 선택옵션정보가 존재하는데 선택된 옵션이 없으면 건너뜀 + if($lst_count && $io_id == '') + continue; + + $opt_list_type_id_use = isset($opt_list[$io_type][$io_id]['use']) ? $opt_list[$io_type][$io_id]['use'] : ''; + // 구매할 수 없는 옵션은 건너뜀 + if($io_id && ! $opt_list_type_id_use) + continue; + + $io_price = isset($opt_list[$io_type][$io_id]['price']) ? $opt_list[$io_type][$io_id]['price'] : 0; + $ct_qty = isset($_POST['ct_qty'][$it_id][$k]) ? (int) $_POST['ct_qty'][$it_id][$k] : 0; + + // 구매가격이 음수인지 체크 + if($io_type) { + if((int)$io_price < 0) + die(json_encode(array('error' => '구매금액이 음수인 상품은 구매할 수 없습니다.'))); + } else { + if((int)$it['it_price'] + (int)$io_price < 0) + die(json_encode(array('error' => '구매금액이 음수인 상품은 구매할 수 없습니다.'))); + } + + // 동일옵션의 상품이 있으면 수량 더함 + $sql2 = " select ct_id, io_type, ct_qty + from {$g5['g5_shop_cart_table']} + where od_id = '$tmp_cart_id' + and it_id = '$it_id' + and io_id = '$io_id' + and ct_status = '쇼핑' "; + $row2 = sql_fetch($sql2); + if(isset($row2['ct_id']) && $row2['ct_id']) { + // 재고체크 + $tmp_ct_qty = $row2['ct_qty']; + if(!$io_id) + $tmp_it_stock_qty = get_it_stock_qty($it_id); + else + $tmp_it_stock_qty = get_option_stock_qty($it_id, $io_id, $row2['io_type']); + + if ($tmp_ct_qty + $ct_qty > $tmp_it_stock_qty) + { + die(json_encode(array('error' => $io_value." 의 재고수량이 부족합니다.\n\n현재 재고수량 : " . number_format($tmp_it_stock_qty) . " 개"))); + } + + $sql3 = " update {$g5['g5_shop_cart_table']} + set ct_qty = ct_qty + '$ct_qty' + where ct_id = '{$row2['ct_id']}' "; + sql_query($sql3); + continue; + } + + // 포인트 + $point = 0; + if($config['cf_use_point']) { + if($io_type == 0) { + $point = get_item_point($it, $io_id); + } else { + $point = $it['it_supply_point']; + } + + if($point < 0) + $point = 0; + } + + $ct_send_cost = 0; + + // 배송비결제 + if($it['it_sc_type'] == 1) + $ct_send_cost = 2; // 무료 + else if($it['it_sc_type'] > 1 && $it['it_sc_method'] == 1) + $ct_send_cost = 1; // 착불 + + $io_value = sql_real_escape_string(strip_tags($io_value)); + + $sql .= $comma."( '$tmp_cart_id', '{$member['mb_id']}', '{$it['it_id']}', '".addslashes($it['it_name'])."', '{$it['it_sc_type']}', '{$it['it_sc_method']}', '{$it['it_sc_price']}', '{$it['it_sc_minimum']}', '{$it['it_sc_qty']}', '쇼핑', '{$it['it_price']}', '$point', '0', '0', '$io_value', '$ct_qty', '{$it['it_notax']}', '$io_id', '$io_type', '$io_price', '".G5_TIME_YMDHIS."', '".$_SERVER['REMOTE_ADDR']."', '$ct_send_cost', '$sw_direct', '$ct_select', '$ct_select_time' )"; + $comma = ' , '; + $ct_count++; + } + + if($ct_count > 0) + sql_query($sql); + } + + die(json_encode(array('error' => ''))); + break; + + case 'get_item_option' : + + $it = get_shop_item($it_id, true); + + if(!$it['it_id']) + die(json_encode(array('error' => '상품정보가 존재하지 않습니다.'))); + + // 상품품절체크 + $is_soldout = is_soldout($it['it_id']); + + // 주문가능체크 + $is_orderable = true; + if(!$it['it_use'] || $it['it_tel_inq'] || $is_soldout) + die(json_encode(array('error' => '상품을 구매할 수 없습니다.'))); + + $item_ct_qty = 1; + if($it['it_buy_min_qty'] > 1) + $item_ct_qty = $it['it_buy_min_qty']; + + $action_url = G5_THEME_SHOP_URL.'/ajax.action.php'; + + $is_option = 0; + $option_item = get_shop_item_options($it['it_id'], $it['it_option_subject'], 0); + + ob_start(); + ?> +
                    +
                    + + + + + + + + + + + + + + + + + + + +
                    +
                    + '', + 'option' => $is_option, + 'html' => $content + ); + + die(json_encode($result)); + + break; + case 'wish_update' : + + $it_id = isset($_POST['it_id']) ? safe_replace_regex($_POST['it_id'], 'it_id') : ''; + + if (!$is_member) + die('회원 전용 서비스 입니다.'); + + if(!$it_id) + die('상품 코드가 올바르지 않습니다.'); + + // 상품정보 체크 + $row = get_shop_item($it_id, true); + + if(!$row['it_id']) + die('상품정보가 존재하지 않습니다.'); + + $sql = " select wi_id from {$g5['g5_shop_wish_table']} + where mb_id = '{$member['mb_id']}' and it_id = '$it_id' "; + $row = sql_fetch($sql); + + if (! (isset($row['wi_id']) && $row['wi_id'])) { + $sql = " insert {$g5['g5_shop_wish_table']} + set mb_id = '{$member['mb_id']}', + it_id = '$it_id', + wi_time = '".G5_TIME_YMDHIS."', + wi_ip = '".$_SERVER['REMOTE_ADDR']."' "; + sql_query($sql); + + die('OK'); + } else { + die('위시리스트에 이미 등록된 상품입니다.'); + } + + break; + default : +} \ No newline at end of file diff --git a/theme/basic/shop/category.php b/theme/basic/shop/category.php new file mode 100644 index 000000000..8ba9dddb9 --- /dev/null +++ b/theme/basic/shop/category.php @@ -0,0 +1,83 @@ + +
                    +

                    전체메뉴

                    + '.PHP_EOL; + ?> +
                  • + + $cate2){ + if( empty($cate2) || $key === 'text' ) continue; + + $mshop_ca_row2 = $cate2['text']; + if($j == 0) + echo '
                      '.PHP_EOL; + ?> +
                    • + +
                    • + 0) + echo '
                    '.PHP_EOL; + ?> +
                  • + 0) + echo '
                  '.PHP_EOL; + else + echo '

                  등록된 분류가 없습니다.

                  '.PHP_EOL; + ?> + + +
                  + diff --git a/theme/basic/shop/index.php b/theme/basic/shop/index.php new file mode 100644 index 000000000..9c06bd7dd --- /dev/null +++ b/theme/basic/shop/index.php @@ -0,0 +1,134 @@ + + + + + + + + +
                  +
                  +

                  히트상품

                  +
                  + set_type(1); + $list->set_view('it_img', true); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_basic', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + $list->set_view('star', true); + echo $list->run(); + ?> +
                  + + + + + + +
                  +
                  +

                  최신상품

                  +
                  + set_type(3); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_basic', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + $list->set_view('star', true); + echo $list->run(); + ?> +
                  + + + + + +
                  +
                  +

                  추천상품

                  +
                  + set_type(2); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_basic', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + $list->set_view('star', true); + echo $list->run(); + ?> +
                  + + + + + + + +
                  +
                  +

                  할인상품

                  +
                  + set_type(5); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_basic', true); + $list->set_view('it_cust_price', true); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + $list->set_view('star', true); + echo $list->run(); + ?> +
                  + + + += '".G5_TIME_YMD."' "; +$res = sql_query($sql); + +for($k=0; $cp=sql_fetch_array($res); $k++) { + if(!is_used_coupon($member['mb_id'], $cp['cp_id'])) + $cp_count++; +} +?> + + +
                  + + +
                  +

                  회원정보 개요

                  + + + + + +

                  내정보

                  +
                  +
                  연락처
                  +
                  +
                  E-Mail
                  +
                  +
                  최종접속일시
                  +
                  +
                  회원가입일시
                  +
                  +
                  주소
                  +
                  +
                  + + 회원탈퇴 +
                  + + +
                  + +
                  +

                  주문내역조회

                  + + +
                  + 더보기 +
                  +
                  + + + +
                  +

                  최근 위시리스트

                  +
                  + + + +
                    + + +
                  • +
                    + 품절 + +
                    + + +
                    + + + + + + +
                    +
                    +
                    +
                    +
                    + 삭제 +
                  • + + 보관 내역이 없습니다.'; + ?> +
                  + +
                  + 더보기 +
                  + +
                  + + +
                  +
                  +
                  + +
                  +
                  + + + + +'.PHP_EOL; + } else { + echo ''.PHP_EOL; + } +} +?> + + +
                  +
                  주문번호
                  +
                  +

                  주문하신 상품

                  + + + +
                  + + + + + + + + + + + + + + + + + + + + + + + + + 0 && $st_count1 == $st_count2) + $custom_cancel = true; + ?> + +
                  상품명총수량판매가포인트배송비소계상태
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  + +
                  + 상품 상태 설명 + +
                  +
                  +
                  주문
                  +
                  주문이 접수되었습니다. +
                  입금
                  +
                  입금(결제)이 완료 되었습니다. +
                  준비
                  +
                  상품 준비 중입니다. +
                  배송
                  +
                  상품 배송 중입니다. +
                  완료
                  +
                  상품 배송이 완료 되었습니다. +
                  + +
                  +
                  +
                  +
                  +

                  결제/배송 정보

                  + $od['od_cancel_price'])) { + $wanbul = " (완불)"; + $misu = false; // 미수금 없음 + } + else + { + $wanbul = display_price($receipt_price); + } + + // 결제정보처리 + if($od['od_receipt_price'] > 0) + $od_receipt_price = display_price($od['od_receipt_price']); + else + $od_receipt_price = '아직 입금되지 않았거나 입금정보를 입력하지 못하였습니다.'; + + $app_no_subj = ''; + $disp_bank = true; + $disp_receipt = false; + if($od['od_settle_case'] == '신용카드' || $od['od_settle_case'] == 'KAKAOPAY' || is_inicis_order_pay($od['od_settle_case']) ) { + $app_no_subj = '승인번호'; + $app_no = $od['od_app_no']; + $disp_bank = false; + $disp_receipt = true; + } else if($od['od_settle_case'] == '간편결제') { + $app_no_subj = '승인번호'; + $app_no = $od['od_app_no']; + $disp_bank = false; + } else if($od['od_settle_case'] == '휴대폰') { + $app_no_subj = '휴대폰번호'; + $app_no = $od['od_bank_account']; + $disp_bank = false; + $disp_receipt = true; + } else if($od['od_settle_case'] == '가상계좌' || $od['od_settle_case'] == '계좌이체') { + $app_no_subj = '거래번호'; + $app_no = $od['od_tno']; + + if( function_exists('shop_is_taxsave') && $misu_price == 0 && shop_is_taxsave($od, true) === 2 ){ + $disp_receipt = true; + } + } + ?> + +
                  +

                  주문하신 분

                  + +
                  + + + + + + + + + + + + + + + + + + + + + + + + +
                  이 름
                  전화번호
                  핸드폰
                  주 소
                  E-mail
                  +
                  +
                  + +
                  +

                  받으시는 분

                  + +
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  이 름
                  전화번호
                  핸드폰
                  주 소
                  희망배송일
                  전하실 말씀
                  +
                  +
                  + +
                  +

                  배송정보

                  + +
                  + + + + + + + + + + + + + + + + + + + + + +
                  배송회사
                  운송장번호
                  배송일시
                  아직 배송하지 않았거나 배송정보를 입력하지 못하였습니다.
                  +
                  +
                  +
                  + +
                  +
                    +
                  • + 주문총액 + +
                  • + 0) { ?> +
                  • + 개별상품 쿠폰할인 + +
                  • + + 0) { ?> +
                  • + 주문금액 쿠폰할인 + +
                  • + + 0) { ?> +
                  • + 배송비 + +
                  • + + 0) { ?> +
                  • + 배송비 쿠폰할인 + +
                  • + + 0) { ?> +
                  • + 추가배송비 + +
                  • + + 0) { ?> +
                  • + 취소금액 + +
                  • + +
                  • + 총계 + +
                  • +
                  • + 적립포인트 + +
                  • + +
                  • 총 구매액
                  • + 0) { + echo '
                  • '; + echo '미결제액'.PHP_EOL; + echo ''.display_price($misu_price).''; + echo '
                  • '; + } + ?> +
                  • + 결제액 + + +
                    +

                    포인트 결제

                    +

                    실결제

                    +
                    + +
                  • +
                  + +
                  +

                  결제정보

                  + +
                  + +
                  + + +
                  +
                  +

                  주문취소

                  +
                  + + + + + + +
                  + +
                  +
                  +
                  + + + +

                  주문 취소, 반품, 품절된 내역이 있습니다.

                  + +
                  +
                  + + 0 && $default['de_card_test'] && $is_admin && $od['od_pg'] == 'kcp') { + preg_match("/\s{1}([^\s]+)\s?/", $od['od_bank_account'], $matchs); + $deposit_no = trim($matchs[1]); + ?> +

                  관리자가 가상계좌 테스트를 한 경우에만 보입니다.

                  +
                  +
                  + + + + + + + + + + + + + + + + + + + + + + + + +
                  모의입금처리
                  +
                  + +
                  +
                  +
                  + + +
                  + + + + +', 10); +add_stylesheet('', 0); +?> + + +
                  +

                  + + + + + +
                  + + +
                  +
                  + 쇼핑몰 전체검색 +
                  + + + +
                  + +
                  +
                  + + + + + +
                  + + +
                  + + +
                  +
                    +
                  • +
                  • +
                  • +
                  • +
                  + +
                  +
                  +
                  + + + + +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + + +
                  + +
                  + + +
                  + + + +
                  +

                  인기상품

                  + set_type(4); + $list->set_view('it_id', false); + $list->set_view('it_name', true); + $list->set_view('it_basic', false); + $list->set_view('it_cust_price', false); + $list->set_view('it_price', true); + $list->set_view('it_icon', false); + $list->set_view('sns', false); + $list->set_view('star', true); + echo $list->run(); + ?> +
                  + + + + + +
                  + + + +
                  +
                  + +
                  + + + +
                  + \ No newline at end of file diff --git a/theme/basic/shop/shop.tail.php b/theme/basic/shop/shop.tail.php new file mode 100644 index 000000000..0b6c87549 --- /dev/null +++ b/theme/basic/shop/shop.tail.php @@ -0,0 +1,69 @@ + +
                  +
                  +
                  + + + +
                  +
                  + +
                  +

                  사이트 정보

                  +

                  + 회사명 + 주소
                  + 사업자 등록번호 + 대표 + 전화 + 팩스
                  + + 통신판매업신고번호 + 개인정보 보호책임자
                  + 부가통신사업신고번호 '.$default['de_admin_buga_no'].''; ?> +

                  +
                  + + +
                  + +
                  + + + +
                  + +
                  Copyright © 2001-2013 . All Rights Reserved.
                  +
                  + + + + + + +', 0); +$thumb_width = 210; +$thumb_height = 150; +?> + +
                  +

                  +
                    + '; + ?> +
                  • + + 비밀글 "; + + if ($list[$i]['icon_new']) echo "N새글"; + + if ($list[$i]['icon_hot']) echo "H인기글"; + + + echo " "; + if ($list[$i]['is_notice']) + echo "".$list[$i]['subject'].""; + else + echo $list[$i]['subject']; + + + + echo ""; + + // if ($list[$i]['link']['count']) { echo "[{$list[$i]['link']['count']}]"; } + // if ($list[$i]['file']['count']) { echo "<{$list[$i]['file']['count']}>"; } + + //echo $list[$i]['icon_reply']." "; + // if ($list[$i]['icon_file']) echo " " ; + //if ($list[$i]['icon_link']) echo " " ; + + if ($list[$i]['comment_cnt']) echo " + + ".$list[$i]['wr_comment'].""; + + ?> + + +
                  • + + +
                  • 게시물이 없습니다.
                  • + +
                  + 더보기 + +
                  diff --git a/theme/basic/skin/latest/pic_basic/style.css b/theme/basic/skin/latest/pic_basic/style.css new file mode 100644 index 000000000..9945e8d26 --- /dev/null +++ b/theme/basic/skin/latest/pic_basic/style.css @@ -0,0 +1,24 @@ +@charset "utf-8"; +/* 새글 스킨 (latest) */ +.pic_lt{position:relative;margin-bottom:20px;overflow:hidden;border: 1px solid #c6cacc;background:#fff} +.pic_lt .lat_title {display:block;background:#fcfcfc;padding:0 20px;line-height:45px;font-size:1.083em;border-bottom:1px solid #e2e2e2;color:#253dbe;} +.pic_lt .lat_title a{color:#253dbe;display:inline-block;position:relative} +.pic_lt .lat_title a:after{position:absolute;bottom:-1px;left:0;width:100%;height:2px;background:#253dbe;content:''} +.pic_lt .lt_more {position:absolute;top:11px;right:10px;display:block;width:25px;line-height:25px;color:#aaa;border-radius:3px;text-align:center;} +.pic_lt .lt_more:hover{color:#777} +.pic_lt ul:after {display:block;visibility:hidden;clear:both;content:""} +.pic_lt ul{padding:20px 15px } +.pic_lt li{float:left;width:20%;padding:0 10px} +.pic_lt li .lt_img{margin:5px 0;display:block} +.pic_lt li .lt_img img{width:100%;height:auto} +.pic_lt li a:hover{color:#a22121} +.pic_lt li .fa-heart{color:#ff0000;} +.pic_lt li .fa-lock{display: inline-block;line-height: 14px;width: 16px;font-size: 0.833em;color: #4f818c;background: #cbe3e8;text-align: center;border-radius: 2px;font-size: 12px;border:1px solid #a2c6ce} +.pic_lt li .new_icon{display:inline-block;width: 16px;line-height:16px ;font-size:0.833em;color:#ffff00;background:#6db142;text-align:center;border-radius: 2px;} +.pic_lt li .hot_icon{display:inline-block;width: 16px;line-height:16px ;font-size:0.833em;color:#fff;background:#e52955;text-align:center;border-radius: 2px;} +.pic_lt li .fa-caret-right{color:#bbb} +.pic_lt .lt_cmt{background:#5c85c1;color:#fff; font-size:11px;height:16px;line-height:16px;padding:0 5px;border-radius:3px;white-space: nowrap; +-webkit-box-shadow: inset 0 2px 5px rgba(255,255,255,0.4); +-moz-box-shadow: inset 0 2px 5px rgba(255,255,255,0.4); +box-shadow: inset 0 2px 5px rgba(255,255,255,0.4);} +.pic_lt .lt_date{display:block;margin-top:5px;color: #888;} diff --git a/theme/basic/skin/latest/shop_basic/img/icon_file.gif b/theme/basic/skin/latest/shop_basic/img/icon_file.gif new file mode 100644 index 000000000..cca47f566 Binary files /dev/null and b/theme/basic/skin/latest/shop_basic/img/icon_file.gif differ diff --git a/theme/basic/skin/latest/shop_basic/img/icon_hot.gif b/theme/basic/skin/latest/shop_basic/img/icon_hot.gif new file mode 100644 index 000000000..c95b839ae Binary files /dev/null and b/theme/basic/skin/latest/shop_basic/img/icon_hot.gif differ diff --git a/theme/basic/skin/latest/shop_basic/img/icon_img.gif b/theme/basic/skin/latest/shop_basic/img/icon_img.gif new file mode 100644 index 000000000..fefa10d4a Binary files /dev/null and b/theme/basic/skin/latest/shop_basic/img/icon_img.gif differ diff --git a/theme/basic/skin/latest/shop_basic/img/icon_link.gif b/theme/basic/skin/latest/shop_basic/img/icon_link.gif new file mode 100644 index 000000000..0f3cb1ac6 Binary files /dev/null and b/theme/basic/skin/latest/shop_basic/img/icon_link.gif differ diff --git a/theme/basic/skin/latest/shop_basic/img/icon_mobile.gif b/theme/basic/skin/latest/shop_basic/img/icon_mobile.gif new file mode 100644 index 000000000..ad934d23c Binary files /dev/null and b/theme/basic/skin/latest/shop_basic/img/icon_mobile.gif differ diff --git a/theme/basic/skin/latest/shop_basic/img/icon_more.gif b/theme/basic/skin/latest/shop_basic/img/icon_more.gif new file mode 100644 index 000000000..7cdf200a7 Binary files /dev/null and b/theme/basic/skin/latest/shop_basic/img/icon_more.gif differ diff --git a/theme/basic/skin/latest/shop_basic/img/icon_movie.gif b/theme/basic/skin/latest/shop_basic/img/icon_movie.gif new file mode 100644 index 000000000..cb958f83f Binary files /dev/null and b/theme/basic/skin/latest/shop_basic/img/icon_movie.gif differ diff --git a/theme/basic/skin/latest/shop_basic/img/icon_new.gif b/theme/basic/skin/latest/shop_basic/img/icon_new.gif new file mode 100644 index 000000000..45aa6d7ed Binary files /dev/null and b/theme/basic/skin/latest/shop_basic/img/icon_new.gif differ diff --git a/theme/basic/skin/latest/shop_basic/img/icon_reply.gif b/theme/basic/skin/latest/shop_basic/img/icon_reply.gif new file mode 100644 index 000000000..91c135977 Binary files /dev/null and b/theme/basic/skin/latest/shop_basic/img/icon_reply.gif differ diff --git a/theme/basic/skin/latest/shop_basic/img/icon_secret.gif b/theme/basic/skin/latest/shop_basic/img/icon_secret.gif new file mode 100644 index 000000000..c04899f14 Binary files /dev/null and b/theme/basic/skin/latest/shop_basic/img/icon_secret.gif differ diff --git a/theme/basic/skin/latest/shop_basic/img/icon_sound.gif b/theme/basic/skin/latest/shop_basic/img/icon_sound.gif new file mode 100644 index 000000000..c5188318a Binary files /dev/null and b/theme/basic/skin/latest/shop_basic/img/icon_sound.gif differ diff --git a/theme/basic/skin/latest/shop_basic/latest.skin.php b/theme/basic/skin/latest/shop_basic/latest.skin.php new file mode 100644 index 000000000..273bb6dcb --- /dev/null +++ b/theme/basic/skin/latest/shop_basic/latest.skin.php @@ -0,0 +1,41 @@ +', 0); +?> + +
                  + +
                    + +
                  • + "; + if ($list[$i]['is_notice']) + echo "".$list[$i]['subject'].""; + else + echo $list[$i]['subject']; + + if ($list[$i]['comment_cnt']) + echo $list[$i]['comment_cnt']; + + echo ""; + + // if ($list[$i]['link']['count']) { echo "[{$list[$i]['link']['count']}]"; } + // if ($list[$i]['file']['count']) { echo "<{$list[$i]['file']['count']}>"; } + + if (isset($list[$i]['icon_new']) && $list[$i]['icon_new']) echo " NEW"; + //if (isset($list[$i]['icon_hot'])) echo " " ; + //if (isset($list[$i]['icon_file'])) echo " " ; + //if (isset($list[$i]['icon_link'])) echo " " ; + //if (isset($list[$i]['icon_secret'])) echo " " ; + ?> +
                  • + + +
                  • 게시물이 없습니다.
                  • + +
                  +
                  diff --git a/theme/basic/skin/latest/shop_basic/style.css b/theme/basic/skin/latest/shop_basic/style.css new file mode 100644 index 000000000..bbcfb2402 --- /dev/null +++ b/theme/basic/skin/latest/shop_basic/style.css @@ -0,0 +1,12 @@ +@charset "utf-8"; +/* 새글 스킨 (latest) */ +.lat {position:relative;} +.lat ul {margin:0 0 10px;padding:0;list-style:none;border:1px solid #e5e5e5} +.lat li {border-top:1px solid #f3f3f3;padding:10px} +.lat li:first-child{border:0} +.lat li i{color:#9da4bc} +.lat li .fa-heart{color:#ff0000} +.lat li .new_icon{display:inline-block;padding: 0 3px;line-height:14px ;font-size:0.833em;color:#fff;background:#c56bed} +.lat li .cnt_cmt{color:#ff3970} +.lat_title {display:block;padding:10px 0 8px;font-size:1.167em} +.lat_more {position:absolute;top:10px;right:0;} diff --git a/theme/basic/skin/member/basic/login.skin.php b/theme/basic/skin/member/basic/login.skin.php index f8d368697..6c1d87af0 100644 --- a/theme/basic/skin/member/basic/login.skin.php +++ b/theme/basic/skin/member/basic/login.skin.php @@ -30,13 +30,81 @@ add_stylesheet('', + + + + + + +
                  +

                  비회원 구매

                  +

                  비회원으로 주문하시는 경우 포인트는 지급하지 않습니다.

                  + +
                  + +
                  + +
                  + + +
                  + + + + +
                  + + +
                  +

                  비회원 주문조회

                  + +
                  + 비회원 주문조회 + +
                  + + + + + + + +
                  +
                  + +
                  +

                  메일로 발송해드린 주문서의 주문번호 및 주문 시 입력하신 비밀번호를 정확히 입력해주십시오.

                  +
                  + +
                  + + + + + ', 0); +?> + +
                  +
                  + + + + + + + +
                  +

                  (필수) 추가 개인정보처리방침 안내

                  +
                  +
                  + + + + + + + + + + + + + + + + +
                  추가 개인정보처리방침 안내
                  목적항목보유기간
                  이용자 식별 및 본인여부 확인생년월일, 암호화된 개인식별부호(CI)회원 탈퇴 시까지
                  +
                  +
                  + +
                  + + +
                  +
                  + +
                  +

                  인증수단 선택하기

                  + +
                  + '; + if ($config['cf_cert_simple']) { + echo '' . PHP_EOL; + } + if ($config['cf_cert_hp']) + echo '' . PHP_EOL; + if ($config['cf_cert_ipin']) + echo '' . PHP_EOL; + echo '
                  '; + echo '' . PHP_EOL; + } + ?> +
                  + + + + + + \ No newline at end of file diff --git a/theme/basic/skin/member/basic/password_lost.skin.php b/theme/basic/skin/member/basic/password_lost.skin.php index 903b3a4fd..97fc852cb 100644 --- a/theme/basic/skin/member/basic/password_lost.skin.php +++ b/theme/basic/skin/member/basic/password_lost.skin.php @@ -3,13 +3,16 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 add_stylesheet('', 0); -?> + +if($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipin'] || $config['cf_cert_hp'])) { ?> + + -
                  -

                  회원정보 찾기

                  +
                  +

                  이메일로 찾기

                  회원가입 시 등록하신 이메일 주소를 입력해 주세요.
                  @@ -19,30 +22,96 @@ add_stylesheet('',

                  +
                  - - +
                  + +
                  +

                  본인인증으로 찾기

                  +
                  + + + + + + + + + +
                  +
                  +
                  + \ No newline at end of file diff --git a/theme/basic/skin/member/basic/password_reset.skin.php b/theme/basic/skin/member/basic/password_reset.skin.php new file mode 100644 index 000000000..f7dfafdaa --- /dev/null +++ b/theme/basic/skin/member/basic/password_reset.skin.php @@ -0,0 +1,39 @@ +', 0); +?> + + +
                  +
                  +
                  +
                  +

                  새로운 비밀번호를 입력해주세요.

                  + +
                  + 회원 아이디 : + + + + +
                  +
                  + +
                  +
                  +
                  +
                  + + + \ No newline at end of file diff --git a/theme/basic/skin/member/basic/register.skin.php b/theme/basic/skin/member/basic/register.skin.php index 3d3898451..662c8da40 100644 --- a/theme/basic/skin/member/basic/register.skin.php +++ b/theme/basic/skin/member/basic/register.skin.php @@ -10,7 +10,7 @@ add_stylesheet('',
                  -

                  회원가입약관 및 개인정보처리방침안내의 내용에 동의하셔야 회원가입 하실 수 있습니다.

                  +

                  회원가입약관 및 개인정보 수집 및 이용의 내용에 동의하셔야 회원가입 하실 수 있습니다.

                  ',
                  -

                  개인정보처리방침안내

                  +

                  개인정보 수집 및 이용

                  - + @@ -40,7 +40,7 @@ add_stylesheet('', - + @@ -54,7 +54,7 @@ add_stylesheet('',
                  - +
                  @@ -80,7 +80,7 @@ add_stylesheet('', } if (!f.agree2.checked) { - alert("개인정보처리방침안내의 내용에 동의하셔야 회원가입 하실 수 있습니다."); + alert("개인정보 수집 및 이용의 내용에 동의하셔야 회원가입 하실 수 있습니다."); f.agree2.focus(); return false; } diff --git a/theme/basic/skin/member/basic/register_form.skin.php b/theme/basic/skin/member/basic/register_form.skin.php index d60d8c8f7..7b79c61f4 100644 --- a/theme/basic/skin/member/basic/register_form.skin.php +++ b/theme/basic/skin/member/basic/register_form.skin.php @@ -3,16 +3,14 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 add_stylesheet('', 0); +add_javascript('', 0); +if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipin'] || $config['cf_cert_hp'])) + add_javascript('', 0); ?>
                  - - - - - @@ -32,7 +30,7 @@ add_stylesheet('',
                  • @@ -40,11 +38,11 @@ add_stylesheet('',
                  • - + class="frm_input full_input " minlength="3" maxlength="20" placeholder="비밀번호">
                  • - + class="frm_input full_input " minlength="3" maxlength="20" placeholder="비밀번호 확인">
                  @@ -53,40 +51,57 @@ add_stylesheet('',

                  개인정보 입력

                    -
                  • - - class="frm_input full_input " size="10" placeholder="이름"> - 아이핀 본인확인'.PHP_EOL; - if($config['cf_cert_hp']) - echo ''.PHP_EOL; +
                  • + 본인확인 시 자동입력'; + $desc_phone = ' 본인확인 시 자동입력'; + + if (!$config['cf_cert_simple'] && !$config['cf_cert_hp'] && $config['cf_cert_ipin']) { + $desc_phone = ''; + } + + if ($config['cf_cert_simple']) { + echo ''.PHP_EOL; + } + if ($config['cf_cert_hp']) + echo ''.PHP_EOL; + if ($config['cf_cert_ipin']) + echo ''.PHP_EOL; + echo '(필수)'; echo ''.PHP_EOL; } ?> -
                    본인확인성인인증 완료
                    - - - - 아이핀 본인확인 후에는 이름이 자동 입력되고 휴대폰 본인확인 후에는 이름과 휴대폰번호가 자동 입력되어 수동으로 입력할수 없게 됩니다. - + +
                  • +
                  • + + class="frm_input full_input " size="10" placeholder="이름">
                  • @@ -98,7 +113,7 @@ add_stylesheet('',
                  • -
                  • - + class="frm_input full_input " size="70" maxlength="255" placeholder="홈페이지">
                  • @@ -123,16 +138,16 @@ add_stylesheet('',
                  • - + class="frm_input full_input " maxlength="20" placeholder="전화번호">
                  • - - + + - class="frm_input full_input " maxlength="20" placeholder="휴대폰번호"> - + class="frm_input full_input " maxlength="20" placeholder="휴대폰번호"> + @@ -141,12 +156,12 @@ add_stylesheet('',
                  • - 필수 - + (필수) + class="frm_input twopart_input " size="5" maxlength="6" placeholder="우편번호">
                    class="frm_input frm_address full_input " size="50" placeholder="기본주소"> -
                    +

                    @@ -163,7 +178,7 @@ add_stylesheet('',
                    • - +
                    • @@ -290,14 +305,30 @@ gif, jpg, png파일만 가능하며 용량 $(function() { $("#reg_zip_find").css("display", "inline-block"); + var pageTypeParam = "pageType=register"; + + // 이니시스 간편인증 + var url = "/ini_request.php"; + var type = ""; + var params = ""; + var request_url = ""; + + $(".win_sa_cert").click(function() { + if(!cert_confirm()) return false; + type = $(this).data("type"); + params = "?directAgency=" + type + "&" + pageTypeParam; + request_url = url + params; + call_sa(request_url); + }); + // 아이핀인증 + var params = ""; $("#win_ipin_cert").click(function() { - if(!cert_confirm()) - return false; - - var url = "/ipin1.php"; + if(!cert_confirm()) return false; + params = "?" + pageTypeParam; + var url = "/ipin1.php"+params; certify_win_open('kcb-ipin', url); return; }); @@ -305,13 +336,13 @@ $(function() { // 휴대폰인증 + var params = ""; $("#win_hp_cert").click(function() { - if(!cert_confirm()) - return false; - - - - certify_win_open("", ""); + + certify_win_open("", ""+params); return; }); diff --git a/theme/basic/skin/member/basic/register_form_update.tail.skin.php b/theme/basic/skin/member/basic/register_form_update.tail.skin.php new file mode 100644 index 000000000..97cd044e1 --- /dev/null +++ b/theme/basic/skin/member/basic/register_form_update.tail.skin.php @@ -0,0 +1,59 @@ +SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting); + + $strDest = array(); + $strDest[] = $receive_number; + $strCallBack = $send_number; + $strCaller = iconv_euckr(trim($default['de_admin_company_name'])); + $strSubject = ''; + $strURL = ''; + $strData = iconv_euckr($sms_contents); + $strDate = ''; + $nCount = count($strDest); + + $res = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount); + + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } else { + include_once(G5_LIB_PATH.'/icode.sms.lib.php'); + + $SMS = new SMS; // SMS 연결 + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + $SMS->Add($receive_number, $send_number, $config['cf_icode_id'], iconv_euckr(stripslashes($sms_contents)), ""); + $SMS->Send(); + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + } + } +} +//---------------------------------------------------------- +// SMS 문자전송 끝 +//----------------------------------------------------------; \ No newline at end of file diff --git a/theme/basic/skin/member/basic/style.css b/theme/basic/skin/member/basic/style.css index 3574d7009..73678141c 100644 --- a/theme/basic/skin/member/basic/style.css +++ b/theme/basic/skin/member/basic/style.css @@ -1,35 +1,6 @@ @charset "utf-8"; /* ### 기본 스타일 커스터마이징 시작 ### */ - -/* 버튼 */ -.mbskin a.btn01 {} -.mbskin a.btn01:focus, .mbskin .btn01:hover {} -.mbskin a.btn02 {} -.mbskin a.btn02:focus, .mbskin .btn02:hover {} -.mbskin .btn_confirm {} /* 서식단계 진행 */ -.mbskin .btn_submit {} -.mbskin button.btn_submit {} -.mbskin fieldset .btn_submit {} -.mbskin .btn_cancel {} -.mbskin button.btn_cancel {} -.mbskin .btn_cancel:focus, .mbskin .btn_cancel:hover {} -.mbskin a.btn_frmline, .mbskin button.btn_frmline {} /* 우편번호검색버튼 등 */ -.mbskin button.btn_frmline {} -.mbskin .win_btn {} /* 새창용 */ -.mbskin .win_btn button {} -.mbskin .win_btn input {} -.mbskin .win_btn a {} -.mbskin .win_btn a:focus, .mbskin .win_btn a:hover {} - -/* 게시판용 버튼 */ -.mbskin a.btn_b01 {} -.mbskin a.btn_b01:focus, .mbskin .btn_b01:hover {} -.mbskin a.btn_b02 {} -.mbskin a.btn_b02:focus, .mbskin .btn_b02:hover {} -.mbskin a.btn_admin {} /* 관리자 전용 버튼 */ -.mbskin a.btn_admin:focus, .mbskin a.btn_admin:hover {} - /* 기본박스 */ .mbskin {position:relative;margin:100px auto 0;width:360px;text-align:center} .mbskin:after {right:10px;left:auto; @@ -42,54 +13,8 @@ .mbskin .frm_input {width:100%} .mbskin .btn_submit {width:100%;margin:10px 0 0;height:45px;font-weight:bold;font-size:1.25em} .mbskin h1 {margin:60px 0 30px;font-size:2em} - - -/* 기본테이블 */ -.mbskin .tbl_head01 {} -.mbskin .tbl_head01 caption {} -.mbskin .tbl_head01 thead th {} -.mbskin .tbl_head01 thead a {} -.mbskin .tbl_head01 thead th input {} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ -.mbskin .tbl_head01 tfoot th {} -.mbskin .tbl_head01 tfoot td {} -.mbskin .tbl_head01 tbody th {} -.mbskin .tbl_head01 td {} -.mbskin .tbl_head01 a {} -.mbskin td.empty_table {} - -/* 폼 테이블 */ -.mbskin table {} -.mbskin caption {} -.mbskin .frm_info {} -.mbskin .frm_file {} - -.mbskin .tbl_frm01 {} -.mbskin .tbl_frm01 th {width:85px} -.mbskin .tbl_frm01 td {} -.mbskin .tbl_frm01 textarea, .mb_skin tbl_frm01 .frm_input {} -.mbskin .tbl_frm01 textarea {} -.mbskin .tbl_frm01 a {} - -/* 필수입력 */ -.mbskin .required, .mbskin textarea.required {} - -/* 테이블 항목별 정의 */ -.mbskin .td_board {} -.mbskin .td_chk {} -.mbskin .td_date {} -.mbskin .td_datetime {} -.mbskin .td_group {} -.mbskin .td_mb_id {} -.mbskin .td_mng {} -.mbskin .td_name {} -.mbskin .td_nick {} -.mbskin .td_num {} -.mbskin .td_numbig {} - -.mbskin .txt_active {} -.mbskin .txt_expired {} - /* ### 기본 스타일 커스터마이징 끝 ### */ + /* 회원가입 약관 */ .register {margin:0 auto} .register:after {display:block;visibility:hidden;clear:both;content:""} @@ -107,7 +32,7 @@ #fregister textarea {display:block;padding:20px;width:100%;height:150px;background:#fff;border:0;line-height:1.6em} #fregister_private {position:relative} #fregister_private div {padding:20px;background:#fff} -#fregister_private table {width:100%;border-collapse:collapse} +#fregister_private table {width:100%;border-collapse:collapse;font-size:1em;} #fregister_private table caption {position:absolute;font-size:0;line-height:0;overflow:hidden} #fregister_private table th {background:#f7f7f9;width:33.33%;color:#000;padding:10px;border:1px solid #d8dbdf} #fregister_private table td {border:1px solid #e7e9ec;padding:10px;border-top:0} @@ -115,7 +40,7 @@ .fregister_agree {position:absolute;top:0;right:0} .fregister_agree input[type="checkbox"] + label {color:#676e70} .fregister_agree input[type="checkbox"] + label:hover {color:#2172f8} -.fregister_agree input[type="checkbox"] + label span {position:absolute;top:20px;right:15px;width:17px;height:17px;display:block;background:#fff;border:1px solid #d0d4df;border-radius:3px} +.fregister_agree input[type="checkbox"] + label span {position:absolute;top:20px;right:15px;width:17px;height:17px;display:block;background:#fff;border:1px solid #999;border-radius:3px} .fregister_agree input[type="checkbox"]:checked + label {color:#000} .fregister_agree input[type="checkbox"]:checked + label span {background:url('./img/chk.png') no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} .fregister_agree.chk_all input[type="checkbox"] + label span {top:18px} @@ -133,7 +58,9 @@ .register_form_inner label {display:block;margin-bottom:10px;line-height:24px} .register_form_inner label.inline {display:inline} -#fregisterform #msg_certify {margin:5px 0 0;padding:5px;border:1px solid #dbecff;background:#eaf4ff;text-align:center} +#fregisterform .cert_desc {color:#3a8afd;} +#fregisterform .cert_req {margin-left:5px;line-height:35px;} +#fregisterform #msg_certify {margin:5px 0;padding:5px;border:1px solid #dbecff;background:#eaf4ff;text-align:center} #fregisterform .frm_address {margin:5px 0 0} #fregisterform #mb_addr3 {display:inline-block;margin:5px 0 0;vertical-align:middle} #fregisterform #mb_addr_jibeon {display:block;margin:5px 0 0} @@ -168,11 +95,47 @@ .tooltip {position:absolute;width:auto;color:#fff;background:#000;padding:10px;font-size:small;line-height:18px;display:none;z-index:9;font-weight:normal;margin-left:15px;margin-top:10px} .tooltip:before {content:"";position:absolute;top:0;left:-10px;width:0;height:0;border-style:solid;border-top:0px solid transparent;border-bottom:10px solid transparent;border-left:0;border-right:10px solid #000} - /* 아이디/비밀번호 찾기 */ +#find_info h3 {display:none;margin-bottom:30px;text-align:center;font-size:1.1em;} +#find_info .new_win_con {background:#f7f7f7;} +#find_info.cert .new_win_con {width:460px;float:left;} +#find_info.cert .new_win_con:nth-child(2) {margin-left:10px;} +#find_info.cert h3 {display:block;} #find_info #mb_hp_label {display:inline-block;margin-left:10px} #find_info p {line-height:1.5em} #find_info #mb_email {margin:10px 0} +#find_info .find_btn .btn_submit {width:30%;word-break:keep-all;} + +/* 비밀번호 재설정 */ +#pw_reset #info_fs {margin-bottom: 10px} +#pw_reset .frm_input {margin:10px 0 0} + +/* 기존 회원 본인인증 */ +#member_cert_refresh p {position:relative;text-align:center;color:#fff;height:50px;line-height:50px;font-size:1.1em;background:#f2838f;margin:0 0 10px;border-radius:5px;font-weight:bold} +#member_cert_refresh p:before {content:"";position:absolute;top:0;left:0;width:5px;height:50px;border-radius:5px 0 0 5px;background:#da4453} +#member_cert_refresh p i {font-size:1.2em;vertical-align:middle} +#member_cert_refresh section {margin:10px auto 15px;border:1px solid #dde7e9;position:relative;border-radius:3px} +#member_cert_refresh_chkall {position:relative;text-align:center;background:#f5f7fa;line-height:50px;border:1px solid #e5e9f0;border-radius:3px;margin-bottom:15px} +#member_cert_refresh h2 {text-align:left;padding:20px;border-bottom:1px solid #dde7e9;font-size:1.2em} +#member_cert_refresh textarea {display:block;padding:20px;width:100%;height:150px;background:#fff;border:0;line-height:1.6em} +#member_cert_refresh_private {position:relative} +#member_cert_refresh_private div {padding:20px;background:#fff} +#member_cert_refresh_private table {width:100%;border-collapse:collapse;font-size:1em;} +#member_cert_refresh_private table caption {position:absolute;font-size:0;line-height:0;overflow:hidden} +#member_cert_refresh_private table th {background:#f7f7f9;width:33.33%;color:#000;padding:10px;border:1px solid #d8dbdf;font-weight:bold;} +#member_cert_refresh_private table td {border:1px solid #e7e9ec;padding:10px;border-top:0} + +.member_cert_refresh_agree {position:absolute;top:0;right:0} +.member_cert_refresh_agree input[type="checkbox"] + label {color:#676e70} +.member_cert_refresh_agree input[type="checkbox"] + label:hover {color:#2172f8} +.member_cert_refresh_agree input[type="checkbox"] + label span {position:absolute;top:20px;right:15px;width:17px;height:17px;display:block;background:#fff;border:1px solid #999;border-radius:3px} +.member_cert_refresh_agree input[type="checkbox"]:checked + label {color:#000} +.member_cert_refresh_agree input[type="checkbox"]:checked + label span {background:url('./img/chk.png') no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} +.member_cert_refresh_agree.chk_all input[type="checkbox"] + label span {top:18px} + +#member_cert_refresh #find_info {margin:50px 0} +#member_cert_refresh #find_info .find_btn {padding:10px 20px;background:#fff} +#member_cert_refresh #find_info .find_btn > div {margin:10px 0} /* 로그인 */ #mb_login {} @@ -188,12 +151,12 @@ #login_info .login_if_lpl {float:right} #login_password_lost {display:inline-block;border:1px solid #d5d9dd;color:#3a8afd;border-radius:2px;padding:2px 5px;line-height:20px} -#mb_login_notmb {margin:30px auto;padding:20px 30px} +#mb_login_notmb {margin:30px auto;padding:20px 30px;border: 1px solid #dde7e9} #mb_login_notmb h2 {font-size:1.25em;margin:20px 0 10px} #guest_privacy {border:1px solid #ccc;text-align:left;line-height:1.6em;color:#666;background:#fafafa;padding:10px;height:150px;margin:10px 0;overflow-y:auto} #mb_login_notmb .btn_submit {display:block;text-align:center;line-height:45px} -#mb_login_od_wr {margin:30px auto;padding:20px 30px} +#mb_login_od_wr {margin:30px auto;padding:20px 30px;border: 1px solid #dde7e9} #mb_login_od_wr h2 {font-size:1.25em;margin:20px 0 10px} #mb_login_od_wr .frm_input {margin:10px 0 0} #mb_login_od_wr p {background:#f3f3f3;margin:20px 0 0;padding:15px 20px;line-height:1.5em} diff --git a/theme/basic/skin/outlogin/basic/img/info_edit.png b/theme/basic/skin/outlogin/basic/img/info_edit.png new file mode 100644 index 000000000..ce5eae3eb Binary files /dev/null and b/theme/basic/skin/outlogin/basic/img/info_edit.png differ diff --git a/theme/basic/skin/outlogin/basic/outlogin.skin.1.php b/theme/basic/skin/outlogin/basic/outlogin.skin.1.php index 5735d3326..5c41ffbdf 100644 --- a/theme/basic/skin/outlogin/basic/outlogin.skin.1.php +++ b/theme/basic/skin/outlogin/basic/outlogin.skin.1.php @@ -27,7 +27,7 @@ add_stylesheet(''
                  ', 0); +?> + + +
                  +

                  회원로그인

                  + +
                  + + + + + +
                  + + +
                  + + + +
                  + +
                  + + + diff --git a/theme/basic/skin/outlogin/shop_basic/outlogin.skin.2.php b/theme/basic/skin/outlogin/shop_basic/outlogin.skin.2.php new file mode 100644 index 000000000..3639e614c --- /dev/null +++ b/theme/basic/skin/outlogin/shop_basic/outlogin.skin.2.php @@ -0,0 +1,43 @@ +', 0); +?> + + + + + +
                  +

                  회원정보

                  + + +
                  + + + diff --git a/theme/basic/skin/outlogin/shop_basic/style.css b/theme/basic/skin/outlogin/shop_basic/style.css new file mode 100644 index 000000000..05f59e4b7 --- /dev/null +++ b/theme/basic/skin/outlogin/shop_basic/style.css @@ -0,0 +1,44 @@ +@charset "utf-8"; + +/* 아웃로그인 스킨 */ +.ol {position:relative} +.ol h2 {margin:0;padding:0;width:1px;height:1px;font-size:0;line-height:0;overflow:hidden} + +.ol a.btn_admin {display:inline-block;padding:0 10px;height:25px;background:#d13f4a;color:#fff;text-decoration:none;line-height:25px;vertical-align:middle} /* 관리자 전용 버튼 */ +.ol a.btn_admin:focus, .ol a.btn_admin:hover {text-decoration:none} + +#ol_before {} +#ol_before fieldset {position:relative} +#ol_id {display:block;width:100%;margin:5px 0 10px} +.ol_idlabel {color:#333} +#ol_pw {display:block;width:100%;margin:5px 0} +.ol_pwlabel {color:#333} +#auto_login {} +#auto_login_label {letter-spacing:-0.1em} +#ol_submit {width:100%;height:40px;border:0;border-radius:3px;color:#fff;font-weight:bold} +#ol_before a {letter-spacing:-0.15em} +#ol_svc {text-align:center;margin:10px 0 0} +#ol_svc a {display:inline-block;color:#333;margin:0 5px} +#ol_auto {position:relative;margin:5px 0;font-size:0.92em;color:#555} +#ol_auto label {letter-spacing:-0.1em} +#ol_auto input {width:13px;height:13px;vertical-align:bottom} + +.btn_member_mn {min-width:150px;padding:5px 0;border:0;background:transparent;color:#fff;text-align:center} +.btn_member_mn .profile_img {display:inline-block;margin-right:5px} +.btn_member_mn .profile_img img {border-radius:50%} +.btn_member_mn .profile_name {display:inline-block;max-width:70px;line-height:34px;vertical-align: bottom;text-overflow:ellipsis;overflow:hidden;white-space:nowrap} +.btn_member_mn i {display:inline-block;margin-left:5px;font-size:1.2em;font-weight:bold} +.btn_member_mn_on {background:#fff;color:#000;border:1px solid #d0d0d0;border-bottom:0} +.member_mn {display:none;position:absolute;left:0;width:150px;background:#fff;z-index:99;border:1px solid #d0d0d0;border-top:0} + +#ol_after {} +#ol_after_private {text-align:left} +#ol_after_private:after {display:block;visibility:hidden;clear:both;content:""} +#ol_after_private li {margin-bottom:1px;position:relative} +#ol_after_private li:hover a {background:#f7f7f7} +#ol_after_private a {display:block;color:#444;padding:10px 15px;line-height:20px} +#ol_after_private a strong {float:right;display:inline-block;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:clip;padding:0 5px;border-radius:15px;font-weight:normal;font-size:0.92em} +#ol_after_private .win_point strong {background:#37bc9b} +#ol_after_private .win_coupon strong {background:#a352c1} +#ol_after_private .win_memo strong {background:#ff8b77} +#ol_after_logout {display:block;font-size:1.083em;line-height:45px;text-align:center;color:#3a8afd;border-top:1px solid #f6f6f6} diff --git a/theme/basic/skin/outlogin/shop_side/img/chk.png b/theme/basic/skin/outlogin/shop_side/img/chk.png new file mode 100644 index 000000000..2841a67f3 Binary files /dev/null and b/theme/basic/skin/outlogin/shop_side/img/chk.png differ diff --git a/theme/basic/skin/outlogin/shop_side/outlogin.skin.1.php b/theme/basic/skin/outlogin/shop_side/outlogin.skin.1.php new file mode 100644 index 000000000..8f3c7ce82 --- /dev/null +++ b/theme/basic/skin/outlogin/shop_side/outlogin.skin.1.php @@ -0,0 +1,65 @@ +', 0); +?> + + +
                  +
                  +

                  회원로그인

                  + 회원가입 +
                  +
                  +
                  +
                  + + + + + + +
                  +
                  +
                  + + +
                  + +
                  + + +
                  + +
                  + + + diff --git a/theme/basic/skin/outlogin/shop_side/outlogin.skin.2.php b/theme/basic/skin/outlogin/shop_side/outlogin.skin.2.php new file mode 100644 index 000000000..abbc07bdf --- /dev/null +++ b/theme/basic/skin/outlogin/shop_side/outlogin.skin.2.php @@ -0,0 +1,70 @@ +', 0); + +// 쿠폰 +$cp_count = 0; +$sql = " select cp_id + from {$g5['g5_shop_coupon_table']} + where mb_id IN ( '{$member['mb_id']}', '전체회원' ) + and cp_start <= '".G5_TIME_YMD."' + and cp_end >= '".G5_TIME_YMD."' "; +$res = sql_query($sql); + +for($k=0; $cp=sql_fetch_array($res); $k++) { + if(!is_used_coupon($member['mb_id'], $cp['cp_id'])) + $cp_count++; +} +?> + + +
                  +
                  +

                  나의 회원정보

                  + + + 관리자 + + + 정보수정 + 로그아웃 +
                  + +
                  + + + diff --git a/theme/basic/skin/outlogin/shop_side/style.css b/theme/basic/skin/outlogin/shop_side/style.css new file mode 100644 index 000000000..67d0f6d78 --- /dev/null +++ b/theme/basic/skin/outlogin/shop_side/style.css @@ -0,0 +1,64 @@ +@charset "utf-8"; + +/* 아웃로그인 스킨 */ +.s_ol {position:relative;border-bottom:1px solid #f6f6f6} +.s_ol h2 {width:115px;float:left;padding:15px 0;text-align:center} +.s_ol .join {width:114px;float:left;padding:15px 0;text-align:center;background:#f7f7f7;color:#6e6e6e} +.s_ol #s_ol_be_cate:after {display:block;visibility:hidden;clear:both;content:""} +.s_ol form {padding:20px} +.s_ol a.btn_admin {display:inline-block;padding:0 10px;height:25px;text-decoration:none;line-height:25px;vertical-align:middle} /* 관리자 전용 버튼 */ +.s_ol a.btn_admin:focus, .s_ol a.btn_admin:hover {text-decoration:none} + +#s_ol_before {} +#s_ol_before:after {display:block;visibility:hidden;clear:both;content:""} +#s_ol_before .s_ol_wr {position:relative;margin-bottom:5px} +#ol_id {display:block;width:100%;border:1px solid #d0d3db;padding:0 10px;height:35px;margin-bottom:5px;border-radius:3px} +#ol_pw {display:block;width:100%;border:1px solid #d0d3db;padding:0 10px;height:35px;margin-bottom:5px;border-radius:3px} +#ol_submit {width:100%;height:35px;background:#3a8afd;border-left:1px solid #ccc;color:#fff;font-weight:bold;font-size:1.167em;border-radius:3px} +#ol_svc {float:right;margin-top:5px;line-height:20px} +#ol_svc a {display:inline-block;border:1px solid #d5d9dd;color:#3a8afd;border-radius:2px;padding:2px 5px} +#ol_auto {float:left;line-height:20px;margin-top:5px} +#ol_auto label {color:#555;vertical-align:baseline} +#ol_auto input {width:13px;height:13px} +.ol_auto_wr:after {display:block;visibility:hidden;clear:both;content:""} +#sns_login {margin-top:0 !important;border-top:0 !important} +#sns_login h3 {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#s_ol_after {border-bottom:1px solid #f6f6f6} +#s_ol_after_hd {position:relative;padding:10px;padding-left:80px;height:80px} +#s_ol_after_hd strong {display:block;margin:5px 0 10px} +#s_ol_after_hd .profile_img {position:absolute;top:15px;left:15px;display:inline-block} +#s_ol_after_hd .profile_img img {border-radius:50%;width:50px;height:50px} +#s_ol_after_hd .btn_admin {position:absolute;right:0;bottom:0;width:20px;height:20px;line-height:20px;padding:0;text-align:center;border-radius:50%;background:#000;vertical-align:baseline} + +#s_ol_after_info {display:inline-block;height:28px;line-height:22px;border:1px solid #d5d9dd;color:#3a8afd;border-radius:2px;padding:2px 5px} +#s_ol_after h2 {margin:0;padding:0;width:1px;height:1px;font-size:0;line-height:0;overflow:hidden} +#s_ol_after_hd .btn_b04 {line-height:23px;padding:0 5px} +#s_ol_after_private {zoom:1} +#s_ol_after_private:after {display:block;visibility:hidden;clear:both;content:""} +#s_ol_after_private li {text-align:left;position:relative;text-align:left} +#s_ol_after_private li:first-child a {border-left:0} +#s_ol_after_private a {display:block;background:#fff;color:#465168;line-height:18px;padding:10px 20px 10px 25px} +#s_ol_after_private a strong {display:inline-block;float:right;max-width:87px;overflow:hidden;white-space:nowrap;text-overflow:clip;color:#3a8afd;padding:0 5px;border-radius:15px;font-size:0.92em} +#s_ol_after_private a:hover strong {background:#4b8bff} +#s_ol_after_private li a:hover {color:#4b8bff;background:#f7f7f7} +#s_ol_after_private li a:hover:after {position:absolute;left:0;top:0;width:2px;height:38px;background:#3a8afd;content:""} +#s_ol_after_private li i {width:25px;color:#8c9eb0;margin-right:5px} +#s_ol_after_private li:hover i {color:#3a8afd} +#s_ol_after_private .win_point:hover strong {background:#37bc9b;color:#fff} +#s_ol_after_private .win_memo:hover strong {background:#ff8b77;color:#fff} +#s_ol_after_private .win_scrap:hover strong {background:#8cc152;color:#fff} +#s_ol_after_private .win_coupon:hover strong {background:#a352c1;color:#fff} + +#s_ol_after_logout {display:inline-block;height:28px;line-height:22px;border:1px solid #d5d9dd;color:#8a8a8a;border-radius:2px;padding:2px 5px} +#s_ol_after_logout:hover {color:#3c8bfd} +#ol_after_memo {margin-right:1px} +#ol_after_pt {margin-right:1px} + +.selec_chk {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box {position:relative} +.chk_box input[type="checkbox"] + label {padding-left:20px;color:#676e70} +.chk_box input[type="checkbox"] + label:hover{color:#2172f8} +.chk_box input[type="checkbox"] + label span {position:absolute;top:2px;left:0;width:15px;height:15px;display:block;margin:0;background:#fff;border:1px solid #d0d4df;border-radius:3px} +.chk_box input[type="checkbox"]:checked + label {color:#000} +.chk_box input[type="checkbox"]:checked + label span {background:url(./img/chk.png) no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px} diff --git a/theme/basic/skin/poll/basic/style.css b/theme/basic/skin/poll/basic/style.css index 6c8f934f8..77a22b5cc 100644 --- a/theme/basic/skin/poll/basic/style.css +++ b/theme/basic/skin/poll/basic/style.css @@ -2,33 +2,7 @@ /* ### 기본 스타일 커스터마이징 시작 ### */ -#poll a.btn_admin {} /* 관리자 전용 버튼 */ -#poll a.btn_admin:focus, #poll a.btn_admin:hover {} - -#poll_result .tbl_frm table {} -#poll_result .tbl_frm .frm_info {} -#poll_result .tbl_frm .frm_address {} -#poll_result .tbl_frm .frm_file {} -#poll_result .tbl_frm caption {} - -#poll_result .tbl_frm01 {} -#poll_result .tbl_frm01 th {} -#poll_result .tbl_frm01 td {} -#poll_result .tbl_frm01 textarea, #poll_result tbl_frm01 .frm_input {} -#poll_result .tbl_frm01 textarea {} -#poll_result .tbl_frm01 a {} - -/* 필수입력 */ -#poll_result .required, #poll_result textarea.required {} - -#poll_result .btn_confirm {} /* 서식단계 진행 */ -#poll_result .btn_submit {} -#poll_result button.btn_submit {} #poll_result .win_btn {text-align:center} /* 새창용 */ -#poll_result .win_btn button {} -#poll_result .win_btn input {} -#poll_result .win_btn a {} -#poll_result .win_btn a:focus, #poll_result .win_btn a:hover {} /* ### 기본 스타일 커스터마이징 끝 ### */ diff --git a/theme/basic/skin/poll/shop_basic/poll.skin.php b/theme/basic/skin/poll/shop_basic/poll.skin.php new file mode 100644 index 000000000..ba1193e91 --- /dev/null +++ b/theme/basic/skin/poll/shop_basic/poll.skin.php @@ -0,0 +1,75 @@ +', 0); +?> + + + + + +
                  +
                  +

                  설문조사

                  + 설문관리 + " target="_blank" onclick="poll_result(this.href); return false;" class="btn_result">결과보기 +
                  +
                  +

                  +
                    + +
                  • + + +
                  • + +
                  +
                  + +
                  +
                  +
                  + + + + \ No newline at end of file diff --git a/theme/basic/skin/poll/shop_basic/poll_result.skin.php b/theme/basic/skin/poll/shop_basic/poll_result.skin.php new file mode 100644 index 000000000..ab3df7063 --- /dev/null +++ b/theme/basic/skin/poll/shop_basic/poll_result.skin.php @@ -0,0 +1,125 @@ +', 0); +?> + + +
                  +

                  +
                  + + 전체 +
                  +

                  결과

                  +
                    + +
                  1. + 현재 가장 높은 득표율 +
                    + +
                    +
                    + 500 표 + 90 % +
                    +
                  2. + + + +
                  3. + +
                    + +
                    +
                    + + % +
                    +
                  4. + +
                  +
                  + + + + +
                  +

                  이 설문에 대한 기타의견

                  + + +
                  +
                  +

                  님의 의견

                  + + + 삭제"; } ?> +
                  +

                  + +

                  +
                  + + + = $po['po_level']) { ?> +
                  + + + + +
                  +

                  기타의견

                  +
                  + + +
                  +
                  + +
                  + + +
                  + + + + + + +
                  + + + + + + + +
                  + +
                  +
                  +
                  + + + \ No newline at end of file diff --git a/theme/basic/skin/poll/shop_basic/style.css b/theme/basic/skin/poll/shop_basic/style.css new file mode 100644 index 000000000..ed1d11433 --- /dev/null +++ b/theme/basic/skin/poll/shop_basic/style.css @@ -0,0 +1,81 @@ +@charset "utf-8"; + +/* ### 기본 스타일 커스터마이징 시작 ### */ + +#poll_result .win_btn {text-align:center} /* 새창용 */ + +/* ### 기본 스타일 커스터마이징 끝 ### */ + +/* 설문조사 스킨 */ +#poll {border:1px solid #dde7e9;background:#fff;position:relative;border-radius:3px;margin-bottom:15px} +#poll header {position:relative;border-bottom:1px solid #e8e8e8;padding:15px} +#poll header:after {display:block;visibility:hidden;clear:both;content:""} +#poll header h2 {display:inline-block;float:left;font-size:1.167em;color:#000;line-height:28px} +#poll header h2:after {display:block;visibility:hidden;clear:both;content:""} +#poll header .btn_result {float:right;display:inline-block;line-height:20px;height:28px;border:1px solid #d5d9dd;color:#3a8afd;border-radius:2px;padding:2px 5px;background:#fff} +#poll header .btn_admin {float:right;margin-left:5px;line-height:28px;font-size:1.4em} +#poll ul {padding:0 20px;list-style:none} +#poll li {padding:5px 0} + +.selec_chk {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box {position:relative} +.chk_box input[type="radio"] {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden} +.chk_box input[type="radio"] + label {position:relative;padding-left:23px;display:inline-block;color:#676e70} +.chk_box input[type="radio"] + label span {position:absolute;top:0;left:0;width:15px;height:15px;display:block;background:#fff;border:1px solid #cdd6df;border-radius:50%} +.chk_box input[type="radio"]:checked + label {color:#305af9} +.chk_box input[type="radio"]:checked + label span:before {width:7px;height:7px;background:#305af9;content:'';position:absolute;top:3px;left:3px;border-radius:50%} + +#poll .poll_con {} +#poll .poll_con p {font-weight:bold;padding:15px 20px;color:#000;font-size:1.167em} +#poll_btn {padding:10px 20px 20px;text-align:center} +#poll_btn:after {display:block;visibility:hidden;clear:both;content:""} +#poll_btn .btn_poll {display:block;width:100%;height:40px;line-height:40px;padding:0 10px;border:0;font-weight:bold;background:#3a8afd;color:#fff;border-radius:3px} + +/* 설문조사 결과 (새창) */ +#poll_result {} +#poll_result section {} +#poll_result .tbl_wrap {margin:0} +#poll_result .sv_member, +#poll_result .sv_guest {font-weight:bold} +#poll_result .poll_all {position:absolute;top:10px;right:10px;display:inline-block;margin:0 0 10px;line-height:30px;font-size:0.92em;color:#3a8afd;background:#f6f6f6;padding:0 10px;border-radius:5px} +#poll_result_list {clear:both;margin:20px;border:1px solid #d6e2f4;border-top:0;background:#fff;border-radius:5px} +#poll_result_list h2 {margin:0;font-size:1.25em;padding:15px;margin:0 0 15px;border-top:1px solid #d6e2f4;border-bottom:1px solid #d6e2f4;text-align:center;background:#edf3fc;color:#375582;border-radius:5px} +#poll_result_list dt {margin-right:5%;color:#e8180d;text-align:right} +#poll_result_list ol {margin:0;padding:0 20px} +#poll_result_list li {margin:20px 0;position:relative;list-style-position:inside} + +.poll_1st .poll_result_graph span {background:#3a8afd} +.poll_result_graph {position:relative;width:90%;margin:5px 0;height:15px;background:#fff;border-radius:10px;-moz-box-shadow:inset 0px 2px 8px #dadada;-webkit-box-shadow:inset 0px 2px 8px #dadada;box-shadow:inset 0px 2px 8px #dadada} +.poll_result_graph span {position:absolute;top:0;left:0;height:15px;background:#8395b3;border-radius:10px 10px;white-space:nowrap} + +.poll_numerical {display:inline-block;position:absolute;top:0;right:0;text-align:center} +.poll_numerical .poll_percent {display:block;font-size:1.2em;color:#3a8afd;font-weight:bold;letter-spacing:-0.5px} +.poll_numerical .poll_cnt {font-size:1em;text-align:right;color:#8d8d8d} + +#poll_result_cmt {margin:20px} +#poll_result_cmt h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#poll_result_cmt article {margin:15px 0;position:relative;border-bottom:1px solid #eaeaea} +#poll_result_cmt h1 {position:absolute;margin:0;padding:0;border:0;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#poll_result_cmt header {margin:0 0 5px} +#poll_result_cmt .poll_datetime {display:inline-block;font-size:0.92em;color:#777} +#poll_result_cmt .profile_img img {border-radius:50%} +#poll_result_cmt p {padding:10px;line-height:1.5em} + +#poll_other_q h3 {margin:0;font-size:1.25em;padding:10px;border-bottom:1px solid #eaeaea;text-align:left} +#poll_other_q h3 span {background:#f7f8e3;color:#c97600;padding:3px;display:inline-block;border-radius:5px;margin-right:5px;font-weight:normal;font-size:0.8em} +#poll_result_wcmt {border:1px solid #cfd4db;margin-bottom:10px} +#poll_result_wcmt input {border:0;height:80px;padding:10px} +#poll_result_cmt .btn_submit {padding:0 20px;float:right} + +.poll_guest input {border: 1px solid #cfd4db;padding:10px;margin-bottom:10px;display:inline-block} + +.poll_cmt_del {float:right} +.poll_cmt_del a {display:inline-block;margin:0 0 5px 10px;color:#c7c9cb;font-size:15px} +.poll_cmt_del:hover a {color:#3a8afd} + +#poll_result_oth {clear:both;margin:20px} +#poll_result_oth h2 {padding:0 0 10px} +#poll_result_oth ul {margin:0;padding:0;list-style:none;border:1px solid #ddd;background:#fff;border-top:0} +#poll_result_oth ul li{border-top:1px solid #eaeaea;position:relative;line-height:20px} +#poll_result_oth a {display:block;padding:10px} +#poll_result_oth li span {position:absolute;bottom:10px;right:15px;color:#777;font-size:0.92em} diff --git a/theme/basic/skin/qa/basic/list.skin.php b/theme/basic/skin/qa/basic/list.skin.php index 56df884ee..47fdfb615 100644 --- a/theme/basic/skin/qa/basic/list.skin.php +++ b/theme/basic/skin/qa/basic/list.skin.php @@ -41,6 +41,11 @@ add_stylesheet('', 0); 게시물 검색 + + +
                  diff --git a/theme/basic/skin/qa/basic/style.css b/theme/basic/skin/qa/basic/style.css index 7f12e4e41..4c0abb64a 100644 --- a/theme/basic/skin/qa/basic/style.css +++ b/theme/basic/skin/qa/basic/style.css @@ -2,89 +2,18 @@ /* ### 기본 스타일 커스터마이징 시작 ### */ /* 게시판 버튼 */ -/* 목록 버튼 */ -#bo_list a.btn_b01 {} -#bo_list a.btn_b01:focus, #bo_list a.btn_b01:hover {} -#bo_list a.btn_b02 {} -#bo_list a.btn_b02:focus, #bo_list a.btn_b02:hover {} -#bo_list a.btn_admin {} /* 관리자 전용 버튼 */ -#bo_list a.btn_admin:focus, #bo_list .btn_admin:hover {} - -/* 읽기 버튼 */ -#bo_v a.btn_b01 {} -#bo_v a.btn_b01:focus, #bo_v a.btn_b01:hover {} -#bo_v a.btn_b02 {} -#bo_v a.btn_b02:focus, #bo_v a.btn_b02:hover {} -#bo_v a.btn_admin {} /* 관리자 전용 버튼 */ -#bo_v a.btn_admin:focus, #bo_v a.btn_admin:hover {} - /* 쓰기 버튼 */ -#bo_w .btn_confirm {} /* 서식단계 진행 */ #bo_w .btn_submit {padding:0 20px;font-size:1.167em} -#bo_w button.btn_submit {} -#bo_w fieldset .btn_submit {} #bo_w .btn_cancel {font-size:1.167em;border-radius:3px} -#bo_w button.btn_cancel {} -#bo_w .btn_cancel:focus, #bo_w .btn_cancel:hover {} -#bo_w a.btn_frmline, #bo_w button.btn_frmline {} /* 우편번호검색버튼 등 */ -#bo_w button.btn_frmline {} /* 기본 테이블 */ /* 목록 테이블 */ #bo_list {position:relative} #bo_list:after {display:block;visibility:hidden;clear:both;content:""} -#bo_list .tbl_head01 {} -#bo_list .tbl_head01 caption {} -#bo_list .tbl_head01 thead th {} -#bo_list .tbl_head01 thead a {} -#bo_list .tbl_head01 thead th input {} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ -#bo_list .tbl_head01 tfoot th {} -#bo_list .tbl_head01 tfoot td {} -#bo_list .tbl_head01 tbody th {} -#bo_list .tbl_head01 td {} -#bo_list .tbl_head01 a {} -#bo_list td.empty_table {} #bo_list tbody .even td {background:#fbfbfb} -/* 읽기 내 테이블 */ -#bo_v .tbl_head01 {} -#bo_v .tbl_head01 caption {} -#bo_v .tbl_head01 thead th {} -#bo_v .tbl_head01 thead a {} -#bo_v .tbl_head01 thead th input {} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ -#bo_v .tbl_head01 tfoot th {} -#bo_v .tbl_head01 tfoot td {} -#bo_v .tbl_head01 tbody th {} -#bo_v .tbl_head01 td {} -#bo_v .tbl_head01 a {} -#bo_v td.empty_table {} - /* 쓰기 테이블 */ #bo_w h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} -#bo_w table {} -#bo_w caption {} -#bo_w .frm_info {} -#bo_w .frm_address {} -#bo_w .frm_file {} - -#bo_w .tbl_frm01 {} -#bo_w .tbl_frm01 th {} -#bo_w .tbl_frm01 td {} -#bo_w .tbl_frm01 textarea, #bo_w tbl_frm01 .frm_input {} -#bo_w .tbl_frm01 textarea {} -#bo_w .tbl_frm01 a {} - -/* 필수입력 */ -#bo_w .required, #bo_w textarea.required {} - -#bo_w .cke_sc {} -#bo_w button.btn_cke_sc {} -#bo_w .cke_sc_def {} -#bo_w .cke_sc_def dl {} -#bo_w .cke_sc_def dl:after {} -#bo_w .cke_sc_def dt, #bo_w .cke_sc_def dd {} -#bo_w .cke_sc_def dt {} -#bo_w .cke_sc_def dd {} /* ### 기본 스타일 커스터마이징 끝 ### */ @@ -182,7 +111,7 @@ box-shadow:inset 0 2px 5px rgb(33, 135, 202)} .bo_sch select {border:0;width:100%;height:40px;border:1px solid #d0d3db;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); -moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)} -.bo_sch .sch_bar {display:inline-block;width:100%;clear:both;border:1px solid #d0d3db;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +.bo_sch .sch_bar {display:inline-block;width:100%;clear:both;margin-top:15px;border:1px solid #d0d3db;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); -moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)} .bo_sch .sch_input {width:250px;height:38px;border:0;padding:0;background-color:transparent;float:left} diff --git a/theme/basic/skin/qa/basic/view.skin.php b/theme/basic/skin/qa/basic/view.skin.php index a8db766a5..a47b8528d 100644 --- a/theme/basic/skin/qa/basic/view.skin.php +++ b/theme/basic/skin/qa/basic/view.skin.php @@ -123,7 +123,7 @@ add_stylesheet('', 0); diff --git a/theme/basic/skin/shop/basic/boxbanner.skin.php b/theme/basic/skin/shop/basic/boxbanner.skin.php new file mode 100644 index 000000000..ca479c497 --- /dev/null +++ b/theme/basic/skin/shop/basic/boxbanner.skin.php @@ -0,0 +1,48 @@ +', 0); +add_javascript('', 10); +?> + +

                  쇼핑몰 배너

                  '.PHP_EOL; +?> + + diff --git a/theme/basic/skin/shop/basic/boxcart.skin.php b/theme/basic/skin/shop/basic/boxcart.skin.php new file mode 100644 index 000000000..225a93c5b --- /dev/null +++ b/theme/basic/skin/shop/basic/boxcart.skin.php @@ -0,0 +1,82 @@ +', 0); +$cart_action_url = G5_SHOP_URL.'/cartupdate.php'; +?> + + + + + + diff --git a/theme/basic/skin/shop/basic/boxcategory.skin.php b/theme/basic/skin/shop/basic/boxcategory.skin.php new file mode 100644 index 000000000..1496911c5 --- /dev/null +++ b/theme/basic/skin/shop/basic/boxcategory.skin.php @@ -0,0 +1,44 @@ +', 0); + +$mshop_categories = get_shop_category_array(true); +?> + + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/boxcommunity.skin.php b/theme/basic/skin/shop/basic/boxcommunity.skin.php new file mode 100644 index 000000000..042f59e2f --- /dev/null +++ b/theme/basic/skin/shop/basic/boxcommunity.skin.php @@ -0,0 +1,25 @@ +', 0); +?> + + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/boxevent.skin.php b/theme/basic/skin/shop/basic/boxevent.skin.php new file mode 100644 index 000000000..376517b9b --- /dev/null +++ b/theme/basic/skin/shop/basic/boxevent.skin.php @@ -0,0 +1,77 @@ +', 0); +?> +
                  +
                  +

                  이벤트

                  +
                  +
                    +
                    '; + $href = G5_SHOP_URL.'/event.php?ev_id='.$row['ev_id']; + + $event_img = G5_DATA_PATH.'/event/'.$row['ev_id'].'_m'; // 이벤트 이미지 + + if (file_exists($event_img)) { // 이벤트 이미지가 있다면 이미지 출력 + echo ''.$row['ev_subject'].''.PHP_EOL; + } else { // 없다면 텍스트 출력 + echo ''; + if ($row['ev_subject_strong']) echo ''; + echo $row['ev_subject']; + if ($row['ev_subject_strong']) echo ''; + echo ''.PHP_EOL; + } + + // 이벤트 상품 + $sql2 = " select b.* + from `{$g5['g5_shop_event_item_table']}` a left join `{$g5['g5_shop_item_table']}` b on (a.it_id = b.it_id) + where a.ev_id = '{$row['ev_id']}' + order by it_id desc + limit 0, 3 "; + $result2 = sql_query($sql2); + for($k=1; $row2=sql_fetch_array($result2); $k++) { + if($k == 1) { + echo '
                      '.PHP_EOL; + } + + $item_href = shop_item_url($row2['it_id']); + + echo '
                    • '.PHP_EOL; + echo ''.get_it_image($row2['it_id'], 110, 110, get_text($row2['it_name'])).''.PHP_EOL; + echo '
                      '.get_text(cut_str($row2['it_name'], 30)).''.PHP_EOL; + echo ''.display_price(get_price($row2), $row2['it_tel_inq']).'
                      '.PHP_EOL; + echo '
                    • '.PHP_EOL; + } + if($k > 1) { + echo '
                    • 더보기
                    • '.PHP_EOL; + echo '
                    '.PHP_EOL; + } + + if($k == 1) { + echo '
                      '.PHP_EOL; + echo '
                    • 등록된 상품이 없습니다.
                    • '.PHP_EOL; + echo '
                    '.PHP_EOL; + } + //echo '더보기'.PHP_EOL; + echo '
                    '.PHP_EOL; + echo ''.PHP_EOL; + + } + + if ($i==0) + echo '
                  • 이벤트 없음
                  • '.PHP_EOL; + ?> +
                  +
                  +', 0); +?> + + +
                  +

                  오늘 본 상품

                  + + + '.PHP_EOL; + echo '
                • '.PHP_EOL; + echo '
                  '; + echo $img; + echo '
                  '.PHP_EOL; + echo '
                  '; + echo ''; + echo cut_str($it_name, 10, '').PHP_EOL; + echo ''; + echo ''; + echo $print_price.PHP_EOL; + echo ''.PHP_EOL; + echo '
                  '.PHP_EOL; + echo '
                • '.PHP_EOL; + + $tv_tot_count++; + $i++; + } + if ($tv_tot_count > 0) echo ''.PHP_EOL; + ?> +
                  + + + + + + +

                  없음

                  + + +
                  + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/boxwish.skin.php b/theme/basic/skin/shop/basic/boxwish.skin.php new file mode 100644 index 000000000..4736de9bf --- /dev/null +++ b/theme/basic/skin/shop/basic/boxwish.skin.php @@ -0,0 +1,42 @@ +', 0); +?> + + + + diff --git a/theme/basic/skin/shop/basic/couponzone.10.skin.php b/theme/basic/skin/shop/basic/couponzone.10.skin.php new file mode 100644 index 000000000..0f300f019 --- /dev/null +++ b/theme/basic/skin/shop/basic/couponzone.10.skin.php @@ -0,0 +1,208 @@ +', 0); +?> + +
                  +

                  다운로드 쿠폰

                  +

                  회원이시라면 쿠폰 다운로드 후 바로 사용하실 수 있습니다.

                  + + '.get_text($row3['it_name']).''; + $coupon_info_class = 'cp_2'; + break; + case '1': + $sql3 = " select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '{$row['cp_target']}' "; + $row3 = sql_fetch($sql3); + $cp_target = '카테고리할인'; + $cp_link = ''.get_text($row3['ca_name']).''; + $coupon_info_class = 'cp_1'; + break; + case '2': + $cp_link = $cp_target = '주문금액할인'; + $coupon_info_class = 'cp_3'; + break; + case '3': + $cp_link = $cp_target = '배송비할인'; + $coupon_info_class = 'cp_4'; + break; + } + + // 다운로드 쿠폰인지 + $disabled = ''; + if(is_coupon_downloaded($member['mb_id'], $row['cz_id'])) + $disabled = ' disabled'; + + // $row['cp_type'] 값이 있으면 % 이며 없으면 원 입니다. + $print_cp_price = $row['cp_type'] ? ''.$row['cp_price'].' %' : ''.number_format($row['cp_price']).' 원'; + + $coupon .= '
                • '.PHP_EOL; + $coupon .= '
                  '.PHP_EOL; + $coupon .= '
                  '.$subj.''.PHP_EOL; + $coupon .= '
                  '.$subj.'
                  '.$print_cp_price.'
                  '.PHP_EOL; + $coupon .= '
                  '.PHP_EOL; + $coupon .= '
                  '.PHP_EOL; + $coupon .= '
                  '.PHP_EOL; + $coupon .= '적용'.PHP_EOL; + $coupon .= '
                  +

                  '.$cp_target.'

                  +
                    +
                  • 적용 : '.$cp_link.'
                  • '; + + if( $row['cp_minimum'] ){ // 쿠폰에 최소주문금액이 있다면 + $coupon .= '
                  • 최소주문금액 : '.number_format($row['cp_minimum']).'
                  • '; + } + + $coupon .='
                  + +
                  '.PHP_EOL; + $coupon .= '
                  '.PHP_EOL; + $coupon .= '
                  기한다운로드 후 '.number_format($row['cz_period']).'일
                  '.PHP_EOL; + //cp_1 카테고리할인 + //cp_2 개별상품할인 + //cp_3 주문금액할인 + //cp_4 배송비할인 + $coupon .= '
                  '.PHP_EOL; + $coupon .= '
                  '.PHP_EOL; + $coupon .= '
                  '.PHP_EOL; + $coupon .= '
                • '.PHP_EOL; + } + + if($coupon) + echo '
                    '.PHP_EOL.$coupon.'
                  '.PHP_EOL; + else + echo '

                  사용할 수 있는 쿠폰이 없습니다.

                  '; + ?> +
                  + +
                  +

                  포인트 쿠폰

                  +

                  보유하신 회원 포인트를 쿠폰으로 교환하실 수 있습니다.

                  + + '.get_text($row3['it_name']).''; + $cp_target = '개별상품할인'; + $coupon_info_class = 'cp_2'; + break; + case '1': + $sql3 = " select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id = '{$row['cp_target']}' "; + $row3 = sql_fetch($sql3); + $cp_link = ''.get_text($row3['ca_name']).''; + $cp_target = '카테고리할인'; + $coupon_info_class = 'cp_1'; + break; + case '2': + $cp_link = $cp_target = '주문금액할인'; + $coupon_info_class = 'cp_3'; + break; + case '3': + $cp_link = $cp_target = '배송비할인'; + $coupon_info_class = 'cp_4'; + break; + } + + // 다운로드 쿠폰인지 + $disabled = ''; + if(is_coupon_downloaded($member['mb_id'], $row['cz_id'])) + $disabled = ' disabled'; + + // $row['cp_type'] 값이 있으면 % 이며 없으면 원 입니다. + $print_cp_price = $row['cp_type'] ? ''.$row['cp_price'].' %' : ''.number_format($row['cp_price']).' 원'; + + $coupon .= '
                • '.PHP_EOL; + $coupon .= '
                  '.PHP_EOL; + $coupon .= '
                  '.$subj.''.PHP_EOL; + $coupon .= '
                  '.$subj.'
                  '.$print_cp_price.'
                  '.PHP_EOL; + $coupon .= '
                  '.PHP_EOL; + $coupon .= '
                  '.PHP_EOL; + + $coupon .= '
                  '.PHP_EOL; + $coupon .= '적용'.PHP_EOL; + + $coupon .= '
                  +

                  '.$cp_target.'

                  +
                    +
                  • 적용 : '.$cp_link.'
                  • '; + + if( $row['cp_minimum'] ){ // 쿠폰에 최소주문금액이 있다면 + $coupon .= '
                  • 최소주문금액 : '.number_format($row['cp_minimum']).'
                  • '; + } + + $coupon .= '
                  + +
                  '.PHP_EOL; + + $coupon .= '
                  '.PHP_EOL; + + $coupon .= '
                  기한다운로드 후 '.number_format($row['cz_period']).'일
                  '.PHP_EOL; + $coupon .= '
                  '.PHP_EOL; + + $coupon .= '
                  '.PHP_EOL; + $coupon .= '
                  '.PHP_EOL; + $coupon .= '
                • '.PHP_EOL; + } + + if($coupon) + echo '
                    '.PHP_EOL.$coupon.'
                  '.PHP_EOL; + else + echo '

                  사용할 수 있는 쿠폰이 없습니다.

                  '; + ?> +
                  + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/img/btn_next.png b/theme/basic/skin/shop/basic/img/btn_next.png new file mode 100644 index 000000000..2cfd49355 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/btn_next.png differ diff --git a/theme/basic/skin/shop/basic/img/btn_prev.png b/theme/basic/skin/shop/basic/img/btn_prev.png new file mode 100644 index 000000000..4fdda6491 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/btn_prev.png differ diff --git a/theme/basic/skin/shop/basic/img/btn_sb_next.png b/theme/basic/skin/shop/basic/img/btn_sb_next.png new file mode 100644 index 000000000..2cfd49355 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/btn_sb_next.png differ diff --git a/theme/basic/skin/shop/basic/img/btn_sb_prev.png b/theme/basic/skin/shop/basic/img/btn_sb_prev.png new file mode 100644 index 000000000..4fdda6491 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/btn_sb_prev.png differ diff --git a/theme/basic/skin/shop/basic/img/chk.png b/theme/basic/skin/shop/basic/img/chk.png new file mode 100644 index 000000000..2841a67f3 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/chk.png differ diff --git a/theme/basic/skin/shop/basic/img/facebook.png b/theme/basic/skin/shop/basic/img/facebook.png new file mode 100644 index 000000000..cf737d633 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/facebook.png differ diff --git a/theme/basic/skin/shop/basic/img/gnb_bg.png b/theme/basic/skin/shop/basic/img/gnb_bg.png new file mode 100644 index 000000000..419b3a2c0 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/gnb_bg.png differ diff --git a/theme/basic/skin/shop/basic/img/gplus.png b/theme/basic/skin/shop/basic/img/gplus.png new file mode 100644 index 000000000..8ab2fa6bc Binary files /dev/null and b/theme/basic/skin/shop/basic/img/gplus.png differ diff --git a/theme/basic/skin/shop/basic/img/icon_arw_toleft.gif b/theme/basic/skin/shop/basic/img/icon_arw_toleft.gif new file mode 100644 index 000000000..a9d338b5e Binary files /dev/null and b/theme/basic/skin/shop/basic/img/icon_arw_toleft.gif differ diff --git a/theme/basic/skin/shop/basic/img/icon_secret.gif b/theme/basic/skin/shop/basic/img/icon_secret.gif new file mode 100644 index 000000000..c04899f14 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/icon_secret.gif differ diff --git a/theme/basic/skin/shop/basic/img/is_button.gif b/theme/basic/skin/shop/basic/img/is_button.gif new file mode 100644 index 000000000..15f3c87aa Binary files /dev/null and b/theme/basic/skin/shop/basic/img/is_button.gif differ diff --git a/theme/basic/skin/shop/basic/img/personal.jpg b/theme/basic/skin/shop/basic/img/personal.jpg new file mode 100644 index 000000000..c8956ecb7 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/personal.jpg differ diff --git a/theme/basic/skin/shop/basic/img/sbn_btn.png b/theme/basic/skin/shop/basic/img/sbn_btn.png new file mode 100644 index 000000000..ebd38ec94 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/sbn_btn.png differ diff --git a/theme/basic/skin/shop/basic/img/sct_bg_toright.gif b/theme/basic/skin/shop/basic/img/sct_bg_toright.gif new file mode 100644 index 000000000..1617dc32f Binary files /dev/null and b/theme/basic/skin/shop/basic/img/sct_bg_toright.gif differ diff --git a/theme/basic/skin/shop/basic/img/select_arrow.png b/theme/basic/skin/shop/basic/img/select_arrow.png new file mode 100644 index 000000000..3ba8b7389 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/select_arrow.png differ diff --git a/theme/basic/skin/shop/basic/img/select_arrow_left.png b/theme/basic/skin/shop/basic/img/select_arrow_left.png new file mode 100644 index 000000000..9e729ff41 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/select_arrow_left.png differ diff --git a/theme/basic/skin/shop/basic/img/select_arrow_next.png b/theme/basic/skin/shop/basic/img/select_arrow_next.png new file mode 100644 index 000000000..f9ca78b70 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/select_arrow_next.png differ diff --git a/theme/basic/skin/shop/basic/img/select_arrow_prev.png b/theme/basic/skin/shop/basic/img/select_arrow_prev.png new file mode 100644 index 000000000..75d70dca7 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/select_arrow_prev.png differ diff --git a/theme/basic/skin/shop/basic/img/select_arrow_right.png b/theme/basic/skin/shop/basic/img/select_arrow_right.png new file mode 100644 index 000000000..f70cff766 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/select_arrow_right.png differ diff --git a/theme/basic/skin/shop/basic/img/sit_siblings.jpg b/theme/basic/skin/shop/basic/img/sit_siblings.jpg new file mode 100644 index 000000000..41555fd18 Binary files /dev/null and b/theme/basic/skin/shop/basic/img/sit_siblings.jpg differ diff --git a/theme/basic/skin/shop/basic/img/twitter.png b/theme/basic/skin/shop/basic/img/twitter.png new file mode 100644 index 000000000..8fbf0914b Binary files /dev/null and b/theme/basic/skin/shop/basic/img/twitter.png differ diff --git a/theme/basic/skin/shop/basic/img/use_reply.png b/theme/basic/skin/shop/basic/img/use_reply.png new file mode 100644 index 000000000..14a3908ad Binary files /dev/null and b/theme/basic/skin/shop/basic/img/use_reply.png differ diff --git a/theme/basic/skin/shop/basic/item.form.skin.php b/theme/basic/skin/shop/basic/item.form.skin.php new file mode 100644 index 000000000..4f1095fb6 --- /dev/null +++ b/theme/basic/skin/shop/basic/item.form.skin.php @@ -0,0 +1,528 @@ +', 0); +?> +
                  +
                  + + + + +
                  + +
                  +
                  + '.$img.''; + } + } + + if($big_img_count == 0) { + echo ''; + } + ?> + 확대보기 +
                  + 0) { + echo ''; + } + ?> +
                  + + + +
                  +

                  요약정보 및 구매

                  +

                  + +

                  + 상품 선택옵션 개, 추가옵션 개 +

                  + + +
                  + + 고객평점 + + + + + 사용후기 + +
                  + 위시리스트 + +
                  + + 추천하기 +
                  +
                  +
                  + + +
                  +
                  개인정보처리방침안내개인정보 수집 및 이용
                  목적
                  이용자 식별 및 본인여부 확인아이디, 이름, 비밀번호아이디, 이름, 비밀번호 회원 탈퇴 시까지
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */ + ?> + + + + + + + + 배송비결제'; + $sc_method = ''; + } + else + $sc_method = '주문시 결제'; + } + ?> + + + + + + + + + + + + + + + + + +
                  판매가격판매중지
                  판매가격전화문의
                  시중가격
                  판매가격 + + +
                  제조사
                  원산지
                  브랜드
                  모델
                  재고수량
                  포인트 + +
                  최소구매수량
                  최대구매수량
                  +
                  + + +
                  +

                  선택옵션

                  + + +
                  + + + + + +
                  +

                  추가옵션

                  + +
                  + + + + + +
                  +

                  선택된 옵션

                  + +
                    +
                  • + + + + + +
                    + +
                    +
                    + + + + + +0원 +
                    +
                  • +
                  + + +
                  + + + +
                  + + + +

                  상품의 재고가 부족하여 구매할 수 없습니다.

                  + + +
                  + + + + + 위시리스트 + + + 재입고알림 + + +
                  + +
                  + + +
                  + +
                  + +
                  + 이 분류에 등록된 다른 상품이 없습니다.'; + } + ?> +
                  + + + + + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/item.info.skin.php b/theme/basic/skin/shop/basic/item.info.skin.php new file mode 100644 index 000000000..722c20faf --- /dev/null +++ b/theme/basic/skin/shop/basic/item.info.skin.php @@ -0,0 +1,337 @@ +', 0); +?> + + + + + +
                  +

                  관련상품

                  + set_query($sql); + echo $list->run(); + ?> +
                  + + + +
                  +
                  +
                    +
                  • +
                  • +
                  • +
                  • +
                  +
                    + + +
                  • +

                    상품 정보

                    + + +

                    상품 상세설명

                    +
                    + +
                    + + + +

                    상품 정보 고시

                    + + + $val) { + $ii_title = $info_array[$key][0]; + $ii_value = $val; + ?> + + + + + + +
                    + + 상품 정보 고시 정보가 올바르게 저장되지 않았습니다.
                    config.php 파일의 G5_ESCAPE_FUNCTION 설정을 addslashes 로
                    변경하신 후 관리자 > 상품정보 수정에서 상품 정보를 다시 저장해주세요.

                    '; + } + } + } //if + ?> + +
                  • + +
                  • +

                    사용후기

                    +
                    +
                  • + + + +
                  • +

                    상품문의

                    +
                    +
                  • + + + +
                  • +

                    배송/교환정보

                    + + + +
                    +

                    배송

                    + +
                    + + + + + +
                    +

                    교환

                    + +
                    + + + +
                  • + +
                  +
                  + +
                  +
                  + + +
                  +

                  선택옵션

                  + +
                  + + + + + +
                  +

                  추가옵션

                  + +
                  + + + + + +
                  +

                  선택된 옵션

                  +
                    + +
                  • +
                    + +
                    +
                    + + + + + +0원 +
                    +
                  • + +
                  +
                  + + +
                  +
                  + +
                  + + +
                  +
                  + + +
                  +
                  +
                  + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/itemqa.skin.php b/theme/basic/skin/shop/basic/itemqa.skin.php new file mode 100644 index 000000000..9e4741463 --- /dev/null +++ b/theme/basic/skin/shop/basic/itemqa.skin.php @@ -0,0 +1,143 @@ +', 0); +?> + + + + +
                  +

                  등록된 상품문의

                  + + + + '; + + if($is_admin || $member['mb_id' ] == $row['mb_id']) { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } else { + $iq_question = '비밀글로 보호된 문의입니다.'; + $is_secret = true; + } + } else { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } + $iq_time = substr($row['iq_time'], 2, 8); + + $hash = md5($row['iq_id'].$row['iq_time'].$row['iq_ip']); + + $iq_stats = ''; + $iq_style = ''; + $iq_answer = ''; + + if ($row['iq_answer']) + { + $iq_answer = get_view_thumbnail(conv_content($row['iq_answer'], 1), $thumbnail_width); + $iq_stats = '답변완료'; + $iq_style = 'sit_qaa_done'; + $is_answer = true; + } else { + $iq_stats = '답변대기'; + $iq_style = 'sit_qaa_yet'; + $iq_answer = '답변이 등록되지 않았습니다.'; + $is_answer = false; + } + + if ($i == 0) echo '
                    '; + ?> + +
                  1. + +
                    +
                    작성자/작성일
                    +
                    +
                    + +
                    +
                    +
                    + 문의내용 + Q + +
                    + +
                    + 답변 + A + +
                    + +
                    + + + + +
                    +
                  2. + + 0) echo '
                  '; + + if (!$i) echo '

                  상품문의가 없습니다.

                  '; + ?> +
                  + + + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/itemqaform.skin.php b/theme/basic/skin/shop/basic/itemqaform.skin.php new file mode 100644 index 000000000..a5797fc0a --- /dev/null +++ b/theme/basic/skin/shop/basic/itemqaform.skin.php @@ -0,0 +1,62 @@ +', 0); +?> + + +
                  +

                  상품문의 쓰기

                  + +
                  + + + + +
                  +
                    +
                  • + 옵션 + class="selec_chk"> + +
                  • +
                  • +
                    + +
                    + 이메일을 입력하시면 답변 등록 시 답변이 이메일로 전송됩니다. +
                    +
                    + +
                    + 휴대폰번호를 입력하시면 답변 등록 시 답변등록 알림이 SMS로 전송됩니다. +
                    +
                  • +
                  • + + +
                  • +
                  • + + +
                  • +
                  + +
                  + + +
                  +
                  +
                  +
                  + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/itemqalist.skin.php b/theme/basic/skin/shop/basic/itemqalist.skin.php new file mode 100644 index 000000000..d70285924 --- /dev/null +++ b/theme/basic/skin/shop/basic/itemqalist.skin.php @@ -0,0 +1,144 @@ +', 0); +?> + + + + + +
                  +
                  + + +
                  + + + +
                  + 전체보기 +
                  +
                  + +
                  + + '; + + if($is_admin || $member['mb_id' ] == $row['mb_id']) { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } else { + $iq_question = '비밀글로 보호된 문의입니다.'; + $is_secret = true; + } + } else { + $iq_question = get_view_thumbnail(conv_content($row['iq_question'], 1), $thumbnail_width); + } + + $it_href = shop_item_url($row['it_id']); + + if ($row['iq_answer']) + { + $iq_answer = get_view_thumbnail(conv_content($row['iq_answer'], 1), $thumbnail_width); + $iq_stats = '답변완료'; + $iq_style = 'sit_qaa_done'; + $is_answer = true; + } else { + $iq_stats = '답변대기'; + $iq_style = 'sit_qaa_yet'; + $iq_answer = '답변이 등록되지 않았습니다.'; + $is_answer = false; + } + + if ($i == 0) echo '
                    '; + ?> +
                  1. + + +
                    +

                    + + +
                    +
                    작성자
                    +
                    +
                    작성일
                    +
                    +
                    + + + +
                    +
                    + +
                  2. + 0) echo '
                  '; + if ($i == 0) echo '

                  자료가 없습니다.

                  '; + ?> +
                  + + + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/itemuse.skin.php b/theme/basic/skin/shop/basic/itemuse.skin.php new file mode 100644 index 000000000..1c796be50 --- /dev/null +++ b/theme/basic/skin/shop/basic/itemuse.skin.php @@ -0,0 +1,134 @@ +', 0); +?> + + + + +
                  +

                  등록된 사용후기

                  + +
                  + +

                  구매고객 총평점 (총 건 상품평 기준)

                  + + + +
                  + + '; + ?> + +
                • + +
                  +
                  평점
                  +
                  별<?php echo $is_star; ?>개
                  +
                  +
                  +
                  작성자/작성일
                  +
                  +
                  + + + +
                • + + 0) echo ''; + + if (!$i) echo '

                  사용후기가 없습니다.

                  '; + ?> +
                  + + + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/itemuseform.skin.php b/theme/basic/skin/shop/basic/itemuseform.skin.php new file mode 100644 index 000000000..3072e5cf5 --- /dev/null +++ b/theme/basic/skin/shop/basic/itemuseform.skin.php @@ -0,0 +1,75 @@ +', 0); +?> + + +
                  +

                  사용후기 쓰기

                  + +
                  + + + + +
                  +
                    +
                  • + + +
                  • +
                  • + 내용 + +
                  • +
                  • + 평점 +
                      +
                    • + > + + 매우만족 +
                    • +
                    • + > + + 만족 +
                    • +
                    • + > + + 보통 +
                    • +
                    • + > + + 불만 +
                    • +
                    • + > + + 매우불만 +
                    • +
                    +
                  • +
                  + +
                  + + +
                  +
                  +
                  +
                  + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/itemuselist.skin.php b/theme/basic/skin/shop/basic/itemuselist.skin.php new file mode 100644 index 000000000..f78588f93 --- /dev/null +++ b/theme/basic/skin/shop/basic/itemuselist.skin.php @@ -0,0 +1,165 @@ +', 0); +?> + + + + +
                  +
                  + + +
                  + + + +
                  + 전체보기 +
                  +
                  + +
                  + + '; + ?> +
                • +
                  +
                  + + + + + +
                  +
                  + +
                  + 평가점수 + 별<?php echo $star; ?>개 + + + + + +
                  +
                  +
                  작성자
                  +
                  +
                  작성일
                  +
                  +
                  + + + + +
                  +
                  +

                  사용후기

                  +
                  +
                  + +
                  +
                  작성자
                  +
                  +
                  작성일
                  +
                  +
                  +
                  +
                  + + + 평가점수별<?php echo $star; ?>개 +
                  + +
                  + + +
                  +
                  +

                  +
                  + +
                  +
                  + +
                  +
                  +
                  + +
                  +
                  + +
                  +
                  + +
                  +
                  +
                • + 0) echo ''; + if ($i == 0) echo '

                  자료가 없습니다.

                  '; + ?> +
                  + + + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/largeimage.skin.php b/theme/basic/skin/shop/basic/largeimage.skin.php new file mode 100644 index 000000000..21f0759a0 --- /dev/null +++ b/theme/basic/skin/shop/basic/largeimage.skin.php @@ -0,0 +1,93 @@ +', 0); +?> + +
                  +

                  상품 이미지 새창 보기

                  +
                  + $imgs){ + $thumbnails[$i] = $imgs['thumb']; + ?> + + + + + + +
                  + + 0) { + echo '
                    '; + foreach($thumbnails as $key=>$val) { + echo '
                  • '.$val.'
                  • '; + } + echo '
                  '; + } + ?> +
                  + +
                  +
                  + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/list.10.skin.php b/theme/basic/skin/shop/basic/list.10.skin.php new file mode 100644 index 000000000..5d038bce8 --- /dev/null +++ b/theme/basic/skin/shop/basic/list.10.skin.php @@ -0,0 +1,166 @@ +', 0); + +// 장바구니 또는 위시리스트 ajax 스크립트 +add_javascript('', 10); +?> + + +view_star = (method_exists($this, 'view_star')) ? $this->view_star : true; + +foreach((array) $list as $row){ + if( empty($row) ) continue; + + $item_link_href = shop_item_url($row['it_id']); // 상품링크 + $star_score = $row['it_use_avg'] ? (int) get_star($row['it_use_avg']) : ''; //사용자후기 평균별점 + $list_mod = $this->list_mod; // 분류관리에서 1줄당 이미지 수 값 또는 파일에서 지정한 가로 수 + $is_soldout = is_soldout($row['it_id'], true); // 품절인지 체크 + + $classes = array(); + + $classes[] = 'col-row-'.$list_mod; + + if( $i && ($i % $list_mod == 0) ){ + $classes[] = 'row-clear'; + } + + $i++; // 변수 i 를 증가 + + if ($i === 1) { + if ($this->css) { + echo "
                    css}\">\n"; + } else { + echo "
                      \n"; + } + } + + echo "
                    • \n"; + echo "
                      \n"; + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_img) { + echo get_it_image($row['it_id'], $this->img_width, $this->img_height, '', '', stripslashes($row['it_name']))."\n"; + } + + if ($this->href) { + echo "\n"; + } + + if ( !$is_soldout ){ // 품절 상태가 아니면 출력합니다. + echo "
                      + \n"; + echo "
                      \n"; + } + + echo "
                      \n"; + + if ($this->view_it_icon) { + // 품절 + if ($is_soldout) { + echo 'SOLD OUT'; + } + } + echo "
                      \n"; + + echo "
                      \n"; + + // 사용후기 평점표시 + if ($this->view_star && $star_score) { + echo "
                      고객평점\"별점
                      \n"; + } + + if ($this->view_it_id) { + echo "
                      <".stripslashes($row['it_id']).">
                      \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
                      ".stripslashes($row['it_basic'])."
                      \n"; + } + + echo "
                      \n"; + + if ($this->view_it_cust_price || $this->view_it_price) { + + echo "
                      \n"; + if ($this->view_it_price) { + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + } + if ($this->view_it_cust_price && $row['it_cust_price']) { + echo "".display_price($row['it_cust_price'])."\n"; + } + echo "
                      \n"; + } + + // 위시리스트 + 공유 버튼 시작 + echo "
                      \n"; + echo "\n"; + if ($this->view_sns) { + echo "\n"; + } + + echo "
                      "; + if ($this->view_sns) { + $sns_top = $this->img_height + 10; + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
                      "; + echo "

                      SNS 공유

                      "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/facebook.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/twitter.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/gplus.png'); + echo ""; + echo "
                      \n"; + } + echo "
                      "; + echo "
                      \n"; + // 위시리스트 + 공유 버튼 끝 + + echo "
                      "; + + if ($this->view_it_icon) { + echo "
                      ".item_icon($row)."
                      \n"; + } + + echo "
                      \n"; + + echo "
                    • \n"; +} //end foreach + +if ($i >= 1) echo "
                    \n"; + +if($i === 0) echo "

                    등록된 상품이 없습니다.

                    \n"; +?> + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/list.20.skin.php b/theme/basic/skin/shop/basic/list.20.skin.php new file mode 100644 index 000000000..c03116805 --- /dev/null +++ b/theme/basic/skin/shop/basic/list.20.skin.php @@ -0,0 +1,106 @@ +', 0); +?> + + +list_mod >= 2) { // 1줄 이미지 : 2개 이상 + if ($i%$this->list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$this->list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
                      css}\">\n"; + } else { + echo "\n"; + +if($i == 0) echo "

                      등록된 상품이 없습니다.

                      \n"; +?> + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/list.30.skin.php b/theme/basic/skin/shop/basic/list.30.skin.php new file mode 100644 index 000000000..303566363 --- /dev/null +++ b/theme/basic/skin/shop/basic/list.30.skin.php @@ -0,0 +1,117 @@ +', 0); +?> + + += 2) { // 1줄 이미지 : 2개 이상 + if ($i%$list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
                        css}\">\n"; + } else { + echo "
                          \n"; + } + } + + $list_top_pad = 20; + $list_right_pad = 10; + $list_bottom_pad = 20; + $list_left_pad = $this->img_width + 10; + $list_real_width = 360; + $list_width = $list_real_width - $list_right_pad - $list_left_pad; + $list_height = $this->img_height - $list_top_pad - $list_bottom_pad; + + echo "
                        • \n"; + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_icon) { + echo "
                          ".item_icon($row)."
                          \n"; + } + + if ($this->view_it_id) { + echo "
                          <".stripslashes($row['it_id']).">
                          \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
                          ".stripslashes($row['it_basic'])."
                          \n"; + } + + if ($this->view_it_cust_price || $this->view_it_price) { + + echo "
                          \n"; + + if ($this->view_it_cust_price && $row['it_cust_price']) { + echo "".display_price($row['it_cust_price'])."\n"; + } + + if ($this->view_it_price) { + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + } + + echo "
                          \n"; + + } + + if ($this->view_sns) { + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
                          "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/sns_fb_s.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/sns_twt_s.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/sns_goo_s.png'); + echo "
                          \n"; + } + + $arrow_left = $this->img_width - 10; + echo "
                          "; + + echo "
                        • \n"; +} + +if ($i >= 1) echo "
                        \n"; + +if($i == 0) echo "

                        등록된 상품이 없습니다.

                        \n"; +?> + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/list.40.skin.php b/theme/basic/skin/shop/basic/list.40.skin.php new file mode 100644 index 000000000..a7152c2cf --- /dev/null +++ b/theme/basic/skin/shop/basic/list.40.skin.php @@ -0,0 +1,137 @@ +', 0); + +// 관련상품 스킨은 사품을 한줄에 하나만 표시하며 해당 상품에 관련상품이 등록되어 있는 경우 기본으로 7개까지 노출합니다. +?> + + += 2) { // 1줄 이미지 : 2개 이상 + if ($i%$list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
                          css}\">\n"; + } else { + echo "
                            \n"; + } + } + + //$list_top_pad = 20; + //$list_right_pad = 10; + //$list_bottom_pad = 20; + //$list_left_pad = $this->img_width + 10; + //$list_real_width = 740; + //$list_width = $list_real_width - $list_right_pad - $list_left_pad; + //$list_height = $this->img_height - $list_top_pad - $list_bottom_pad; + + echo "
                          • \n"; + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_icon) { + echo "
                            ".item_icon($row)."
                            \n"; + } + + if ($this->view_it_id) { + echo "
                            <".stripslashes($row['it_id']).">
                            \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
                            ".stripslashes($row['it_basic'])."
                            \n"; + } + + if ($this->view_it_cust_price || $this->view_it_price) { + + echo "
                            \n"; + + if ($this->view_it_cust_price && $row['it_cust_price']) { + echo "".display_price($row['it_cust_price'])."\n"; + } + + if ($this->view_it_price) { + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + } + + echo "
                            \n"; + + } + + echo "
                            + \n"; + echo "
                            \n"; + + // 위시리스트 + 공유 버튼 시작 + echo "
                            \n"; + echo "\n"; + if ($this->view_sns) { + echo "\n"; + } + + echo "
                            "; + if ($this->view_sns) { + $sns_top = $this->img_height + 10; + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
                            "; + echo "

                            SNS 공유

                            "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/facebook.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/twitter.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/gplus.png'); + echo ""; + echo "
                            \n"; + } + echo "
                            "; + echo "
                            \n"; + // 위시리스트 + 공유 버튼 끝 + + // 관련상품 + echo "
                            ".relation_item($row['it_id'], 70, 0, 5)."
                            \n"; + + echo "
                          • \n"; +} + +if ($i >= 1) echo "
                          \n"; + +if($i == 0) echo "

                          등록된 상품이 없습니다.

                          \n"; +?> + diff --git a/theme/basic/skin/shop/basic/list.sort.skin.php b/theme/basic/skin/shop/basic/list.sort.skin.php new file mode 100644 index 000000000..b5ba4c0fd --- /dev/null +++ b/theme/basic/skin/shop/basic/list.sort.skin.php @@ -0,0 +1,45 @@ +', 0); +?> + + +
                          +

                          상품 정렬

                          + + + + +
                          + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/list.sub.skin.php b/theme/basic/skin/shop/basic/list.sub.skin.php new file mode 100644 index 000000000..0989cdcbe --- /dev/null +++ b/theme/basic/skin/shop/basic/list.sub.skin.php @@ -0,0 +1,12 @@ +', 0); +?> + +
                            +
                          • +
                          • +
                          +'.$row['ca_name'].' ('.$row2['cnt'].')'; + $exists = true; +} + +if ($exists) { + + // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 + add_stylesheet('', 0); +?> + + + + + +'; + if ($cnt) { + $str .= ''.$row['ca_name'].''; + $sql2 = " select ca_id, ca_name from {$g5['g5_shop_category_table']} where ca_id like '{$row['ca_id']}%' and ca_use = '1' and length(ca_id) = $len4 order by ca_order, ca_id "; + $result2 = sql_query($sql2); + $k=0; + while ($row2=sql_fetch_array($result2)) { + $str .= ''.$row2['ca_name'].''; + $k++; + } + } else { + $str .= ''.$row['ca_name'].''; + } + $str .= ''; + $exists = true; + } +} + +if ($exists) { + // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 + add_stylesheet('', 0); +?> + + + + + +'.$row['ca_name'].''; + $exists = true; +} + +if ($exists) { + + // add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 + add_stylesheet('', 0); +?> + + + + + +', 0); +?> + + +list_mod >= 2) { // 1줄 이미지 : 2개 이상 + if ($i%$this->list_mod == 0) $sct_last = 'sct_last'; // 줄 마지막 + else if ($i%$this->list_mod == 1) $sct_last = 'sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = 'sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
                            css}\">\n"; + } else { + echo "\n"; + +if($i == 0) echo "

                            등록된 상품이 없습니다.

                            \n"; +?> + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/main.20.skin.php b/theme/basic/skin/shop/basic/main.20.skin.php new file mode 100644 index 000000000..e6bcf1e5b --- /dev/null +++ b/theme/basic/skin/shop/basic/main.20.skin.php @@ -0,0 +1,280 @@ +', 0); + +/* +상품리스트가 일정 시간마다 위로 롤링되는 스킨 +롤링되기 위해서는 상품이 2줄 이상이어야 함 +*/ +?> + + +
                              +
                            • +
                            • +
                            + + + +1 && $i%$this->list_mod == 0) + $sct_last = ' sct_last'; // 줄 마지막 + + if ($i == 1) { + if ($this->css) { + echo "
                            type}\" class=\"{$this->css}\">\n"; + } else { + echo "
                            type}\" class=\"sct smt_20\">\n"; + } + echo "
                              \n"; + } + + if ($i>1 && $i%$this->list_mod == 1) { + echo "
                            \n"; + echo "\n"; + echo "
                            \n"; +} + +if($i == 0) echo "

                            등록된 상품이 없습니다.

                            \n"; +?> + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/main.30.skin.php b/theme/basic/skin/shop/basic/main.30.skin.php new file mode 100644 index 000000000..548a40f12 --- /dev/null +++ b/theme/basic/skin/shop/basic/main.30.skin.php @@ -0,0 +1,162 @@ +', 0); + +// 관련상품 스킨은 사품을 한줄에 하나만 표시하며 해당 상품에 관련상품이 등록되어 있는 경우 기본으로 7개까지 노출합니다. +add_javascript('', 10); +?> + + += 2) { // 1줄 이미지 : 2개 이상 + if ($i%$list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
                              css}\">\n"; + } else { + echo "
                                \n"; + } + } + + echo "
                              • \n"; + + echo "
                                \n"; + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_img) { + echo get_it_image($row['it_id'], $this->img_width, $this->img_height, '', '', stripslashes($row['it_name']))."\n"; + } + + if ($this->href) { + echo "\n"; + } + + // 할인율 표시 ( 전화문의가 아니며 판매가격 과 시중가격 이 있을때 표시 (시중가격-판매가격)/시중가격*100 ) + if ($row['it_cust_price'] && $row['it_price'] && !$row['it_tel_inq']) { + + $sale_per = round( (((int) $row['it_cust_price'] - get_price($row))/$row['it_cust_price']) * 100 , 1).'%'; + + echo ''.$sale_per.''.PHP_EOL; + } + + if ($this->view_it_icon) { + // 품절 + if (is_soldout($row['it_id'], true)) { + echo 'SOLD OUT'; + } + } + echo "
                                \n"; + + echo "
                                \n"; + + // 사용후기 평점표시 + if ($this->view_star && $star_score) { + echo "
                                고객평점\"별점
                                \n"; + } + + if ($this->view_it_id) { + echo "
                                <".stripslashes($row['it_id']).">
                                \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
                                ".stripslashes($row['it_basic'])."
                                \n"; + } + + if ($this->view_it_cust_price || $this->view_it_price) { + + echo "
                                \n"; + + if ($this->view_it_cust_price && $row['it_cust_price']) { + echo "".display_price($row['it_cust_price'])."\n"; + } + + if ($this->view_it_price) { + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + } + echo "
                                \n"; + } + + + // 위시리스트 + 공유 버튼 시작 { + echo "
                                \n"; + echo "\n"; + if ($this->view_sns) { + echo "\n"; + } + + echo "
                                "; + if ($this->view_sns) { + $sns_top = $this->img_height + 10; + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
                                "; + echo "

                                SNS 공유

                                "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/facebook.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/twitter.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/gplus.png'); + echo ""; + echo "
                                \n"; + } + echo "
                                "; + echo "
                                \n"; + // } 위시리스트 + 공유 버튼 끝 + + echo "
                                \n"; + + if ($this->view_it_icon) { + echo "
                                ".item_icon($row)."
                                \n"; + } + + echo "
                              • \n"; +} + +if ($i >= 1) echo "
                              \n"; + +if($i == 0) echo "

                              등록된 상품이 없습니다.

                              \n"; +?> + + + + diff --git a/theme/basic/skin/shop/basic/main.40.skin.php b/theme/basic/skin/shop/basic/main.40.skin.php new file mode 100644 index 000000000..3893452b0 --- /dev/null +++ b/theme/basic/skin/shop/basic/main.40.skin.php @@ -0,0 +1,154 @@ +', 0); + +// 관련상품 스킨은 사품을 한줄에 하나만 표시하며 해당 상품에 관련상품이 등록되어 있는 경우 기본으로 7개까지 노출합니다. +add_javascript('', 10); +?> + + += 2) { // 1줄 이미지 : 2개 이상 + if ($i%$list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
                                css}\">\n"; + } else { + echo "
                                  \n"; + } + } + + echo "
                                • \n"; + + echo "
                                  \n"; + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_img) { + echo get_it_image($row['it_id'], $this->img_width, $this->img_height, '', '', stripslashes($row['it_name']))."\n"; + } + + if ($this->href) { + echo "\n"; + } + + echo "
                                  + \n"; + echo "
                                  \n"; + + echo "
                                  \n"; + + if ($this->view_it_icon) { + // 품절 + if (is_soldout($row['it_id'], true)) { + echo 'SOLD OUT'; + } + } + echo "
                                  \n"; + + echo "
                                  \n"; + + // 사용후기 평점표시 + if ($this->view_star && $star_score) { + echo "
                                  고객평점\"별점
                                  \n"; + } + + if ($this->view_it_id) { + echo "
                                  <".stripslashes($row['it_id']).">
                                  \n"; + } + + if ($this->href) { + echo "\n"; + } + + if ($this->view_it_basic && $row['it_basic']) { + echo "
                                  ".stripslashes($row['it_basic'])."
                                  \n"; + } + + if ($this->view_it_cust_price || $this->view_it_price) { + + echo "
                                  \n"; + if ($this->view_it_price) { + echo display_price(get_price($row), $row['it_tel_inq'])."\n"; + } + echo "
                                  \n"; + } + + + // 위시리스트 + 공유 버튼 시작 { + echo "
                                  \n"; + echo "\n"; + if ($this->view_sns) { + echo "\n"; + } + + echo "
                                  "; + if ($this->view_sns) { + $sns_top = $this->img_height + 10; + $sns_url = $item_link_href; + $sns_title = get_text($row['it_name']).' | '.get_text($config['cf_title']); + echo "
                                  "; + echo "

                                  SNS 공유

                                  "; + echo get_sns_share_link('facebook', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/facebook.png'); + echo get_sns_share_link('twitter', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/twitter.png'); + echo get_sns_share_link('googleplus', $sns_url, $sns_title, G5_SHOP_SKIN_URL.'/img/gplus.png'); + echo ""; + echo "
                                  \n"; + } + echo "
                                  "; + echo "
                                  \n"; + // } 위시리스트 + 공유 버튼 끝 + + echo "
                                  \n"; + + if ($this->view_it_icon) { + echo "
                                  ".item_icon($row)."
                                  \n"; + } + + echo "
                                • \n"; +} + +if ($i >= 1) echo "
                                \n"; + +if($i == 0) echo "

                                등록된 상품이 없습니다.

                                \n"; +?> + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/main.50.skin.php b/theme/basic/skin/shop/basic/main.50.skin.php new file mode 100644 index 000000000..eb8bfb031 --- /dev/null +++ b/theme/basic/skin/shop/basic/main.50.skin.php @@ -0,0 +1,83 @@ +', 0); +?> + + +1 && $i%$this->list_mod == 0) + $sct_last = ' sct_last'; // 줄 마지막 + if ($i == 1) { + if ($this->css) { + echo "
                                  css}\">\n"; + } else { + echo "\n"; +if($i == 0) echo "

                                  등록된 상품이 없습니다.

                                  \n"; +?> + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/mainbanner.10.skin.php b/theme/basic/skin/shop/basic/mainbanner.10.skin.php new file mode 100644 index 000000000..9146a50a2 --- /dev/null +++ b/theme/basic/skin/shop/basic/mainbanner.10.skin.php @@ -0,0 +1,143 @@ +', 0); +add_javascript('', 10); +add_stylesheet('', 10); + +$max_width = $max_height = 0; +$bn_first_class = ' class="bn_first"'; +$bn_slide_btn = ''; +$bn_sl = ' class="bn_sl"'; +$main_banners = array(); + +for ($i=0; $row=sql_fetch_array($result); $i++) +{ + $main_banners[] = $row; + + // 테두리 있는지 + $bn_border = ($row['bn_border']) ? ' class="sbn_border"' : '';; + // 새창 띄우기인지 + $bn_new_win = ($row['bn_new_win']) ? ' target="_blank"' : ''; + + $bimg = G5_DATA_PATH.'/banner/'.$row['bn_id']; + $item_html = ''; + + if (file_exists($bimg)) + { + $banner = ''; + $size = getimagesize($bimg); + + if($size[2] < 1 || $size[2] > 16) + continue; + + if($max_width < $size[0]) + $max_width = $size[0]; + + if($max_height < $size[1]) + $max_height = $size[1]; + + $item_html .= ''; + } + + $banner_style = $max_height ? 'style="min-height:'.($max_height + 25).'px"' : ''; + if ($i==0) echo '
                                  '.PHP_EOL; + + echo '
                                  '.PHP_EOL; + + echo '
                                  '.PHP_EOL; + + echo '
                                  '.PHP_EOL; + echo '
                                  + +
                                  '.PHP_EOL; + echo '
                                  '.PHP_EOL; + echo '
                                  '.PHP_EOL; +?> + + + substr($ca_id,0,2), + 'ca_id2' => substr($ca_id,0,4), + 'ca_id3' => substr($ca_id,0,6), + ); +} else if( $is_item_view && isset($it) && is_array($it) ) { + $navi_datas = get_shop_navigation_data(true, $it['ca_id']); + $ca_ids = array( + 'ca_id' => substr($it['ca_id'],0,2), + 'ca_id2' => substr($it['ca_id'],0,4), + 'ca_id3' => substr($it['ca_id'],0,6) + ); +} + +$location_class = array(); +if($is_item_view){ + $location_class[] = 'view_location'; // view_location는 리스트 말고 상품보기에서만 표시 +} else { + $location_class[] = 'is_list is_right'; // view_location는 리스트 말고 상품보기에서만 표시 +} + +// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨 +add_stylesheet('', 0); +add_javascript('', 10); +?> + +
                                  + 메인으로 + + + + + + + + + + + + + + + + + +
                                  + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/personalpay.skin.php b/theme/basic/skin/shop/basic/personalpay.skin.php new file mode 100644 index 000000000..c16812194 --- /dev/null +++ b/theme/basic/skin/shop/basic/personalpay.skin.php @@ -0,0 +1,34 @@ +', 0); +?> + += 2) { // 1줄 이미지 : 2개 이상 + if ($i%$list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + echo "
                                    \n"; + } + + $href = G5_SHOP_URL.'/personalpayform.php?pp_id='.$row['pp_id'].'&page='.$page; +?> +
                                  • +
                                    +
                                    +
                                    +
                                  • + 1) echo "
                                  \n"; + +if($i == 1) echo "

                                  등록된 개인결제가 없습니다.

                                  \n"; \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/relation.10.skin.php b/theme/basic/skin/shop/basic/relation.10.skin.php new file mode 100644 index 000000000..4c4840127 --- /dev/null +++ b/theme/basic/skin/shop/basic/relation.10.skin.php @@ -0,0 +1,109 @@ +', 0); +add_javascript('', 10); +?> + + +list_mod >= 2) { // 1줄 이미지 : 2개 이상 + if ($i%$this->list_mod == 0) $sct_last = ' sct_last'; // 줄 마지막 + else if ($i%$this->list_mod == 1) $sct_last = ' sct_clear'; // 줄 첫번째 + else $sct_last = ''; + } else { // 1줄 이미지 : 1개 + $sct_last = ' sct_clear'; + } + + if ($i == 1) { + if ($this->css) { + echo "
                                    css}\">\n"; + } else { + echo "\n"; + +if($i == 1) echo "

                                    등록된 상품이 없습니다.

                                    \n"; +?> + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/search.skin.php b/theme/basic/skin/shop/basic/search.skin.php new file mode 100644 index 000000000..e1cf4bace --- /dev/null +++ b/theme/basic/skin/shop/basic/search.skin.php @@ -0,0 +1,134 @@ + + + + + +
                                    +

                                    검색 결과

                                    + +
                                    +
                                    +
                                    + + + +
                                    + + + + + + 상세검색을 선택하지 않거나, 상품가격을 입력하지 않으면 전체에서 검색합니다.
                                    + 검색어는 최대 30글자까지, 여러개의 검색어를 공백으로 구분하여 입력 할수 있습니다. +
                                    +
                                    +
                                    + 검색범위 + > + > + > + > + 상품가격 (원) + + 원 ~ + + 원 +
                                    +
                                    +
                                    + +
                                    + +
                                    + + + + +
                                    + +
                                    + set_is_page(true); + $list->set_view('it_img', true); + $list->set_view('it_name', true); + $list->set_view('it_basic', true); + $list->set_view('it_cust_price', false); + $list->set_view('it_price', true); + $list->set_view('it_icon', true); + $list->set_view('sns', true); + $list->set_view('star', true); + echo $list->run(); + } + else + { + $i = 0; + $error = '

                                    '.$list_file.' 파일을 찾을 수 없습니다.
                                    관리자에게 알려주시면 감사하겠습니다.

                                    '; + } + + if ($i==0) + { + echo '
                                    '.$error.'
                                    '; + } + + $query_string = 'qname='.$qname.'&qexplan='.$qexplan.'&qid='.$qid; + if($qfrom && $qto) $query_string .= '&qfrom='.$qfrom.'&qto='.$qto; + $query_string .= '&qcaid='.$qcaid.'&q='.urlencode($q); + $query_string .='&qsort='.$qsort.'&qorder='.$qorder; + echo get_paging($config['cf_write_pages'], $page, $total_page, $_SERVER['SCRIPT_NAME'].'?'.$query_string.'&page='); + ?> +
                                    + +
                                    + + + \ No newline at end of file diff --git a/theme/basic/skin/shop/basic/style.css b/theme/basic/skin/shop/basic/style.css new file mode 100644 index 000000000..c7251bc9d --- /dev/null +++ b/theme/basic/skin/shop/basic/style.css @@ -0,0 +1,970 @@ +@charset "utf-8"; + +/* 리스트 공통 */ +.lists-row{margin-right:-10px;margin-left:-10px} +.lists-row .col-row-0,.lists-row .col-row-1,.lists-row .col-row-2,.lists-row .col-row-3,.lists-row .col-row-4,.lists-row .col-row-5,.lists-row .col-row-6,.lists-row .col-row-7,.lists-row .col-row-8,.lists-row .col-row-9,.lists-row .col-row-10{position:relative;min-height:1px;padding-left:10px;*padding-left:0;padding-right:10px;*padding-right:0;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:0;} +.lists-row .col-row-0,.lists-row .col-row-1{width:100%} +.lists-row .col-row-2{width:50%} +.lists-row .col-row-3{width:33.33333333%} +.lists-row .col-row-4{width:25%} +.lists-row .col-row-5{width:20%} +.lists-row .col-row-6{width:16.66666667%} +.lists-row .col-row-7{width:14.28571428%} +.lists-row .col-row-8{width:12.5%} +.lists-row .col-row-9{width:11.11111111%} +.lists-row .col-row-10{width:10%} +.row-clear{clear:both!important} +.lists-row .sct_img img{max-width:100%;height:auto} + +/* aside:gnb */ +#gnb {margin-bottom:15px;background:#fff;border:1px solid #e8e8e8;border-top:0} +#gnb h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.gnb_1dli {position:relative;word-wrap:break-word} +.gnb_1dli_on {color:#fff;text-decoration:none} +.gnb_1da {display:block;padding:0 20px;line-height:48px;color:#010101;text-decoration:none;font-size:1.167em} +.gnb_1da i {position:absolute;right:0;top:0;display:inline-block;color:#c4c4c4;padding:15px;font-size:1.45em} + +.gnb_1dam {background:url('img/gnb_bg.png') center right no-repeat} +.gnb_1dli_on .gnb_1da {background-color:#f5f5f5;color:#3a8afd;font-weight:bold;text-decoration:none} +.gnb_1dli_on .gnb_1da:after {position:absolute;left:-1px;top:0;content:"";background:#3a8afd;width:3px;height:100%} + +.gnb_1dli_on .gnb_1dam {text-decoration:none} +.gnb_2dul {display:none;z-index:1000;position:absolute;border:1px solid #e8e8e8;padding:10px} +.gnb_1dli_over .gnb_2dul, .gnb_1dli_over2 .gnb_2dul {display:inline-block;top:0;left:263px;width:200px;background:#fff} +.gnb_1dli_over .gnb_2dul:after, .gnb_1dli_over2 .gnb_2dul:after {content:"";position:absolute;top:10px;left:-6px;display:inline-block;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #fff} +.gnb_1dli_over .gnb_2dul:before, .gnb_1dli_over2 .gnb_2dul:before {content:"";position:absolute;top:9px;left:-7px;display:inline-block;width:0;height:0;border-top:7px solid transparent;border-bottom:7px solid transparent;border-right:7px solid #e8e8e8} + +.gnb_2da {} +.gnb_1dli_over .gnb_2da {display:block;padding:5px 10px;line-height:20px;font-size:1.083em} +.gnb_2da:focus, .gnb_2da:hover {text-decoration:none;color:#3a8afd} + +/* 오늘 본 상품 */ +#stv {position:relative;height:100%} +#stv .li_empty {text-align:center;line-height:100px} +#stv_pg {display:block;position:fixed;right:0;bottom:0;width:229px;text-align:center;margin:10px 0 0;padding:15px;line-height:20px;background:#fff} +.stv_item {display:none;padding:15px;word-break:break-all;border-bottom:1px solid #f6f6f6} +.stv_item:after {display:block;visibility:hidden;clear:both;content:""} +.stv_item .prd_img {display:inline-block;float:left;margin-right:10px} +.stv_item .prd_cnt {display:inline-block;float:left} +.stv_item .prd_cnt span {display:block;max-width:105px} +.stv_item .prd_cnt .prd_name {font-weight:bold;margin-bottom:3px} + +#stv_btn {position:absolute;top:10px;right:10px;width:60px;height:50px} +#up {position:absolute;top:0;left:0;background:url('img/btn_sb_prev.png') no-repeat 50% 50%;width:30px;height:30px;text-indent:-999px;overflow:hidden;border:0} +#down {position:absolute;top:0;right:0;background:url('img/btn_sb_next.png') no-repeat 50% 50%;width:30px;height:30px;text-indent:-999px;overflow:hidden;border:0} + +/* 이벤트 링크 */ +#sev {margin:20px 0;text-align:center} +#sev header {margin:0 0 20px} +#sev header:after {display:block;visibility:hidden;clear:both;content:""} +#sev h2 {float:left;font-size:1.5em;margin:0 0 10px 0;display:inline-block;line-height:1em} +#sev h2:after {display:block;visibility:hidden;clear:both;content:""} +#sev ul:after {display:block;visibility:hidden;clear:both;content:""} +#sev>ul {margin:0 -10px} +#sev .ev_li {float:left;padding:0 10px;width:33.333%} +#sev .ev_li:first-child {margin-left:0} +#sev .ev_li .sev_img img {width:100%;height:auto} +#sev .ev_prd {border:1px solid #ddd;text-align:center;background:#fff} +#sev .ev_prd li {position:relative;display:block;padding:15px;text-align:left;vertical-align:top;border-bottom:1px solid #f6f6f6} +#sev .ev_prd li:last-child {border-bottom:0} +#sev .ev_prd li:after {display:block;visibility:hidden;clear:both;content:""} +#sev .ev_prd .ev_prd_tit {display:block;color:#000;font-size:1.1em;margin-bottom:5px} +#sev .ev_prd .ev_prd_img {float:left;display:inline-block} +#sev .ev_prd .ev_txt_wr {float:left;max-width:139px;margin-left:10px} +#sev .ev_prd .ev_prd_price {font-weight:bold;display:block;margin:5px 0 10px;font-size:1.25em;font-weight:bold} +#sev .ev_prd .sev_more {color:#3a8afd;background:#fff;display:block;text-align:center} + + +/* 커뮤니티 링크 */ +#scomm {padding:20px} +#scomm h2 {margin:0 0 5px} +#scomm li {display:block;margin:3px} +#scomm li a {line-height:25px;color:#555} +#scomm li a:hover {color:#be334a} + +/* 메인배너 */ +#main_bn {border:1px solid #e3e5e8;position:relative;margin:19px 0 30px} +#main_bn:after {display:block;visibility:hidden;clear:both;content:""} +#main_bn .slide-wrap {padding:0;margin:0} +#main_bn .slide-wrap img {max-width:100%;height:auto} +#main_bn .main_image_area{position:relative} +#main_bn .owl_pager {position:relative;width:100%;background:#fff;border-top:1px solid #e3e5e8} +#main_bn .owl_pager ul:after {display:block;visibility:hidden;clear:both;content:""} +#main_bn .owl_pager li {float:left;position:relative;width:20%;border-left:1px solid #e3e5e8;text-align:center;line-height:45px;height:45px;font-size:1.2em} +#main_bn .owl_pager li:first-child, #main_bn .owl_pager li:nth-child(5n+1) {border-left:0} +#main_bn .owl_pager li a {display:block} +#main_bn .owl_pager li a:after {content:"";position:absolute;top:0;left:0;width:100%;height:2px;background:#e3e5e8} +#main_bn .owl_pager li.active a {color:#3a8afd} +#main_bn .owl_pager li.active a:after {background:#3a8afd;top:-1px} + +.btn_wr {background:rgba(0,0,0,0.5);display:inline-block;position:absolute;right:20px;bottom:65px;border-radius:30px;padding:3px 5px} +#main_bn .btn_wr{z-index:2} +.btn_wr .pager-prev {margin-left:5px;font-weight:bold} +.btn_wr .pager-next {margin-right:5px;font-weight:bold} +.btn_wr .pager-prev, .btn_wr .pager-next, #slide-counter {float:left;display:inline-block;padding:5px;color:#fff} +#slide-counter {margin:0 5px} + +/*서브배너*/ +#sbn_side {position:relative;width:100%;margin-bottom:20px} +.sb_bn {} +.sb_bn img {width:100%;height:auto} +#sbn_side h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sbn_side .bx-controls {position:absolute;bottom:10px;left:15px} +#sbn_side .bx-pager-item {display:inline-block} +#sbn_side .bx-pager-item a {float:left;width:8px;height:8px;margin-right:5px;border-radius:50%;background:#fff;text-indent:-9999px;opacity:0.5} +#sbn_side .bx-pager-item a.active {opacity:1} +#sbn_side .bx-controls-direction {display:none} + +/*장바구니*/ +#sbsk {position:relative} +#sbsk li {position:relative;border-bottom:1px solid #f6f6f6;padding:15px} +#sbsk li:after {display:block;visibility:hidden;clear:both;content:""} +#sbsk .go_cart {position:absolute;top:11px;right:15px;display:inline-block;height:28px;line-height:22px;border:1px solid #d5d9dd;color:#3a8afd;border-radius:2px;background:#fff;padding:2px 5px} +#sbsk .btn_buy {padding:15px;font-weight:bold;text-align:center} +#sbsk .btn_buy .btn_submit {width:100%;height:40px} +#sbsk .li_empty {text-align:center;line-height:100px} +#sbsk .prd_img {display:inline-block;float:left;margin-right:10px} +#sbsk .prd_cnt {display:inline-block;float:left} +#sbsk .prd_cnt a, #sbsk .prd_cnt span {display:block;max-width:105px} +#sbsk .prd_cnt .prd_name {font-weight:bold;margin-bottom:3px} +#sbsk .cart_del {border:0;width:35px;height:35px;text-align:center;position:absolute;right:0;bottom:0;color:#c5c8ca;background:#fff;font-size:1.25em} + +/*위시리스트*/ +#wish {} +#wish li {position:relative;border-bottom:1px solid #f6f6f6;padding:15px} +#wish li:after {display:block;visibility:hidden;clear:both;content:""} +#wish .li_empty {text-align:center;line-height:100px} +#wish .prd_img {display:inline-block;float:left;margin-right:10px} +#wish .prd_cnt {display:inline-block;float:left} +#wish .prd_cnt a {display:block;max-width:105px} +#wish .prd_cnt .prd_name {font-weight:bold;margin-bottom:3px} + +/* ##### main(nn).skin.php, list.(nn).skin.php 공통 적용 시작 ##### */ + +/* 공통 */ +.sct_wrap {position:relative;margin:0 0 20px} +.sct_wrap .sctrl {position:absolute;top:0;right:0} /* 애니메이션 효과 사용 시 재생 정지 버튼 등 */ +.sct_wrap:after {display:block;visibility:hidden;clear:both;content:""} +.sct_wrap header {padding:10px 0 20px} +.sct_wrap header:after {display:block;visibility:hidden;clear:both;content:""} +.sct_wrap h2 {float:left;font-size:1.5em;margin:0 0 10px 0;display:inline-block;line-height:1em} +.sct_wrap h2:after {display:block;visibility:hidden;clear:both;content:""} +.sct_wrap h2 a {text-decoration:none} + +#sct {clear:both} + +.sct {clear:both;margin:0;padding:0;list-style:none} +.sct:after {display:block;visibility:hidden;clear:both;content:""} +.sct_li {position:relative} +.sct_noitem {padding:100px 0;text-align:center} +.sct img {position:relative} /* 리스트뷰 갤러리뷰 변경 시 ie6,7 에서 이미지 사라지는 문제 해결하기 위해 */ +.shop_icon {display:inline-block;color:#fff;line-height:20px;padding:0 5px;font-size:0.92em;margin:1px;border-radius:2px} +.shop_icon_1 {background:#3ec1d3} +.shop_icon_2 {background:#ffb722} +.shop_icon_3 {background:#2dd49f} +.shop_icon_4 {background:#556ee6} +.shop_icon_5 {background:#ff5081} + +.shop_icon_soldout {position:absolute;z-index:1;top:0;left:0;width:100%;height:100%;background:#000;background:rgba(0,0,0,0.5);text-align:center;line-height:215px;color:#fff;font-size:18px;font-weight:bold;letter-spacing:1px} +.shop_icon_soldout.h160{line-height:160px} +.shop_icon_coupon {background:#d45959} + +/* 재생/정지/이전/다음 버튼 */ +.sctrl {margin:0;padding:0;list-style:none} +.sctrl:after {display:block;visibility:hidden;clear:both;content:""} +.sctrl li {position:relative;float:left} +.sctrl button {position:relative;margin:0;padding:0;width:20px;height:20px;border:0;cursor:pointer;overflow:hidden} +.sctrl button span {position:absolute;top:0;left:0;width:20px;height:20px;border:0;background:url('img/is_button.gif') no-repeat} +.sctrl button.sctrl_play span {background-position:-60px 0} +.sctrl button.sctrl_play span.sctrl_on {background-position:-60px -30px} +.sctrl button.sctrl_stop span {background-position:-90px 0} +.sctrl button.sctrl_stop span.sctrl_on {background-position:-90px -30px} +.sctrl button.sctrl_prev span {background-position:-120px 0} +.sctrl button.sctrl_prev span.sctrl_on {background-position:-120px -30px} +.sctrl button.sctrl_next span {background-position:-150px 0} +.sctrl button.sctrl_next span.sctrl_on {background-position:-150px -30px} + +/* 메인리스트 별점 공통 */ +.sct_li .sct_star img, .sct_li img.sit_star{width:72px !important;height:auto} + +/* 상품 목록 스킨 10 */ +.sct_10 {margin:25px 0} +.sct_10.lists-row{margin-right:-10px;margin-left:-10px} +.sct_10 .sct_li {position:relative;float:left;margin-bottom:40px;text-align:left} +.sct_10 .sct_last {margin-right:0} +.sct_10 .sct_clear {clear:both} +.sct_10 .sct_a {text-decoration:none} +.sct_10 .sct_a:focus, .sct_10 .sct_a:hover {text-decoration:none} + +.sct_10 .sct_img {position:relative;text-align:center} +.sct_10 .sct_img a {display:block} +.sct_10 .sct_cart {display:none;position:absolute;left:0;bottom:0;border:0;width:100%;padding:15px 0;background:#000;background:rgba(0,0,0,0.5);color:#fff;font-size:1em;font-weight:bold} +.sct_10 .sct_img:hover .sct_cart {display:block} +.sct_10 .sct_cart i {display:inline-block;margin-right:5px;font-size:1.2em} +.sct_10 .sct_disc {position:absolute;right:15px;bottom:15px;background:red;color:#fff;padding:0 8px;line-height:24px;font-weight:bold;font-size:1.2em;background:#000;background:rgba(0,0,0,0.5)} + +.sct_10 .sct_ct_wrap {position:relative} +.sct_10 .sct_ct_wrap:after {display:block;visibility:hidden;clear:both;content:""} +.sct_10 .sct_star {margin: 10px 0 5px} +.sct_10 .sct_txt {border-bottom:1px solid #d9dde2;font-size:1.1em;margin:10px 0;padding-bottom:10px} +.sct_10 .sct_basic {margin-bottom:5px;color:#6e7f88} +.sct_10 .sct_bottom {position:relative;min-height:20px} +.sct_10 .sct_cost {margin:5px 0 10px;font-size:1.25em;font-weight:bold} +.sct_10 .sct_dict {display:block;text-decoration:line-through;font-weight:normal;font-size:0.85em;color:#858a8d} + +.sct_10 .sct_sns_wrap {display:none;width:100%;height:100%;position:fixed;top:0;left:0;z-index:999} +.sct_10 .sct_sns {position:absolute;top:50%;left:50%;background:#fff;text-align:center;width:245px;max-height:300px;margin-left:-125px;margin-top:-180px;overflow-y:auto;border-radius:5px;-webkit-box-shadow:1px 1px 18px rgba(0,0,0,0.2);-moz-box-shadow: 1px 1px 18px rgba(0,0,0,0.2);box-shadow: 1px 1px 18px rgba(0,0,0,0.2);border:1px solid #dde7e9;background:#fff;border-radius:3px} +.sct_10 .sct_sns h3 {padding:15px;border-bottom:1px solid #e8e8e8;text-align:left} +.sct_10 .sct_sns a {display:inline-block;border-radius:50%;width:50px;height:50px;line-height:25px;text-align:center;padding:10px 0;margin:20px 5px} +.sct_10 .sct_sns .share-facebook {background:#415b92} +.sct_10 .sct_sns .share-twitter {background:#35b3dc} +.sct_10 .sct_sns .share-googleplus {background:#ea3838} +.sct_10 .sct_sns img {width:24px} +.sct_10 .sct_sns_bg {background:rgba(0,0,0,0.1);width:100%;height:100%} +.sct_10 .sct_sns_cls {position:absolute;right:0;top:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff} + +.sct_10 .sct_op_btn {position:absolute;right:5px;bottom:0} +.sct_10 .sct_op_btn>button {border:0;width:25px;height:20px;font-size:1.25em;text-align:center;color:#949494;background:transparent} + +/* 상품 목록 스킨 20 */ +.sct_20 .sct_li {position:relative;float:left;margin:0 25px 15px 0} +.sct_20 .sct_last {margin:0 0 15px !important} +.sct_20 .sct_clear {clear:both} +.sct_20 .sct_a {display:block;position:relative;text-decoration:none} +.sct_20 .sct_a:focus, .sct_20 .sct_a:hover {text-decoration:none} +.sct_20 .sct_img {} +.sct_20 .sct_icon {position:absolute;top:10px;left:-5px;margin:0 !important} +.sct_20 .sct_icon img {display:block;margin:0 0 3px} +.sct_20 .sct_id {display:block;padding:5px 10px 0;background:#f2f5f9} +.sct_20 .sct_txt {padding:10px;background:#f2f5f9} +.sct_20 .sct_basic {padding:0 10px 5px;background:#f2f5f9;line-height:1.5em} +.sct_20 .sct_cost {display:block;padding:0 10px 10px;background:#f2f5f9;font-weight:bold} +.sct_20 .sct_dict {text-decoration:line-through;display:block;margin:0 0 5px;color:#999;font-weight:normal} +.sct_20 .sct_sns {position:absolute;bottom:10px;right:10px} + +/* 상품 목록 스킨 30 */ +.sct_30 .sct_li {position:relative;float:left;margin:0 16px 15px 0;border:1px solid #e9e9e9;background:#f5f6fa} +.sct_30 .sct_last {margin:0 0 15px !important} +.sct_30 .sct_clear {clear:both} +.sct_30 .sct_arw_toleft {display:block;z-index:2;position:absolute;top:20px;left:221px;width:10px;height:19px;background:url('img/icon_arw_toleft.gif') no-repeat} +.sct_30 .sct_a {text-decoration:none} +.sct_30 .sct_img {position:absolute;top:0;left:0} +.sct_30 .sct_icon {position:absolute;bottom:25px;left:-5px;margin:0 !important} +.sct_30 .sct_icon img {display:block;margin:0 0 3px} +.sct_30 .sct_txt {display:inline-block;margin:0 0 20px} +.sct_30 .sct_basic {margin:0 0 15px;padding:0;line-height:1.5em} +.sct_30 .sct_cost {display:block;margin:0 0 10px;font-weight:bold} +.sct_30 .sct_dict {text-decoration:line-through;display:block;margin:0 0 5px;color:#999;font-weight:normal} +.sct_30 .sct_sns {position:absolute;bottom:20px;right:10px} + +/* 상품 목록 스킨 40 */ +.sct_40 {margin:20px 0} +.sct_40 .sct_clear {border-top:1px solid #dadada} +.sct_40 .sct_li {position:relative;padding:15px 0;border-bottom:1px solid #dadada} +.sct_40 .sct_li:after {display:block;visibility:hidden;clear:both;content:""} +.sct_40 .sct_a {text-decoration:none} +.sct_40 .sct_a:focus, .sct_40 .sct_a:hover {text-decoration:none} + +.sct_40 .sct_img {text-align:center;float:left;margin-right:20px} +.sct_40 .sct_img a {display:block;position:relative;z-index: 9999;} +.sct_40 .sct_cart {position:absolute;right:0;bottom:0;border:0;width:150px;padding:15px 0;background:#000;background:rgba(0,0,0,0.5);color:#fff;font-size:1em;font-weight:bold;z-index:99999} +.sct_40 .list-10-btn .sct_cart{z-index:1;top:40px;right:10px;bottom:initial;padding:8px 0;width:140px;border:1px solid #1c70e9;background:#3a8afd;color:#fff;cursor:pointer;border-radius:3px} +.sct_40 .list-10-btn .sct_cart:hover {background:#2375eb} +.sct_40 .list-10-btn .sct_cart i{display:none} +.sct_40 .sct_img:hover .sct_cart {display:block} +.sct_40 .sct_cart i {display:inline-block;margin-right:5px;font-size:1.2em} +.sct_40 .sct_disc {position:absolute;right:15px;bottom:15px;background:red;color:#fff;padding:0 8px;line-height:24px;font-weight:bold;font-size:1.2em;background:#000;background:rgba(0,0,0,0.5)} +.sct_40 .sit_icon_li{margin-top:10px} + +.sct_40 .sct_ct_wrap {position:relative} +.sct_40 .sct_ct_wrap:after {display:block;visibility:hidden;clear:both;content:""} +.sct_40 .sct_star {margin:10px 0 5px} +.sct_40 .sct_txt {font-size:1.1em;margin:10px 0;padding-bottom:10px} +.sct_40 .sct_txt a{font-weight:600;font-size:1.2em} +.sct_40 .sct_basic {margin-bottom:5px;color:#6e7f88} +.sct_40 .sct_cost {position:absolute;right:200px;top:15px;font-size:1.35em;font-weight:bold} +.sct_40 .sct_dict {text-decoration:line-through;font-weight:normal;display:block;font-size:0.85em;color:#858a8d} + +.sct_40 .sct_sns_wrap {display:none;width:100%;height:100%;position:fixed;top:0;left:0;z-index:999} +.sct_40 .sct_sns {position:absolute;top:50%;left:50%;background:#fff;text-align:center;width:245px;max-height:300px;margin-left:-125px;margin-top:-180px;overflow-y:auto;border-radius:5px;-webkit-box-shadow:1px 1px 18px rgba(0,0,0,0.2);-moz-box-shadow: 1px 1px 18px rgba(0,0,0,0.2);box-shadow: 1px 1px 18px rgba(0,0,0,0.2);border:1px solid #dde7e9;background:#fff;border-radius:3px} +.sct_40 .sct_sns h3 {padding:15px;border-bottom:1px solid #e8e8e8;text-align:left} +.sct_40 .sct_sns a {display:inline-block;border-radius:50%;width:50px;height:50px;line-height:25px;text-align:center;padding:10px 0;margin:20px 5px} +.sct_40 .sct_sns .share-facebook {background:#415b92} +.sct_40 .sct_sns .share-twitter {background:#35b3dc} +.sct_40 .sct_sns .share-googleplus {background:#ea3838} +.sct_40 .sct_sns img {width:24px} +.sct_40 .sct_sns_bg {background:rgba(0,0,0,0.1);width:100%;height:100%} +.sct_40 .sct_sns_cls {position:absolute;right:0;top:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff} + +.sct_40 .sct_op_btn {position:absolute;right:20px;bottom:20px} +.sct_40 .sct_op_btn>button {border:0;width:25px;height:20px;font-size:1.25em;text-align:center;color:#949494;background:transparent} + + + +/* 개인결제 목록 */ +.sct_pv .sct_li {position:relative;float:left;margin:0 18px 15px 0} +.sct_pv .sct_last {margin:0 0 15px !important} +.sct_pv .sct_clear {clear:both} +.sct_pv .sct_a {display:inline-block;position:relative;text-decoration:none;font-size:1.1em} +.sct_pv .sct_a:focus, .sct_pv .sct_a:hover {text-decoration:none} +.sct_pv .sct_img {margin:0 0 10px} +.sct_pv .sct_txt {margin:0 0 5px} +.sct_pv .sct_icon {margin:0 0 10px} +.sct_pv .sct_id {display:block;margin:0 0 5px} +.sct_pv .sct_basic {margin:0 0 10px} +.sct_pv .sct_cost {display:block;margin:5px 0 10px;font-size:1.25em;font-weight:bold} +.sct_pv .sct_dict {text-decoration:line-through;display:block;margin:0 0 5px;color:#999;font-weight:normal} +.sct_pv .sct_sns {} + +/* 메인 상품 목록 스킨 10 */ +.smt_10 {margin:0 -5px} +.smt_10 .sct_li {position:relative;float:left;width:215px;margin-right:15px;margin-bottom:15px;text-align:left} +.smt_10 .sct_last {margin-right:0} +.smt_10 .sct_clear {clear:both} +.smt_10 .sct_a {text-decoration:none} +.smt_10 .sct_a:focus, .smt_10 .sct_a:hover {text-decoration:none} +.smt_10 .sct_ct_wrap {position:relative} +.smt_10 .sct_ct_wrap:after {display:block;visibility:hidden;clear:both;content:""} + +.smt_10 .sct_img {position:relative;text-align:center} +.smt_10 .sct_img a {display:block} +.smt_10 .sct_cart {display:none;position:absolute;left:0;bottom:0;border:0;width:100%;padding:15px 0;background:#000;background:rgba(0,0,0,0.5);color:#fff;font-size:1em;font-weight:bold} +.smt_10 .sct_img:hover .sct_cart {display:block} +.smt_10 .sct_li.overlay .sct_cart{display:none !important} +.smt_10 .sct_cart i {display:inline-block;margin-right:5px;font-size:1.2em} +.smt_10 .sct_disc {position:absolute;right:15px;bottom:15px;background:red;color:#fff;padding:0 8px;line-height:24px;font-weight:bold;font-size:1.2em;background:#000;background:rgba(0,0,0,0.5)} + +.smt_10 .sct_star {margin: 10px 0 5px} +.smt_10 .sct_txt {border-bottom:1px solid #d9dde2;font-size:1.1em;margin:10px 0;padding-bottom:10px} +.smt_10 .sct_basic {margin-bottom:5px;color:#6e7f88} +.smt_10 .sct_cost {margin:5px 0 10px;font-size:1.25em;font-weight:bold} +.smt_10 .sct_dict {text-decoration:line-through;font-weight:normal;display:block;font-size:0.85em;color:#858a8d} + +.smt_10 .sct_sns_wrap {display:none;width:100%;height:100%;position:fixed;top:0;left:0;z-index:999} +.smt_10 .sct_sns {position:absolute;top:50%;left:50%;background:#fff;text-align:center;width:245px;max-height:300px;margin-left:-125px;margin-top:-180px;overflow-y:auto;border-radius:5px;-webkit-box-shadow:1px 1px 18px rgba(0,0,0,0.2);-moz-box-shadow: 1px 1px 18px rgba(0,0,0,0.2);box-shadow: 1px 1px 18px rgba(0,0,0,0.2);border:1px solid #dde7e9;background:#fff;border-radius:3px} +.smt_10 .sct_sns h3 {padding:15px;border-bottom:1px solid #e8e8e8;text-align:left} +.smt_10 .sct_sns a {display:inline-block;border-radius:50%;width:50px;height:50px;line-height:25px;text-align:center;padding:10px 0;margin:20px 5px} +.smt_10 .sct_sns .share-facebook {background:#415b92} +.smt_10 .sct_sns .share-twitter {background:#35b3dc} +.smt_10 .sct_sns .share-googleplus {background:#ea3838} +.smt_10 .sct_sns img {width:24px} +.smt_10 .sct_sns_bg {background:rgba(0,0,0,0.1);width:100%;height:100%} +.smt_10 .sct_sns_cls {position:absolute;right:0;top:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff} + +.smt_10 .sct_op_btn {position:absolute;right:5px;bottom:0} +.smt_10 .sct_op_btn>button {border:0;width:25px;height:20px;font-size:1.25em;text-align:center;color:#949494;background:transparent} + +.sct_cartop_wr {position:absolute;top:0;left:0;z-index:3;width:100%;height:100%;padding:10px;text-align:left;background:rgba(0,0,0,0.5);opacity:0.98} +.sct_cartop_wr .it_option {width:100%;height:35px;margin-bottom:5px;} +.sct_cartop_wr .cartopt_cart_btn {width:100%;border:1px solid #1c70e9;padding:8px 5px;margin-bottom:5px;background:#3a8afd;color:#fff;border-radius:3px} +.sct_cartop_wr .cartopt_close_btn {width:100%;border:1px solid #1c70e9;padding:8px 5px;background:#fff;color:#1c70e9;border-radius:3px} + +/* 메인 상품 목록 스킨 20 */ +.smt_20 {position:relative;overflow-y:hidden;margin:0 -5px} +.smt_20 .sct_ul {width:100%;position:absolute;top:0;left:0;margin:0;padding:0;list-style:none} +.smt_20 .sct_ul_first {display:block;top:0} +.smt_20 .sct_li {position:relative;float:left;width:215px;margin-right:15px;margin-bottom:15px;text-align:left} +.smt_20 .sct_last {margin:0 0 15px !important} +.smt_20 .sct_clear {clear:both} +.smt_20 .sct_a {display:inline-block;position:relative;text-decoration:none} +.smt_20 .sct_a:focus, .smt_20 .sct_a:hover {text-decoration:none} +.smt_20 .sct_img {position:relative;text-align:center} +.smt_20 .sct_img a {display:block} +.smt_20 .sct_cart {display:none;position:absolute;left:0;bottom:0;border:0;width:100%;padding:15px 0;background:#000;background:rgba(0,0,0,0.5);color:#fff;font-size:1em;font-weight:bold} +.smt_20 .sct_img:hover .sct_cart {display:block} +.smt_20 .sct_txt {border-bottom:1px solid #d9dde2;font-size:1.1em;margin:10px 0;padding-bottom:10px} +.smt_20 .sct_basic {margin-bottom:5px;color:#6e7f88} +.smt_20 .sct_cost {margin:5px 0 10px;font-size:1.25em;font-weight:bold} +.smt_20 .sct_dict {text-decoration:line-through;display:block;font-size:0.85em;color:#858a8d} + +.smt_20 .sct_sns {margin-bottom:10px} +.smt_20 .sct_sns a {display:inline-block;border-radius:50%;width:30px;height:30px;line-height:28px;margin-right:5px;text-align:center} +.smt_20 .sct_sns .share-facebook {background:#415b92} +.smt_20 .sct_sns .share-twitter {background:#35b3dc} +.smt_20 .sct_sns .share-googleplus {background:#ea3838} +.smt_20 .sct_sns img {width:20px} + +.smt_20 .sct_icon {margin:0 0 10px} +.smt_20 .sct_id {display:block;margin:0 0 5px} + + +/* 메인 상품 목록 스킨 30 */ +.smt_30 {position:relative} +.smt_30 li {position:relative;min-height:50px;padding:10px 15px;background:#fff} +.smt_30 li:after {display:block;visibility:hidden;clear:both;content:""} +.smt_30 .sct_clear {clear:both} +.smt_30 .sct_img {float:left;width:80px;margin-right:10px} +.smt_30 .sct_img img {width:100%;height:auto} +.smt_30 .sct_cnt {display:inline-block;float:left;max-width:143px;line-height:20px} +.smt_30 .sct_txt a {display:block;font-size:1em;color:#000;max-height:40px;overflow:hidden;text-overflow:ellipsis;list-style:none} +.smt_30 .sct_cost {font-weight:bold;font-size:1.2em} + + +/* 메인 상품 목록 스킨 40 */ +.smt_40 {background:#fff;padding:20px;border:1px solid #e3e5e8} +.smt_40 .sct_li {position:relative;float:left;width:20%;margin:0 8px} +.smt_40 .sct_last {} +.smt_40 .sct_clear {clear:both} +.smt_40 .sct_img {position:relative;text-align:center} +.smt_40 .sct_star {margin:10px 0 5px} +.smt_40 .sct_txt {display:block;margin:5px 0;font-size:1.1em} +.smt_40 .sct_cost {margin:5px 0;font-size:1.25em;font-weight:bold} + + +/* 관련상품 목록 스킨 10 */ +#sit_rel {position:relative;border:1px solid #e8e8e8;padding:35px;margin-top:20px;background:#fff} +#sit_rel:after {display:block;visibility:hidden;clear:both;content:""} +#sit_rel h2 {font-size:1.6em;margin:0 0 30px;text-align:center} +#sit_rel .bx-wrapper {margin:0 auto} +#sit_rel .bx-controls-direction {position:absolute;top:25px;right:35px} +#sit_rel .bx-prev {display:inline-block;width:30px;height:30px;border:1px solid #dee3eb;border-right:0;text-indent:-999px;overflow:hidden;background:url('img/select_arrow_left.png') no-repeat 50% 50%} +#sit_rel .bx-next {display:inline-block;width:30px;height:30px;border:1px solid #dee3eb;text-indent:-999px;overflow:hidden;background:url('img/select_arrow_right.png') no-repeat 50% 50%} +.scr_10 li img {width:100%;height:auto} +.scr_10 .sct_txt {display:block;margin:5px 0;font-size:1.1em} +.scr_10 .sct_cost {margin:5px 0;font-size:1.25em;font-weight:bold} + +/* ##### main(nn).skin.php, list.(nn).skin..php 공통 적용 끝 ##### */ + +/* 상품 목록 */ +#sct {margin:0} +.sct_admin {text-align:right} +.sct_admin a {} + +/* 상품 목록 현재 위치 */ +#sct_location {display:inline-block;float:right;padding:12px 0;position:absolute;right:0;top:12px} +#sct_location .go_home {display:inline-block;font-size:1.4em;color:#a2a2a2;line-height:17px;text-decoration:none;vertical-align:top;padding:0 12px} +#sct_location i.dividing-line {vertical-align:top;font-size:1.2em;color:#a2a2a2;display:inline-block;margin:0;line-height:17px} +#sct_location select {float:left;border:1px solid #d3d3d3;height:26px;padding:0 5px;margin:0 12px} +#sct_location.is_right select{float:right} +#sct_location.view_location{display:block;float:none!important;position:relative;top:0;left:0} +#sct_location.view_location:after{display:block;visibility:hidden;clear:both;content:""} +.view_location .go_home{float:left} +.view_location i.dividing-line{float:left} +.view_location .shop_select_to_html.shop_hover_selectbox{float:left} +.shop_select_to_html{position:relative;display:inline-block} +.shop_select_to_html span{padding:10px 20px 15px} +.shop_select_to_html .menulist{position:absolute;top:20px;display:none;opacity:0;transition:all .2s ease-in-out} +.view_location .shop_select_to_html .menulist{left:0} +.is_right .shop_select_to_html .menulist{right:0} +.shop_select_to_html:hover .category_title,.shop_select_to_html:hover .category_title i{color:#69aa6f} +.shop_select_to_html:hover .menulist{display:block;opacity:1;transition:all .2s ease-in-out} +.shop_select_to_html .menulist{background-color:#fff;border-radius:5px;box-shadow:0 0 0 1px rgba(68,88,112,0.11);box-sizing:border-box;margin-top:4px;overflow:hidden;padding:6px 0;-webkit-transition:all .2s cubic-bezier(0.5,0,0,1.25),opacity .15s ease-out;transition:all .2s cubic-bezier(0.5,0,0,1.25),opacity .15s ease-out;z-index:9;white-space:nowrap;width:auto} +.shop_select_to_html .menulist ul.wide{display:inline-block!important;width:146px;vertical-align:top;min-height:360px} +.shop_select_to_html .menulist ul.left-border{border-left:1px dashed #e6e9ed} +.shop_select_to_html .option{font-weight:400;line-height:40px;list-style:none;min-height:40px;outline:none;text-align:left;-webkit-transition:all .2s;transition:all .2s} +.shop_select_to_html .option:hover,.shop_select_to_html .option.focus,.shop_select_to_html .option.selected.focus{background-color:#f6f7f9} +.shop_select_to_html .option.selected,.shop_select_to_html .option.selected a{font-weight:700;color:#69aa6f} +.shop_select_to_html .option.disabled{background-color:transparent;color:#90a1b5;cursor:default} +.shop_select_to_html .option a{display:block;padding-left:28px;padding-right:49px} +.shop_select_to_html .category_title{color:#4F4F4F;font-size:1.1em} +.shop_select_to_html .category_title i{margin-left:5px;color:#a2a2a2} + +.sct_here {font-weight:bold} +.sct_bg {padding-right:15px !important;background:url('img/sct_bg_toright.gif') right 50% no-repeat} + +/* 상품 목록 카테고리 목록 */ +.sct_ct {clear:both;margin:10px 0 20px;background:#fff;border:1px solid #d3d3d3;border-top:2px solid #000;padding:10px} +.sct_ct h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.sct_ct ul:after {display:block;visibility:hidden;clear:both;content:""} +.sct_ct a {text-decoration:none} +.sct_ct_parent {font-weight:bold} +.sct_ct_here {color:#ff3600 !important} + +#sct_ct_1 li {float:left;width:20%;border-right:1px solid #f6f6f6} +#sct_ct_1 li:nth-child(5n) {border-right:0} +#sct_ct_1 li a {display:block;padding:0 10px;line-height:40px;font-weight:bold} +#sct_ct_1 li a:hover {color:#3a8afd} + +#sct_ct_2 li {margin:0 0 10px} +#sct_ct_2 a {display:inline-block;width:120px} + +#sct_ct_3 li {float:left;margin:0 10px 10px 0;width:120px} + +/* 상품 정렬 리스트 스타일 선택 공통 */ +#sct_sortlst {clear:both;background:#fff;border:1px solid #e3e5e8} +#sct_sortlst:after {display:block;visibility:hidden;clear:both;content:""} + +/* 상품 정렬 */ +#sct_sort {float:left;width:80%} +#sct_sort:after {display:block;visibility:hidden;clear:both;content:""} +#sct_sort h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sct_sort ul {margin:0;padding:0 0 0 1px;list-style:none} +#sct_sort ul:after {display:block;visibility:hidden;clear:both;content:""} +#sct_sort li {float:left;position:relative;margin-left:-1px;height:45px;padding:15px 0;line-height:15px} +#sct_sort li a {border-left:1px solid #ddd;display:block;padding:0 10px} +#sct_sort li a:hover {color:#be334a} +#sct_sort li:first-child a {border:0} + +/* 상품 리스트 스타일 선택 */ +#sct_lst {float:right;margin:0 0;padding:0;list-style:none} +#sct_lst:after {display:block;visibility:hidden;clear:both;content:""} +#sct_lst li {position:relative;float:left} +#sct_lst button {position:relative;margin:0;padding:0;width:45px;height:45px;border:0;cursor:pointer;background:#fff;color:#adadad;font-size:15px} +#sct_lst button:hover {color:#000} +#sct_lst button.sct_lst_list {} +#sct_lst button .icon {display:block} + +/* 상품 상세보기 */ +#sit {margin:0 0 10px} +.sit_admin {position:absolute;right:0;top:2px;text-align:right} +.sit_admin a {line-height:35px;padding:0 10px} +.sit_empty {padding:60px 0;text-align:center} + +.is_search #wrapper_title, .is_item #wrapper_title{display:none} + +/* 상품 상세보기 - 개요 */ +#sit_ov_from {background:#fff;border-bottom:1px solid #e3e3e3;clear:both} +#sit_ov_wrap {width:1200px;margin:0 auto;padding:45px;border-top:1px solid #e3e3e3} +#sit_ov_wrap:after {display:block;visibility:hidden;clear:both;content:""} + +/* 상품 상세보기 - 이미지 미리보기 */ +#sit_pvi {float:left;position:relative} +#sit_pvi_big {float:right;text-align:center} +#sit_pvi_big a {display:none} +#sit_pvi_big a.visible {display:block} +#sit_pvi_big #popup_item_image {display:inline-block;position:absolute;bottom:0;right:0;width:43px;height:43px;line-height:43px;background:#fff;color:#8c9195;border:1px solid #e0e0e0;font-size:1.4em} +#sit_pvi_big img {width:500px;height:auto} +#sit_pvi_thumb {float:left;margin:0;padding:0;list-style:none;text-align:center} +#sit_pvi_thumb:after {display:block;visibility:hidden;clear:both;content:""} +#sit_pvi_thumb li {margin:0 15px 15px 0} +#sit_pvi_thumb img {border:1px solid #dbdbdb} +#sit_pvi_thumb img:hover {border:1px solid #010101} + +#sit_pvi_nwbig {padding:10px 0;text-align:center} +#sit_pvi_nwbig span {display:none} +#sit_pvi_nwbig span.visible {display:inline} +#sit_pvi_nw ul {margin:0 0 20px;text-align:center;padding:0 10px;list-style:none} +#sit_pvi_nw ul:after {display:block;visibility:hidden;clear:both;content:""} +#sit_pvi_nw li {display:inline-block;margin:0 0 1px 1px} +#sit_pvi_nw li img {width:60px;height:60px} + +/* 상품 상세보기 - 간략정보 및 구매기능 */ +#sit_ov {position:relative;float:right;width:448px;height:auto !important;height:355px;min-height:355px;padding-bottom:20px} +#sit_ov h3 {margin:0 0 10px} + +#sit_title {margin:0 0 10px;font-size:2.4em} +#sit_desc {margin:0 0 10px;padding:0;color:#474747;font-size:1.167em} +#sit_opt_info {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} + +#sit_star_sns {position:relative} +#sit_star_sns span {display:inline-block;margin:0 5px 0 0;color:#666;letter-spacing:0} +#sit_star_sns .sit_star {position:relative;top:-2px;margin:0 5px 0 0} + +#sit_star_sns a {display:inline-block;vertical-align:middle} +#sit_star_sns .btn_sns_share {float:left;background:transparent;width:35px;height:25px;border:0;color:#4b5259;font-size:1.6em;font-weight:bold} +#sit_star_sns .btn_sns_share:hover {color:#3a8afd} +#sit_star_sns .sns_area {display:none;position:absolute;top:45px;right:0;max-width:175px;text-align:center;background:#fff;border:1px solid #e2e2e2;padding:10px;z-index:10} +#sit_star_sns .sns_area:before {content:"";position:absolute;top:-8px;right:13px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #e2e2e2 transparent} +#sit_star_sns .sns_area:after {content:"";position:absolute;top:-7px;right:13px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent} +#sit_star_sns .sns_area a {display:inline-block;width:35px;height:35px;line-height:35px;margin-bottom:5px;background:#eee;text-align:center;border-radius:50%} +#sit_star_sns .sns_area a img {width:24px;height:auto} +#sit_star_sns .sns_area #sit_btn_rec {font-size:15px} +#sit_star_sns .sns_area .share-googleplus {background:#ea3838} +#sit_star_sns .sns_area .share-facebook {background:#415b92} +#sit_star_sns .sns_area .share-twitter {background:#35b3dc} + +#sit_btn_opt {position:absolute;right:0;bottom:0} +#btn_wish {float:left;position:relative;display:inline-block;padding-right:5px;color:#4b5259;width:35px;height:25px;text-align:center;font-size:1.25em;font-weight:bold} +#btn_wish i {font-size:1.6em;font-weight:bold} +#btn_wish .btn_wish_num {position:absolute;right:0;bottom:-2px;margin:0;padding:0 2px;height:17px;line-height:15px;border-radius:30px;background:#fff;color:#4b5259;font-size:0.75em} + +.sit_info {padding:10px 0;border-top:1px solid #e2e2e2;margin:10px 0 0;border-bottom:1px solid #e2e2e2} +.sit_info .tr_price {border-bottom:1px solid #e2e2e2} +.sit_info .tr_price th, +.sit_info .tr_price td {padding-bottom:15px} + +.sit_ov_tbl {width:100%;border:0;border-collapse:collapse;color:#666} +.sit_ov_tbl th {font-weight:normal;text-align:left} +.sit_ov_tbl td {padding:10px 0} +.sit_ov_tbl td strong {color:#000;line-height:5px;vertical-align:top;font-size:1.25em} +.sit_ov_ro {padding:2px 2px 3px;border:0;background:transparent;text-align:right;vertical-align:middle} +.sit_ov_opt {padding:2px 2px 3px;border:0;background:transparent;vertical-align:middle} +.sit_ov_input {margin:0 1px 0 0;padding:2px 2px 3px;border:1px solid #b8c9c2;background:transparent;vertical-align:middle} +#sit_ov_tbl button {margin:0 1px 0 0} + +.sit_option {padding:10px 0;margin:10px 0 0} +.sit_option label {display:block;margin:0 0 5px;color:#666} +.sit_option label.label-title{display:none} +.sit_option select {width:100%;margin:0 0 10px;height:50px;padding:0 10px;border:1px solid #cdcdcd; +-webkit-appearance:none; /* 화살표 없애기 for chrome*/ +-moz-appearance:none; /* 화살표 없애기 for firefox*/ +appearance:none; /* 화살표 없애기 공통*/ +background:url('img/select_arrow.png') no-repeat 96% 50%/* 화살표 아이콘 추가 */ +} +.sit_option select::-ms-expand {display:none/* 화살표 없애기 for IE10, 11*/} + +.sit_option h3 {font-size:1.083em} +.sit_sel_btn {position:relative} /* 선택옵션용 추가 버튼 */ +.sit_sel_btn button {position:absolute;top:-51px;right:0 !important;right:15px} + +#sit_sel_option h3 {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#sit_tot_price {font-size:1.167em;line-height:45px;font-weight:bold;text-align:right} +#sit_tot_price:after {display:block;visibility:hidden;clear:both;content:""} +#sit_tot_price span {float:left} +#sit_tot_price strong {font-size:1.5em;margin-left:15px} + +#sit_ov_soldout {padding:20px 0;margin:10px 0;color:#ff3061;background:#fff6f6;font-weight:bold;text-align:center} + +#sit_ov_btn:after {display:block;visibility:hidden;clear:both;content:""} +#sit_ov_btn button {width:186px;float:left;margin-right:5px;height:50px;margin-bottom:10px;font-weight:bold;font-size:1.25em} +.sit_btn_buy {background:#3a8afd;border-radius:3px;border:1px solid #1c70e9;color:#fff} +.sit_btn_buy:hover {background:#2176f1} +.sit_btn_cart {background:#fff;border-radius:3px;border:1px solid #98a3b3;color:#000} +.sit_btn_cart:hover {background:#f3f3f3} +#sit_btn_alm {float:left;display:inline-block;width:186px;height:50px;margin-left:5px;line-height:50px;margin-bottom:10px;font-weight:bold;font-size:1.25em;background:#d50c0c;border-radius:3px;color:#fff;border:0;text-align:center} +.sit_btn_wish {float:left;display:inline-block;width:65px;height:50px;margin-bottom:10px;line-height:50px;color:#8c9195;font-size:1.6em;border:1px solid #98a3b3;text-align:center;border-radius:3px;font-weight:bold} +.sit_btn_wish:hover {color:red} + +/* 상품 상세보기 - 다른 상품 보기 */ +#sit_siblings {clear:both;width:100%;border-top:1px solid #f1f3f6;background:#fff;text-align:center;position:relative} +#sit_siblings:after {display:block;visibility:hidden;clear:both;content:""} +#sit_siblings h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#sit_siblings a {display:block;position:relative;padding:0;margin: 15px;line-height:35px;color:#999} +#sit_siblings a#siblings_prev {float:left;padding-left:20px} +#sit_siblings a#siblings_prev:after {content:"";background:url('img/sit_siblings.jpg') no-repeat;position:absolute;left:0;top:10px;width:10px;height:15px;display:inline-block} +#sit_siblings a#siblings_next {float:right;padding-right:20px} +#sit_siblings a#siblings_next:after {content:"";background:url('img/sit_siblings.jpg') -14px 0px no-repeat;position:absolute;right:0;top:10px;width:10px;height:15px;display:inline-block} +#sit_siblings a span {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} + +#sit_info {display:inline-flex;position:relative;width:100%;min-height:600px;margin-top:20px;margin-bottom:30px;border:1px solid #e8e8e8;background:#fff} +#sit_info:after {display:block;visibility:hidden;clear:both;content:""} + +#sit_tab {width:928px;display:table-cell} +#sit_tab:after {display:block;visibility:hidden;clear:both;content:""} +#sit_tab .tab_tit {border-bottom:1px solid #e8e8e8;background:#fff;padding:0 10px} +#sit_tab .tab_tit:after {display:block;visibility:hidden;clear:both;content:""} +#sit_tab .tab_tit li {display:inline-block;float:left} +#sit_tab .tab_tit li button {display:block;width:100%;position:relative;font-size:1.2em;padding:10px 15px;border:0;color:#666;background:#fff;line-height:38px;text-align:center;z-index:1} +#sit_tab .tab_tit li .selected {background:#fff;z-index:2;border-bottom-color:#fff;color:#000;font-weight:bold} +#sit_tab .tab_tit li .selected:after {content:"";position:absolute;left:0;bottom:0;width:100%;height:3px;background:#3a8afd;display:inline-block} +#sit_tab .tab_con {background:#fff;padding:15px} +#sit_tab .item_use_count, #sit_tab .item_qa_count {display:inline-block;min-width:20px;height:20px;font-size:0.75em;line-height:20px;padding:0 5px;background:#eee;border-radius:10px;color:#777} + +#sit_buy {display:table-cell;width:270px;border-left:1px solid #e8e8e8;vertical-align:top} +.sit_buy_inner {position:relative;top:0 !important;vertical-align:top} +.sit_side_option {padding:15px 15px 10px;border-bottom:1px solid #ebeff3} +.sit_side_option h3 {margin-bottom:10px} +.sit_side_option label {display:block;margin:0 0 5px;color:#666} +.sit_side_option label.label-title{display:none} +.sit_side_option select {width:100%;margin:0 0 10px;height:50px;padding:0 10px;border:1px solid #cdcdcd; +-webkit-appearance:none; /* 화살표 없애기 for chrome*/ +-moz-appearance:none; /* 화살표 없애기 for firefox*/ +appearance:none; /* 화살표 없애기 공통*/ +background:url('img/select_arrow.png') no-repeat 96% 50%/* 화살표 아이콘 추가 */} +.sit_side_option select::-ms-expand {display:none/* 화살표 없애기 for IE10, 11*/} + +.sit_sel_option {overflow-y:auto;height:300px} +.sit_sel_option h3 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.sit_sel_option:after {display:block;visibility:hidden;clear:both;content:""} +.sit_sel_option li {position:relative;padding:15px;border-bottom:1px solid #e6e9ed} +.sit_sel_option li:after {display:block;visibility:hidden;clear:both;content:""} +.sit_sel_option .sit_opt_del {position:absolute;top:0;right:0;width:30px;height:30px;font-size:15px;border:0;border-left:1px solid #e6e9ed;border-bottom:1px solid #e6e9ed;background:#fff;color:#c6c8ca} +.sit_sel_option .opt_name {font-weight:bold;line-height:28px} +.sit_sel_option .num_input {float:left;border:0;height:30px;border-top:1px solid #e4e4e4;border-bottom:1px solid #e4e4e4;text-align:center} +.sit_sel_option .sit_opt_prc {display:block;float:right;width:100px;padding:0 3px;text-align:right;line-height:30px;font-size:1.183em;font-weight:bold} +.sit_sel_option button {float:left;width:30px;height:30px;border:1px solid #bdc9dc;border-radius:0;background:#fff;color:#666;font-size:0.92em} +.sit_sel_option button:hover {color:#000} + +.sum_section {padding:15px;z-index:3} +.sum_section:after {display:block;visibility:hidden;clear:both;content:""} +.sit_tot_price {font-weight:bold;padding-bottom:10px;line-height:25px;font-size:1.167em;text-align:right} +.sit_tot_price strong {font-size: 1.5em;margin-left:15px} +.sit_tot_price span {float:left} +.sit_order_btn button {display:block;width:100%;padding:15px 0;font-size:1.25em;font-weight:bold} +.sit_order_btn .sit_btn_cart {margin-bottom:5px} + +/* 상품 재입고 알림 (SMS) */ +#sit_sms_new {} +#sit_sms_new .form_01 {padding:20px} +#sit_sms_new #sms_agree {padding:5px 0 20px} +#sit_sms_new li strong {display:inline-block;margin:10px 0} +#sit_sms_new textarea {line-height:1.5em;color:#555} +#sit_sms_new .prd_name {background:#f3f3f3;padding:15px 20px;font-weight:bold;font-size:1.167em} +#sit_sms_new .chk_box input[type="checkbox"]:checked + label span {background:url('img/chk.png') no-repeat 50% 50% #3a8afd} + +/* 상품 상세보기 - 상품정보 */ +#sit_inf {margin:20px 0} +#sit_inf h2 {position:absolute;font-size:0;line-height:0;content:""} +#sit_inf h3 {position:absolute;font-size:0;line-height:0;content:""} + +#sit_inf_basic {margin:0 0 20px;line-height:1.7em} +#sit_inf_explan {margin:0 0 10px;width:auto !important;line-height:1.7em;overflow:hidden} /* ie6 미대응시 #sit_inf_explan {margin:0 0 10px} 만으로 충분 */ +#sit_inf_explan img {max-width:100%;height:auto} + +#sit_inf_open {width:100%;border:0;border-top:1px solid #777;border-collapse:collapse} +#sit_inf_open th {padding:10px;border-bottom:1px solid #e5e5e5;background:#f3f3f3;vertical-align:top;text-align:left} +#sit_inf_open td {padding:10px;border-bottom:1px solid #e5e5e5;background:#fff;vertical-align:top} + +/* 상품 상세보기 - 사용후기 */ +#sit_use {} +#sit_use h2 {position:absolute;font-size:0;line-height:0;content:""} +#sit_use h3 {position:absolute;font-size:0;line-height:0;content:""} + +.sit_use_top {position:relative;background:#fff;border:2px solid #efeff1;margin:0 0 15px;padding:15px;min-height:90px;vertical-align:middle} +.sit_use_top h4 {font-size:1.2em;margin-bottom:10px} +.sit_use_top h4 span {color:#aaa;font-size:0.85em;font-weight:normal} +.sit_use_top .sit_star {height:20px} +.sit_use_top .st_bg {background:#666} + +#sit_use_wbtn {position:absolute;top:20px;right:30px} +#sit_use_wbtn a {padding:0 20px;line-height:45px;font-weight:bold;font-size:1.167em} + +#sit_use_ol {margin:0 0 5px;padding:0;border-top:1px solid #e0e0e0;list-style:none} +.sit_use_li {position:relative;padding:10px 0;padding-left:110px;min-height:120px;border-bottom:1px solid #e0e0e0} +.sit_use_li:after {display:block;visibility:hidden;clear:both;content:""} +.sit_use_li_title {position:absolute;right:20px;bottom:20px;border:1px solid #ddd;padding:8px 10px;border-radius:3px;color:#666;font-size:0.92em;background:#fff} +.sit_use_li_title:hover {background:#6b99ee;border-color:#6b99ee;color:#fff} + +.sit_thum {margin:0;position:absolute;top:10px;left:0} +.sit_use_dl:after {display:block;visibility:hidden;clear:both;content:""} +.sit_use_dl dt {position:absolute;font-size:0;line-height:0;content:""} +.sit_use_dl dd {color:#7f7f7f;line-height:1.5em} +.sit_use_dl .sit_use_star {margin:0 0 5px} +.sit_use_dl .sit_use_tit {font-weight:bold;font-size:1.167em;color:#000 !important} + +.sit_use_con {display:none;margin-right:110px;margin-bottom:10px} +.sit_use_p {margin:10px 0;padding:10px 0} +.sit_use_cmd {} + +.sit_use_reply {position:relative;border-top:1px dotted #bbb;margin:10px 0 0;padding:10px 0 0 40px} +.use_reply_icon {position:absolute;top:10px;left:5px;background:url('./img/use_reply.png') no-repeat 0 0;width:28px;height:17px;text-indent:-999px;overflow:hidden} +.use_reply_tit {font-weight:bold;line-height:1.5em;padding-right:100px} +.use_reply_name {font-size:0.92em;color:#777;margin:5px;position:absolute;top:10px;right:0} +.use_reply_p {padding:10px 0;background:#fff;line-height:1.5em} + +#sit_use_write_star:after {display:block;visibility:hidden;clear:both;content:""} +#sit_use_write_star li {float:left;width:33.333%} +#sit_use_write_star li img {width:100px} + +/* 상품 상세보기 - 상품문의 */ +#sit_qa {margin:20px 0} +#sit_qa h2 {position:absolute;font-size:0;line-height:0;content:""} +#sit_qa h3 {position:absolute;font-size:0;line-height:0;content:""} + +#sit_qa_ol {margin:0 0 5px;padding:0;border-top:1px solid #f0f0f0;list-style:none} +.sit_qa_li:after {display:block;visibility:hidden;clear:both;content:""} +.sit_qa_li {position:relative;border-bottom:1px solid #f0f0f0;padding:15px 10px} +.sit_qa_li_title {display:block;float:left;width:80%;text-align:left;background:none;border:0;line-height:25px;font-weight:bold;font-size:1.167em} + +.sit_qa_dl {float:right;width:20%;line-height:30px;color:#7f7f7f;text-align:right;margin:0} +.sit_qa_dl:after {display:block;visibility:hidden;clear:both;content:""} +.sit_qa_dl dt {position:absolute;font-size:0;line-height:0;content:""} +.sit_qa_dl dd {display:inline-block;margin-left:10px} +.sit_qaa_done {display:inline-block;height:30px;line-height:30px;background:#f6bb42;color:#fff;padding:0 8px;margin-right:10px;font-size:12px;font-weight:normal;border-radius:3px} +.sit_qaa_yet {display:inline-block;height:30px;line-height:30px;background:#ccd1d9;color:#fff;padding:0 8px;margin-right:10px;font-size:12px;font-weight:normal;border-radius:3px} + +.sit_qa_con {display:none;clear:both} +.sit_qa_p {margin:10px 0;background:#f3f3f3;line-height:1.5em} +.sit_qa_p .qa_alp {position:absolute;top:13px;left:15px;font-size:2em;color:#000} +.sit_qa_qaa {padding:15px 20px;padding-left:50px;position:relative;min-height:50px;border-top:1px solid #fff} +.sit_qa_qaq {padding:15px 20px;padding-left:50px;position:relative;min-height:50px} +.sit_qa_con textarea {display:none} +.sit_qa_cmd {text-align:right} + +.sit_qa_pw {display:none;position:absolute;top:30px;left:175px;padding:10px;width:348px;border:1px solid #000;background:#fff;text-align:center} +.sit_qa_pw span {display:block;margin:0 0 5px} + +#sit_qa_wbtn {text-align:right;margin:0 0 20px} +#sit_qa_wbtn a {padding:0 20px;line-height:45px;font-weight:bold;font-size:1.167em} + +#sit_qa_write {} +#sit_qa_write #iq_subject {width:100%} +#sit_qa_write .chk_box input[type="checkbox"]:checked + label span {background:url('img/chk.png') no-repeat 50% 50% #3a8afd} + +/* 상품 상세보기 - 배송정보 */ +#sit_dvr {margin:20px 0} +#sit_dvr h2 {position:absolute;font-size:0;line-height:0;content:""} + +/* 상품 상세보기 - 교환정보 */ +#sit_ex {margin:20px 0} +#sit_ex h2 {position:absolute;font-size:0;line-height:0;content:""} + + +/* 사용후기 모음 */ +#sps_sch {margin:0 0 10px} +#sps_sch a {display:inline-block;padding:0 8px;height:40px;line-height:40px;vertical-align:top;border-radius:3px;background:#434a54;color:#fff;font-weight:bold;text-decoration:none} +#sps_sch .sch_wr {width:300px;border:1px solid #d0d3db;border-radius:3px;display:inline-block;background:#fff} +#sps_sch:after {display:block;visibility:hidden;clear:both;content:""} +#sps_sch select {float:left;border:0;width:175px;height:40px;margin-right:5px;border:1px solid #d0d3db;border-radius:3px} +#sps_sch .sch_input {width:258px;height:38px;border:0;padding:0;background-color:transparent;float:left} +#sps_sch .sch_btn {height:38px;float:left;background:none;border:0;width:40px;font-size:15px} + +#sps {} +#sps ol {margin:0;padding:0;list-style:none} +#sps li {position:relative;padding:15px;border-bottom:1px solid #f0f0f0;background:#fff} +#sps li:after {display:block;visibility:hidden;clear:both;content:""} + +.sps_img {position:absolute;top:15px;left:15px} +.sps_img_inner {float:left;position:relative} +.sps_img a span {position:absolute;font-size:0;line-height:0;overflow:hidden} +.sps_img .prd_detail {position:absolute;right:0;bottom:0;border:0;color:#fff;background:#078601;width:34px;height:34px;text-align:center;opacity:0.8} +.sps_img .prd_detail:hover {opacity:1} + +.review_detail_cnt {display:none;position:fixed;width:100%;height:100%;top:0;left:0;z-index:999;background:rgba(0,0,0,0.1)} +.review_detail_in {position:absolute;top:50%;left:50%;width:590px;max-height:450px;background:#fff;text-align:left;margin-left:-300px;margin-top:-180px;overflow-y:auto;border-radius:3px;border:1px solid #dde7e9;background:#fff;border-radius:3px} +.review_detail_in h3 {padding:15px;border-bottom:1px solid #e8e8e8;font-size:1.4em} +.review_cnt {padding:25px} +.rd_cls {position:absolute;top:0;right:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff} + +.review_tp_cnt {position:relative;padding:0 0 10px;margin-bottom:15px;border-bottom:1px solid #f1f1f1} +.review_tp_cnt>span {font-size:1.2em;display:block} +.review_tp_cnt:after {display:block;visibility:hidden;clear:both;content:""} +.review_tp_cnt .sps_opt_btn_more {position:absolute;top:0;right:0;border:0;padding:5px 5px 5px 10px;background:#fff;color:#c4c8cb;font-size:1.4em} +.review_tp_cnt .sps_opt_li {display:none;position:absolute;top:40px;right:0;border:1px solid #b8bfc4} +.review_tp_cnt .sps_opt_li:before {content:"";position:absolute;top:-8px;right:5px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #b8bfc4 transparent} +.review_tp_cnt .sps_opt_li:after {content:"";position:absolute;top:-6px;right:5px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent} +.review_tp_cnt .sps_opt_li li {border-bottom:1px solid #f1f1f1;padding:10px !important;color:#6b757c} + +.review_summ {background:#fcfcfc;border:2px solid #efeff1;padding:10px} +.review_bt_cnt {margin:15px 0} + +.sps_reply {margin-top:10px;padding-top:10px;border-top:1px dotted #bbb} +.sps_reply .sps_img {text-align:right;width:70px} +.sps_reply .sps_section h2 {background:url('./img/use_reply.png') no-repeat 0 0;text-indent:30px;line-height:1.5em} + +#sps dl {margin:5px 0} +#sps dl:after {display:block;visibility:hidden;clear:both;content:""} +#sps dt {float:left} +#sps dd {float:left;margin:0 10px 0 0;color:#999} +#sps dd img {position:relative;top:-2px} + +.sps_section {float:left;width:100%;padding-left:115px} +.sps_section .sps_pd_name {display:block;color:#3a8afd;padding:10px 0 5px} +.sps_section .sps_rv_tit {display:block;font-size:1.2em;font-weight:bold} +.sps_section .sps_rv_thum {position:absolute;top:15px;right:15px} +.sps_section p {padding:0;width:100%} +.sps_con_full {padding:0;height:auto !important} +.sps_con_btn {clear:both;margin:5px 0} +.sps_con_btn:after {display:block;visibility:hidden;clear:both;content:""} +.sps_con_btn .sps_dl {float:left} +.sps_con_btn button.review_detail {float:right;border-radius:3px;border:1px solid #d4d6db;color:#666;font-size:0.92em;padding:5px 7px;background:#fff} +.sps_con_btn button.review_detail:hover {background:#6b99ee;border-color:#6b99ee;color:#fff} + +/* 상품문의 모음 */ +#sqa_sch {margin:0 0 10px} +#sqa_sch a {display:inline-block;padding:0 8px;height:40px;line-height:40px;vertical-align:top;border-radius:3px;background:#434a54;color:#fff;font-weight:bold;text-decoration:none} +#sqa_sch .sch_wr {width:300px;border:1px solid #d0d3db;border-radius:3px;display:inline-block;background:#fff} +#sqa_sch:after {display:block;visibility:hidden;clear:both;content:""} +#sqa_sch select {float:left;border:0;width:175px;height:40px;margin-right:5px;border:1px solid #d0d3db;border-radius:3px} +#sqa_sch .sch_input {width:258px;height:38px;border:0;padding:0;background-color:transparent;float:left} +#sqa_sch .sch_btn {height:38px;float:left;background:none;border:0;width:40px;font-size:15px} + +#sqa {margin-bottom:20px} +#sqa ol {margin:0;padding:0;list-style:none} +#sqa li {position:relative;padding:15px 20px 15px 15px;border-bottom:1px solid #f0f0f0;background:#fff} +#sqa li:after {display:block;visibility:hidden;clear:both;content:""} +#sqa li .sit_qaa_yet {position:absolute;right:20px;top:20px;margin-right:0} +#sqa li .sit_qaa_done {position:absolute;right:20px;top:20px;margin-right:0} + +.sqa_img {float:left;margin:0 10px 0 0} +.sqa_img span {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#sqa dl {margin:5px 0} +#sqa dl:after {display:block;visibility:hidden;clear:both;content:""} +#sqa dt {float:left} +#sqa dd {float:left;margin:0 10px 0 0;color:#999} + +#sqa dd img {position:relative;top:-2px} +.sqa_con {margin:10px 0;background:#f3f3f3;line-height:1.5em} +.sqa_con .qa_alp {position:absolute;top:13px;left:15px;font-size:2em;color:#000} + +.sqa_section {float:left;width:1100px} +.sqa_section h2 {padding-right:70px;font-size:1.2em;font-weight:bold} +.sqa_section .sqa_con {line-height:1.7em} +.sqa_section p {padding:0;width:100%} +.sqa_con_full {padding:0;height:auto !important} +.sqa_con_btn button {border:1px solid #ddd;padding:5px 8px;color:#666;font-size:0.92em;margin:5px 0;background:#fff} +.sqa_con_btn button:hover {background:#6b99ee;border-color:#6b99ee;color:#fff} + +/* 상품검색 */ +#ssch {margin:20px 0} +#ssch h2 {font-size:1.8em;line-height:30px;margin:10px 0} +#ssch h2 .ssch_result_total {float:right;color:#6f6f6f;font-size:0.55em;font-weight:normal} +#ssch h2 strong {color:#ff005a} +#ssch_frm {background:#fff;border:1px solid #e3e5e8} +#ssch_frm .ssch_scharea {padding:15px;border-bottom:1px solid #e3e5e8} +#ssch_frm .ssch_scharea:after {display:block;visibility:hidden;clear:both;content:""} +#ssch_frm .ssch_scharea label {display:inline-block;margin:0 8px 0 0} +#ssch_frm .ssch_scharea .ssch_input {height:45px;padding:0 10px;margin-right:5px;border:1px solid #d0d3db;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)} +#ssch_frm .ssch_scharea .btn_submit {width:90px;height:45px;margin-right:5px;padding:0 5px;font-weight:bold;border:1px solid #2e3745;background:#434a54} + +#ssch_frm .ssch_left {} +#ssch_frm .ssch_option {padding:15px;border-bottom:1px solid #e3e5e8} +#ssch_frm .ssch_option .ssch_input {height:32px;padding:0 10px;margin-right:5px;border:1px solid #d0d3db;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075); +box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)} + +#ssch_frm p {padding:15px;color:#737373;border-bottom:1px solid #e3e5e8} + +#ssch_cate {background:#fff;border-bottom:1px solid #e3e5e8;padding:15px} +#ssch_cate ul:after {display:block;visibility:hidden;clear:both;content:""} +#ssch_cate li {float:left;width:20%;border-right:1px solid #f6f6f6} +#ssch_cate li:nth-child(5n) {border-right:0} +#ssch_cate li span {font-weight:normal} +#ssch_cate a {display:block;padding:0 10px;line-height:40px} +#ssch_cate a:hover {color:#3a8afd} + +#ssch_sort {float:left;width:80%} +#ssch_sort:after {display:block;visibility:hidden;clear:both;content:""} +#ssch_sort h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#ssch_sort ul {margin:0;padding:0 0 0 1px;list-style:none} +#ssch_sort ul:after {display:block;visibility:hidden;clear:both;content:""} +#ssch_sort li {float:left;position:relative;margin-left:-1px;height:45px;padding:15px 0;line-height:15px} +#ssch_sort li a {border-left:1px solid #ddd;display:block;padding:0 10px} +#ssch_sort li:hover:after {content:"";position:absolute;left:0;bottom:-1px;width:100%;height:2px;background:#3a8afd} +#ssch_sort li:hover a {color:#3a8afd} +#ssch_sort li:first-child a {border:0} + +#ssch_sort_all {margin:0;padding:0 15px;list-style:none} +#ssch_sort_all:after {display:block;visibility:hidden;clear:both;content:""} +#ssch_sort_all li {float:left;position:relative;margin-left:-1px;height:45px;padding:15px 0;line-height:15px} +#ssch_sort_all li a {display:block;padding:0 10px} +#ssch_sort_all li:hover:after {content:"";position:absolute;left:0;bottom:-1px;width:100%;height:2px;background:#3a8afd} +#ssch_sort_all li:hover a {color:#3a8afd} +#ssch_sort_all li:first-child a {border:0} + +/*쿠폰존 리스트*/ +.couponzone_list {margin:0 0 20px;position:relative} +.couponzone_list h2 {padding:15px 20px;font-size:1.25em;border:1px solid #e3e5e8;background:#fff} +.couponzone_list p {position:absolute;top:5px;right:0;margin:15px 20px;color:#666} +.couponzone_list ul {padding:30px;margin:0;list-style:none;background:#fff;border:1px solid #e3e5e8;border-top:0} +.couponzone_list ul:after {display:block;visibility:hidden;clear:both;content:""} +.couponzone_list ul li {float:left;width:262px;margin:0 0 30px 30px;background:#fff} +.couponzone_list ul li:nth-child(4n+1) {clear:both;margin-left:0} +.couponzone_list ul li img {width:100%;height:auto;line-height:1.2em;border-radius:5px 5px 0 0} +.couponzone_list ul li .cp_inner {border:1px solid #ddd;border-radius:5px; +-webkit-box-shadow:0px 1px 6px 0 #dedede; +-moz-box-shadow:0px 1px 6px 0 #dedede; +box-shadow:0px 1px 6px 0 #dedede +} +.couponzone_list ul li .coupon_img {position:relative;height:98px;overflow:hidden;border-bottom:1px dashed #ccc} +.couponzone_list ul li .coupon_tit {position:absolute;top:0;left:0;width:100%;height:98px;padding-top:30px;text-align:center;font-weight:bold;text-overflow:ellipsis;overflow:hidden;white-space:nowrap} +.couponzone_list ul li .coupon_tit strong {display:inline-block;font-size:1.3em} +.couponzone_list ul li .coupon_tit .cp_evt, +.couponzone_list ul li .coupon_tit .cp_evt b {font-size:1.4em} +.couponzone_list ul li .cp_cnt {padding:10px} +.couponzone_list ul li .coupon_date {display:inline-block;float:right;padding:2px 3px;margin:5px 0px;font-size:0.92em;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:#777} +.couponzone_list ul li .coupon_target {display:inline-block;margin:5px 0px} +.couponzone_list ul li .coupon_target>button {display:inline-block;max-width:125px;padding:2px 3px;font-size:0.92em;border:0;border-radius:3px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap} +.couponzone_list ul li .coupon_target .cp_1 {background:#edfbde;color:#8cc152}/*카테고리할인*/ +.couponzone_list ul li .coupon_target .cp_2 {background:#fbdef3;color:#c15293}/*개별상품할인*/ +.couponzone_list ul li .coupon_target .cp_3 {background:#fbf1de;color:#c18b52}/*주문금액할인*/ +.couponzone_list ul li .coupon_target .cp_4 {background:#f2defb;color:#7c52c1}/*배송비할인*/ + +.couponzone_list ul li .coupon_info {display:none;position:absolute;min-width:235px;background:#fff;border:1px solid #000;padding:15px} +.couponzone_list ul li .coupon_info:after {display:block;visibility:hidden;clear:both;content:""} +.couponzone_list ul li .coupon_info h4 {font-size:1.2em;margin-bottom:10px} +.couponzone_list ul li .coupon_info ul {padding:0;margin:0;position:relative;border:0} +.couponzone_list ul li .coupon_info li {width:auto;margin:0;float:inherit;color:#5e5e5e;line-height:18px} +.couponzone_list ul li .coupon_info li a {text-decoration:underline;color:#5e5e5e} +.couponzone_list ul li .coupon_info .coupon_info_cls {position:absolute;right:0;top:0;color:#c7c9cc;border:0;background:#fff;padding:10px;font-size:1.2em} + +.couponzone_list ul li .coupon_btn {text-align:center} +.couponzone_list ul li .coupon_btn .btn02 {width:100%;height:42px;line-height:28px;margin-top:15px;border:0;color:#fff;background:#3a8afd;border-radius:5px;font-weight:bold} +.couponzone_list ul li .coupon_btn .btn02:hover {background:#2176f1;color:#fff} +.couponzone_list ul li .coupon_btn .disabled {background:#c6c6c6;border:1px;color:#fff;border-color:#c6c6c6} +.couponzone_list ul li .coupon_btn .disabled:hover {background:#c6c6c6;border:1px;color:#fff;border-color:#c6c6c6} +.couponzone_list .no_coupon {position:relative;padding:100px 0;text-align:center;color:#999} diff --git a/theme/basic/skin/visit/shop_basic/style.css b/theme/basic/skin/visit/shop_basic/style.css new file mode 100644 index 000000000..a8b4436f9 --- /dev/null +++ b/theme/basic/skin/visit/shop_basic/style.css @@ -0,0 +1,12 @@ +@charset "utf-8"; + +/* 방문자 집계 */ +#visit {position:relative} +#visit .btn_admin {position:absolute;top:0;right:20px;height:25px;line-height:25px;padding:0 5px;border-radius:3px} +#visit h2 {font-size:1.2em;margin-bottom:20px;text-align:left;color:#fff;position:relative} +#visit dl {padding:10px 0} +#visit dl:after {display:block;visibility:hidden;clear:both;content:""} +#visit dt {float:left;width:50%;text-align:left;line-height:23px;height:23px;color:#e3e3e3} +#visit dt span {display:inline-block;width:5px;height:5px;border-radius:50%;vertical-align:middle;margin-right:10px;background:#3a8afd} +#visit dd {float:left;width:50%;padding:0 5px;text-align:right;text-align:right;font-weight:bold;line-height:23px;height:23px;font-size:0.92em} +#visit dd strong {display:inline-block;padding:0 5px;border-radius:20px;line-height:15px;color:#fff} diff --git a/theme/basic/skin/visit/shop_basic/visit.skin.php b/theme/basic/skin/visit/shop_basic/visit.skin.php new file mode 100644 index 000000000..8d42edd72 --- /dev/null +++ b/theme/basic/skin/visit/shop_basic/visit.skin.php @@ -0,0 +1,25 @@ +', 0); +?> + + +
                                    +

                                    접속자집계

                                    +
                                    +
                                    오늘
                                    +
                                    +
                                    어제
                                    +
                                    +
                                    최대
                                    +
                                    +
                                    전체
                                    +
                                    +
                                    + 관리자 +
                                    + \ No newline at end of file diff --git a/theme/basic/tail.php b/theme/basic/tail.php index 78336991c..147cf0a4b 100644 --- a/theme/basic/tail.php +++ b/theme/basic/tail.php @@ -5,6 +5,11 @@ if (G5_IS_MOBILE) { include_once(G5_THEME_MOBILE_PATH.'/tail.php'); return; } + +if(G5_COMMUNITY_USE === false) { + include_once(G5_THEME_SHOP_PATH.'/shop.tail.php'); + return; +} ?>
                            diff --git a/theme/basic/theme.config.php b/theme/basic/theme.config.php index 866b812a0..b6ffe622b 100644 --- a/theme/basic/theme.config.php +++ b/theme/basic/theme.config.php @@ -12,26 +12,140 @@ $theme_config = array(); // 가져오기 기능을 통해 게시판 설정의 해당 필드에 바로 적용할 수 있습니다. // 사용하지 않는 스킨 설정은 값을 비워두시면 됩니다. +// 테마에서 커뮤니티 지원여부 설정 +// 커뮤니티 사용없이 쇼핑몰이 초기화면이라면 false로 설정 +// false 설정이면 게시판 head, tail 은 쇼핑몰의 그것이 적용됨 +if(! defined('G5_COMMUNITY_USE')) define('G5_COMMUNITY_USE', true); + +// 갤러리 이미지 수 등의 설정을 지정하시면 게시판관리에서 해당 값을 +// 가져오기 기능을 통해 게시판 설정의 해당 필드에 바로 적용할 수 있습니다. +// 사용하지 않는 스킨 설정은 값을 비워두시면 됩니다. $theme_config = array( - 'set_default_skin' => false, // 기본환경설정의 최근게시물 등의 기본스킨 변경여부 true, false - 'preview_board_skin' => 'basic', // 테마 미리보기 때 적용될 기본 게시판 스킨 - 'preview_mobile_board_skin' => 'basic', // 테마 미리보기 때 적용될 기본 모바일 게시판 스킨 - 'cf_member_skin' => 'basic', // 회원 스킨 - 'cf_mobile_member_skin' => 'basic', // 모바일 회원 스킨 - 'cf_new_skin' => 'basic', // 최근게시물 스킨 - 'cf_mobile_new_skin' => 'basic', // 모바일 최근게시물 스킨 - 'cf_search_skin' => 'basic', // 검색 스킨 - 'cf_mobile_search_skin' => 'basic', // 모바일 검색 스킨 - 'cf_connect_skin' => 'basic', // 접속자 스킨 - 'cf_mobile_connect_skin' => 'basic', // 모바일 접속자 스킨 - 'cf_faq_skin' => 'basic', // FAQ 스킨 - 'cf_mobile_faq_skin' => 'basic', // 모바일 FAQ 스킨 - 'bo_gallery_cols' => 3, // 갤러리 이미지 수 - 'bo_gallery_width' => 295, // 갤러리 이미지 폭 - 'bo_gallery_height' => 200, // 갤러리 이미지 높이 - 'bo_mobile_gallery_width' => 125, // 모바일 갤러리 이미지 폭 - 'bo_mobile_gallery_height' => 100, // 모바일 갤러리 이미지 높이 - 'bo_image_width' => 600, // 게시판 뷰 이미지 폭 - 'qa_skin' => 'basic', // 1:1문의 스킨 - 'qa_mobile_skin' => 'basic' // 1:1문의 모바일 스킨 + 'set_default_skin' => false, // 기본환경설정의 최근게시물 등의 기본스킨 변경여부 true, false + 'preview_board_skin' => 'basic', // 테마 미리보기 때 적용될 기본 게시판 스킨 + 'preview_mobile_board_skin' => 'basic', // 테마 미리보기 때 적용될 기본 모바일 게시판 스킨 + 'cf_member_skin' => 'basic', // 회원 스킨 + 'cf_mobile_member_skin' => 'basic', // 모바일 회원 스킨 + 'cf_new_skin' => 'basic', // 최근게시물 스킨 + 'cf_mobile_new_skin' => 'basic', // 모바일 최근게시물 스킨 + 'cf_search_skin' => 'basic', // 검색 스킨 + 'cf_mobile_search_skin' => 'basic', // 모바일 검색 스킨 + 'cf_connect_skin' => 'basic', // 접속자 스킨 + 'cf_mobile_connect_skin' => 'basic', // 모바일 접속자 스킨 + 'cf_faq_skin' => 'basic', // FAQ 스킨 + 'cf_mobile_faq_skin' => 'basic', // 모바일 FAQ 스킨 + 'bo_gallery_cols' => 4, // 갤러리 이미지 수 + 'bo_gallery_width' => 215, // 갤러리 이미지 폭 + 'bo_gallery_height' => 215, // 갤러리 이미지 높이 + 'bo_mobile_gallery_width' => 250, // 모바일 갤러리 이미지 폭 + 'bo_mobile_gallery_height' => 200, // 모바일 갤러리 이미지 높이 + 'bo_image_width' => 900, // 게시판 뷰 이미지 폭 + 'qa_skin' => 'basic', // 1:1문의 스킨 + 'qa_mobile_skin' => 'basic', // 1:1문의 모바일 스킨 + 'de_shop_skin' => 'basic', // 쇼핑몰 PC 기본스킨 + 'de_shop_mobile_skin' => 'basic', // 쇼핑몰 모바일 기본스킨 + 'de_type1_list_use' => 1, // PC 히트상품 출력 + 'de_type1_list_skin' => 'main.10.skin.php', // PC 히트상품 출력스킨 + 'de_type1_list_mod' => 5, // PC 히트상품 출력 1줄당 이미지 수 + 'de_type1_list_row' => 2, // PC 히트상품 출력 출력 줄 수 + 'de_type1_img_width' => 160, // PC 히트상품 이미지 폭 + 'de_type1_img_height' => 160, // PC 히트상품 이미지 높이 + 'de_type2_list_use' => 1, // PC 추천상품 출력 + 'de_type2_list_skin' => 'main.20.skin.php', // PC 추천상품 출력스킨 + 'de_type2_list_mod' => 4, // PC 추천상품 출력 1줄당 이미지 수 + 'de_type2_list_row' => 2, // PC 추천상품 출력 출력 줄 수 + 'de_type2_img_width' => 215, // PC 추천상품 이미지 폭 + 'de_type2_img_height' => 215, // PC 추천상품 이미지 높이 + 'de_type3_list_use' => 1, // PC 최신상품 출력 + 'de_type3_list_skin' => 'main.40.skin.php', // PC 최신상품 출력스킨 + 'de_type3_list_mod' => 4, // PC 최신상품 출력 1줄당 이미지 수 + 'de_type3_list_row' => 1, // PC 최신상품 출력 출력 줄 수 + 'de_type3_img_width' => 215, // PC 최신상품 이미지 폭 + 'de_type3_img_height' => 215, // PC 최신상품 이미지 높이 + 'de_type4_list_use' => 1, // PC 인기상품 출력 + 'de_type4_list_skin' => 'main.50.skin.php', // PC 인기상품 출력스킨 + 'de_type4_list_mod' => 5, // PC 인기상품 출력 1줄당 이미지 수 + 'de_type4_list_row' => 1, // PC 인기상품 출력 출력 줄 수 + 'de_type4_img_width' => 215, // PC 인기상품 이미지 폭 + 'de_type4_img_height' => 215, // PC 인기상품 이미지 높이 + 'de_type5_list_use' => 1, // PC 할인상품 출력 + 'de_type5_list_skin' => 'main.30.skin.php', // PC 할인상품 출력스킨 + 'de_type5_list_mod' => 4, // PC 할인상품 출력 1줄당 이미지 수 + 'de_type5_list_row' => 1, // PC 할인상품 출력 출력 줄 수 + 'de_type5_img_width' => 215, // PC 할인상품 이미지 폭 + 'de_type5_img_height' => 215, // PC 할인상품 이미지 높이 + 'de_mobile_type1_list_use' => 1, // 모바일 히트상품 출력 + 'de_mobile_type1_list_skin' => 'main.30.skin.php', // 모바일 히트상품 출력스킨 + 'de_mobile_type1_list_mod' => 2, // 모바일 히트상품 출력 1줄당 이미지 수 + 'de_mobile_type1_list_row' => 4, // 모바일 히트상품 출력 출력 줄 수 + 'de_mobile_type1_img_width' => 230, // 모바일 히트상품 이미지 폭 + 'de_mobile_type1_img_height' => 230, // 모바일 히트상품 이미지 높이 + 'de_mobile_type2_list_use' => 1, // 모바일 추천상품 출력 + 'de_mobile_type2_list_skin' => 'main.10.skin.php', // 모바일 추천상품 출력스킨 + 'de_mobile_type2_list_mod' => 2, // 모바일 추천상품 출력 1줄당 이미지 수 + 'de_mobile_type2_list_row' => 2, // 모바일 추천상품 출력 출력 줄 수 + 'de_mobile_type2_img_width' => 300, // 모바일 추천상품 이미지 폭 + 'de_mobile_type2_img_height' => 300, // 모바일 추천상품 이미지 높이 + 'de_mobile_type3_list_use' => 1, // 모바일 최신상품 출력 + 'de_mobile_type3_list_skin' => 'main.10.skin.php', // 모바일 최신상품 출력스킨 + 'de_mobile_type3_list_mod' => 2, // 모바일 최신상품 출력 1줄당 이미지 수 + 'de_mobile_type3_list_row' => 4, // 모바일 최신상품 출력 출력 줄 수 + 'de_mobile_type3_img_width' => 300, // 모바일 최신상품 이미지 폭 + 'de_mobile_type3_img_height' => 300, // 모바일 최신상품 이미지 높이 + 'de_mobile_type4_list_use' => 1, // 모바일 인기상품 출력 + 'de_mobile_type4_list_skin' => 'main.20.skin.php', // 모바일 인기상품 출력스킨 + 'de_mobile_type4_list_mod' => 2, // 모바일 인기상품 출력 1줄당 이미지 수 + 'de_mobile_type4_list_row' => 2, // 모바일 인기상품 출력 출력 줄 수 + 'de_mobile_type4_img_width' => 80, // 모바일 인기상품 이미지 폭 + 'de_mobile_type4_img_height' => 80, // 모바일 인기상품 이미지 높이 + 'de_mobile_type5_list_use' => 1, // 모바일 할인상품 출력 + 'de_mobile_type5_list_skin' => 'main.10.skin.php', // 모바일 할인상품 출력스킨 + 'de_mobile_type5_list_mod' => 2, // 모바일 할인상품 출력 1줄당 이미지 수 + 'de_mobile_type5_list_row' => 2, // 모바일 할인상품 출력 출력 줄 수 + 'de_mobile_type5_img_width' => 230, // 모바일 할인상품 이미지 폭 + 'de_mobile_type5_img_height' => 230, // 모바일 할인상품 이미지 높이 + 'de_rel_list_use' => 1, // 관련상품 출력 + 'de_rel_list_skin' => 'relation.10.skin.php', // 관련상품 출력 스킨 + 'de_rel_list_mod' => 5, // 관련상품 1줄당 이미지 수 + 'de_rel_img_width' => 215, // 관련상품 이미지 폭 + 'de_rel_img_height' => 215, // 관련상품 이미지 높이 + 'de_mobile_rel_list_use' => 1, // 모바일 관련상품 출력 + 'de_mobile_rel_list_skin' => 'relation.10.skin.php', // 모바일 관련상품 출력 스킨 + 'de_mobile_rel_list_mod' => 3, // 모바일 관련상품 1줄당 이미지 수 + 'de_mobile_rel_img_width' => 230, // 모바일 관련상품 이미지 폭 + 'de_mobile_rel_img_height' => 230, // 모바일 관련상품 이미지 높이 + 'de_search_list_skin' => 'list.10.skin.php', // 검색상품 출력 스킨 + 'de_search_list_mod' => 5, // 검색상품 1줄당 이미지 수 + 'de_search_list_row' => 5, // 검색상품 출력 줄 수 + 'de_search_img_width' => 225, // 검색상품 이미지 폭 + 'de_search_img_height' => 225, // 검색상품 이미지 높이 + 'de_mobile_search_list_skin' => 'list.10.skin.php', // 모바일 검색상품 출력 스킨 + 'de_mobile_search_list_mod' => 2, // 모바일 검색상품 1줄당 이미지 수 + 'de_mobile_search_list_row' => 5, // 모바일 검색상품 출력 줄 수 + 'de_mobile_search_img_width' => 230, // 모바일 관련상품 이미지 폭 + 'de_mobile_search_img_height' => 230, // 모바일 관련상품 이미지 높이 + 'de_mimg_width' => 400, // 상품상세 이미지 Width + 'de_mimg_height' => 400, // 상품상세 이미지 Height + 'ca_skin' => 'list.10.skin.php', // 분류 리스트 스킨 + 'ca_img_width' => 225, // 분류 리스트 이미지 폭 + 'ca_img_height' => 225, // 분류 리스트 이미지 높이 + 'ca_list_mod' => 5, // 분류 리스트 1줄당 이미지 수 + 'ca_list_row' => 5, // 분류 리스트 이미지 줄 수 + 'ca_mobile_skin' => 'list.10.skin.php', // 모바일 분류 리스트 스킨 + 'ca_mobile_img_width' => 230, // 모바일 분류 리스트 이미지 폭 + 'ca_mobile_img_height' => 230, // 모바일 분류 리스트 이미지 높이 + 'ca_mobile_list_mod' => 2, // 모바일 분류 리스트 1줄당 이미지 수 + 'ca_mobile_list_row' => 5, // 모바일 분류 리스트 이미지 줄 수 + 'ev_skin' => 'list.10.skin.php', // 이벤트 출력 스킨 + 'ev_img_width' => 225, // 이벤트 리스트 이미지 폭 + 'ev_img_height' => 225, // 이벤트 리스트 이미지 높이 + 'ev_list_mod' => 5, // 이벤트 리스트 1줄당 이미지 수 + 'ev_list_row' => 5, // 이벤트 리스트 이미지 줄 수 + 'ev_mobile_skin' => 'list.10.skin.php', // 모바일 이벤트 출력 스킨 + 'ev_mobile_img_width' => 230, // 모바일 이벤트 리스트 이미지 폭 + 'ev_mobile_img_height' => 230, // 모바일 이벤트 리스트 이미지 높이 + 'ev_mobile_list_mod' => 2, // 모바일 이벤트 1줄당 이미지 수 + 'ev_mobile_list_row' => 5, // 모바일 이벤트 이미지 줄 수 + 'ca_mobile_list_best_mod' => 2, // 모바일 상품리스트 베스트상품 1줄당 이미지 수 + 'ca_mobile_list_best_row' => 3, // 모바일 상품리스트 베스트상품 이미지 줄 수 ); \ No newline at end of file diff --git a/version.php b/version.php new file mode 100644 index 000000000..58d3e1f1c --- /dev/null +++ b/version.php @@ -0,0 +1,9 @@ + + + + + +
                            +

                            + + + +
                            + + + +
                            + 사이트 내 전체검색 +
                            + + + + + +
                            + + +
                            + + + +
                            + + + + +
                            +
                            + +
                            + + +
                            + + +
                            + + +
                            +
                            + +
                            +
                            +
                            + +
                            +

                            + 이 프로그램은 영카트5 설치 후 바로 실행하셔야만 합니다.
                            + 만약 영카트5 사이트를 운영 중에 이 프로그램을 실행하시면 DB 데이터가 망실되거나 데이터의 오류가 발생할 수 있습니다.
                            + 또한 중복해서 실행하실 경우에도 DB 데이터의 오류가 발생할 수 있으니 반드시 한번만 실행해 주십시오. +

                            +

                            프로그램을 실행하시려면 영카트4의 config.php 파일 경로를 입력하신 후 확인을 클릭해 주십시오.

                            + +
                            +
                            + + + +
                            +
                            + +

                            + 경로는 영카트5 설치 루트를 기준으로 영카트4의 config.php 파일의 상대경로입니다.
                            + 예를 들어 영카트4를 웹루트에 설치하셨고 영카트5를 yc5라는 하위 폴더에 설치하셨다면 입력하실 경로는 ../config.php 입니다. +

                            + +
                            + + + +
                            +
                            + + + +
                            + + +
                            +
                            <?php echo G5_VERSION ?>
                            +
                            +

                            + Copyright © 소유하신 도메인. All rights reserved.
                            + 상단으로 +

                            +
                            +
                            + + + +'; + +if(empty($_POST)) + alert('올바른 방법으로 이용해 주십시오.', G5_URL); + +if(get_session('yc4_tables_copied') == 'done') + alert('DB 데이터 변환을 이미 실행하였습니다. 중복 실행시 오류가 발생할 수 있습니다.', G5_URL); + +if($is_admin != 'super') + alert('최고관리자로 로그인 후 실행해 주십시오.', G5_URL); + +$g4_config_file = trim($_POST['file_path']); + +if(!$g4_config_file) + alert('config.php 파일의 경로를 입력해 주십시오.'); + +$g4_config_file = preg_replace('#/config.php$#i', '', $g4_config_file).'/config.php'; + +if(!is_file($g4_config_file)) + alert('입력하신 경로에 config.php 파일이 존재하지 않습니다.'); + +$shop_config_file = str_replace('config.php', 'shop.config.php', $g4_config_file); + +if(!is_file($shop_config_file)) + alert('입력하신 경로에 shop.config.php 파일이 존재하지 않습니다.\\nshop.config.php 파일은 config.php 파일과 동일한 위치에 있어야 합니다.'); + +$item_img_path = str_replace('config.php', 'data/item', $g4_config_file); + +if(!file_exists($item_img_path)) + alert('상품이미지 폴더를 확인할 수 없습니다. 상품이미지 폴더의 상대경로가 '.$item_img_path.' 이 아니라면\\nyc4_import_run.php 파일에서 $item_img_path 의 값을 수정하신 후 실행해 주십시오.'); + +$is_euckr = false; +?> + + + + + +
                            +

                            + + + +
                            + + + +
                            + 사이트 내 전체검색 +
                            + + + + + +
                            + + +
                            + + + +
                            + + + + +
                            +
                            + +
                            + + +
                            + + +
                            + + +
                            +
                            + +
                            +
                            +
                            + +
                            +
                              + $v){ + if( preg_match('/_table$/i', $k) ){ + $g4[$k] = preg_replace('/[^0-9A-Za-z_]/', '', $v); + } + } + } + + if(preg_replace('/[^a-z]/', '', strtolower($g4['charset'])) == 'euckr') + $is_euckr = true; + + /* + // content table 복사 + $sql = " select * from {$g4['yc4_content_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['content_table']} SET $sql_common "); + } + echo '
                            1. content table 복사
                            2. '.PHP_EOL; + + // new win table 복사 + $sql = " select * from {$g4['yc4_new_win_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if($key == 'nw_id') + continue; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['new_win_table']} SET $sql_common "); + } + echo '
                            3. new win table 복사
                            4. '.PHP_EOL; + + // faq table 복사 + $sql = " select * from {$g4['yc4_faq_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['faq_table']} SET $sql_common "); + } + echo '
                            5. faq table 복사
                            6. '.PHP_EOL; + + // faq master table 복사 + $sql = " select * from {$g4['yc4_faq_master_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['faq_master_table']} SET $sql_common "); + } + echo '
                            7. faq master table 복사
                            8. '.PHP_EOL; + */ + + // banner table 복사 + $sql = " select * from {$g4['yc4_banner_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if($key == 'bn_id') + continue; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['g5_shop_banner_table']} SET $sql_common "); + } + echo '
                            9. banner table 복사
                            10. '.PHP_EOL; + + // event table 복사 + $sql = " select * from {$g4['yc4_event_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if($key == 'ev_id') + continue; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['g5_shop_event_table']} SET $sql_common "); + } + echo '
                            11. event table 복사
                            12. '.PHP_EOL; + + // event item table 복사 + $sql = " select * from {$g4['yc4_event_item_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['g5_shop_event_item_table']} SET $sql_common "); + } + echo '
                            13. event item table 복사
                            14. '.PHP_EOL; + + // item ps table 복사 + $sql = " select * from {$g4['yc4_item_ps_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if($key == 'is_id') + continue; + + if($key == 'is_score') + $val = (int)($val / 2); + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['g5_shop_item_use_table']} SET $sql_common "); + } + echo '
                            15. item ps table 복사
                            16. '.PHP_EOL; + + // item qa table 복사 + $sql = " select * from {$g4['yc4_item_qa_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if($key == 'iq_id') + continue; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['g5_shop_item_qa_table']} SET $sql_common "); + } + echo '
                            17. item qa table 복사
                            18. '.PHP_EOL; + + // item relation table 복사 + $sql = " select * from {$g4['yc4_item_relation_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['g5_shop_item_relation_table']} SET $sql_common "); + } + echo '
                            19. event item table 복사
                            20. '.PHP_EOL; + + // category table 복사 + $sql = " select * from {$g4['yc4_category_table']} "; + $result = sql_query($sql); + $excl_fld = array('ca_skin', 'ca_opt1_subject', 'ca_opt2_subject', 'ca_opt3_subject', 'ca_opt4_subject', 'ca_opt5_subject', 'ca_opt6_subject'); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if(in_array($key, $excl_fld)) + continue; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['g5_shop_category_table']} SET $sql_common, ca_skin = 'list.10.skin.php' "); + } + echo '
                            21. category table 복사
                            22. '.PHP_EOL; + + // item table 복사 + $sql = " select * from {$g4['yc4_item_table']} "; + $result = sql_query($sql); + $excl_fld = array('it_opt1_subject', 'it_opt2_subject', 'it_opt3_subject', 'it_opt4_subject', 'it_opt5_subject', 'it_opt6_subject', 'it_opt1', 'it_opt2', 'it_opt3', 'it_opt4', 'it_opt5', 'it_opt6', 'it_amount2', 'it_amount3', 'it_gallery', 'it_explan_html'); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if(in_array($key, $excl_fld)) + continue; + + if($key == 'it_amount') + $key = 'it_price'; + + if($key == 'it_cust_amount') + $key = 'it_cust_price'; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + // 상품이미지처리 + $idx = 1; + for($k=1; $k<=5; $k++) { + $item_img_file = $item_img_path.'/'.$row['it_id'].'_l'.$k; + if(is_file($item_img_file)) { + $size = @getimagesize($item_img_file); + + if($size[2] < 1 || $size[2] > 16) + continue; + + switch($size[2]) { + case 1: + $ext = 'gif'; + break; + case 2: + $ext = 'jpg'; + break; + case 3: + $ext = 'png'; + break; + case 6: + $ext = 'bmp'; + break; + default: + continue; + break; + } + + // 이미지복사 + @mkdir(G5_DATA_PATH.'/item/'.$row['it_id'], G5_DIR_PERMISSION); + @chmod(G5_DATA_PATH.'/item/'.$row['it_id'], G5_DIR_PERMISSION); + + if(copy($item_img_file, G5_DATA_PATH.'/item/'.$row['it_id'].'/'.$row['it_id'].'_l'.$idx.'.'.$ext)) { + @chmod(G5_DATA_PATH.'/item/'.$row['it_id'].'/'.$row['it_id'].'_l'.$idx.'.'.$ext, G5_FILE_PERMISSION); + $sql_common .= $comma . " it_img{$idx} = '".$row['it_id'].'/'.$row['it_id'].'_l'.$idx.'.'.$ext."' "; + $idx++; + } + } + } + + sql_query(" INSERT INTO {$g5['g5_shop_item_table']} SET $sql_common "); + + // 사용후기의 확인된 건수를 상품테이블에 저장 + update_use_cnt($row['it_id']); + + // 사용후기의 선호도(별) 평균을 상품테이블에 저장 + update_use_avg($row['it_id']); + } + echo '
                            23. item table 복사
                            24. '.PHP_EOL; + + // order table 복사 + $sql = " select * from {$g4['yc4_order_table']} "; + $result = sql_query($sql); + $excl_fld = array('on_uid', 'od_temp_bank', 'od_temp_card', 'od_temp_hp', 'od_temp_point', 'od_receipt_card', 'od_receipt_bank', 'od_receipt_hp', 'od_bank_time', 'od_card_time', 'od_hp_time', 'od_cancel_card', 'od_dc_amount', 'od_refund_amount', 'dl_id', 'od_escrow1', 'od_escrow2', 'od_escrow3', 'od_cash_no', 'od_cash_receipt_no', 'od_cash_app_time', 'od_cash_reg_stat', 'od_cash_reg_desc', 'od_cash_tr_code', 'od_cash_id_info', 'od_cash', 'od_cash_allthegate_gubun_cd', 'od_cash_allthegate_confirm_no', 'od_cash_allthegate_adm_no', 'od_cash_tgcorp_mxissueno', 'od_cash_inicis_noappl', 'od_cash_inicis_pgauthdate', 'od_cash_inicis_pgauthtime', 'od_cash_inicis_tid', 'od_cash_inicis_ruseopt', 'od_cash_receiptnumber', 'od_cash_kspay_revatransactionno'); + + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if(in_array($key, $excl_fld)) + continue; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + $od_receipt_price = $row['od_receipt_bank'] + $row['od_receipt_card'] + $row['od_receipt_hp']; + $od_refund_price = $row['od_refund_amount']; + $od_receipt_time = $row['od_bank_time']; + if(!is_null_time($row['od_card_time'])) + $od_receipt_time = $row['od_card_time']; + else if(!is_null_time($row['od_hp_time'])) + $od_receipt_time = $row['od_hp_time']; + + // 배송정보 + $od_status = '주문'; + $od_delivery_company = ''; + if($row['dl_id'] && $row['od_invoice']) { + $dl = sql_fetch(" select dl_company from {$g4['yc4_delivery_table']} where dl_id = '{$row['dl_id']}' "); + $od_delivery_company = addslashes($dl['dl_company']); + + $od_status = '배송'; + } + + $sql_common .= $comma . " od_receipt_price = '$od_receipt_price', od_refund_price = '$od_refund_price', od_status = '$od_status', od_delivery_company = '$od_delivery_company', od_receipt_time = '$od_receipt_time' "; + + sql_query(" INSERT INTO {$g5['g5_shop_order_table']} SET $sql_common "); + + // 장바구니자료복사 + $sql2 = " select * from {$g4['yc4_cart_table']} where on_uid = '{$row['on_uid']}' "; + $result2 = sql_query($sql2); + $excl_fld2 = array('ct_id', 'on_uid', 'it_opt1', 'it_opt2', 'it_opt3', 'it_opt4', 'it_opt5', 'it_opt6', 'ct_amount', 'ct_send_cost'); + for($k=0; $row2=sql_fetch_array($result2); $k++) { + if($is_euckr) + $row2 = array_map('iconv_utf8', $row2); + + $comma = ''; + $sql_common2 = ''; + + foreach($row2 as $key=>$val) { + if(in_array($key, $excl_fld2)) + continue; + + $sql_common2 .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + $od_id = $row['od_id']; + + $ct_price = $row2['ct_amount']; + + // 상품명 + $it = sql_fetch(" select it_name from {$g5['g5_shop_item_table']} where it_id = '{$row2['it_id']}' "); + $it_name = addslashes($it['it_name']); + + // 주문옵션 + $ct_option = ''; + $deli = ''; + for($j=1; $j<=6; $j++) { + if($row2['it_opt'.$j]) { + $ct_option .= $deli . $row2['it_opt'.$j]; + } + } + + if($ct_option) + $ct_option = addslashes($ct_option); + + $sql_common2 .= $comma . " ct_price = '$ct_price', it_name = '$it_name', ct_option = '$ct_option' "; + + sql_query(" INSERT INTO {$g5['g5_shop_cart_table']} SET od_id = '$od_id', $sql_common2 , ct_select = '1' "); + } + + // 주문상품의 상태체크 + $cnt1 = sql_fetch(" select count(*) as cnt from {$g5['g5_shop_cart_table']} where od_id = '$od_id' "); + $cnt2 = sql_fetch(" select count(*) as cnt from {$g5['g5_shop_cart_table']} where od_id = '$od_id' and ct_status = '완료' "); + if($cnt1['cnt'] == $cnt2['cnt'] && $cnt2['cnt'] > 0) + $od_status = '완료'; + + // 미수금 등의 정보 + $info = get_order_info($od_id); + + if(!$info) + continue; + + $sql = " update {$g5['g5_shop_order_table']} + set od_cart_price = '{$info['od_cart_price']}', + od_cart_coupon = '{$info['od_cart_coupon']}', + od_coupon = '{$info['od_coupon']}', + od_send_coupon = '{$info['od_send_coupon']}', + od_cancel_price = '{$info['od_cancel_price']}', + od_misu = '{$info['od_misu']}', + od_tax_mny = '{$info['od_tax_mny']}', + od_vat_mny = '{$info['od_vat_mny']}', + od_free_mny = '{$info['od_free_mny']}', + od_status = '$od_status' + where od_id = '$od_id' "; + sql_query($sql); + } + echo '
                            25. order table 복사
                            26. '.PHP_EOL; + + // wish table 복사 + $sql = " select * from {$g4['yc4_wish_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if($key == 'wi_id') + continue; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['g5_shop_wish_table']} SET $sql_common "); + } + echo '
                            27. event item table 복사
                            28. '.PHP_EOL; + + echo '
                            '.PHP_EOL; + + echo '
                            영카트4 DB 데이터 이전 완료
                            '.PHP_EOL; + + // 실행완료 세션에 기록 + set_session('yc4_tables_copied', 'done'); + ?> +
                            + +
                            +
                            + + + +
                            + + +
                            +
                            <?php echo G5_VERSION ?>
                            +
                            +

                            + Copyright © 소유하신 도메인. All rights reserved.
                            + 상단으로 +

                            +
                            +
                            + + + +