PageSourceSearch

https://keep.go.kr/js/front/apiManager.js

js keep.go.kr collected 2026-10-05 06:05:54 UTC 31,941 bytes, 646 lines download raw bytes

1var apiManager = {
2    init: function() {
3        this.registEvent();    
4    }
5    
6    , registEvent: function() {
7        // TODO
8    }
9    
10    // 실시간 대기정보
11    , getCtprvnRltmMesureDnsty: function(sidoName, tabIdx, grid) {
12        $.ajax({
13            url: contextpath + "front/api/getCtprvnRltmMesureDnsty.do"
14            , type: "GET"
15            , data: {sidoName: sidoName} 
16            , cache: false
17            , success: function(result) {
18                if(result.response && result.response.header.resultCode == "00") {
19                    if(main.envfldCd != "104101") return false;
20                    main.setWidgetStatus("success", result.response.body.items[0].dataTime + "기준");
21                    apiManager.setCtprvnRltmMesureDnsty(result.response.body, tabIdx, grid);
22                } else {
23                    main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
24                }
25            }
26        });
27    }
28    
29    , setCtprvnRltmMesureDnsty: function(data, tabIdx, grid) {
30        for(var i = 0; i < data.totalCount; i++) {
31            var info = data.items[i];
32            var sidoName = info.sidoName;
33            var stationName = info.stationName;
34            var displayInfo = this.getRltmMesureDnstyInfo(tabIdx, info);
35            
36            $(grid).append(
37                '<tr><td>' + sidoName + '</td><td>' + stationName + '</td><td><span class="fc-level' + displayInfo.grade + '">' + displayInfo.value + '</span></td></tr>'
38            );
39        }
40    }
41    
42    // 대기 노출 정보
43    , getRltmMesureDnstyInfo: function(idx, data) {
44        var info = {
45          value: "-"
46          , grade: "-"  
47        };
48        switch(idx) {
49            case 0:
50                info.grade = data.khaiGrade;
51                info.value = this.getGrade(data.khaiGrade) + "(" + data.khaiValue + ")"; 
52            break;
53            
54            case 1:
55                info.grade = data.pm25Grade;
56                info.value = data.pm25Value + "㎍/㎥(1시간),<br/>" + data.pm25Value24 + "㎍/㎥(24시간)";
57            break;
58            
59            case 2:
60                info.grade = data.pm10Grade;
61                info.value = data.pm10Value + "㎍/㎥(1시간),<br/>" + data.pm10Value24 + "㎍/㎥(24시간)";
62            break;
63            
64            case 3:
65                info.grade = data.o3Grade; 
66                info.value = data.o3Value;
67            break;
68            
69            case 4:
70                info.grade = data.no2Grade;
71                info.value = data.no2Value;
72            break;
73            
74            case 5:
75                info.grade = data.coGrade;
76                info.value = data.coValue;
77            break;
78            
79            case 6:
80                info.grade = data.so2Grade;
81                info.value = data.so2Value;
82            break;
83            
84            default:
85        }
86        
87        return info;
88    }
89    
90    // 대기 상태
91    , getGrade: function(grade) {
92        return grade == 1 ? "좋음" : grade == 2 ? "보통" : grade == 3 ? "나쁨" : grade == 4 ? "매우나쁨" : "-";
93    }
94    
95    // 오늘/내일/모레 예보
96    , getMinuDustFrcstDspth: function(informCode, dateIdx, grid) {
97        $.ajax({
98            url: contextpath + "front/api/getMinuDustFrcstDspth.do"
99            , type: "GET"
100            , data: {searchDate: $.datepicker.formatDate("yy-mm-dd", new Date()), informCode: informCode} 
101            , cache: false
102            , success: function(result) {
103                if(main.envfldCd != "104102") return false;
104                if(result.response && result.response.header.resultCode == "00") {
105                    apiManager.setMinuDustFrcstDspth(result.response.body, dateIdx, grid);
106                } else {
107                    main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
108                }
109            }
110        });
111    }
112    
113    , setMinuDustFrcstDspth: function(data, dateIdx, grid) {
114        var now = new Date();
115        var today = $.datepicker.formatDate("yy-mm-dd", now);
116        var tomorrow = $.datepicker.formatDate("yy-mm-dd", new Date(now.setDate(now.getDate() + 1)));
117        var afterTomorrow = $.datepicker.formatDate("yy-mm-dd", new Date(now.setDate(now.getDate() + 1)));
118        var todayInfoList = "예보정보가 없습니다.", tomorrowInfoList = "예보정보가 없습니다.", afterTomorrowInfoList = "예보정보가 없습니다.";
119        var dateTime;
120        for(var i = 0, len = data.totalCount; i < len; i++) {
121            var info = data.items[i];
122            if(info.informData == today && todayInfoList == "예보정보가 없습니다.") {
123                dateTime = info.dataTime;
124                todayInfoList = info.informGrade.split(",");
125            } else if(info.informData == tomorrow && tomorrowInfoList == "예보정보가 없습니다.") {
126                dateTime = info.dataTime;
127                tomorrowInfoList = info.informGrade.split(",");
128            } else if(info.informData == afterTomorrow && afterTomorrowInfoList == "예보정보가 없습니다.") {
129                dateTime = info.dataTime;
130                afterTomorrowInfoList = info.informGrade.split(",");
131            }
132        }
133        if((dateIdx == 0 && todayInfoList == "예보정보가 없습니다.") || (dateIdx == 1 && tomorrowInfoList == "예보정보가 없습니다.") || 
134          (dateIdx == 2 && afterTomorrowInfoList == "예보정보가 없습니다.")) {
135            main.setWidgetStatus("error", null, "예보정보가 없습니다.");
136        } else {
137            var data, area, grade, className;
138            var list = dateIdx == 0 ? todayInfoList : dateIdx == 1 ? tomorrowInfoList : afterTomorrowInfoList;
139            for(var i = 0, len = list.length; i < len; i++) {
140                data = list[i];
141                area = $.trim(data.split(":")[0]);
142                grade = $.trim(data.split(":")[1]);
143                className = grade == "좋음" ? "fc-level1" : grade == "보통" ? "fc-level2" : grade == "나쁨" ? "fc-level3" : "fc-level4";
144                $(grid).append(
145                    '<tr><td>' + area + '</td>' + '<td><span class="' + className + '"><i></i>' + grade + '</span></td></tr>' 
146                ); 
147            }
148            main.setWidgetStatus("success", dateTime);
149        }
150    }
151    
152    // 우리동네 대기정보
153    , getMsrstnAcctoRltmMesureDnsty: function(stationName, grid) {
154        $.ajax({
155            url: "/front/api/getMsrstnAcctoRltmMesureDnsty.do"
156            , type: "GET"
157            , data: {stationName: stationName} 
158            , cache: false
159            , success: function(result) {
160                if(result.response && result.response.header.resultCode == "00") {
161                    if(main.envfldCd != "104103") return false;
162                    if(result.response.body.items.length == 0) {
163                        main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
164                    } else {
165                        main.setWidgetStatus("success", result.response.body.items[0].dataTime + "기준");
166                        apiManager.setMsrstnAcctoRltmMesureDnsty(result.response.body, grid);
167                    }
168                } else {
169                    main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
170                }
171            }
172        });
173    }
174    
175    , setMsrstnAcctoRltmMesureDnsty: function(data, grid) {
176        var info = data.items[0];
177        $(grid).append(
178            '<tr><td class="al pt5 pb5">초미세먼지(PM-2.5)</td><td class="al pt5 pb5"><span class="fc-level' + info.pm25Grade + '"><i></i>' + this.getGrade(info.pm25Grade) + '</span></td>' +
179            '<td class="al pt5 pb5">' + info.pm25Value + '㎍/㎥(1h), ' + info.pm25Value24 + '㎍/㎥(24h)</td></tr>' 
180        );
181        $(grid).append(
182            '<tr><td class="al pt5 pb5">미세먼지(PM-10)</td><td class="al pt5 pb5"><span class="fc-level' + info.pm10Grade + '"><i></i>' + this.getGrade(info.pm25Grade) + '</span></td>' +
183            '<td class="al pt5 pb5">' + info.pm10Value + '㎍/㎥(1h), ' + info.pm10Value24 + '㎍/㎥(24h)</td></tr>' 
184        );
185        $(grid).append(
186            '<tr><td class="al pt5 pb5">오존(O3)</td><td class="al pt5 pb5"><span class="fc-level' + info.o3Grade + '"><i></i>' + this.getGrade(info.o3Grade) + '</span></td>' +
187            '<td class="al pt5 pb5">' + info.o3Value + 'ppm</td></tr>' 
188        );
189        $(grid).append(
190            '<tr><td class="al pt5 pb5">이산화질소(NO2)</td><td class="al pt5 pb5"><span class="fc-level' + info.no2Grade + '"><i></i>' + this.getGrade(info.no2Grade) + '</span></td>' +
191            '<td class="al pt5 pb5">' + info.no2Value + 'ppm</td></tr>' 
192        );
193        $(grid).append(
194            '<tr><td class="al pt5 pb5">일산화탄소(CO)</td><td class="al pt5 pb5"><span class="fc-level' + info.coGrade + '"><i></i>' + this.getGrade(info.coGrade) + '</span></td>' +
195            '<td class="al pt5 pb5">' + info.coValue + 'ppm</td></tr>' 
196        );
197        $(grid).append(
198            '<tr><td class="al pt5 pb5">아황산가스(SO2)</td><td class="al pt5 pb5"><span class="fc-level' + info.so2Grade + '"><i></i>' + this.getGrade(info.so2Grade) + '</span></td>' +
199            '<td class="al pt5 pb5">' + info.so2Value + 'ppm</td></tr>' 
200        );
201    }
202    
203    , onPostPopup: function() {
204        new daum.Postcode({
205            oncomplete: function(data) {
206                apiManager.getTMStdrCrdnt(data.bname).then(function(response) {
207                    if(main.envfldCd != "104103") return false;
208                    if(response.totalCount == 0) {
209                        main.setWidgetStatus("error", null, "검색한 주소와 가까운 측정소가 없습니다.<br/>주소를 다시 검색해 주세요.");
210                    } else {
211                        var info, item;
212                        for(var i = 0; i < response.totalCount; i++) {
213                            item = response.items[i];
214                            if(item.sggName == data.sigungu) {
215                                info = item;
216                                break;
217                            }
218                        }
219                        apiManager.getNearbyMsrstnList(data, info);                        
220                    }
221                }).catch(function(error) {
222                    main.setWidgetStatus("error", null, "서비스 제공
222상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
223                });
224            }
225        }).open();
226    }
227    
228    , getTMStdrCrdnt: function(umdName) {
229        return new Promise(function(resolve, reject) {
230            $.ajax({
231                url: "/front/api/getTMStdrCrdnt.do"
232                , type: "GET"
233                , data: {umdName: umdName} 
234                , cache: false
235                , success: function(result) {
236                    if(main.envfldCd != "104103") return false;
237                    if(result.response && result.response.header.resultCode == "00") {
238                        resolve(result.response.body);
239                    } else {
240                        reject(new Error("서비스 제공상태가 원할하지 않습니다."));
241                    }
242                }
243            });
244        });
245    }
246    
247    , getNearbyMsrstnList: function(postData, tmData) {
248        $.ajax({
249            url: "/front/api/getNearbyMsrstnList.do"
250            , type: "GET"
251            , data: {tmX: tmData.tmX, tmY: tmData.tmY} 
252            , cache: false
253            , success: function(result) {
254                if(main.envfldCd != "104103") return false;
255                if(result.response && result.response.header.resultCode == "00") {
256                    var stationInfo = result.response.body.items[0];
257                    var confirmMsg = postData.address + "(" + postData.bname + ")" + "과(와)\n가장 가까운 측정소는 『" + stationInfo.stationName + " 측정소』입니다.\n해당 측정소의 대기정보를 조회 하시겠습니까?";
258                    if(confirm(confirmMsg)) {
259                        localStorage.setItem("nearMsrstn", stationInfo.stationName);
260                        main.onSearch();    
261                    }
262                } else {
263                    main.setWidgetStatus("error", null, "서비스 제공
263상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
264                }
265            }
266        });
267    }
268    
269    // 수위정보
270    , getWaterlevelList: function(sidoName, grid) {
271        $.ajax({
272            url: "/front/api/getWlobsList.do"
273            , type: "GET"
274            , data: {hydroType: "waterlevel"} 
275            , cache: false
276            , success: function(result) {
277                try {
278                    if(main.envfldCd != "104104") return false;
279                    apiManager.getWlobsList(sidoName, result.wlobsList.content, result.obsrvnList.content, "water", grid);
280                } catch {
281                    main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
282                }
283            }
284        });
285    }
286    
287    , setWaterlevelList: function(dataList, grid, sidoName) {
288        var data, obsnm, attwl, wrnwl, almwl, srswl, wl;
289        for(var i = 0, len = dataList.length; i < len; i++) {
290            data = dataList[i];
291            obsnm = data.obsnm; 
292            attwl = data.attwl == " " ? "-" : data.attwl; 
293            wrnwl = data.wrnwl == " " ? "-" : data.wrnwl; 
294            almwl = data.almwl == " " ? "-" : data.almwl; 
295            srswl = data.srswl == " " ? "-" : data.srswl; 
296            wl = data.wl == " " ? "-" : data.wl; 
297            $(grid).append(
298                '<tr><td>' + sidoName + '</td><td>' + obsnm + '</td>' + '<td>' + attwl + '</td>' + 
299                '<td>' + wrnwl + '</td>' + '<td>' + almwl + '</td>' + 
300                '<td>' + srswl + '</td>' + '<td>' + wl + '</td></tr>'
301            );            
302        }
303    }
304    
305    // 댐정보
306    , getDamList: function(grid) {
307        $.ajax({
308            url: "/front/api/getWlobsList.do"
309            , type: "GET"
310            , data: {hydroType: "dam"} 
311            , cache: false
312            , success: function(result) {
313                try {
314                    if(main.envfldCd != "104104") return false;
315                    apiManager.getWlobsList("", result.wlobsList.content, result.obsrvnList.content, "dam", grid);
316                } catch {
317                    main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
318                }
319            }
320        });
321    }
322    
323    , setDamList: function(dataList, grid, sidoName) {
324        var data, sidoName, obsnm, pfh, swl, inf, tototf;
325        for(var i = 0, len = dataList.length; i < len; i++) {
326            data = dataList[i];
327            sidoName = data.sidoName;
328            obsnm = data.obsnm; 
329            pfh = data.pfh == " " ? "-" : data.pfh; 
330            swl = data.swl == " " ? "-" : data.swl; 
331            inf = data.inf == " " ? "-" : data.inf; 
332            tototf = data.tototf == " " ? "-" : data.tototf; 
333            $(grid).append(
334                '<tr><td>' + obsnm + '</td>' + '<td>' + pfh + '</td>' + 
335                '<td>' + swl + '</td>' + '<td>' + inf + '</td>' + '<td>' + tototf + '</td></tr>'
336            );            
337        }
338    }
339    
340    // 보정보
341    , getBoList: function(grid) {
342        $.ajax({
343            url: "/front/api/getWlobsList.do"
344            , type: "GET"
345            , data: {hydroType: "bo"} 
346            , cache: false
347            , success: function(result) {
348                try {
349                    if(main.envfldCd != "104104") return false;
350                    apiManager.getWlobsList("", result.wlobsList.content, result.obsrvnList.content, "bo", grid);
351                } catch {
352                    main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
353                }
354            }
355        });
356    }
357    
358    , setBoList: function(dataList, grid) {
359        var data, sidoName, obsnm, pfh, swl, owl, inf, tototf;
360        for(var i = 0, len = dataList.length; i < len; i++) {
361            data = dataList[i];
362            sidoName = data.sidoName;
363            obsnm = data.obsnm; 
364            pfh = data.pfh == " " ? "-" : data.pfh; 
365            swl = data.swl == " " ? "-" : data.swl; 
366            owl = data.owl == " " ? "-" : data.owl; 
367            inf = data.inf == " " ? "-" : data.inf; 
368            tototf = data.tototf == " " ? "-" : data.tototf; 
369            $(grid).append(
370                '<tr><td style="word-break: keep-all;">' + obsnm + '</td>' + '<td>' + pfh + '</td>' + '<td>' + swl + '</td>' + 
371                '<td>' + owl + '</td>' + '<td>' + inf + '</td>' + '<td>' + tototf + '</td></tr>'
372            );            
373        }
374    }
375    
376    , getWlobsList: function(sidoName, wlobsList, obsrvnList, type, grid) {
377        var list = [];
378        var addr;
379        for(var i = 0, len = wlobsList.length; i < len; i++) {
380            var data = wlobsList[i];
381            if(data) {
382                addr = data.addr;
383                if(addr && addr != " ") {
384                    addr = addr.split(" ")[0];
385                    if(type == "water") {
386                        if(sidoName == "충북" && addr.indexOf("충청북도") > -1) {
387                            list.push(data);
388                        } else if(sidoName == "충남" && addr.indexOf("충청남도") > -1) {
389                            list.push(data);
390                        } else if(sidoName == "경북" && (addr.indexOf("경상북도") > -1 || addr.indexOf("경북") > -1 || addr.indexOf("겅상북도") > -1)) {
391                            list.push(data);
392                        } else if(sidoName == "경남" && addr.indexOf("경상남도") > -1) {
393                            list.push(data);
394                        } else if(sidoName == "전북" && (addr.indexOf("전라북도") > -1 || addr.indexOf("전북") > -1)) {
395                            list.push(data);
396                        } else if(sidoName == "전남" && addr.indexOf("전라남도") > -1) {
397                            list.push(data);
398                        } else if(addr.indexOf(sidoName) > -1) {
399                            list.push(data);
400                        }    
401                    } else {
402                        if(addr.indexOf("충청북도") > -1) {
403                            data.sidoName = "충북";
404                        } else if(addr.indexOf("충청남도") > -1) {
405                            data.sidoName = "충남";
406                        } else if((addr.indexOf("경상북도") > -1 || addr.indexOf("경북") > -1 || addr.indexOf("겅상북도") > -1)) {
407                            data.sidoName = "경북";
408                        } else if(addr.indexOf("경상남도") > -1) {
409                            data.sidoName = "경남";
410                        } else if((addr.indexOf("전라북도") > -1 || addr.indexOf("전북") > -1)) {
411                            data.sidoName = "전북";
412                        } else if(addr.indexOf("전라남도") > -1) {
413                            data.sidoName = "전남";
414                        } else {
415                            data.sidoName = addr.split(" ")[0];                       
416                        }
417                        list.push(data);                        
418                    }
419                }
420            }
421        }
422        if(type == "water") {
423            for(i = 0, len = list.length; i < len; i++) {
424                var wlobsInfo = list[i];
425                var obsrvnInfo = obsrvnList.find(function(item) {
426                    return item.wlobscd == wlobsInfo.wlobscd;
427                });
428                wlobsInfo["wl"] = obsrvnInfo ? obsrvnInfo.wl : "-";
429            }
430            this.setWaterlevelList(list, grid, sidoName);
431        } else if(type == "dam") {
432            for(i = 0, len = list.length; i < len; i++) {
433                var wlobsInfo = list[i];
434                var obsrvnInfo = obsrvnList.find(function(item) {
435                    return item.dmobscd == wlobsInfo.dmobscd;
436                });
437                wlobsInfo["swl"] = obsrvnInfo ? obsrvnInfo.swl : "-";
438                wlobsInfo["inf"] = obsrvnInfo ? obsrvnInfo.inf : "-";
439                wlobsInfo["tototf"] = obsrvnInfo ? obsrvnInfo.tototf : "-";
440            }
441            this.setDamList(list, grid);
442        } else if(type == "bo") {
443            for(i = 0, len = list.length; i < len; i++) {
444                var wlobsInfo = list[i];
445                var obsrvnInfo = obsrvnList.find(function(item) {
446                    return item.boobscd == wlobsInfo.boobscd;
447                });
448                wlobsInfo["swl"] = obsrvnInfo ? obsrvnInfo.swl : "-";
449                wlobsInfo["owl"] = obsrvnInfo ? obsrvnInfo.owl : "-";
450                wlobsInfo["inf"] = obsrvnInfo ? obsrvnInfo.inf : "-";
451                wlobsInfo["tototf"] = obsrvnInfo ? obsrvnInfo.tototf : "-";
452            }
453            this.setBoList(list, grid);
454        }
455        main.setWidgetStatus("success", null);
456    }
457    
458    // 농업기상 관측지점 정보
459    , getObsrSpotList: function(doSeCode) {
460        $.ajax({
461            url: "/front/api/getObsrSpotList.do"
462            , type: "GET"
463            , data: {doSeCode: doSeCode} 
464            , cache: false
465            , success: function(result) {
466                try {
467                    if(main.envfldCd != "104105") return false;
468                } catch {
469                    main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
470                }
471            }
472        });
473    }
474    
475    // 농업기상 관측 정보 조회(시간)
476    , getWeatherTimeList: function(obsrSpotCode, grid) {
477        $.ajax({
478            url: "/front/api/getWeatherTimeList.do"
479            , type: "GET"
480            , data: {dateTime: $.datepicker.formatDate("yy-mm-dd", new Date()), obsrSpotCode: obsrSpotCode} 
481            , cache: false
482            // , success: function(result) {
483            //
484            //     try {
485            //         var res_cd = result.header.result_Code;
486            //         console.log(res_cd);
487            //         if (res_cd == 301) {
488            //             main.setWidgetStatus("error", null, "해당지역은 농업기상정보 관측지점정보 제공 지역이 아닙니다.<br/>다른지역으로 다시 요청해주세요");
489            //             return false;
490            //         }
491            //         if(result.body) {
492            //             if(main.envfldCd != "104105") return false;
493            //             main.setWidgetStatus("success", null);
494            //             apiManager.setWeatherTimeList(result.body, grid);
495            //         } else {
496            //             main.setWidgetStatus("error", null, "서비스 제공
496상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
497            //         }
498            //     } catch {
499            //         main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
500            //     }
501            // }
502            , success: function(result) {
503                console.log(result);
504                try {
505                    if(result.response) {
506                        if(main.envfldCd != "104105") return false;
507                        main.setWidgetStatus("success", null);
508                        apiManager.setWeatherTimeList(result.response.body, grid);
509                    } else {
510                        main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
511                    }
512                } catch {
513                    main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
514                }
515            }
516
517        });
518    }
519    
520    , setWeatherTimeList: function(data, grid) {
521        console.log("c");
522        var dataList = data.items.item;
523        console.log("dataList :" + dataList);
524        var len = data.total_Count;
525        console.log("len :" + len);
526        var info, time;
527        for(var i = data.total_Count - 3; i < len; i++) {
528            info = dataList[i];
529            time = info.date.split(" ")[1].split(":")[0] + "시";
530            $("#time" + (3 - (len - i))).text(time);
531        }
532        $(grid).append('<tr><td>기온</td><td>' + dataList[0].temp + '℃</td><td>' + dataList[1].temp + '℃</td><td>' + dataList[2].temp + '℃</td><tr>');
533        $(grid).append('<tr><td>습도</td><td>' + dataList[0].hum + '%</td><td>' + dataList[1].hum + '%</td><td>' + dataList[2].hum + '%</td><tr>');
534        $(grid).append('<tr><td>강수량</td><td>' + dataList[0].rn + '%</td><td>' + dataList[1].rn + '%</td><td>' + dataList[2].rn + '%</td><tr>');
535        var sunTime0 = dataList[0].sun_Time ? dataList[0].sun_Time : "-";
536        var sunTime1 = dataList[1].sun_Time ? dataList[1].sun_Time : "-";
537        var sunTime2 = dataList[2].sun_Time ? dataList[2].sun_Time : "-";
538        $(grid).append('<tr><td>일조시간</td><td>' + sunTime0 + '</td><td>' + sunTime1 + '</td><td>' + sunTime2 + '</td><tr>');
539    }
540    
541    // 농업기상 관측 정보 조회(일)
542    , getWeatherMonDayList: function(obsrSpotCode, grid) {
543        $.ajax({
544            url: "/front/api/getWeatherMonDayList.do"
545            , type: "GET"
546            , data: {searchYear: $.datepicker.formatDate("yy", new Date()), searchMonth: $.datepicker.formatDate("mm", new Date()), obsrSpotCode: obsrSpotCode} 
547            , cache: false
548            // , success: function(result) {
549            //     try {
550            //         var res_cd = result.header.result_Code;
551            //         if (res_cd == 301) {
552            //             main.setWidgetStatus("error", null, "해당지역은 농업기상정보 관측지점정보 제공 지역이 아닙니다.<br/>다른지역으로 다시 요청해주세요");
553            //             return false;
554            //         }
555            //         if(result.body) {
556            //             if(main.envfldCd != "104105") return false;
557            //             main.setWidgetStatus("success", null);
558            //             apiManager.setWeatherMonDayList(result.body, grid);
559            //         } else {
560            //             main.setWidgetStatus("error", null, "서비스 제공
560상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
561            //         }
562            //     } catch {
563            //         main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
564            //     }
565            // }
566            , success: function(result) {
567                try {
568                    if(result.response) {
569                        if(main.envfldCd != "104105") return false;
570                        main.setWidgetStatus("success", null);
571                        apiManager.setWeatherMonDayList(result.response.body, grid);
572                    } else {
573                        main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
574                    }
575                } catch {
576                    main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
577                }
578            }
579
580        });
581    }
582    
583    , setWeatherMonDayList: function(data, grid) {
584        var dataList = data.items.item;
585        var len = data.total_Count - 5;
586        if(len < 5) {
587            len = data.total_Count;
588        }
589        var info, date, temp, maxTemp, minTemp, sunTime, rain;
590        for(var i = len - 1; i >= 0; i--) {
591            info = dataList[i];
592            date = info.date.split("-")[1] + "월 " + info.date.split("-")[2] + "일";
593            temp = info.temp;
594            maxTemp = info.hghst_Artmp;
595            minTemp = info.lowst_Artmp;
596            sunTime = info.sun_Time ? info.sun_Time : "-";
597            rain = info.rn;
598            $(grid).append(
599                '<tr><td>' + date + '</td>' + '<td>' + temp + '℃</td>' + '<td>' + maxTemp + '℃</td>' + 
600                '<td>' + minTemp + '℃</td>' + '<td>' + sunTime + '</td>' + '<td>' + rain + 'mm</td></tr>'
601            );
602        }
603    }
604    
605    // 전기자동차 충전소 정보
606    , getChargerInfo: function(zcode, zscode, grid) {
607        $.ajax({
608            url: "/front/api/getChargerInfo.do"
609            , type: "GET"
610            , data: {zcode: zcode, zscode: zscode} 
611            , cache: false
612            , success: function(result) {
613                try {
614                    if(main.envfldCd != "104106") return false;
615                    if(result.resultCode && result.resultCode == "00") {
616                        main.setWidgetStatus("success", null);
617                        apiManager.setChargerInfo(result, grid);
618                    } else {
619                        main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");                                                                                
620                    }
621                } catch {
622                    main.setWidgetStatus("error", null, "서비스 제공상태가 원할하지 않습니다.<br/>잠시후 다시 시도해주세요.");
623                }
624            }
625        });
626    }
627    
628    , setChargerInfo: function(data, grid) {
629        var dataList = data.items.item;
630        var len = data.totalCount;
631        var info, statNm, type, stat, addr;
632        for(var i = 0; i < len; i++) {
633            info = dataList[i];
634            statNm = info.statNm;
635            type = info.chgerType == "01" ? "DC차데모" : info.chgerType == "02" ? "AC완속" : info.chgerType == "03" ? "DC차데모 + AC3상" :
636                     info.chgerType == "04" ? "DC콤보" : info.chgerType == "05" ? "DC차데모 + DC콤보" : info.chgerType == "06" ? "DC차데모 + AC3상 + DC콤보" : 
637                     info.chgerType == "07" ? "AC3상" : "-";
638            stat = info.stat == "1" ? "통신이상" : info.stat == "2" ? "대기" : info.stat == "3" ? "충전중" : info.stat == "4" ? "운영중지" :
639                    info.stat == "5" ? "점검중" : info.stat == "9" ? "미확인" : "-";
640            addr = info.addr;
641            $(grid).append(
642                '<tr><td>' + statNm + '</td>' + '<td>' + type + '</td>' + '<td>' + stat + '</td>' + '<td>' + addr + '</td></tr>'
643            );
644        }
645    }
646};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.