/* odaeri/js/cartControl.js */ // 2017-09-02오후 4:04 // 글로벌 변수들... // geolocationToAddr() 완료후 추가수행이 이루어지는 콜백 펑션.. var geolocationCallBackFunc = ""; var queryCartActionCallBackFunc = ""; var targetInd = 0; var currentQuantity = 1; var targetQntity = 1; // 카트 옵션 아약스 트리거 버튼 클릭시.. 서버 액셔너 호출 $(document).on("click",".cartOptionAjaxActionBtn", function() { console.log("typeof $(this).closest(.cartEachOrdersDiv).attr(id)" + typeof $(this).closest(".cartEachOrdersDiv").attr("id") ); if( typeof $(this).closest(".cartEachOrdersDiv").attr("id") === "string" ) { var cartId = $(this).closest(".cartEachOrdersDiv").attr("id").replace("eachCartOrdersDiv_",""); } var $nextSib = $(this); // mode=modCart // quantity 컨트롤러 // 출력되는 quantity 는 JSON 으로 서버처리 확인이 된 뒤에 바꿔준다.. 여기서 출력변화는 하지 않는다. if( $(this).hasClass("driveOptionQuantitySelector") ) { currentQuantity = parseInt( $(this).siblings(".driveOptionQuantity").text() ); console.log( "currentQuantity : " +currentQuantity ); $nextSib = $(this); if( $(this).hasClass("quantityMinus") ) targetQntity = currentQuantity-1; else if( $(this).hasClass("quantityPlus") ) targetQntity = currentQuantity+1; $(this).attr("data-value", targetQntity ); console.log( "Quantity : " + $(this).attr("data-value" ) ); // quantity 는 1 보다 작을 수 없다. if($nextSib.attr("data-value") < 1 ) { alert("운행 수량은 1대 이상이어야 합니다."); return; } else if($nextSib.attr("data-value") > 9 ) { alert("운행 수량은 9대 이하이어야 합니다."); return; } // selectedQntityStorage 밸류 인젝션 $("#eachCartOrdersDiv_"+cartId).find(".selectedQntityStorage").attr("data-value", targetQntity); // 액션 URI var actionVars = "cartId=" + cartId + "&mode=modCart&" + $nextSib.attr("data-id") + "=" + $nextSib.attr("data-value") + "&"; // Amount 업데이트 cartSelectedChargesAmount(); //queryCartAction( actionVars ); queryCartAction( actionVars, "updateQuantitySelected", cartId ); return; } // driveCharge 컨트롤러 // 역시 마찬가지... 출력되는 driveCharge 는 여기서 바꿔주지 않고, JSON 확인이 완료된 뒤에 바꿔준다. /* 2017-09-03오후 1:18 odometer 작동을 위해, 서버 액션 이후, 전체 cart 아이템들을 모두 리프레시 하지 말고, 금액만 변경해주자. queryCartAction() 펑션에 파라메터를 추가해서 queryCartJSON() 펑션 호출을 막아주자. */ else if( $(this).attr("data-id") == "driveOptionDriveChargeChangeTo" ) { // 허용된 요금 구간내에서만 + - 조절이 허용된다. // priceRangeArr 어레이에서 서버의 selectedCharge 의 위치를 찾아내고, // 그 전/후 값을 각각 -/+ 버튼의 data-value 속성에 할당해준다. // 마지막 값으로 전/후 값이 없을 경우... data-value 속성값은 null 이 되고, 이 경우 에러를 리턴한다. var thisPriceRangeArr = $(this).siblings(".priceRangeStorage").attr("data-value").split(":"); var thisSelectedCharge = $(this).siblings(".selectedChargeStorage").attr("data-value"); console.log(" thisPriceRangeArr " + thisPriceRangeArr ); console.log(" thisSelectedCharge " + thisSelectedCharge ); // 현재 선택된 차지의 index 값을 받아온다. var ind = parseInt( findKey(thisPriceRangeArr, thisSelectedCharge) ); // -, + 버튼의 타겟 index 값 if( $(this).hasClass("driveChargeMinus") ) targetInd = ind-1 ; else if( $(this).hasClass("driveChargePlus") ) targetInd = ind+1 ; // 범위를 벗어나면 리턴 if( targetInd < 0 || targetInd >= thisPriceRangeArr.length ) { alert("조정 범위를 초과하였습니다."); return; } var actionVars = "cartId=" + cartId + "&mode=modCart&selectedCharge=" + thisPriceRangeArr[targetInd] + "&"; console.log(" actionVars " + actionVars ); queryCartAction( actionVars, "updateDriveChargeSelected", cartId ); //$(this).siblings(".selectedCharge").text(thisPriceRangeArr[targetInd].format() ); //refreshOdometer( "odometer", thisPriceRangeArr[targetInd] ); return; //console.log(" ind " + ind ); } // 삭제버튼 클릭 대응 if( $(this).hasClass("cartEachOrderDeleteBtn") ) { if( confirm("삭제하시겠습니까?") ) { var actionVars = "cartId=" + cartId + "&" + $nextSib.attr("data-id") + "=" + $nextSib.attr("data-value") + "&"; queryCartAction( actionVars ); return; } else return; } // driveOptions 컨트롤러 // 나머지 UL > LI 옵션들 처리... // 마지막 LI 클릭시, .first() 를 핸들하도록 처리.. else { if( typeof $(this).next().attr("data-id") !== "undefined" ) $nextSib = $(this).next(); else $nextSib = $(this).siblings().eq(0); // 액션 URI var actionVars = "cartId=" + cartId + "&mode=modCart&" + $nextSib.attr("data-id") + "=" + $nextSib.attr("data-value") + "&"; console.log("actionVars : " + actionVars); // Exceptions 처리... queryCartAction( actionVars ); // 폼 스트링 업데이트 updateCartItemFormSerialized( cartId, $nextSib.attr("data-id"), $nextSib.attr("data-value") ); } }); // 서버에 카트 액션 URL 을 요청한다. // 리턴 JSON 에 따라 대응 처리.... function queryCartAction( actionVars, callBackFunc, args ) { callBackFunc = typeof callBackFunc !== 'undefined' ? callBackFunc : ""; args = typeof args !== 'undefined' ? args : ""; $.getJSON("/ajax/cartAction.php?"+ actionVars + "callback=?", function( jsonObj ) { // do something... if( jsonObj.actionResult == "OK" && callBackFunc=="" ) queryCartJSON(); else if( callBackFunc!="" ) window[callBackFunc](args); }); } // 서버에 카트 JSON 을 요청한다. // odometer 가 작동하려면 이렇게 해서는 addNewCartOrdersDiv() 이렇게 해선 안되고.... 2017-09-02오후 4:00 // 변화되는 숫자 항목 하나씩만 변경해주도록 바꿔야 한다. function queryCartJSON() { console.log( "locationCoord['y'] : " + locationCoord['y'] ); $.getJSON( "/ajax/cartList.php?&callback=?", function( jsonObj ) { console.log(" typeof jsonObj " + jsonObj ); if( jsonObj != null ) { $("#eachCartOrdersFrameDiv").empty(); $.each( jsonObj, function( id, ea ) { addNewCartOrdersDiv(id, ea); }); } else { console.log(" 엠티 카트.... "); $(".cartEnabled").addClass("display-none"); $(".cartEmptyDiv").removeClass("display-none"); } }); } // 단일 카트 항목의 요금만 업데이트 시킨다. .quickOrderSummaryDataDiv function updateDriveChargeSelected( cartId ) { // Cart.html 에서의 액션 요청 처리... if(cartId) var $_selectedCartItem = $("#eachCartOrdersDiv_"+cartId); // QuickOrder - 단일카트 아이템 요청 처리... else var $_selectedCartItem = $(".quickOrderSummaryDataDiv"); // var thisPriceRangeArr = $_selectedCartItem.find(".priceRangeStorage").attr("data-value").split(":"); var thisSelectedCharge =$_selectedCartItem.find(".selectedChargeStorage").attr("data-value"); $_selectedCartItem.find(".selectedChargeStorage").attr("data-value", thisPriceRangeArr[targetInd]); // 히든 선택항목 밸류 refreshOdometerSingle( $_selectedCartItem.find(".selectedCharge"), thisPriceRangeArr[targetInd] ); // 출력 선택항목 밸류 & odometer.trigger refreshOdometerSingle( $("#quickOrderBenefitsBlackDiv").find(".finalCharge"), thisPriceRangeArr[targetInd] ); // 출력 선택항목 밸류 & odometer.trigger // 메인 폼 밸류 업데이트 $("#selectedPrice").val(thisPriceRangeArr[targetInd]); // 폼 스트링 업데이트 //updateCartItemFormSerialized( cartId, "selectedCharge", thisPriceRangeArr[targetInd] ); // Amount 업데이트 cartSelectedChargesAmount(); } // 단일 카트 항목의 quantity 만 업데이트 시킨다. function updateQuantitySelected(cartId ) { console.log( "targetQntity : "+targetQntity ); $("#eachCartOrdersDiv_"+cartId).find(".driveOptionQuantity").text( targetQntity ); // 히든 선택항목 밸류 refreshOdometerSingle( $("#eachCartOrdersDiv_"+cartId).find(".driveOptionDriveQntity"), targetQntity ); // 출력 선택항목 밸류 & odometer.trigger // 폼 스트링 업데이트 //updateCartItemFormSerialized( cartId, "qntity", targetQntity ); // Amount 업데이트 cartDriversAmount(); } var eachCartOrdersDivId=""; // 서버의 Cart.JSON 으로부터 개별오더 출력 블럭들을 구성해준다. function addNewCartOrdersDiv(id, obj) { eachCartOrdersDivId = "eachCartOrdersDiv_"+obj.cartId; $("#cartDriveElementPrimitiveDom").clone().attr("id",eachCartOrdersDivId).appendTo("#eachCartOrdersFrameDiv"); $("#"+eachCartOrdersDivId).removeClass("display-none"); $("#"+eachCartOrdersDivId+" .deptFullAddr").text( obj.deptFullAddr ); $("#"+eachCartOrdersDivId+" .destFullAddr").text( obj.destFullAddr ); $("#"+eachCartOrdersDivId+" .driveDistance").text( obj.driveDistance ); $("#"+eachCartOrdersDivId+" .defaultPrice").text( obj.defaultPrice.format() ); $("#"+eachCartOrdersDivId+" .selectedCharge").text( obj.selectedCharge.format() ); $("#"+eachCartOrdersDivId+" .driveQntity").text( obj.qntity ); // driverOptions 구성.. $("#"+eachCartOrdersDivId+" .cartDriveOptionsUL > li").css("display","none"); $("#"+eachCartOrdersDivId+" .cartDriveOptionsUL > li").filter("[data-value='"+obj.driverSex+"']").css("display","inline-block"); $("#"+eachCartOrdersDivId+" .cartDriveOptionsUL > li").filter("[data-value='"+obj.driverLicense+"']").css("display","inline-block"); $("#"+eachCartOrdersDivId+" .cartDriveOptionsUL > li").filter("[data-value='"+obj.transmission+"']").css("display","inline-block"); // 각 오더의 priceRange 를 구성한다. // 구버전 카트에 삽입된 스트링을 보기위해 추가한 코드로, 없애도 서비스와는 무관하다. var priceRangesStr = ""; if( obj.priceRangeSerialized.indexOf("priceRange") > -1 ) { var tempArr = obj.priceRangeSerialized.split("&"); $.each( tempArr, function( ind, val ) { var tempArr2 = val.split("="); $.each( tempArr2, function( ind2, val2 ) { val2.replace("/[^0-9]/",""); if( is_numeric(val2) ) priceRangesStr += val2 + ":" ; }); }); priceRangesStr.replace("/:$/g",""); //console.log(" 구버전 카트 priceRangesStr " + priceRangesStr ); } $("#"+eachCartOrdersDivId+" .deptGeoIdStorage").attr("data-value", obj.deptGeoId); $("#"+eachCartOrdersDivId+" .destGeoIdStorage").attr("data-value", obj.destGeoId); $("#"+eachCartOrdersDivId+" .destFullAddrStorage").attr("data-value", obj.destFullAddr); if(!priceRangesStr) $("#"+eachCartOrdersDivId+" .priceRangeStorage").attr("data-value", obj.priceRangeSerialized); else $("#"+eachCartOrdersDivId+" .priceRangeStorage").attr("data-value", priceRangesStr); $("#"+eachCartOrdersDivId+" .defaultPriceStorage").attr("data-value", obj.defaultPrice); $("#"+eachCartOrdersDivId+" .selectedChargeStorage").attr("data-value", obj.selectedCharge); $("#"+eachCartOrdersDivId+" .selectedQntityStorage").attr("data-value", obj.qntity); $("#"+eachCartOrdersDivId+" .cartCoordXStorage").attr("data-value", obj.coordX); $("#"+eachCartOrdersDivId+" .cartCoordYStorage").attr("data-value", obj.coordY); cartItemLocationAccuracy( obj.cartId, obj ); //var elem = document.getElementsByClassName('odometer'); //var firstElem = elem[1]; //var elem = $(".odometer:eq(3)"); //refreshOdometerSingle( elem, "20,000" ); // Amount 업데이트 cartDriversAmount(); cartSelectedChargesAmount(); makeCartItemFormSerialized(obj.cartId, obj); // 카트 밸리데이터 cartValidator(); } // 2017-10-06오전 3:32 // locationAccuracy 처리블럭을 펑션으로 분리한다. -- locationAccuracy 처리 일원화 펑션.. // 현재위치와 카트 아이템의 물리적 직선거리를 확인하고, // 지정범위 밖이거나 허용정책을 벗어난 경우, locationAccuracy 에 락을 걸어주고 디스플레이를 변경해준다. // 현재 좌표값은 locationCoord 어레이에 확보되어 있아야 하고, 카트 아이템의 죄표값은 파라메터 obj 에 들어있어야 한다. // onLoad 시에도 사옹되고, 출발지점 변경후 locationAccuracy 검사할 때도 사용된다. 모든 locationAccuracy 검사시 사용된다. function cartItemLocationAccuracy( cartId, obj ) { if(obj.coordY && obj.coordX) { // 단말기의 현재위치와, 각 카트아이템의 출발위치 의 거리-간격을 조회한다. var locationAccuracy = calcCrow( locationCoord['y'], locationCoord['x'], obj.coordY, obj.coordX).toFixed(5)*1000; locationAccuracy = locationAccuracy.toFixed(1); } else var locationAccuracy = "Unknown"; $("#"+eachCartOrdersDivId+" .locationAccuracy").text( locationAccuracy); /* locationAccuracy 정책 : 다음 조건에서는 locationAccuracy 검사를 통과한 것으로 본다. 지오-리버스지오 결과 오차가 생각보다 매우 크게 나오는 경우가 많았다. 시간을 두고 좀 더 정교한 룰을 만들어볼 것.. 1. 기본 70m 이내의 거리에 있을 때, 2. 기본 70m 이상, 100m 이내의 거리에 있으면서 주소 번지수가 같을 때.. 대쉬 이하 번지수는 무시하고 비교.. 단말기 위치 : var locationAddrStripped = locationFullAddr.substring(0, locationFullAddr.indexOf("-")); 카트아이템 출발주소 : var deptAddrStripped = obj.deptFullAddr.substring(0, obj.deptFullAddr.indexOf("-")); var locationAddrStripped = locationFullAddr.substring(0, locationFullAddr.indexOf("-")); var deptAddrStripped = obj.deptFullAddr.substring(0, obj.deptFullAddr.indexOf("-")); 대쉬 포함으로 정책을 다시 수정... 2017-09-15오전 12:59 */ // locationAccuracy 가 unknown 이 아니거나 70m 이내일 때, 또는 100m 이내이고 주소가 일치할 때 // 출발지 재지정 버튼 클래스를 숨겨준다. eachCartOrdersDivId = "eachCartOrdersDiv_"+cartId; // locationAccuracy 유효성 검사를 위한 변수 값 할당 $("#"+eachCartOrdersDivId+" .locationAccuracy").text( locationAccuracy); //var deptAddrStripped = obj.deptFullAddr.substring(0, obj.deptFullAddr.indexOf("-")); console.log( "locationAccuracy : " +locationAccuracy ); $("#"+eachCartOrdersDivId+" .locationAccuracyStorage").attr("data-value", locationAccuracy ); if( (locationAccuracy!="Unknown" && locationAccuracy < 70) || (locationAccuracy <= 100 && locationFullAddr==obj.deptFullAddr) ) { $("#"+eachCartOrdersDivId+" .deptAccuracyBtn").css("display","none"); $("#"+eachCartOrdersDivId+" .deptAccuracyDiv").css("display","none"); } } /* 2017-09-11오후 5:21 복수 아이템의 serialize 처리 방법 고민... 1. 각 카트아이템 블럭에 스토리지용 span 을 추가한다. 2. 카트아이템을 구성해주는 펑션 addNewCartOrdersDiv() 에서 serialize 해주는 펑션을 호출해준다. cartItem[0] ... cartItem[n] var eachCartItemSerialize = "cartItem_"+eachCartOrdersDivId ; */ // 각 카트 아이템의 데이터셋을 form.serialize() 된 스트링으로 구성해준다. function makeCartItemFormSerialized( cartId, obj) { var itemSerialized = ""; itemSerialized += "&qntity=" + obj.qntity; itemSerialized += "&driveDistance=" + obj.driveDistance; itemSerialized += "&defaultPrice=" + obj.defaultPrice; itemSerialized += "&selectedCharge=" + obj.defaultPrice; itemSerialized += "&driverSex=" + obj.driverSex; itemSerialized += "&transmission=" + obj.transmission; itemSerialized += "&driverLicense=" + obj.driverLicense; itemSerialized += "&deptGeoId=" + obj.deptGeoId; itemSerialized += "&destGeoId=" + obj.destGeoId; itemSerialized += "&deptPointId=" + obj.deptPointId; itemSerialized += "&destPointId=" + obj.destPointId; itemSerialized += "&selectedCharge=" + obj.selectedCharge; // selectedCharge // 만들어진 값 넣어주기 console.log( "#eachCartOrdersDiv_ : " + "#eachCartOrdersDiv_"+cartId ); console.log( "#eachCartOrdersDiv_ : " + itemSerialized ); $("#eachCartOrdersDiv_"+cartId+" .cartItemFormSerialized").attr("data-value", itemSerialized ); } // 카트 아이템 항목값 변경 액션시, 해당 아이템의 값을 form.serializedString 에서 수정해준다. function updateCartItemFormSerialized( cartId, elem, val ) { var serializedSource = $("#eachCartOrdersDiv_"+cartId+" .cartItemFormSerialized").attr("data-value"); console.log( "serializedSource : " +serializedSource ); console.log( "elem, val : " +elem+", "+val ); var serializedOutput = ""; var arr = serializedSource.split("&"); $.each( arr, function( ea, eaVal ) { var addingStr = ""; if( eaVal.length>1 ) { var arr2 = eaVal.split("="); if( arr2[0] == elem ) addingStr = elem+"="+val+"&"; else addingStr = eaVal+"&"; } //console.log( "eaVal : " +eaVal ); //console.log( "serializedOutput : " +serializedOutput ); serializedOutput += addingStr; }); if(!serializedOutput) serializedOutput= serializedSource; // 수정된 값 넣어주기 $("#eachCartOrdersDiv_"+cartId+" .cartItemFormSerialized").attr("data-value", serializedOutput ); } //// 액션 버튼 - 서밋 액션 시에, 모든 카트항목들의 serializedStr 을 serialize() 해준다. function SerializeAllCartItems() { } //// ReGenCartItemDeptLocation //// 카트 아이템의 출발지 재설정 버튼 클릭에 대응하여, 서버에 처리요청을 넘겨주고, 리턴 JSON 을 받아와서 해당 아이템의 출력을 변경해준다. /* 2017-09-16오후 1:55 접근이 잘못됐다. php 내부에서 인콰이어리를 불러오겠다는 건 잘못된 생각... JS 에서 새로운 출발주소로 인콰이어리를 하고, 결과 JSON 으로 Cart.update php 를 호출해주는 방법으로 가야하는게 맞다. 1. driveChargeAction.php 에 전달 URL 생성 ---- 완료 2. getJSON ---- 완료 3. 출력 항목 변경 4. form.Data 변경 5. update.Cart.php 호출 */ $(document).on("click", ".resetDeptPointFromGeoLocation", function() { var cartId = $(this).closest(".cartEachOrdersDiv").attr("id").replace("eachCartOrdersDiv_",""); eachCartOrdersDivId = "eachCartOrdersDiv_"+cartId; // 서버에 넘겨주는 정보 : cartId, 현재위치 좌표 값, var destGeoId = $("#"+eachCartOrdersDivId+" .destGeoIdStorage").attr("data-value"); var destFullAddr = $("#"+eachCartOrdersDivId+" .destFullAddrStorage").attr("data-value"); var paramStr = "deptGeoId="+locationGeoId+"&deptFullAddr="+locationFullAddr+"&deptCoord4326X="+locationCoord['x']+"&deptCoord4326Y="+locationCoord['y']; paramStr += "&destGeoId="+destGeoId+"&destFullAddr="+destFullAddr+"&actioned=actioned"; console.log("서버 액셔너 호출 : "+paramStr); $.getJSON( "/ajax/driveChargeAction.php?&callback=?", paramStr, function( jsonObj ) { if( jsonObj.actionResult=="OK" ) { console.log( "jsonObj.deptFullAddr : " + jsonObj.deptFullAddr ); console.log( "jsonObj.priceRangeStorage : " + jsonObj.priceRangeStorage ); jsonObj.coordY = locationCoord['y']; jsonObj.coordX = locationCoord['x']; // 출력항목 변경 : 출발지 주소, 거리, 요금, 요금 레인지 selectedChargeStorage $("#"+eachCartOrdersDivId+" .deptFullAddr").text(jsonObj.deptFullAddr); $("#"+eachCartOrdersDivId+" .driveDistance").text(jsonObj.driveDistance); $("#"+eachCartOrdersDivId+" .defaultPrice").text(jsonObj.defaultPrice); $("#"+eachCartOrdersDivId+" .selectedCharge").text(jsonObj.defaultPrice); $("#"+eachCartOrdersDivId+" .selectedChargeStorage").attr("data-value", jsonObj.defaultPrice); refreshOdometerSingle( $("#"+eachCartOrdersDivId+" .selectedCharge"), jsonObj.defaultPrice ); $("#"+eachCartOrdersDivId+" .priceRangeStorage").attr("data-value",jsonObj.priceRangeFullStr); // 푬 항목 데이터 변경 -- deptGeoId, deptFullAddr, driveDistance, defaultPrice updateCartItemFormSerialized( cartId, "deptGeoId", jsonObj.deptGeoId ); updateCartItemFormSerialized( cartId, "deptFullAddr", jsonObj.deptFullAddr ); updateCartItemFormSerialized( cartId, "driveDistance", jsonObj.driveDistance ); updateCartItemFormSerialized( cartId, "defaultPrice", jsonObj.defaultPrice ); updateCartItemFormSerialized( cartId, "selectedCharge", jsonObj.defaultPrice ); // 카트 아이템의 폼.serialize(); makeCartItemFormSerialized(cartId, jsonObj); // updateCart var resignDeptPointParam = "mode=resignDeptPoint&cartId="+cartId+"&deptGeoId="+jsonObj.deptGeoId+"&deptPointId="+jsonObj.deptPointId+"&driveDistance="+jsonObj.driveDistance+"&defaultPrice="+jsonObj.defaultPrice+"&deptFullAddr="+jsonObj.deptFullAddr+"&priceRangeSerialized="+jsonObj.priceRangeFullStr+"&"; // 서버 액셔너 펑션 호출... // 콜백 펑션에서 필요한 내용들을 정리해서 펑션으로 따로 만들어줘야 한다. queryCartAction( resignDeptPointParam ); // locationAccuracy 처리는 굳이 콜백으로 처리해야 할 필요가 없다. 현재위치와 현재위치 간의 비교이므로, 서버에서 받아오는 좌표값이 없기 때문이다. // 만약, 사용자지정 위치를 허용하게 되고, 그래햐 할 필요가 있다면??? // 그 경우에도, 지도지정 위치만을 허용하도록 해서 ajax 호출전에 미리 지정지점의 좌표가 확보되도록 규칙을 정해주자. cartItemLocationAccuracy( cartId, jsonObj ); //$.ajax("/ajax/", function() { // LocationAccuracy Lock 해제 //$("#"+eachCartOrdersDivId+" .deptAccuracyDiv").slideUp(); //}); cartDriversAmount(); cartSelectedChargesAmount(); // 카트 밸리데이터 cartValidator(); } else { } }); }); // 호출 대리기사 Amount 를 실시간 계산 function cartDriversAmount() { var driversAmnt=0; $(".driverQntitySelected").each( function() { //console.log( "여기와 $(this).text() : " +$(this).text() ); if($(this).text().length>0) driversAmnt += parseInt( $(this).text() ); }); //$("#cartDriversAmount").text(driversAmnt); //console.log( "driversAmnt : " + driversAmnt ); if($("#cartDriversAmount").length>0) refreshOdometerSingle( $("#cartDriversAmount"), driversAmnt ); if($("#orderSummaryQntitySum").length>0) refreshOdometerSingle( $("#orderSummaryQntitySum"), driversAmnt ); } // 총 대리비 Amount 를 실시간 계산 function cartSelectedChargesAmount() { var selectedChargesAmnt=0; $(".selectedChargeStorage").each( function() { //console.log( "$(this).attr(data-value) : " +$(this).attr("data-value") ); // .selectedQntityStorage var qntity = parseInt( $(this).next(".selectedQntityStorage").attr("data-value") ); //console.log( "qntity 변경 : " +qntity ); selectedChargesAmnt += parseInt( $(this).attr("data-value") )*qntity; //console.log( "selectedCharge : " + $(this).attr("data-value") ); //console.log( "selectedChargesAmnt : " + selectedChargesAmnt ); }); //console.log( "$(#orderSummaryChargeSum ).length : " + $("#orderSummaryChargeSum ").length ); //$("#cartSelectedChargesAmount").text(selectedChargesAmnt); if($("#cartSelectedChargesAmount").length > 0 ) refreshOdometerSingle( $("#cartSelectedChargesAmount"), selectedChargesAmnt ); if($("#orderSummaryChargeSum ").length > 0 ) refreshOdometerSingle( $("#orderSummaryChargeSum "), selectedChargesAmnt ); } // 카트 --> 오더쉬트 로 이동을 허용하기 위한 필요충분조건들을 검사하고 결과를 리턴한다. // 카트 페이지의 밸리데이션은 이런 방식으로... /* [주문하기] 버튼 바로위에 에러상황 메세지가 싱글라인으로 노출된다. - 에러 메세지는 모든 가능한 에러상황에 대응, 펑션으로 처리한다. [주문하기] 버튼은 모든 조건이 충족된 후에 disabled 가 제거된다. */ var validationResult = ""; function cartValidator() { validationResult = validateDeptLocations(); //console.log( "validationResult : " + validationResult ); // .locationAccuracyStorage 모두를 검사하고 밸리데이팅... if( validationResult=="false" ) { $("#cartValidateResult").slideDown(); $("#wholeCartSubmitBtn").addClass("button-disabled"); //$(".wholeCartSubmitBtn").addClass("display-none"); } else if( validationResult=="true" ) { $("#cartValidateResult").slideUp(); $("#wholeCartSubmitBtn").removeClass("button-disabled"); //$(".wholeCartSubmitBtn").removeClass("display-none"); } } // .locationAccuracyStorage 모두를 검사하고 밸리데이팅... function validateDeptLocations() { var validationResult = "true"; $(".locationAccuracyStorage").each( function() { //console.log( "$(this).attr(data-value) : " +$(this).attr("data-value") ); if( $(this).attr("data-value")=="unknown" || $(this).attr("data-value") > 100 ) { // locationAccuracy 정책에 위배된 아이템이 하나라도 존재하면 카트 --> 오더 진행을 불허한다. console.log( "// 카트 --> 오더 진행을 불허한다." ); validationResult = "false" ; } }); return validationResult; }