// odaeri/js/odaeri20160224.js
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
// sweetPages 테이블의 온로드 및 선택TH 동기화를 위한 펑션 & 호출부
// 2016-02-10오전 11:43
// JQM 반응형테이블 columntoggle 을 적용시키고, 모든 클래스테이블들으로 동기화시켜준다.
$(document).on("pageinit", ".jqmPageClass", function () {
// console.log("debugging started...");
// 디폴트첵
defaultChkTableTh();
// 전체 클래스테이블 동기화
syncroChkTableTh();
/* The following code is executed once the DOM is loaded */
// Calling the jQuery plugin and splitting the
// #holder UL into pages of 5 LIs each:
// $('#postScriptsUl').sweetPages({perPage:5});
// var controls1 = $('.swControls').detach();
// controls1.appendTo('.holder');
// console.log("sweetPages called...");
// $("#postScriptsUl").trigger("create");
// $('#hotLinksUl').sweetPages({perPage:5});
// $('#priceExampleTable').sweetPages({perPage:1});
// $('#recentOrdersTable').sweetPages({perPage:1});
// var controls2 = $('.swControls').detach();
// controls2.appendTo('.holderTable');
// The default behaviour of the plugin is to insert the
// page links in the ul, but we need them in the main container:
// var controls1 = $('.swControls').detach();
// var controls2 = $('.swControls').detach();
// controls1.appendTo('.holder');
// controls2.appendTo('.holderTable');
});
// JQM 반응형 테이블의 TH 요소중 일부(0,1,2)를 디폴트 디스플레이 ON 체크
function defaultChkTableTh() {
// 디폴트첵
//$(document).on(".recentOrdersTables", "tablecreate", function () {
$(document).off(".recentOrdersTables", "tablecreate").on(".recentOrdersTables", "tablecreate", function () {
$(".recentOrdersTables").each( function() {
var thisIdStr= $(this).attr("id");
$("#"+thisIdStr+"-popup [type=checkbox]:lt(3)") /* second checkbox */
.prop("checked", true) /* uncheck it */
.checkboxradio("refresh") /* refresh UI */
.trigger("change"); /* trigger change to update table */
});
});
}
// JQM 반응형 테이블 TH 요소 디스플레이 변경시, 모든 클래스 테이블에 똑같이 적용
function syncroChkTableTh() {
// 전체 클래스테이블 동기화
$(".ui-controlgroup-controls input[type=checkbox]").on("click", function() {
// 몇번째 요소인지 확인하고, checked/unchecked 어트리뷰트 확인,
// 형제요소 table 의 각각 ui-controlgroup-controls 에 적용..
// refresh UI
// trigger change
});
}
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
// 검색파라메터 값
var keyId= "";
var keywordCat= "";
var serializedStr= "";
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
/************ prevent JQM multiple event binding.. ***************/
// Search Form 핸들러
$(document).on('pageinit', '.jqmPageClass', function(){
/* 2016/03/23 09:09
링크 클릭시 이벤트... JQM 의 기본세팅을 $.mobile.ajaxEnabled = false; 해준다면 이건 필요 없다.
// 2016-02-24오후 11:29
// 링크 클릭시 중요 파라메터 값 보관 및 전달처리..
$(document).off("click",".keyIdLinks").on("click",".keyIdLinks", function(e, data) {
var href= $(this).attr("href");
var keywordCat= $(this).data("keywordcat");
var nonKuCity= $(this).data("nonkucity");
var keyId = $(this).data("keyid");
// keyId=5248;
sessionStorage.hrefKeywordCat= keywordCat;
sessionStorage.hrefnonKuCity= nonKuCity;
sessionStorage.hrefKeywordCat= keyId;
$("#keyId").val(keyId);
$("#keywordCat").val(keywordCat);
$("#nonKuCity").val(nonKuCity);
// changePage()
$.changePage( href );
e.preventDefault();
});
*/
/*
// 검색버튼 클릭이벤트 Authorizing & ajax.load()
$(document).off("click", "#searchActionBtn").on("click", "#searchActionBtn", function(e) {
console.log("Search Btn Clicked.");
if( validateForm()===false ) { alert("목적지를 선택해주세요."); return false; };
// 먼저 Div 에 ajax Loading Image 를 띄워준다
//$("#searchResultShowDiv").html("

");
serializedStr = $("#odaeriTopSeaechForm").serialize();
var actUrl = $("#odaeriTopSeaechForm").attr("action");
var actionURI = actUrl+"?"+serializedStr;
console.log("search start...");
console.log("actUrl."+actUrl);
console.log("actionURI."+actionURI);
_deptGeoId= $("#deptGeoId").val();
_destGeoId= $("#destGeoId").val();
$.getJSON("/ajax/calcCharge.php?deptGeoId="+_deptGeoId+"&destGeoId="+_destGeoId,
function( data ) {
console.log(JSON.stringify(data));
$.each( data, function( key, val ) {
// if(key=="defaultPrice") $("#defaultPrice").text(val);
// searchResultPopUp 내부요소 #defaultPrice, #driveDistance, #priceRange0 등은
// 정해진 네이밍 규칙에 따라 유니크하게 확보되어 있어야 한다.
$("#"+key).text(val);
console.log("key: "+key);
console.log("val: "+val);
// 출발지/도착지 풀 스트링 업데이트
$("#deptGeoFullStr").text( $("#deptInputFullStr").val() );
$("#destGeoFullStr").text( $("#destInputFullStr").val() );
});
$("#searchResultPopUp").trigger("create"); // 생성된 엘리먼트의 IQM 이펙트를 부여
$.mobile.changePage('#searchResultPopUp', 'pop', true, true); // 팝업 트리거
// storeDestPoint( $("#destInputFullStr").val() ); // 목적지 풀어드레스를 sessionStorage 에 보관
sessionStorage.setItem('destAddressFullStr', encodeURI( $("#destInputFullStr").val() ) ); // sessionStorage 로 보관된다.
sessionStorage.setItem('destAddressGeoId', _destGeoId ); // sessionStorage 로 보관된다.
}
);
*/
/*
$("#searchResultPopUp").html("");
$("#searchResultPopUp").load(
actionURI+" #odaeriTopSearchResultDiv",
function() {
$("#searchResultPopUp").trigger("create"); // 생성된 엘리먼트의 IQM 이펙트를 부여
//$("#searchResultShowDiv").slideDown('slow');
$.mobile.changePage('#searchResultPopUp', 'pop', true, true); // 팝업 트리거
목적지를 JS.sessionStorage 에 스토어해야 하는데, searchAction.php 의 JS 에서는 보관되지 않는다.
여기서 목적지를 파싱해 보관할 수 밖에 없다.
그런데 문제는, ajax 로 받아온 Data 는 Html 블럭이라는 것...
너무 복잡해지니까.... PHP SESSION 에 보간해서 처리하자.
// storeDeptPoint(destAddressFullStr);
}
);
*/
/*
e.preventDefault();
});
*/
// Ajax Selector 클릭 이벤트 처리허용여부 체크...
// 출발지 범위가 city 이면 return false..
// OK!! 이벤트 중복 바인딩 문제는 제거되었다. 2016-02-24오후 10:03
$(document).off("click", ".ajaxSelectBox").on("click", ".ajaxSelectBox", function(e) {
console.log( "ajaxSelectBox clicked.." );
keyId= $("#odaeriTopSeaechForm :input[name='keyId']").val();
keywordCat= $("#odaeriTopSeaechForm :input[name='keywordCat']").val();
nonKuCity= $("#odaeriTopSeaechForm :input[name='nonKuCity']").val();
serializedStr = $("#odaeriTopSeaechForm").serialize();
if(keyId=="") { alert("현재위치를 찾을 수 없습니다. 현재위치 새로고침 버튼을 눌러주세요."); e.preventDefault(); return; };
if(keywordCat=="city" && nonKuCity!="Yes") { alert("출발지 범위가 너무 넓습니다. 현재위치 새로고침 버튼을 눌러주세요."); e.preventDefault(); return; };
//console.log("serializedStr."+serializedStr);
});
// Ajax Selector 클릭 이벤트 처리...
// 주소 요소를 ajax 로 받아와서 selectBox 에 넣어준다.
$(document).off("change", ".ajaxSelectBox").on("change", ".ajaxSelectBox", function() {
console.log( "ajaxSelectBox changing.." );
// addAjaxSelectBox($(this).attr("id"), "세부주소 선택");
makeAddrSelector( $(this).attr("name"), $("option:selected",this).text() );
// deptDongRiSelectBox 일 때, 페이지 이동
if( $(this).attr('id')=="provinceSelectBox" ) {
$("#provinceSelectedStr").val( $("option:selected", this).text() );
}
else if( $(this).attr('id')=="citySelectBox" ) {
$("#citySelectedStr").val( $("option:selected", this).text() );
}
else if( $(this).attr('id')=="dongRiSelectBox" ) {
$("#destGeoId").val( $(this).val() );
$("#destInputFullStr").val( $("#provinceSelectedStr").val()+" "+ $("#citySelectedStr").val() + " "+ $("option:selected", this).text() );
//console.log("append trigger activated!!!");
}
console.log("option text: "+ $("option:selected", this).text()) ;
// deptDongRiSelectBox 일 때, 페이지 이동
/* 사용되지 않는다. 2016/04/10 13:47
if( $(this).attr('name')=="deptDongRi" ) {
document.location.href= "/land/landing.html?geoId="+$(this).val();
}
*/
});
// search Result Box 닫기... closeSearchResultBtn
$(document).off("click", "#closeSearchResultBtn").on("click", "#closeSearchResultBtn", function() {
$("#searchResultShowDiv").slideUp('slow');
});
// display ajax-loader Div for every ajax Actions.
// 모든 ajax 리퀘스트에 대해 시작과 끝을 모니터링하고 #ajaxloading 를 디스플레이한다.
// jQuery.ajaxStart() 메서드는 XHTTPRequest 를 사용하지만 getJASON 은 다른 방식으로 통신하는 것으로 보인다.
// getJASON() 은 모니터링이 불가능하다.
$(document).ajaxStart(function() {
$("#ajaxloading").show();
console.log("ajax action started..");
}).ajaxStop(function() {
$("#ajaxloading").hide();
console.log("ajax action finished..");
});
});
// append() 된 select box 에 options 를 체워넣는다.
function makeAddrSelector(name,val) {
if(name=="province") var subSelectId= "citySelectBox";
else if(name=="deptProvince") var subSelectId= "deptCitySelectBox";
else if(name=="city") var subSelectId= "dongRiSelectBox";
else if(name=="deptCity") var subSelectId= "deptDongRiSelectBox";
if(name!="dongRi") {
$.getJSON("/ajax/subAddr.php", { cate: name, name: val },
function(data){
console.log(name);
$("#"+subSelectId).empty();
$("#dongRiSelectBox").empty();
$.each(data, function() {
$("#"+subSelectId).append(new Option(this.name,this.geoId ));
});
// jQueryMobile 1.5.x 렌더링 문제로 콜백함수에서 리프레쉬 해줘야 한다.
// 차후 버그패치가 되면 아래 라인 제거해줄 것.
$("#"+subSelectId).selectmenu('refresh', true);
}
);
}
// console.log("id:"+subSelectId);
}
// 폼 전송 validate
function validateForm() {
if( $("#dongRiSelectBox").val()=="" ) return false;
}
// 출발지 선택 Div 토글
$("#toggleSelectDeptPointDiv").click( function() {
$("#deptPointSelectDiv").slideToggle("slow", function() {
if($("#deptProvinceSelectBox").length<1) $("#provinceSelectBox").clone().prop({ id: "deptProvinceSelectBox", name: "deptProvince"}).appendTo("#deptPointSelectDivHeader");
});
});
String.prototype.trim = function() {
return this.replace(/(^\s*)|(\s*$)/gi, "");
}
/* 위치 새로고팀 클릭시...
* 1. 브라우저 객체로부터 기본 좌표를 획득, -- Done
* 2. 변환좌표계를 미리 확보해해두고, -- Done
* 3. 국가지도 API 에 좌표의 주소값을 쿼리하는 php 스크립트를 Ajax 호출한다. -- Done
* 4. 리다이렉션 될 $keyId 가 필요하다. 이 역시 동일한 PHP 스크립트의 리턴값을 통해 얻어온다... 이건 세션값으로???
* 5. 모든 획득에 성공하면 리다이렉션 : /land/landing.html?keyId=$keyId
*/
//navigator.geolocation.getCurrentPosition(successCallback, errorCallback, options);
var latiVal= "";
var longVal= "";
// refreshLocationBtn
/*
$(document).on("click","#refreshLocationBtn", function(e) {
if(navigator.geolocation) {
// 1. 브라우저 객체로부터 기본 좌표를 획득,
navigator.geolocation.getCurrentPosition( tryGeoAddr, onError);
}
// $("#deptAddressFullStr").load( "/ajax/refreshLocation.php", function() {
e.preventDefault();
});
*/
/***`2016/03/28 16:18
이 펑션은 호출되지 않는다.
function storeDestPoint(destAddressFullStr) {
sessionStorage.setItem('destAddressFullStr', encodeURI( destAddressFullStr ) ); // sessionStorage 로 보관된다.
//console.log( decodeURI(sessionStorage.getItem("destAddressFullStr") ) );
console.log( "출력 시작..." );
for (var i = 0; i < sessionStorage.length; i++){
console.log(sessionStorage.key(i) + "=[" + sessionStorage.getItem(sessionStorage.key(i)) + "]");
}
console.log( decodeURI(sessionStorage.getItem("destAddressFullStr") ) );
}
***/
// geolocation 의 콜백함수로 호출된다. 사용자 좌표를 받아와 변환좌표계까지 확보한다.
function getGeoLocations(location) {
latiVal= location.coords.latitude;
longVal= location.coords.longitude;
// 2. 변환좌표계를 미리 확보해해두고,
var coord4326 = [ longVal , latiVal ];
var coord3857 = ol.proj.transform([longVal, latiVal], 'EPSG:4326', 'EPSG:3857'); // 3857 좌표
console.log("변환좌표계 3857: "+coord3857[0]+", "+coord3857[1]);
sessionStorage.setItem('geoLocation4326', JSON.stringify(coord4326) ); // sessionStorage 로 보관된다.
sessionStorage.setItem('geoLocation3857', JSON.stringify(coord3857) ); // sessionStorage 로 보관된다.
getGeoAddress(coord3857);
// 2016/03/26 13:02
// 오더폼의 입력값을 동기화시켜주는 펑션... ajax 동기화 시점을 맞추려니 여기에 넣을 수 밖에 없었더.
assignGeoData2Form();
console.log("경위도좌표계: "+latiVal+", "+longVal);
var coord4326 = [ longVal, latiVal ];
}
// 오더폼의 입력값을 동기화시켜주는 펑션...
function assignGeoData2Form() {
console.log( "출력 시작..." );
for (var i = 0; i < sessionStorage.length; i++){
// console.log(sessionStorage.key(i) + "=[" + decodeURI( sessionStorage.getItem(sessionStorage.key(i)) ) + "]");
}
console.log( decodeURI(sessionStorage.getItem("deptAddressFullStr") ) );
var g3857Arr = JSON.parse(sessionStorage.getItem("geoLocation3857"));
var g4326Arr = JSON.parse(sessionStorage.getItem("geoLocation4326"));
$("#deptGeo3857Y").val( g3857Arr[0] );
$("#deptGeo3857Z").val( g3857Arr[1] );
$("#deptGeo4326Y").val( g4326Arr[0] );
$("#deptGeo4326Z").val( g4326Arr[1] );
$("#deptAddressFullStr").val( decodeURI(sessionStorage.getItem("deptAddressFullStr") ) );
// $("#deptGeoId").val( sessionStorage.getItem("deptAddressGeoId") );
// $("#destGeoId").val( destAddressGeoId );
$("#orderPrice").val( $("#orderPriceSuggest").text() );
}
// 국가지도 API 에 쿼리해서 좌표의 주소를 받아온다.
function getGeoAddress(coord3857) {
var data='lat='+latiVal+'&long='+longVal+"&x3857="+coord3857[0]+"&y3857="+coord3857[1];
$.post( "/ajax/tryToGetAddr.php", data, function(result) {
// console.log("comes here???");
// console.log(result);
// console.log( result.resultAddr ); //
// console.log( "keywordTableId: "+result.resultKeyId ); //
// console.log( "geoId: "+result.geoId ); //
// $("#deptPointAddrStr").text(result.resultAddr);
// sessionStorage.clear();
sessionStorage.setItem('deptAddressFullStr', encodeURI(result.resultAddr) ); // sessionStorage 로 보관된다.
sessionStorage.setItem('deptAddressGeoId', result.geoId ); // sessionStorage 로 보관된다.
},"json");
}
// getGeoLocations() + getGeoAddress() .... 몉달 묵은 올드버전이지만
// 아직 land/index.html 에서 이 방식으로 사용되고 있다. 2016/03/23 10:50
// geolocation 의 콜백함수인데, prototype 을 써서 클래스처럼 활용할 수 있도록 코딩해볼 것.
function tryGeoAddr(location) {
latiVal= location.coords.latitude;
longVal= location.coords.longitude;
console.log("경위도좌표계: "+latiVal+", "+longVal);
// 2. 변환좌표계를 미리 확보해해두고,
var coord3857 = ol.proj.transform([longVal, latiVal], 'EPSG:4326', 'EPSG:3857'); // 3857 좌표
console.log("변환좌표계 3857: "+coord3857[0]+", "+coord3857[1]);
// 3. 국가지도 API 에 좌표의 주소값을 쿼리하는 php 스크립트를 Ajax 호출한다.
// 4. 리다이렉션 될 $keyId 가 필요하다. 이 값은 tryToGetAddr.php 스크립트에서 세션밸류로 처리 불가...
var data='lat='+latiVal+'&long='+longVal+"&x3857="+coord3857[0]+"&y3857="+coord3857[1];
console.log("Post data: "+data);
$.post( "/ajax/tryToGetAddr.php", data, function(result) {
console.log("comes here???");
console.log(result);
console.log( result.resultAddr ); //
console.log( result.resultKeyId ); //
$("#deptPointAddrStr").text(result.resultAddr);
if(keyId != result.resultKeyId) {
setTimeout( function() { document.location.replace(window.location.pathname+"?keyId="+result.resultKeyId); }, 500 );
}
},"json");
}
function onError(){ return; }
//$(document).ready(function(){
$(document).on("pagecreate", ".jqmPageClass", function() {
});
function swapDisplay( div1, div2 ) {
console.log("펑션 swapDisplay");
$(div1).slideUp();
$(div2).slideDown();
ajaxLoadingScreenOff();
}
/*******************************************************************************************/
/*************************** PROTOTYPES... ****************************/
// 숫자 타입에서 쓸 수 있도록 format() 함수 추가
Number.prototype.format = function(){
if(this==0) return 0;
var reg = /(^[+-]?\d+)(\d{3})/;
var n = (this + '');
while (reg.test(n)) n = n.replace(reg, '$1' + ',' + '$2');
return n;
};
// 문자열 타입에서 쓸 수 있도록 format() 함수 추가
String.prototype.format = function(){
var num = parseFloat(this);
if( isNaN(num) ) return "0";
return num.format();
};
/*******************************************************************************************/