PageSourceSearch

https://money2.creontrade.com/webponent-press/chart/webponent.visual.shaped.js

js creontrade.com collected 2026-10-02 15:08:59 UTC 68,910 bytes, 1,723 lines download raw bytes

1/*
2 * 사이버이메지네이션
3 * 최초 작성자 : [email protected]
4 * 마지막 수정자 : [email protected]
5 * 마지막 수정날짜 :  16.10.28
6 */
7(function() {
8
9    var productName = 'webPonent CHART 2.0';
10    var productId = 'WC2';
11
12    if (typeof WEBPONENT_CHART_LICENSE_KEY === 'undefined') {
13
14        $.ajax({
15            url : '/webponent.licenseKey.js',
16            dataType : 'script',
17            async : false
18        });
19
20        if (typeof WEBPONENT_CHART_LICENSE_KEY === 'undefined' || WEBPONENT_CHART_LICENSE_KEY === '') {
21
22            alert(productName + '의 라이센트키를 입력해주세요.');
23            return;
24        }
25    }
26
27    var key = "SXGWLZPDOKFIVUHJYTQBNMACERxswgzldpkoifuvjhtybqmncare";
28
29    function decodeStr(coded) {
30        coded = decodeURIComponent(coded);
31        var uncoded = "";
32        var chr;
33        for (var i = coded.length - 1; i >= 0; i--) {
34            chr = coded.charAt(i);
35            uncoded += (chr >= "a" && chr <= "z" || chr >= "A" && chr <= "Z") ? String
36                .fromCharCode(65 + key.indexOf(chr) % 26)
37                : chr;
38        }
39        return uncoded;
40    }
41
42    function appendTrialUi(wrapper) {
43
44        wrapper = $(wrapper);
45
46        var trialUiWrapper = $('<div class="WEBPONENT-TRIAL-UI">');
47
48        trialUiWrapper
49            .css({
50                'position' : 'absolute',
51                'top' : '0',
52                'left' : '0',
53                'width' : '100%',
54                'height' : '100%',
55                'background-image' : "url('data:image/png;base64,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')",
56                'background-repeat' : 'no-repeat',
57                'background-position' : 'center center',
58                'z-index' : '1',
59                'opacity' : '0.3'
60            });
61
62        var img = $('<img src="http://www.webponent.com/img/webponent.png"/>');
63
64        trialUiWrapper.append(img);
65
66        wrapper.prepend(trialUiWrapper);
67
68        wrapper.on('mouseenter', function() {
69
70            trialUiWrapper.stop(true, true);
71            trialUiWrapper.hide();
72        });
73
74        wrapper.on('mouseleave', function() {
75
76            trialUiWrapper.stop(true, true);
77            trialUiWrapper.fadeIn();
78        });
79
80        wrapper.data('check-trial-ui', setInterval(function() {
81
82            if (wrapper.find('.WEBPONENT-TRIAL-UI').length === 0) {
83
84                clearInterval(wrapper.data('check-trial-ui'));
85                appendTrialUi(wrapper[0]);
86            }
87        }, 5000));
88    }
89
90    function makeLicenseObject(text) {
91
92        var obj = {};
93
94        var splitedArray = text.split(';');
95
96        obj.product = splitedArray[0];
97        obj.customer = splitedArray[2];
98        obj.licenseType = splitedArray[3];
99        obj.domains = splitedArray[5];
100        obj.expireDate = splitedArray[6];
101
102        return obj;
103    }
104
105    var TRIAL_UI = false;
106
107    var decodedLicenseKey = decodeStr(WEBPONENT_CHART_LICENSE_KEY);
108
109    var licenseObject = makeLicenseObject(decodedLicenseKey);
110
111    if (licenseObject.licenseType === 'TRIAL') {
112
113        TRIAL_UI = true;
114
115        if (new Date() > new Date(licenseObject.expireDate * 1)) {
116
117            alert(productName + ' ' + licenseObject.licenseType + '버전의 라이센스 유효기간이 지났습니다.');
118            return;
119        }
120
121    } else if (licenseObject.licenseType === 'DEVELOP') {
122
123        if (new Date() > new Date(licenseObject.expireDate * 1)) {
124
125            TRIAL_UI = true;
126        }
127        /**
128         licenseType ED시리즈 조건 추가(ver.150915 평다진)
129         */
130    } else if (licenseObject.licenseType === 'OFFICIAL' || licenseObject.licenseType === "ED001"  ||
131        licenseObject.licenseType === "ED002"  || licenseObject.licenseType === "ED003") {
132
133        var domain = window.location.host.toUpperCase();
134
135        TRIAL_UI = true;
136
137        var splitedDomain = licenseObject.domains.split(',');
138
139        for (var i = 0; i < splitedDomain.length; i++) {
140
141            var regesteredSite = splitedDomain[i];
142
143            if (domain.indexOf(regesteredSite) > -1) {
144
145                TRIAL_UI = false;
146            }
147        }
148    } else if (licenseObject.product !== productId) {
149
150        TRIAL_UI = true;
151
152    } else {
153
154        alert('유효하지 않은 ' + productName + ' 라이센스입니다.');
155        TRIAL_UI = true;
156    }
157
158    (function() {
159
160        var self = {};
161
162        var elementType = getElementType();
163        var defaultFont =  'Nanum Gothic';
164
165        /**
166         * 기본으로 설정되어 있는 스타일 반환
167         * @return {defaultStyles} default styles
168         */
169        function getDefaultStyles () {
170
171            defaultFont = 'Nanum Gothic';
172            var defaultStyles = {
173                /**
174                 * 기본 레이아웃
175                 * @position {Object} 	: 차트 내 위치 이동 (x축, y축)
176                 * @area {Object} 	    : 바탕색상, 테두리
177                 */
178                layout : {
179                    position : {
180                        x : 0,
181                        y : 0
182                    },
183                    area : {
184                        color : '#f8f8f8' ,
185                        border :'#c1c6cc'
186                    }
187                },
188
189                /**
190                 *  OBJECT STYLES, VALUE
191                 * @width {Object}	: GAUGE OBJECT'S WIDTH
192                 * @height {Object}	: GAUGE OBJECT'S HEIGHT
193                 */
194                object : {
195                    width: 360,
196                    height: 240
197                },
198
199                /**
200                 *  COUNTER STYLES
201                 * @x {Object} 		: COUNTER  POSITION X축 위치 이동
202                 * @y {Object}      : COUNTER  POSITION Y축 위치 이동
203                 * @width {Object}  : COUNTER  넓이 비율
204                 * @height {Object} : COUNTER  높이 비율
205                 * @radius {Object} : COUNTER  BORDER-RADIUS 테두리각 조절
206                 * @color {Object} 	: COUNTER BACKGROUND
207                 * @border {Object} : COUNTER BORDER COLOR
208                 * @text {Object}	: COUNTER NUMBER FONT STYLE {font-family, font-size, font-weight}
209                 */
210                counter : {
211                    x : 0 ,
212                    y : 0 ,
213                    width: 'auto',
214                    height: 'auto',
215                    radius : 2,
216                    color : '#fcfcfc',
217                    border : '#bdc2ca',
218                    text : {
219                        family : 'LCDMono',
220                        size : 1,
221                        weight : 800,
222                        color:'#484b4e'
223                    }
224                },
225
226                /**
227                 *  AXIS STYLES
228                 * @block {Object}		: 눈금의 수 설정
229                 * @interval {Object} 	: 눈금사이의 간격 수 설정
230                 * @text {Object}		: 치수 텍스트 관련 설정
231                 * @blockLine {Object}  	: 치수를 가리키는 긴 눈금
232                 * @intervalLine {Object}	: 간격을 가르키는 일반 눈금
233                 */
234                axis : {
235                    block : 10 ,
236                    interval : 4 ,
237                    text : {
238                        num : 5,
239                        family: defaultFont,
240                        size: 12,
241                        weight: "bold",
242                        align: "end",
243                        color : "#797f85"
244                    },
245                    blockLine : {
246                        color: "#a3aab1",
247                        length : 15
248                    },
249                    intervalLine : {
250                        color: "#c3c8cd",
251                        length: 7.5
252                    }
253                },
254
255                /**
256                 *  CYLINDER GAUGE의 스타일 설정
257                 * @border {Object} :border 색상
258                 * @fill {Object}   : 채워진 실린더양
259                 * @current {Object}   : 현재 위치한 라인
260                 * @prevDataLine {Object}  : 이전 잔상
261                 */
262                cylinder : {
263                    border :'#c7cfd9',
264                    fill : {
265                        color : "100-#2bcdba-#6bdccf",
266                        opacity: 0.3,
267                        border : 'none'
268                    },
269                    current : {
270                        color : '#6bdccf'
271                    },
272                    prevDataLine : {
273                        color : '#c7cfd9'
274                    }
275                },
276
277                /**
278                 *  Thermometer GAUGE의 스타일 설정
279                 * @prevBack {Object} :border 색상
280                 * @prevBar {Object}   : 채워진 실린더양
281                 * @bottom {Object}   : 현재 위치한 라인
282                 * @barLine {Object}  : 이전 잔상
283                 * @bar {Object}  : 이전 잔상
284                 */
285                thermometer : {
286                    prevBackground: {
287                        color : "#fcfcfc",
288                        border : 'none'
289                    },
290                    prevBar : {
291                        size : 1,
292                        color : "#ff6360",
293                        opacity : 0.5
294                    },
295                    bottom : {
296                        color :  '#ff6360',
297                        border :  "#bcc7d4"
298                    },
299                    back : {
300                        color : "#fcfcfc",
301                        border : "#bcc7d4"
302                    },
303                    bar : {
304                        color : "100-#ff6360-#ff908e",
305                        border : 'none'
306                    }
307                },
308
309                /**
310                 *  최대값, 평균값, 타켓 표시값 관련 STYLE 설정
311                 * @max {Object} 	: 입력된 데이터들 간의 최대값
312                 * @avg {Object}   	: 입력된 데이터들의 평균값
313                 * @target {Object}   : 사용자가 설정한 표시값
314                 */
315                pointer : {
316                    max : {
317                        bar : {
318                            color : '#ff625f',
319                            length :10
320                        },
321                        font : {
322                            size : 10,
323                            color :  '#ff625f',
324                            align: 'start',
325                            position : -18,
326                            family: defaultFont
327                        }
328                    },
329                    avg : {
330                        bar : {
331                            color : '#2bcdba',
332                            length :10
333                        },
334                        font : {
335                            size : 10,
336                            color :  '#2bcdba',
337                            align: 'start',
338                            position : -18,
339                            family: defaultFont
340                        }
341                    },
342                    target : {
343                        color : '#8397a6'
344                    }
345                }
346            };
347            return defaultStyles;
348        }
349
350        /**
351         * 기본으로 설정되어 있는 옵션 반환
352         * data 부분에 해당하는 key들은 고정이며 추가되는 부분은 자유롭게 설정한다.
353         * @return {defaultOptions} default options
354         */
355        function getDefaultOptions() {
356
357            var defaultOptions = {
358                /*  DATA SETTING - 데이터 설정  */
359                data : {
360                    data : null ,
361                    url : null ,			// Ajax를 통해서 데이터를 가져ì˜
361¤ê³ ìž 할경우
362                    type : null ,			// json, text 형태 설정
363                    reverse : false , 		// 데이터 흐름이 반대로 들어올경우
364                    jsonDepth : 'output.result' ,	// json에 depth
365                    format :  null,         // 데이터 포멧 형식 설정
366                    use : null		    	// 표현할 데이터 key 값 , null인경우 데이터의 마지막key값 기준이 된다.
367                },
368
369                /*  USING OPTION - 옵션 사용 유무 */
370                use : {
371                    axis : true ,		// 눈금
372                    axisText : true ,	// 치수
373                    counter : true ,	// 치수표시판
374                    max :true ,		// 최대값 표시
375                    avg : true ,		// 평균값 표시
376                    target : false ,	// 타겟값 표시
377                    toolTip : true ,	// 마우스오버 툴팁
378                    animate : true ,	// 움직이는 효과
379                    resize : false ,	// 게이지 사이즈 조절
380                    responsive : true 	// 반응형 유무
381                },
382
383                /*  TOOLTIP SETTING IN DETAIL- 툴팁 세부 설정  */
384                toolTip : {
385                    className : null ,
386                    position : {
387                        x : 0 ,
388                        y : 0
389                    },
390                    func : null
391                },
392
393                /*  축의 MAX, MIN  VALUE SETTINGS - 최댓값, 최소값 설정 (DEFAULT - auto ) */
394                minmax : {
395                    min : 'auto' ,
396                    max : 'auto'
397                },
398
399                /* 데이터의 max값, 평균값,  타겟표시값 설정 (DEFAULT - auto ) */
400                pointer : {
401                    max : 'auto' ,
402                    avg : 'auto' ,
403                    target : 0
404                }
405
406            };
407
408            return defaultOptions;
409        }
410
411        /**
412         * Gauge를 그리기 위한 위치들을 설정
413         * @type {Object}
414         */
415        function cloneSettingSize(gauge, type) {
416
417            var width = gauge.svg.width,
418                height = gauge.svg.height,
419                styles =  gauge.styles,
420                use = gauge.options.use,
421                objWidth = 0, objHeight = 0;
422
423            var centerX = (width / 2) + styles.layout.position.x;
424            var standard = (width > height) ? height : width;
425            var centerY = (height / 2) + styles.layout.position.y;
426
427            switch (type) {
428                case 'cylinder':
429                    objWidth = width * 0.237;
430                    objHeight = height * 0.543;
431                    break;
432
433                case 'thermometer':
434                    centerY = centerY - 40;
435                    objWidth = standard * 0.1;
436                    objHeight = height * 0.5;
437                    break;
438            }
439
440            /**
441             * 사용자가 CHART의 크기를 변경
442             */
443            if (use.resize) {
444                centerX = centerX + 5;
445                objWidth = standard * (styles.object.width / 400);
446                objHeight = standard * (styles.object.height / 448);
447            }
448
449            var gapX = (objWidth / 2),
450                startX = (centerX - gapX),
451                endX = (startX + objWidth);
452
453            var settingSize = {
454                objWidth : objWidth,
455                objHeight : objHeight,
456                centerX : centerX,
457                gapX : gapX,
458                startX : startX,
459                endX : endX,
460                centerY :centerY ,
461                startY :centerY -(objHeight/2),
462                endY :centerY+(objHeight/2)
463            };
464            return settingSize;
465
466        }
467
468        function cloneSettingModel(gauge) {
469            var settingModel = {
470                data : [ ],
471                wrapper : {
472                    width : null
473                }
474            };
475            return settingModel;
476        }
477
478        /**
479         * defaultStyles 와 GAUGE 스타일을 extend 시켜준다.
480         * @param  {Object} style [GAUGE 스타일]
481         * @return {Object}       [extend 되어진 스타일]
482         */
483        function extendStyles (style) {
484
485            var defaultStyles = getDefaultStyles();
486
487            var styles = $.extend(true, defaultStyles, style);
488
489            if (elementType === 'VML') {
490                styles.axis.family = "Dotum";
491                styles.counter.text.family = "Dotum";
492            }
493
494            return styles;
495        }
496
497        /**
498         * defaultOptions 와 GAUGE 옵션을 extend 시켜준다.
499         * @param  {Object} option [GAUGE 옵션]
500         * @return {Object}        [extend 되어진 옵션]
501         */
502        function extendOptions(option) {
503
504            var defaultOptions = getDefaultOptions();
505            var options = $.extend(true, defaultOptions, option);
506
507            if (elementType === 'VML') {
508                options.use.animate =  false;
509            }
510            return options;
511        }
512
513        /**
514         * 브라우져 환경에 따라 SVG 인지 VML 인지 구분해준다.
515         * @return {String} ['SVG' or 'VML']
516         */
517        function getElementType() {
518
519            var g = {
520                doc : document,
521                win : window
522            };
523            var elementType = (g.win.SVGAngle ||
524            g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1") ? "SVG" : "VML");
525
526            return elementType;
527        }
528        /**
529         * AJAX 를 이용하여 데이터를 읽어온다.
530         * @param  {Object} options [GAUGE 옵션]
531         * @return {Array}         [파싱된 데이터 반환]
532         */
533        function loadData(options) {
534
535            var data = [];
536
537            if (options.data.data) {
538                data = options.data.data;
539            } else {
540                $.ajax({
541                    url : options.data.url,
542                    async : false,
543                    dataType : options.data.type,
544                    success : function(resp) {
545
546                        if (options.data.type === "json") {
547
548                            data = loadJson(resp, options);
549
550                        } else if (options.data.type === "text") {
551
552                            data = loadText(resp, options);
553                        }
554                    },
555                    error : function(e, a, b) {
556                        console.log(e, a, b);
557                    }
558                });
559            }
560
561            return data;
562        }
563
564        /**
565         * 데이터가 json 형식일 경우
566         * options.data.jsonDepth 에 따라 해당 데이터를 반환한다.
567         * @param  {Array} data    [AJAX 에 의해 호출되어진 데이터]
568         * @param  {Object} options [PIE 옵션]
569         * @return {Array}         [PIE 데이터]
570         */
571        function loadJson(data, options) {
572
573            var bld_depth = options.data.jsonDepth.split('.');
574            var outPut = bld_depth[0];
575            var result = bld_depth[1];
576
577            var arr = data;
578
579            for (var i = 0; i < bld_depth.length; i++) {
580
581                arr = arr[bld_depth[i]];
582            }
583
584            return arr;
585        }
586
587        /**
588         * 데이터가 text 형식일 경우
589         * '|' ,'\n' 을 기준으로 데이터를 파싱한다.
590         * @param  {String} data    [AJAX 에 의해 호출되어진 데이터]
591         * @param  {Object} options [PIE 옵션]
592         * @return {Array}         [PIE 데이터]
593         */
594        function loadText(data2, options) {
595
596            var arr = [];
597            var data = data2;
598            var lineArr = data.split('\n');
599            var dataTitles = [];
600            var titleCheck = true;
601
602            for (var i = 0; i < lineArr.length; i++) {
603
604                if (lineArr.length <= 1) {
605
606                    continue;
607                }
608
609                var objArr = lineArr[i].split('|');
610
611                if (titleCheck) {
612
613                    for (var j = objArr.length; j--;) {
614
615                        dataTitles.unshift(trim(objArr[j]));
616                    }
617
618                    titleCheck = false;
619
620                } else {
621
622                    var obj = {};
623
624                    if (objArr.length <= 1) {
625
626                        continue;
627                    }
628
629                    $.each(objArr, function(j, item) {
630
631                        obj[dataTitles[j]] = trim(item);
632                    });
633
634                    arr.push(obj);
635                }
636            }
637
638            return arr;
639        }
640
641        function drawSvg(gauge) {
642
643            var svgWidth = Math.floor(gauge.wrapper.width());
644            var svgHeight = Math.floor(gauge.wrapper.height());
645
646            gauge.svg = Raphael(gauge.wrapper[0],'100%', svgHeight);
647            gauge.svg.canvas.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
648
649        }
650
651        function drawLayout(gauge) {
652
653            var paper = gauge.svg,
654                styles = gauge.styles.layout,
655                width = paper.width,
656                height =  paper.height;
657
658            if (elementType === "VML") {
659                paper.canvas.style.background = styles.area.color;
660            }
661
662            gauge.redrawItem.background = paper.rect(0,0, '100%','100%' );
663            gauge.redrawItem.background.attr({"fill": styles.area.color, "stroke":styles.area.border});
664
665        }
666
667        function drawCylinderPath(startX, endX, endY, gapX, height) {
668
669            endY = Math.round(endY) - 0.5;
670            height = Math.round(height) - 0.5;
671
672            return  'M' + startX + ',' + height +
673                'L' + startX + ',' + endY +
674                'A' + gapX + ',14,0,0,0,' + endX + ',' + endY +
675                'L' + endX + ',' + height +
676                'A' + gapX + ',14,0,0,0,' + startX + ',' + height;
677
678        }
679        /**
680         * y축 위치 찾기
681         * @param {gauge} gauge 객체
682         */
683        function getPixel(endPoint, data, allData, interval, measureNum) {
684            var res =  Math.round(endPoint - (data / (allData / measureNum)) * interval);
685            return  (isNaN(res)===true) ? endPoint :  res;
686        }
687
688        function setInputData(gauge){
689
690            var putData = gauge.options.data;
691            var setData = gauge.settings.data;
692            var use = putData.use;
693            var dataLen = putData.data.length;
694            for (var i = 0; i < dataLen; i ++ ){
695                if( use === null || use === undefined){
696                    for( var x in putData.data[i]){
697                        setData[i] = parseInt(putData.data[i][x]);
698                    }
699                }else{
700                    setData[i] = parseInt(putData.data[i][use]);
701                }
702            }
703
704            if ( gauge.options.data.reverse ) {
705
706                setData.reverse();
707            }
708
709        }
710        /**
711         * gauge 의 데이터 중 최대값,최소값,평균값 을 구한다.
712         * @param {gauge} gauge 객체
713         */
714        function setComputedData(gauge){
715
716            var opt = gauge.options;
717            var datas = gauge.settings.data;
718            var dataLen = datas.length;
719            var maxVal =0,  sum=0 , minVal=0;
720            var findMin = [];
721
722            for(var  i = 0 ; i < dataLen ; i++){
723                var inputData = datas[i];
724                inputData = findFloat(inputData);
725                if(maxVal<inputData){
726                    maxVal = inputData;
727                }
728                if(minVal>inputData){
729                    minVal = inputData;
730                }
731                sum = sum + inputData;
732                findMin.push(minVal);
733            }
734            if(opt.pointer.max==="auto"){
735                opt.pointer.max = findFloat(maxVal);
736            }
737            if(opt.pointer.avg==="auto"){
738                opt.pointer.avg = findFloat(sum / dataLen);
739            }
740            if(opt.minmax.min==="auto"){
741                opt.minmax.min = findFloat(Math.min.apply(null, findMin));
742            }
743
744        }
745
746        /**
747         * 소수점 자리 대상인지를 확인
748         * @param {num} :  검사 대상
749         */
750        function findFloat(num) {
751            if(num === undefined){
752                return false;
753            }
754            var stringNum = num.toString();
755            var idx = stringNum.indexOf('.');
756            if (idx !== -1) {
757                num = (idx >= (stringNum.length - 3)) ? num : dropNumber(num,-2);
758            }
759            return num;
760        }
761
762        /**
763         * 소수점 둘쨋자리 이상의 숫자를 반올림
764         * @param {num} :  검사 대상
765         * @param {idx} :  소수점 자릿수  (둘쨋자리) = -2
766         */
767        function dropNumber(num, idx) {
768            num = parseFloat(num);
769            var minus = '';
770            if (num < 0) {
771                minus = '-';
772            }
773            num = Math.abs(num);
774            num = (parseInt((num + 0.5 * Math.pow(10, idx)) * 100)) / 100;
775            var s = minus + num.toString();
776
777            return parseFloat(s);
778        }
779
780        /**
781         * GAUGE COUNTER  :
782         * @param {gauge} gauge 객체
783         * @param {type} gauge type
784         */
785        function drawCounter(gauge) {
786            var pos = gauge.sizes;
787            var counter = gauge.styles.counter;
788            var paper = gauge.svg;
789            var isAnimated = gauge.options.use.animate;
790
791            var dataSet = gauge.settings.data;
792            var currentVal = dataSet[dataSet.length-1];
793            var prevData = ((dataSet.length-2) > 0 ) ? dataSet[dataSet.length-2] : 0;
794
795            var rectW = (typeof counter.width == "number")? counter.width: (paper.width * 0.1),
796                rectH = (typeof counter.height == "number")?  rectW / 2 + ( counter.height - (rectW / 2) ) : rectW / 2,
797                rectX = (pos.endX + rectH * 0.6)+ counter.x ,
798                rectY = (pos.endY - rectH)+ counter.y ,
799                textSize = rectW * 0.4 * counter.text.size,
800                txtX = rectX + (rectW / 2)  ,
801                txtY = rectY + (rectH / 2)  ;
802
803            var counterBox = paper.rect(rectX, rectY, rectW, rectH, counter.radius)
804                .attr({  "fill" : counter.color,  "stroke" : counter.border  });
805            var inputData = paper.text(txtX, txtY, currentVal)
806                .attr({
807                    "font-family" : counter.text.family,
808                    "font-size" : textSize,
809                    "font-weight" : counter.text.weight,
810                    "text-align" : 'center',
811                    "fill" : counter.text.color
812                });
813            gauge.redrawItem.push(counterBox,inputData);
814
815            if(isAnimated){
816                animNum(currentVal,prevData,inputData,gauge);
817            }else{
818
819                if (gauge.options.data.format !== null) {
820                    currentVal = formatting(currentVal, gauge.options.data.format);
821                }
822
823                inputData.attr({text:currentVal});
824            }
825        }
826
827        /** GAUEGE function: animNum
828         * 값 변경 애니메이션    [ COUNTER 내의 숫자 움직임 ]
829         * (inputData.attr("text")) 의 값을 변경
830         * @[param] :  (비교값1, 비교값2, 대상, GAUGE);
831         */
832        function animNum(currentVal,prevData,inputData,gauge){
833            inputData.attr({'text' : prevData});
834
835            var difference  = Math.floor( Math.abs(currentVal-prevData));
836            var counter = 0, inputText ="", inputNum=0;
837
838            if(currentVal !==prevData ){
839                var gapNum = setInterval(function() {
840
841                    if(currentVal < prevData) {
842                        inputNum = parseInt((inputData.attr("text")))-1;
843                    } else {
844                        inputNum = parseInt((inputData.attr("text")))+1;
845                    }
846
847                    inputText = (gauge.options.data.format !== null) ? formatting(inputNum,gauge.options.data.format) : inputNum;
848                    inputData.attr({ text: inputText } );
849
850                    counter = counter + 1;
851
852                    if(inputNum===currentVal || counter === difference){
853                        clearTimeout(gapNum);
854                    }
855                }, 1000/difference);
856            }
857        }
858
859        function adjustMinMax(gauge) {
860
861            var range = gauge.options.minmax;
862            var pointer = gauge.options.pointer;
863            var target =parseInt(pointer.target);
864            var axis= gauge.styles.axis;
865            var linesCount = countLine(axis);
866
867            /* 최소값 */
868            var arr = [range.min, pointer.max, pointer.avg];
869            if(gauge.options.use.target){
870                arr.push(target );
871            }
872            range.min = Math.min.apply( null ,arr);
873
874            if (range.min < 0) {
875                range.min = (range.min % 10 === 0) ? range.min : range.min- (10 + (range.min % 10));
876            } else {
877                range.min = (range.min % 10 === 0) ? range.min : range.min- (range.min % 10);
878            }
879
880            if (range.max === "auto" || typeof range.max !== "number") {
881                if (pointer.max === 0 && target === 0){
882                    range.max = 10;
883                }
884                else if (pointer.max < 100 && target < 100) {
885                    range.max = 100;
886                } else {
887                    range.max =  (target > pointer.max) ? target : (pointer.max);
888                    if (range.max % linesCount !== 0) {
889                        range.max = range.max + (linesCount - (range.max % linesCount))+ range.min;
890                    }
891                }
892            } else if (range.max < pointer.max) {
893                range.max = pointer.max;
894            }
895
896            var dataSet = gauge.settings.data;
897            var inputData = dataSet[dataSet.length-1];
898
899            if (inputData > range.max){
900                range.max =  (10  - (inputData % 10 )) + inputData;
901            }
902
903        }
904
905        /**
906         * CHART 의 눈금 표시 (  ANGULAR || 'COL' || 'ROW'  )
907         */
908        function drawAxis(gauge, type) {
909
910            var pos = gauge.sizes;
911            var axis = gauge.styles.axis;
912            var paper = gauge.svg;
913
914            var linesCount = countLine(axis);
915
916            var blockLine = paper.set();
917            var intervalLine = paper.set();
918
919            if (type === 'thermometer') {
920                pos.objHeight = (pos.objWidth * 5.28);
921            }
922
923            var interval = (pos.objHeight) / linesCount;
924
925            for (var i = 0, len = linesCount+1; i < len;  i++) {
926                var lineY = Math.round(pos.startY + i * interval) + 0.5,
927                    lineX = Math.round(pos.startX) - 0.5;
928                if (i % axis.interval === 0) {
929                    blockLine.push(paper.path("M" + lineX + "," + lineY + "L" + (lineX - axis.blockLine.length) + "," + lineY));
930                } else {
931                    intervalLine.push(paper.path("M" + lineX + "," + lineY + "L" + (lineX - axis.intervalLine.length) + "," + lineY));
932                }
933            }
934            blockLine.attr({ "stroke" : axis.blockLine.color });
935            intervalLine.attr({ "stroke" : axis.intervalLine.color });
936
937            gauge.redrawItem.push(blockLine,intervalLine);
938
939        }
940
941        function countLine(x){
942            return  ( x.block * x.interval === 0) ? x.block : x.block * x.interval;
943        }
944
945        /**
946         * CHART 의 치수 표시 (  ANGULAR || 'COL' || 'ROW'  )
947         */
948        function drawTextAxis(gauge, type) {
949
950            var pos = gauge.sizes;
951            var paper = gauge.svg;
952            var axis = gauge.styles.axis;
953            var text = axis.text;
954            var opt = gauge.options;
955
956            var maxAxis = opt.minmax.max;
957            var minAxis = opt.minmax.min;
958            var range = maxAxis - minAxis;
959
960            var textLines = paper.set();
961
962            if (type === 'thermometer') {
963                pos.objHeight = (pos.objWidth * 5.28);
964                pos.endY = pos.startY + pos.objHeight;
965            }
966
967            for (var i = 0; i < text.num ; i++) {
968                var textValue =Math.ceil((range/(text.num-1))*i);
969                if ( textValue % 5 !== 0  &&  maxAxis  >10) {
970                    textValue = textValue + (5 - (textValue % 5));
971                }
972                var lineY = Math.round(pos.endY - (pos.objHeight / range * textValue)) - 0.5;
973
974                textValue = textValue + minAxis;
975
976                if (type === 'thermometer' && opt.data.format !== null) {
977                    textValue = formatting(textValue, "temperature");
978                }
979
980                textLines.push(paper.text( (pos.startX - (axis.blockLine.length * 1.35)), lineY, textValue) );
981
982            }
983            textLines.attr({
984                'font-size' : text.size,
985                'fill' : text.color,
986                "text-anchor" : text.align,
987                "font-family" : text.family,
988                "font-weight" : text.weight
989            });
990            gauge.redrawItem.push(textLines);
991        }
992
993        /**
994         * GAUEGE CHART 의 TARGET 표시
995         * @param(type) : GAUGE CHART TYPE
996         * @param(targetVal) : TARGET VALUE
997         */
998        function drawTarget(gauge, type) {
999            var paper = gauge.svg;
1000            var pos = gauge.sizes;
1001            var pointer = gauge.styles.pointer.target;
1002
1003            var minAxis = gauge.options.minmax.min;
1004            var maxAxis = gauge.options.minmax.max - minAxis;
1005            var targetVal =   gauge.options.pointer.target - minAxis;
1006
1007            var linesCount = countLine(gauge.styles.axis);
1008
1009            var interval =  pos.objHeight / linesCount, // 한칸당 수 범위
1010                targetPath = Math.round(getPixel(pos.endY, targetVal, maxAxis, linesCount, interval)) - 0.5,
1011                targetCmd = make2Line((pos.endX + 1), (targetPath), (pos.endX + 14), (targetPath - 4), (pos.endX + 14), (targetPath + 4));
1012
1013            var target = paper.path(targetCmd).attr({ "fill" : pointer.color, "stroke" : 'none' });
1014
1015            gauge.tipItems.targetPointer = target;
1016            gauge.redrawItem.push(target);
1017        }
1018
1019        function drawPointer(gauge, type, pointerType) {
1020            var paper = gauge.svg;
1021            var pos = gauge.sizes;
1022            var styles =  gauge.styles;
1023
1024            var maxAxis = gauge.options.minmax.max;
1025            var minAxis = gauge.options.minmax.min;
1026            var range = maxAxis-minAxis;
1027
1028            var pointer = gauge.options.pointer;
1029            var  pointerVal = null;
1030
1031            if(pointerType === 'max'){
1032                pointerVal =  pointer.max - minAxis,
1033                    styles = styles.pointer.max;
1034            }
1035            else if (pointerType === 'avg') {
1036                pointerVal =  pointer.avg - minAxis,
1037                    styles = styles.pointer.avg;
1038            }
1039            var linesCount = countLine(gauge.styles.axis);
1040
1041            var interval = pos.objHeight / linesCount,
1042                pointerPath = Math.round( getPixel(pos.endY, pointerVal, range, linesCount, interval) ) - 0.5,
1043                labels = (paper.text((pos.endX + 15), pointerPath, pointerType)),
1044                pointerCmd = "";
1045
1046            var bar_length=  pos.endX + styles.bar.length;
1047            if (type === 'cylinder') {
1048                pointerCmd = makeLine( pos.endX ,  pointerPath , bar_length , pointerPath );
1049            }  else {
1050                pointerCmd = makeLine( pos.startX , pointerPath , bar_length , pointerPath );
1051            }
1052
1053            if (pointerType === 'max' && pointer.avg == pointerVal && gauge.options.use.avg) {
1054                labels.translate((styles.font.size+10), 0);
1055            }
1056            labels.attr({
1057                'font-size' : styles.font.size,
1058                'fill' : styles.font.color,
1059                "text-anchor" : styles.font.align,
1060                "font-family" : styles.font.family
1061            });
1062
1063            var pointer = paper.path(pointerCmd)
1064                .attr({ "stroke" : styles.bar.color });
1065
1066            if (type == 'thermometer' ) {
1067                pointer.attr({ "stroke-dasharray" : "- " });
1068            }
1069            if( pointerType === 'max'){
1070                gauge.tipItems.max = paper.set();
1071                gauge.tipItems.max.push(labels, pointer);
1072            }
1073            else if(pointerType ==='avg'){
1074                gauge.tipItems.avg = paper.set();
1075                gauge.tipItems.avg.push(labels, pointer);
1076            }
1077            gauge.redrawItem.push(pointer,labels);
1078
1079        }
1080
1081        function makeLine(sX, sY, eX, eY) {
1082            return "M" + sX + "," + sY + "L" + eX + "," + eY;
1083        }
1084
1085        function make2Line(sX, sY, cX, cY, eX, eY) {
1086            return "M" + sX + "," + sY + "L" + cX + "," + cY + "L" + eX + "," + eY;
1087        }
1088
1089        /**
1090         * CYLINDER TYPE_GAUGE CHART
1091         */
1092        function drawCylinder(gauge) {
1093
1094            var pos = gauge.sizes;
1095            var opt = gauge.options;
1096            var paper = gauge.svg;
1097            var cylinder = gauge.styles.cylinder;
1098
1099            var isAnimated = opt.use.animate;
1100            var linesCount = countLine(gauge.styles.axis);
1101            var interval = pos.objHeight / linesCount;
1102
1103            var minAxis =  opt.minmax.min;
1104            var maxAxis = opt.minmax.max- minAxis;
1105
1106            var dataSet = gauge.settings.data;
1107            var inputData = dataSet[dataSet.length-1]- minAxis;
1108            var prevData = ((dataSet.length-2) > 0 ) ? dataSet[dataSet.length-2] - minAxis  :0;
1109
1110            var prevHeight = getPixel(pos.endY, prevData, maxAxis, linesCount, interval),
1111                curHeight = getPixel(pos.endY, inputData, maxAxis, linesCount, interval);
1112
1113            var bottom = paper.ellipse(pos.centerX, pos.endY - 0.5, pos.gapX - 1, 14).attr({"stroke" : cylinder.border}),
1114                inside = null,  prev = null,
1115                current_line = null;
1116
1117            if (isAnimated) {
1118                prev = paper.ellipse(pos.centerX, prevHeight, pos.gapX - 1, 14).attr({ "stroke" : cylinder.prevDataLine.color }); //
1119                inside = paper.path(drawCylinderPath(pos.startX, pos.endX, pos.endY, pos.gapX, prevHeight));
1120                current_line = paper.ellipse(pos.centerX, prevHeight, pos.gapX - 1, 14);
1121
1122                inside.animate({
1123                    "path" : drawCylinderPath(pos.startX, pos.endX, pos.endY, pos.gapX, curHeight)
1124                }, 1000);
1125                current_line.animate({
1126                    "transform" : "t0," + (curHeight - prevHeight)
1127                }, 1000);
1128
1129                gauge.tipItems.prev = prev;
1130
1131            } else {
1132                inside = paper.path(drawCylinderPath(pos.startX, pos.endX, pos.endY, pos.gapX, curHeight));
1133                current_line = paper.ellipse(pos.centerX, curHeight, pos.gapX - 1, 14);
1134            }
1135            var top = paper.ellipse(pos.centerX, pos.startY, pos.gapX, 15)
1136                .attr({"stroke" : cylinder.border});
1137            var border = paper.path(drawCylinderPath(pos.startX, pos.endX, pos.endY, pos.gapX, pos.startY));
1138            current_line.attr({
1139                "stroke" : cylinder.current.color
1140            });
1141            border.attr({
1142                "stroke" : cylinder.border
1143            });
1144            inside.attr({
1145                "fill" : cylinder.fill.color,
1146                "opacity" : cylinder.fill.opacity,
1147                "stroke" : cylinder.fill.border
1148            });
1149
1150            gauge.redrawItem.push( top, border, bottom, current_line, inside, prev );
1151            gauge.tipItems.base = inside;
1152        }
1153
1154        /**
1155         * THERMOMETER TYPE_GAUGE CHART
1156         */
1157        function drawThermometer(gauge) {
1158
1159            var pos = gauge.sizes ;
1160            var opt = gauge.options;
1161            var styles = gauge.styles;
1162            var paper = gauge.svg;
1163
1164            var thermometer = styles.thermometer;
1165            var isAnimated =  opt.use.animate;
1166
1167            var minAxis =  opt.minmax.min;
1168            var maxAxis = opt.minmax.max- minAxis ;
1169
1170            var dataSet = gauge.settings.data;
1171            var inputData = dataSet[dataSet.length-1]- minAxis;
1172            var prevData = dataSet[dataSet.length-2]- minAxis;
1173
1174            var linesCount = countLine(styles.axis);
1175            var interval = pos.objHeight / linesCount; // 한칸당 수 범위
1176
1177            var prevHeight = getPixel(pos.endY, prevData, maxAxis, interval, linesCount);
1178            pos.objHeight = (pos.objWidth * 5.28);
1179            pos.endY = pos.startY + pos.objHeight;
1180
1181            var curHeight = getPixel(pos.endY, inputData, maxAxis, interval, linesCount);
1182            var bottom = paper.circle(pos.centerX, (pos.endY + (pos.objWidth * 0.85) - (pos.objHeight * 0.03)), pos.objWidth * 0.85);
1183            var back = paper.rect(pos.startX, pos.startY, pos.objWidth, pos.objHeight);
1184            var bar = null;
1185
1186            var rectX = pos.centerX - pos.gapX + 0.5,
1187                rectY = prevHeight,
1188                rectW = pos.objWidth - 1,
1189                rectH = Math.round(pos.objHeight - (prevHeight - pos.startY));
1190            if (isAnimated && prevData !== inputData) {
1191                var prevBackground = paper.rect(rectX, rectY, rectW, rectH),
1192                    prevBar = paper.rect(rectX, rectY , rectW, thermometer.prevBar.size);
1193
1194                bar = paper.rect(rectX, rectY,rectW, rectH + 2)
1195                    .animate({
1196                        y : curHeight,
1197                        height : rectH + 2 - (curHeight-rectY)
1198                    }, 1000);
1199
1200                prevBackground.attr({
1201                    'fill' : thermometer.prevBackground.color,
1202                    'stroke' : thermometer.prevBackground.border
1203                });
1204                prevBar.attr({
1205                    'fill' : thermometer.prevBar.color,
1206                    'stroke' : 'none',
1207                    'opacity' : 0.5
1208                });
1209
1210                gauge.tipItems.prev = prevBar;
1211                gauge.redrawItem.push(prevBackground,prevBar);
1212
1213            } else {
1214                bar = paper.rect(rectX, curHeight, rectW, rectH + 2 - (curHeight-rectY));
1215            }
1216
1217            bottom.attr({
1218                'fill' : thermometer.bottom.color,
1219                'stroke' : thermometer.bottom.border
1220            });
1221            back.attr({
1222                'fill' : thermometer.back.color,
1223                'stroke' : thermometer.back.border
1224            });
1225            bar.attr({
1226                'fill' : thermometer.bar.color,
1227                'stroke' : thermometer.bar.border
1228            });
1229
1230            gauge.tipItems.base =paper.set();
1231            gauge.tipItems.base.push(bar, bottom);
1232            gauge.redrawItem.push(curHeight,bottom,back, bar);
1233
1234        }
1235
1236        function getMousePosition(e) {
1237            var m = {};
1238            var target, rect, parent, parentRect;
1239            e = e || window.event;
1240            if (elementType === 'VML') {
1241                target = e.target || e.srcElement, rect = target
1242                    .getBoundingClientRect(), parent = target.parentNode,
1243                    parentRect = parent.getBoundingClientRect();
1244                m.x = e.offsetX + rect.left - parentRect.left;
1245                m.y = e.offsetY + rect.top - parentRect.top;
1246            } else {
1247                var appName = navigator.appName.toLowerCase();
1248                var userAgent = navigator.userAgent.toLowerCase();
1249                if (userAgent.indexOf('firefox') > -1) { // FireFox
1250                    m.x = Math.round(e.layerX);
1251                    m.y = Math.round(e.layerY);
1252                } else if (appName === 'opera') { // Opera
1253                    target = e.target || e.srcElement, rect = target
1254                        .getBoundingClientRect(),
1255                        parent = target.parentNode, parentRect = parent
1256                        .getBoundingClientRect();
1257                    m.x = e.offsetX + rect.left - parentRect.left;
1258                    m.y = e.offsetY + rect.top - parentRect.top;
1259                } else { // etc
1260                    m.x = Math.round(e.offsetX);
1261                    m.y = Math.round(e.offsetY);
1262                }
1263            }
1264            return m;
1265        }
1266
1267        /**
1268         * mouse move event
1269         */
1270        function mouseMoveFunc(e, _this, gauge, x) {
1271            var styles = gauge.styles;
1272            var options = gauge.options;
1273            var toolTip = gauge.tipItems.toolTip;
1274            var pointerVal = gauge.options.pointer;
1275            var mousePosition = getMousePosition(e);
1276
1277            var data = gauge.settings.data;
1278
1279            if (options.toolTip.func !== null) {
1280
1281                eval(options.toolTip.func)(gauge, data, toolTip);
1282
1283            } else {
1284                var tip = "";
1285                switch (x) {
1286                    case "all" :
1287                        tip +=  '<span>' + "- data :  "+dropNumber(data[data.length-1],-2) +'</span><br />';
1288                        tip +=  '<span>' + "- Max :  "+pointerVal.max +'</span><br />';
1289                        tip +=  '<span>' + "- Average :  "+pointerVal.avg  +'</span><br />';
1290                        break;
1291                    case "draw" :
1292                        tip +=  '<span>' + " current data : "+dropNumber(data[data.length-1],-2) +'</span><br />';
1293                        break;
1294                    case "targetPointer" :
1295                        tip +=   '<span>' + "target :  "+pointerVal.target +'</span><br />';
1296                        break;
1297                    case "prev" :
1298                        tip +=   '<span>' + "previous data :  "+data[data.length-2] +'</span><br />';
1299                        break;
1300                    case "max" :
1301                        tip +=   '<span>' + " Max :  "+pointerVal.max+'</span><br />';
1302                        break;
1303                    case "avg" :
1304                        tip +=   '<span>' + " Average :  "+pointerVal.avg +'</span><br />';
1305                        break;
1306                    default :
1307                        tip += x;
1308                }
1309                var tipElement = '<div class="tip_data">' + tip + '</div>';
1310                toolTip.html(tipElement);
1311            }
1312
1313            var toolTipWidth = (toolTip.width() / 2),
1314                toolTipHeight = toolTip.height();
1315
1316            toolTip.css({
1317                top : mousePosition.y - toolTipHeight + options.toolTip.position.y-15,
1318                left : mousePosition.x - toolTipWidth + options.toolTip.position.x
1319            });
1320
1321            gauge.redrawItem.push(toolTip);
1322        }
1323
1324        /**
1325         * gauge 에 이벤트 발생시
1326         * @param  {gauge} gauge 객체
1327         */
1328        function itemsEvents(gauge) {
1329
1330            var styles = gauge.styles;
1331            var options = gauge.options;
1332
1333            if (!options.use.toolTip) {
1334                return;
1335            }
1336
1337            gauge.tipItems.base.mousemove(function (e) {
1338
1339                gauge.tipItems.toolTip.show();
1340                mouseMoveFunc(e, this, gauge, "draw");
1341
1342            }).mouseout(function (e) {
1343
1344                gauge.tipItems.toolTip.hide();
1345
1346            });
1347
1348
1349            if (options.use.max && options.toolTip.func === null) {
1350                gauge.tipItems.max.mousemove(function (e) {
1351
1352                    gauge.tipItems.toolTip.show();
1353                    var func = '<span>' + " Max :  " + gauge.options.pointer.max + '</span><br />';
1354                    gauge.mouseMoveFunc(e, this, gauge, func);
1355
1356
1357                }).mouseout(function (e) {
1358
1359                    gauge.tipItems.toolTip.hide();
1360
1361                });
1362            }
1363
1364            if (options.use.avg && options.toolTip.func === null) {
1365                gauge.tipItems.avg.mousemove(function (e) {
1366
1367                    gauge.tipItems.toolTip.show();
1368                    var func = '<span>' + " Average :  " + gauge.options.pointer.avg + '</span><br />';
1369                    gauge.mouseMoveFunc(e, this, gauge, func);
1370
1371                }).mouseout(function (e) {
1372
1373                    gauge.tipItems.toolTip.hide();
1374
1375                });
1376            }
1377
1378            if (options.use.target && options.toolTip.func === null) {
1379                gauge.tipItems.targetPointer.mousemove( function (e) {
1380
1381                    gauge.tipItems.toolTip.show();
1382                    mouseMoveFunc(e, this, gauge,"targetPointer");
1383
1384                }).mouseout( function(e){
1385
1386                    gauge.tipItems.toolTip.hide();
1387
1388                });
1389            }
1390            if (options.use.animate && options.toolTip.func === null) {
1391                gauge.tipItems.prev.mousemove(function(e) {
1392
1393                    gauge.tipItems.toolTip.show();
1394                    mouseMoveFunc(e, this, gauge, "prev");
1395
1396                }).mouseout(function(e) {
1397
1398                    gauge.tipItems.toolTip.hide();
1399
1400                });
1401            }
1402
1403        }
1404
1405        /**
1406         * 툴팁 사용 시 element 를 생성 한다.
1407         * @param  {pie} pie 객체
1408         */
1409        function appendToolTip(gauge) {
1410            var options = gauge.options;
1411            gauge.tipItems.toolTip = $('<div>');
1412
1413            if (options.toolTip.className === null) {
1414
1415                gauge.tipItems.toolTip.css({
1416                    "background" : "#171717",
1417                    "color" : "#fff",
1418                    "padding" : "5px 10px",
1419                    "font-size" : " 12px",
1420                    "font-family" : "NanumGothic"
1421                });
1422
1423            } else {
1424
1425                gauge.tipItems.toolTip.attr('class', options.toolTip.className);
1426            }
1427
1428            gauge.tipItems.toolTip.css({
1429                'position' : "absolute",
1430                'white-space' : 'nowrap',
1431                'z-index' : 100000
1432            });
1433
1434            gauge.tipItems.toolTip.hide();
1435
1436            gauge.wrapper.append(gauge.tipItems.toolTip);
1437
1438        }
1439
1440        function formatting(num, formatType) {
1441            var res = null;
1442            switch (formatType) {
1443                case "prime":
1444                    res = dropNumber(num);
1445                    break;
1446                case "percent":
1447                    res = num + "%";
1448                    break;
1449                case "temperature":
1450                    res = num + "º";
1451                    break;
1452                default:
1453                    res = num;
1454
1455            }
1456            return res;
1457        }
1458
1459        function noData(gauge) {
1460
1461            var x = gauge.wrapper.width() / 2;
1462            var y = gauge.wrapper.height() / 2;
1463            var text = gauge.svg.text(x, y, '데이터가 로드되지 않았습니다.');
1464
1465            text.attr({
1466                'font-family' : 'dotum',
1467                'font-size' : 12,
1468                fill : '#000'
1469            });
1470        }
1471
1472        function drawItem(gauge, type) {
1473            var use = gauge.options.use;
1474
1475            if(use.axis){
1476                drawAxis(gauge,type);
1477            }
1478            if(use.axisText){
1479                drawTextAxis(gauge,type);
1480            }
1481
1482            switch (type) {
1483                case 'cylinder':
1484                    drawCylinder(gauge);
1485                    break;
1486                case 'thermometer':
1487                    drawThermometer(gauge);
1488                    break;
1489            }
1490
1491            if(use.target){
1492                drawTarget(gauge, type);
1493            }
1494            if(use.max){
1495                drawPointer(gauge, type, "max");
1496            }
1497            if(use.avg){
1498                drawPointer(gauge,type,"avg");
1499            }
1500            if(use.counter){
1501                drawCounter(gauge);
1502            }
1503
1504            if (use.toolTip) {
1505                appendToolTip(gauge);
1506            }
1507        }
1508        function reDrawGauge(gauge, type) {
1509
1510            gauge.redrawItem.remove();
1511            $(".tip_data").parent().remove();
1512            gauge.redrawItem = gauge.svg.set();
1513            setWrapper(gauge);
1514            gauge.settings = cloneSettingModel(gauge);
1515
1516
1517            drawLayout(gauge);
1518            if (gauge.options.data.data === 'error' || gauge.options.data.data.length <= 0) {
1519                noData(gauge);
1520
1521            } else {
1522                setInputData(gauge);
1523                setComputedData(gauge);
1524                adjustMinMax(gauge);
1525
1526                gauge.sizes = cloneSettingSize(gauge, type);
1527                drawItem(gauge, type);
1528            }
1529
1530            itemsEvents(gauge);
1531        }
1532
1533        /**
1534         * GAUGE 을 렌더링 하기 위한 전반적인 부분을 세팅한다.
1535         * @param  {Gauge} gauge 객체
1536         * @param  {Node} wrapper gauge 가 append 되는 DIV
1537         * @param  {Object} styles pie 스타일
1538         * @param  {Object} options pie 옵션
1539         * @param  {String} GAUGE CHART의 TYPE
1540         */
1541        function setup(gauge, wrapper, styles, options, type) {
1542            gauge.wrapper = wrapper;
1543
1544            gauge.wrapper.css({
1545                'position' : "relative"
1546            });
1547
1548            gauge.styles = extendStyles(styles);
1549
1550            gauge.options = extendOptions(options);
1551
1552            gauge.options.data.data = loadData(gauge.options);
1553
1554            drawSvg(gauge);
1555
1556            setWrapper(gauge);
1557
1558            gauge.tipItems ={};
1559
1560            gauge.redrawItem = gauge.svg.set();
1561
1562            gauge.settings = cloneSettingModel(gauge);
1563
1564            // 여기서부터 스크립트 작성
1565
1566            drawLayout(gauge);
1567            if (gauge.options.data.data === 'error' || gauge.options.data.data.length <= 0) {
1568                noData(gauge);
1569
1570            } else {
1571
1572                setInputData(gauge);
1573                setComputedData(gauge);
1574                adjustMinMax(gauge);
1575
1576                gauge.sizes = cloneSettingSize(gauge, type);
1577
1578                drawItem(gauge, type);
1579
1580            }
1581            itemsEvents(gauge);
1582        }
1583
1584        /**
1585         * GAUEGE 에 이벤트를 붙여준다.
1586         * @param  {GAUEGE} gauge 객체
1587         */
1588        function bindEvents(wrapper, gauge) {
1589            /**
1590             * gauge 를 redraw 할 때 발생하는 이벤트
1591             */
1592            gauge.event.on('reDraw', function(e, gauge) {
1593            });
1594
1595            /**
1596             * gauge 의 resize 이벤트
1597             */
1598            if (wrapper.data('resizeEventName')) {
1599
1600                $(window).off(wrapper.data('resizeEventName'));
1601            }
1602            var wrapperUniqueId = getUniqueID();
1603
1604            wrapper.data('resizeEventName', 'resize.' + wrapperUniqueId);
1605
1606            $(window).on(
1607                wrapper.data('resizeEventName'),
1608                function(e) {
1609
1610                    var afterWrapperWidth = gauge.settings.wrapper.width;
1611                    var beforeWrapperWidth = gauge.wrapper.width();
1612                    var afterWrapperHeight = gauge.settings.wrapper.height;
1613                    var beforeWrapperHeight = gauge.wrapper.height();
1614
1615                    if (afterWrapperWidth !== beforeWrapperWidth|| afterWrapperHeight !== beforeWrapperHeight) {
1616                        if (gauge.options.use.responsive) {
1617                            gauge.resize();
1618                        }
1619                        gauge.svg.width = gauge.wrapper.width();
1620                        gauge.svg.height = gauge.wrapper.height();
1621                    }
1622                });
1623        }
1624
1625        function setWrapper(gauge) {
1626
1627            gauge.svg.width = gauge.wrapper.width();
1628            gauge.svg.height = gauge.wrapper.height();
1629        }
1630
1631        function getUniqueID() {
1632
1633            return Math.random().toString(36).substr(2, 9);
1634        }
1635
1636        /**
1637         * GAUEGE 에 API 를 추가한다.
1638         * @param  {GAUEGE} gauge 객체
1639         */
1640        function addApis(gauge, type) {
1641            gauge.on = function(eventName, callback) {
1642
1643                gauge.event.on(eventName, callback);
1644            };
1645
1646            /**
1647             *   GAUEGE CHART 를 다시 그릴 경우 사용
1648             *   설정 값에 따른 셋팅
1649             *   BEFORE REDRAW  SETTING USER OPTIONS
1650             */
1651            gauge.reDraw = function(styles, options) {
1652
1653                gauge.styles = extendStyles(styles);
1654                gauge.options = extendOptions(options);
1655                gauge.options.data.data = loadData(gauge.options);
1656
1657                reDrawGauge(gauge,type);
1658
1659                gauge.event.trigger('reDraw', [ gauge ]);
1660            };
1661
1662            /**
1663             * resize
1664             */
1665            gauge.resize = function() {
1666                reDrawGauge(gauge, type);
1667            };
1668
1669            gauge.mouseMoveFunc = function(e,x,gauge,type){
1670                mouseMoveFunc(e, x, gauge, type);
1671            };
1672
1673        }
1674
1675        /**
1676         * GAUGE 초기화 함수
1677         * @param  {Node}   wrapper gauge 가 append 되는 DIV
1678         * @param  {Object} styles  gauge 스타일
1679         * @param  {Object} options gauge 옵션
1680         * @return {gauge}  gauge 객체
1681         */
1682        self.init = function(wrapper, styles, options, type) {
1683            var gauge = {};
1684
1685            gauge.event = $({});
1686
1687            bindEvents(wrapper, gauge);
1688
1689            gauge.type = type;
1690
1691            setup(gauge, wrapper, styles, options, type);
1692
1693            addApis(gauge, type);
1694
1695            // 트라이얼 워터마크 생성
1696            if (TRIAL_UI) {
1697
1698                appendTrialUi(wrapper);
1699            }
1700            /**
1701             license object chart 에 추가(ver.150915 평다진)
1702             */
1703            gauge.license = licenseObject;
1704            /**
1705             * wrapper(jQuery selector)에 저장(ver. 160318 평다진)
1706             */
1707            wrapper[0].instance = gauge;
1708
1709            return gauge;
1710        };
1711
1712        if (!window.webponent) {
1713            window.webponent = {};
1714        }
1715        if (!window.webponent.visual) {
1716            window.webponent.visual = {};
1717        }
1718        window.webponent.visual.shaped = self;
1719
1720    })();
1721
1722})();
1723

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.