PageSourceSearch

https://innobranch.com/resources/common/js/util.js

js innobranch.com collected 2026-10-08 08:26:11 UTC 24,863 bytes, 1,183 lines download raw bytes

1
2const COLOR_DANGER = "#dc512f";
3
4
5(function($) {
6	
7	$.searchArray = function(array, field, value)
8	{
9		for (var i in array)
10		{
11			if (array[i][field] == value)
12			{
13				return array[i];
14			}
15		}
16	};
17	
18	$.fn.zip = function(settings)
19	{
20		var defaultSettings = {
21			searchButton: ".btn_search",
22			zipCodeElement: ".zip_area",
23			addressElement: ".address_area"
24		};
25		settings = $.extend(defaultSettings, settings || {});
26		
27		return $(this).each(function() {
28			var manager = ZipManager._get($(this));
29			
30			manager.init(settings);
31		});
32
33	};
34	
35	/**
36		사용방법 :
37	  
38		var options = {
39			nameField: "",
40			
41			valueField: "",
42			
43			list: [
44				object1, object2, "option1", "option2", object3
45			],
46				
47			prepend: {
48				name: "",
49				value: ""
50			},
51			
52			postpend: {
53				name: "",
54				value: ""
55			}
56		};
57		
58		$(selector).combo("make", options);
59	*/
60		
61	$.fn.combo = function(jobs, options) {
62		
63		return $(this).each(function() {
64			var manager = ComboManager._get($(this));
65			
66			if ("make" == jobs)
67			{
68				manager.make(options);
69			}
70		});
71		
72	};
73	
74	$.fn.table = function(job, options)
75	{
76		return $(this).each(function() {
77			var manager = TableManager.getManager($(this));
78			
79			if ("make" == job)
80			{
81				manager.make(options);
82			}
83			else if ("addData" == job)
84			{
85				manager.addData(options);
86			}
87			else if ("sort" == job)
88			{
89				manager.sort(options);
90			}
91			else if ("filter" == job)
92			{
93				manager.filter(options);
94			}
95			else if ("clear" == job)
96			{
97				manager.clear();
98			}
99		});
100	};
101
102	
103	$.fn.fillData = function(data) {
104		return $(this).each(function(index, item) {
105			__fillDataSlot(item, data);
106		});
107	};
108	
109	$.fn.fillData20 = function(data) {
110		return $(this).each(function(index, item) {
111			__fillDataSlot(item, data);
112		});
113	};
114
115	
116	$.phoneNumber = function(phoneNumber, what)
117	{
118		if (!phoneNumber)
119		{
120			return "";
121		}
122		
123		var index1 = phoneNumber.indexOf("-");
124		var index2 = phoneNumber.indexOf("-", index1 + 1);
125		
126		if (index1 >= 0)
127		{
128			if (what == 1)
129			{
130				return phoneNumber.substring(0, index1);
131			}
132			else if (what == 2)
133			{
134				return phoneNumber.substring(index1 + 1, index2);
135			}
136			else
137			{
138				return phoneNumber.substring(index2 + 1);
139			}
140		}
141		else
142		{
143			return "";
144		}
145	};
146	
147	$.isEmpty = function(value) {
148		
149		return (!value || (value + "").trim().length == 0);
150		
151	};
152
153	/* 우편번호 검색 - by daum */
154	function ZipManager(elem)
155	{
156		this.elem = elem;
157	}
158	
159	ZipManager.prototype.init = function(settings)
160	{
161		this.settings = settings;
162		
163		var this1 = this;
164		$(settings.searchButton).on("click", function() {
165			this1._doSearch();
166		});
167	};
168
169	ZipManager.prototype._doSearch = function()
170	{
171		var this1 = this;
172		new daum.Postcode({
173            oncomplete: function(data) {
174            	if (data)
175            	{
176            		$(this1.settings.zipCodeElement).val(data.zonecode);
177            		$(this1.settings.addressElement).val(data.address);
178            	}
179            }
180		}).open();
181	};
182
183	ZipManager._instances = [];
184	
185	ZipManager._get = function(elem)
186	{
187		for (var i in ZipManager._instances)
188		{
189			if (ZipManager._instances[i].elem.is(elem))
190			{
191				return ZipManager._instances[i];
192			}
193		}
194		
195		return ZipManager._make(elem);
196	};
197	
198	ZipManager._make = function(elem)
199	{
200		var instance = new ZipManager(elem);
201		ZipManager._instances.push(instance);
202		
203		return instance;
204	}
205	
206	
207	/* 콤보 박스 */
208	function ComboManager(elem)
209	{
210		this.elem = elem;
211	}
212
213	ComboManager.prototype.make = function(options)
214	{
215		this.elem.empty();
216		
217		if (options.prepend)
218		{
219			for (var i in options.prepend)
220			{
221				this.appendOption(options.prepend[i].name, options.prepend[i].value);
222			}
223		}
224
225		for (var i in options.list)
226		{
227			var name;
228			var value;
229			
230			if (typeof options.list[i] == "string")
231			{
232				name = options.list[i];
233				value = options.list[i];
234			}
235			else
236			{
237				name = extractData(options.list[i], options.nameField);
238				value = extractData(options.list[i], options.valueField);
239			}
240			
241			this.appendOption(name, value);
242		}
243		
244		if (options.postpend)
245		{
246			for (var i in options.postpend)
247			{
248				this.appendOption(options.postpend[i].name, options.postpend[i].value);
249			}
250		}
251	};
252
253	ComboManager.prototype.appendOption = function(name, value)
254	{
255		var option = $("<option />");
256		option.attr("value", value);
257		option.html(name);
258		
259		this.elem.append(option);
260	};
261	
262	ComboManager._list = [];
263	
264	ComboManager._get = function(elem) {
265		for (var i in ComboManager._list)
266		{
267			if (elem.is(ComboManager._list[i].elem))
268			{
269				return ComboManager._list[i];
270			}
271		}
272		
273		return ComboManager._make(elem);
274	};
275	
276	ComboManager._make = function(elem)
277	{
278		var manager = new ComboManager(elem);
279		ComboManager._list.push(manager);
280		
281		return manager;
282	};
283
284	
285	/*
286	 * Table Manager
287	 */
288	function TableManager(elem)
289	{
290		this.elem = elem;
291		this.list = [];
292		this.sortDirection = 1;
293	}
294	
295	TableManager.prototype.make = function(options)
296	{
297		this.options = options;
298		
299		this.elem.addClass("table");
300		this.elem.addClass("table-fixed");
301
302		this._makeHeader(options);
303		this._makeBody(options);
304		
305	};
306	
307	TableManager.prototype.addData = function(data)
308	{
309		if (Array.isArray(data))
310		{
311			for (var i in data)
312			{
313				this.list.push(data[i]);
314				this._addRow(data[i]);
315			}
316		}
317		else
318		{
319			this.list.push(data);
320			this._addRow(data);
321		}
322	};
323
324	TableManager.prototype.sort = function(field)
325	{
326		if (this.sortField == field)
327		{
328			this.sortDirection *= -1;
329		}
330		else
331		{
332			this.sortField = field;
333			this.sortDirection = 1;
334		}
335		
336		var this1 = this;
337		this.list.sort(function(a, b) {
338			return ((this1._extractData(a, field) > this1._extractData(b, field)) ? 1 : -1) * this1.sortDirection;
339		});
340		
341		this._redrawHeader();
342		this._redrawRows();
343		
344		if (this.options.callbackSort)
345		{
346			this.options.callbackSort(field, this.sortDirection);
347		}
348	};
349	
350	TableManager.prototype.filter = function(filterOption)
351	{
352		this.filterField = filterOption.field;
353		this.filterValue = filterOption.value;
354		
355		this._redrawRows();
356	};
357	
358	TableManager.prototype.clear = function()
359	{
360		this.list.splice(0, this.list.length);
361		this.tbody.empty();
362	};
363
364
365	TableManager.prototype._makeHeader = function()
366	{
367		this.thead = $("<thead />");
368		this.elem.append(this.thead);
369		
370		this._redrawHeader();
371	};
372
373	TableManager.prototype._makeBody = function(options)
374	{
375		this.tbody = $("<tbody />");
376		this.elem.append(this.tbody);
377		
378		this.tbody.css("height", $(window).height() - 220);
379		
380		this.tbody.on("contextmenu", function(event) {
381			event.preventDefault();
382		});
383		
384		var this1 = this;
385		if (options.eventHandlers)
386		{
387			for (var i in options.eventHandlers)
388			{
389				this.tbody.on(options.eventHandlers[i].type, function(event) {
390					var tr1 = $(event.target).parent("tr");
391					var data = this1._getData(tr1.attr("data-key"));
392					
393					for (var j in options.eventHandlers)
394					{
395						if (options.eventHandlers[j].type == event.type)
396						{
397							if (event.type == "taphold")
398							{
399								event.pageX = __pageX;
400								event.pageY = __pageY;
401							}
402							
403							options.eventHandlers[j].callback(event, data);
404						}
405					}
406				});
407			}
408		}
409	}
410	
411	TableManager.prototype._redrawHeader = function()
412	{
413		this.thead.empty();
414		
415		this.thead.append("<tr />");
416		
417		for (var i in this.options.columns)
418		{
419			this._appendHeaderColumn(this.options.columns[i]);
420		}
421	};
422	
423	TableManager.prototype._appendHeaderColumn= function(column)
424	{
425		var title = column.title;
426		if (column.field == this.sortField)
427		{
428			title += " " + (this.sortDirection == 1 ? "&darr;" : "&uarr;");
429		}
430		
431		var th = $("<th />
431");
432		th.html(title);
433		th.addClass(column.clazz);
434		
435		this.thead.find("tr").append(th);
436		
437		var this1 = this;
438		th.bind("click", function() {
439			this1.sort(column.field);
440		});
441	};
442
443	TableManager.prototype._redrawRows = function()
444	{
445		this.tbody.empty();
446
447		var list = [];
448		
449		if (this.filterField && this.filterValue)
450		{
451			for (var i in this.list)
452			{
453				var value = this._extractData(this.list[i], this.filterField) + "";
454				if (value && value.indexOf(this.filterValue) >= 0)
455				{
456					list.push(this.list[i]);
457				}
458			}
459		}
460		else
461		{
462			list = this.list;
463		}
464		
465		for (var i in list)
466		{
467			this._addRow(list[i]);
468		}
469	};
470	
471	TableManager.prototype._addRow = function(rowData)
472	{
473		var tr = $("<tr />");
474		
475		for (var i in this.options.columns)
476		{
477			this._appendColumn(tr, this.options.columns[i], rowData);
478		}
479		
480		this.tbody.append(tr);
481		
482		
483		if (this.options.keyField)
484		{
485			tr.attr("data-key", this._extractData(rowData, this.options.keyField));
486		}
487	};
488
489	TableManager.prototype._appendColumn = function(tr, column, rowData)
490	{
491		var td = $("<td />");
492		td.css("width", "300px");
493		
494		var content = "";
495		if (column.fn && typeof(column.fn) == "function")
496		{
497			content = column.fn(rowData);
498		}
499		else
500		{
501			content = this._extractData(rowData, column.field);
502		}
503		
504		td.addClass(column.clazz);
505		td.html(content + "&nbsp;");
506		
507		tr.append(td);
508	};
509
510	TableManager.prototype._extractData = function(object, column)
511	{
512		if (!object || !column)
513		{
514			return "";
515		}
516		
517		var index = column.indexOf(".");
518		if (index < 0)
519		{
520			return object[column];
521		}
522		else
523		{
524			var pre = column.substring(0, index);
525			
526			return this._extractData(object[pre], column.substring(index + 1));
527		}
528		
529	};
530	
531	TableManager.prototype._getData = function(key)
532	{
533		if (this.options.keyField)
534		{
535			for (var i in this.list)
536			{
537				if (key == this._extractData(this.list[i], this.options.keyField))
538				{
539					return this.list[i];
540				}
541			}
542		}
543	}
544		
545	
546	var __tableManagers = [];
547	
548	TableManager.getManager = function(elem)
549	{
550		for (var i in __tableManagers)
551		{
552			if (elem.is(__tableManagers[i].elem))
553			{
554				return __tableManagers[i];
555			}
556		}
557		
558		return TableManager.makeManager(elem);
559	};
560
561	TableManager.makeManager = function(elem)
562	{
563		var manger = new TableManager(elem);
564		__tableManagers.push(manger);
565		
566		return manger;
567	};
568	
569
570	
571	function __fillDataSlot(slot, data)
572	{
573		var dataField = $(slot).attr("data-field") || $(slot).attr("data-value") || $(slot).attr("name") || "";
574		var dataFunction = window[$(slot).attr("data-function")];
575		var value = extractData(data, dataField);
576		//console.log("fillDataSlot", $(slot), dataField, value, data);
577		
578		if (!dataFunction && $(slot).data("function")) {
579			var fnStr = $(slot).data("function");
580			var fn = eval(fnStr);
581			if (fn && typeof(fn) == "function") {
582				dataFunction = fn;
583			}
584		}
585		
586		if ((value === null) || (value === undefined) || (value === ""))
587		{
588			value = "";
589
590			if ($(slot).attr("data-empty"))
591			{
592				value = $(slot).attr("data-empty");
593			}
594		}
595		
596		value = value + "";
597		
598		if (dataFunction)
599		{
600			dataFunction(slot, data, value);
601		}
602		else
603		{
604			if ($(slot).attr('data-postfix'))
605			{
606				value += $(slot).attr('data-postfix');
607			}
608			
609			if (($(slot).attr("type") == "checkbox") || ($(slot).attr("type") == "radio"))
610			{
611				//console.log("dataField", dataField, value, $(slot).attr("value"), (($(slot).attr("data-match") == value) || ($(slot).attr("value") == value)));
612				$(slot).attr("checked", (($(slot).attr("data-match") == value) || ($(slot).attr("value") == value)));
613				/*if (($(slot).attr("data-match") == value) || ($(slot).attr("value") == value))
614				{
615					$(slot).attr("checked", true);
616				}*/
617			}
618			else
619			{
620				var tagName = $(slot).prop("tagName");
621				
622				if ((tagName == "INPUT") || (tagName == "SELECT") || (tagName == "TEXTAREA"))
623				{
624					$(slot).val(value);
625				}
626				else
627				{
628					$(slot).html(value);
629				}
630			}
631		}
632	}
633	
634	
635})(jQuery);
636
637$(document).ready(function() {
638	
639	if ($.datepicker)
640	{
641		$.datepicker.regional['ko'] = {
642			closeText : '닫기',
643			prevText : '이전달',
644			nextText : '다음달',
645			currentText : '오늘',
646			monthNames : ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"],
647			monthNamesShort : ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"],
648			dayNames : [ '일', '월', '화', '수', '목', '금', '토' ],
649			dayNamesShort : [ '일', '월', '화', '수', '목', '금', '토' ],
650			dayNamesMin : [ '일', '월', '화', '수', '목', '금', '토' ],
651			weekHeader : 'Wk',
652			dateFormat : 'yy-mm-dd',
653			showMonthAfterYear: true, 
654			yearSuffix: '년',
655			changeMonth: false,
656			changeYear: false
657		};
658
659		$.datepicker.setDefaults($.datepicker.regional[ "ko" ]);
660	}
661	
662});
663
664
665
666/* 정규식 */
667var REGEX_TIME_HHMM = /([01][0-9]|2[0-3])[\:\s]*([0-6][0-9])$/;
668
669/***** Date *****/
670var MONTH_NAMES = ["JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY",
671                   "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"];
672
673var WEEK_NAMES = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];
674
675Date.prototype.format = function(f) {
676    if (!this.valueOf()) return " ";
677 
678    var weekName = ["SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"];
679    var weekNameShort = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];
680    var weekNameKr = ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"];
681    var d = this;
682     
683    return f.replace(/(yyyy|yy|MM|dd|E|hh|mm|ss|SSS|a\/p)/gi, function($1) {
684        switch ($1) {
685            case "yyyy": return d.getFullYear();
686            case "yy": return (d.getFullYear() % 1000).zf(2);
687            case "MM": return (d.getMonth() + 1).zf(2);
688            case "dd": return d.getDate().zf(2);
689            case "E": return weekNameKr[d.getDay()];
690            case "e": return weekNameShort[d.getDay()];
691            case "HH": return d.getHours().zf(2);
692            case "hh": return ((h = d.getHours() % 12) ? h : 12).zf(2);
693            case "mm": return d.getMinutes().zf(2);
694            case "ss": return d.getSeconds().zf(2);
695            case "SSS": return d.getMilliseconds().zf(3);
696            case "a/p": return d.getHours() < 12 ? "오전" : "오후";
697            default: return $1;
698        }
699    });
700};
701
702function parseDate(s)
703{
704	if (!s) {return null;}
705	if (s.length == 0)
706	{
707		return null;
708	}
709	
710	s= s.replace(/\-/g, "");
711	
712	var years = 0;
713	var months = 0;
714	var days = 0;
715	var hours = 0;
716	var minutes = 0;
717	var seconds = 0;
718	var milliSeconds = 0;
719	
720	if (s.length >= 8)
721	{
722		years = parseInt(s.substring(0, 4));
723		months = parseInt(s.substring(4, 6)) - 1;
724		days = parseInt(s.substring(6, 8));
725	}
726	if (s.length >= 14)
727	{
728		hours = parseInt(s.substring(8, 10));
729		minutes = parseInt(s.substring(10, 12));
730		seconds = parseInt(s.substring(12, 14));
731	}
732	if (s.length == 17)
733	{
734		milliSeconds = parseInt(s.substring(14));
735	}
736	
737	var time = new Date();
738	time.setFullYear(years, months, days);
739	time.setHours(hours, minutes, seconds, milliSeconds);
740	
741	return time;
742}
743
744
745function isNowIncluded(from, to)
746{
747	var now = new Date().getTime();
748	
749	if (from == null)
750	{
751		if (to == null)
752		{
753			return true;
754		}
755		else
756		{
757			to.setHours(23, 59, 59, 999);
758			return (now <= to.getTime());
759		}
760	}
761	else
762	{
763		from.setHours(0, 0, 0, 0);
764		
765		if (to == null)
766		{
767			return (now >= from.getTime());
768		}
769		else
770		{
771			to.setHours(23, 59, 59, 999);
772			return ((now >= from.getTime()) && (now <= to.getTime()));
773		}
774	}
775}
776
777
778/***** String *****/
779String.prototype.string = function(len){var s = '', i = 0; while (i++ < len) { s += this; } return s;};
780String.prototype.zf = function(len){return "0".string(len - this.length) + this;};
781Number.prototype.zf = function(len){return this.toString().zf(len);};
782
783function initExtraProtoType() {
784	if(typeof String.prototype.trim !== 'function') {
785	    String.prototype.trim = function() {
786	        return this.replace(/^\s+|\s+$/g, ''); 
787	    };
788	}
789	
790}
791
792if (!String.prototype.endsWith) {
793	  String.prototype.endsWith = function(searchString, position) {
794	      var subjectString = this.toString();
795	      if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
796	        position = subjectString.length;
797	      }
798	      position -= searchString.length;
799	      var lastIndex = subjectString.indexOf(searchString, position);
800	      return lastIndex !== -1 && lastIndex === position;
801	  };
802	}
803
804
805/***** 우편번호 *****/
806function zip(fnCallback)	// <script src="http://dmaps.daum.net/map_js_init/postcode.v2.js"></script> 추가되어 있어야 함
807{
808	new daum.Postcode({
809        oncomplete: function(data) {
810            var zipcode = data.zonecode;
811            var address = data.address;
812            
813            if (fnCallback)
814            {
815            	fnCallback(zipcode, address);
816            }
817            
818        }
819    }).open();
820	
821}
822
823
824/***** 전화번호 Parser *****/
825function PhoneNumber()
826{
827	this.phoneNumber1 = "";
828	this.phoneNumber2 = "";
829	this.phoneNumber3 = "";
830	
831	this.validPhoneNumber = false;
832}
833
834PhoneNumber.prototype.parse = function(phoneNumber)
835{
836	if (phoneNumber == "")
837	{
838		this.valid = true;
839		return;
840	}
841	
842	var regex = /^\(?([0-9]{3})\)?[-. ]?([0-9]{4})[-. ]?([0-9]{4})$/;	// xxx xxxx xxxx
843	var result = phoneNumber.match(regex);
844
845	if (!result)
846	{
847		regex = /^\(?([02]{2})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/;	// 02 xxx xxxx
848		result = phoneNumber.match(regex);
849	}
850
851	if (!result)
852	{
853		regex = /^\(?([02]{2})\)?[-. ]?([0-9]{4})[-. ]?([0-9]{4})$/;	// 02 xxxx xxxx
854		result = phoneNumber.match(regex);
855	}
856
857	if (!result)
858	{
859		regex = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/;	// xxx xxx xxxx
860		result = phoneNumber.match(regex);
861	}
862
863	if (result)
864	{
865		this.phoneNumber1 = result[1];
866		this.phoneNumber2 = result[2];
867		this.phoneNumber3 = result[3];
868		
869		this.valid = true;
870	}
871	else
872	{
873		this.valid = false;
874	}
875};
876
877/**
878 * 파일 이름의 확장자를 이용해서 주어진 파일 이름을 가진 파일이 사진(그림) 파일인지 여부를 되돌린다.
879 * 
880 * @param fileName 파일 이름
881 * @returns 사진(그림) 파일이면 true, 아니면 false
882 */
883function isImageFile(fileName)
884{
885	return (fileName.toLowerCase().match(/\.(jpg|jpeg|png|gif)$/));
886}
887
888
889/**
890 * 파일 이름의 확장자를 이용해서 주어진 파일 이름을 가진 파일이 동영상 파일인지 여부를 되돌린다.
891 * 
892 * @param fileName 파일 이름
893 * @returns 동영상 파일이면 true, 아니면 false
894 */
895function isMovieFile(fileName)
896{
897	return (fileName.toLowerCase().match(/\.(avi|mp4|mpg|mpeg|mpe|wmv|asf|asx)$/));
898}
899
900
901function setCookie(name, value, expireDay) 
902{
903	var cookies = name + '=' + escape(value) + '; path=/ ';
904
905	if (typeof expireDay != 'undefined')
906	{
907		var expire = new Date();
908		expire.setDate(expire.getDate() + expireDay);
909		cookies += ';expires=' + expire.toGMTString() + ';';
910	}
911		
912	document.cookie = cookies;
913}
914
915function getCookie(name) {
916	name = name + '=';
917	var cookieData = document.cookie;
918
919	var start = cookieData.indexOf(name);
920	var value = '';
921	
922	if (start != -1) 
923	{
924		start += name.length;
925		var end = cookieData.indexOf(';', start);
926		if (end == -1)
927		{
928			end = cookieData.length;
929		}
930		value = cookieData.substring(start, end);
931	}
932	return unescape(value);
933}
934
935
936function removeDuplicatedItem(list)
937{
938	if (list instanceof Array)
939	{
940		var removeCount = 0;
941		for (var i = 0 ; i < list.length ; i++)
942		{
943			for (var j = i + 1 ; j < list.length ; j++)
944			{
945				removeCount = 0;
946				
947				if (list[i] == list[j])
948				{
949					list.splice(j, 1);
950					
951					j--;
952					removeCount++;
953				}
954			}
955			i -= removeCount;
956		}
957	}
958}
959
960
961/**
962 * 임의의 object에 포함되어 이벤트 발생과 수신을 담당할 이벤트 관리자
963 */
964function EventDispatcher()
965{
966	this.listenerMap = {};
967}
968
969/* 이벤트 리스너를 등록한다. */
970EventDispatcher.prototype.addEventListener = function(eventType, fnListener)
971{
972	var listeners = this.listenerMap[eventType];
973	if (listeners === undefined)
974	{
975		listeners = [];
976		this.listenerMap[eventType] = listeners;
977	}
978	
979	listeners.push(fnListener);
980};
981
982/* 이벤트 리스너를 제거한다. */
983EventDispatcher.prototype.removeEventListener = function(eventType, fnListener)
984{
985	var listeners = this.listenerMap[eventType];
986	if (listeners)
987	{
988		for (var i in listeners)
989		{
990			if (listeners[i] === fnListener)
991			{
992				listeners.splice(i, 1);
993				break;
994			}
995		}
996	}
997};
998
999/* 이벤트를 발생시킨다. */
1000EventDispatcher.prototype.dispatchEvent = function(eventType)
1001{
1002	var listeners = this.listenerMap[eventType];
1003
1004	if (listeners)
1005	{
1006		var args = [];
1007		for (var j = 1 ; j < arguments.length ; j++)
1008		{
1009			args.push(arguments[j]);
1010		}
1011		
1012		for (var i in listeners)
1013		{
1014			listeners[i].apply(this, args);
1015		}
1016	}
1017};
1018
1019
1020function zeroFill( number, width )
1021{
1022	width -= number.toString().length;
1023	if (width > 0) {
1024		return new Array(width + (/\./.test(number) ? 2 : 1)).join('0')
1025				+ number;
1026	}
1027	return number + "";
1028}
1029
1030
1031function justifyLabels()
1032{
1033	$(".form_item label").each(function(index, label) {
1034		var $label = $(label);
1035		var labelWidth = $label.width();
1036		labelWidth = 80;
1037		var text = $label.html().trim();
1038		
1039		var div = $("<div>");
1040		div.css("width", " 200px")
1041		div.css("height", "15px");
1042		div.html(text);
1043		
1044		$label.empty();
1045		$label.append(div);
1046		
1047		var fontName = $label.css("font-family");
1048		var wordWidth = getWidthOfText(text, fontName, $label.css("font-size"));
1049
1050		var letterSpacing = ((((labelWidth - 0) - (wordWidth + 0)) /  (text.length - 1))) * 1.0; 
1051		
1052		$label.css("letter-spacing", letterSpacing + "px");
1053	});
1054	
1055	
1056	function getWidthOfText(txt, fontname, fontsize)
1057	{
1058		  // Create dummy span
1059		  var e = document.createElement('span');
1060		  // Set font-size
1061		  e.style.fontSize = fontsize;
1062		  // Set font-face / font-family
1063		  e.style.fontFamily = fontname;
1064		  // Set text
1065		  e.innerHTML = txt;
1066		  document.body.appendChild(e);
1067		  // Get width NOW, since the dummy span is about to be removed from the document
1068		  var w = e.offsetWidth;
1069		  // Cleanup
1070		  document.body.removeChild(e);
1071		  // All right, we're done
1072		  return w;
1073		}
1074}
1075
1076
1077function extractData(object, column)
1078{
1079	//console.log("  extractData", object, column)
1080	if (!object || !column)
1081	{
1082		return "";
1083	}
1084	
1085	var index = column.indexOf(".");
1086	if (index < 0)
1087	{
1088		return object[column];
1089	}
1090	else
1091	{
1092		var pre = column.substring(0, index);
1093		
1094		return extractData(object[pre], column.substring(index + 1));
1095	}
1096	
1097};
1098
1099
1100function nl2Br(str)
1101{
1102	if (!str)
1103	{
1104		return "";
1105	}
1106	
1107	return str.replace(/(?:\r\n|\r|\n)/g, '<br>');
1108}
1109
1110/**
1111 * 주어진 문자열에서 숫자와 소수점, - 을 제외한 모든 문자를 제거한다.
1112 */
1113function removeNonDigit(str)
1114{
1115	if (!str)
1116	{
1117		return "";
1118	}
1119	
1120	return str.replace(/[^\d.-]/g,'');
1121}
1122
1123function round(value, position)
1124{
1125	if (typeof position == "undefined")
1126	{
1127		position = 0;
1128	}
1129	
1130	var pad = Math.pow(10, position);
1131	
1132	return (Math.round((value * pad)) / pad).toFixed(position);
1133}
1134
1135/* query string을 parsing 해서 json 으로 되돌림 */
1136function getUrlParams() {
1137	var params = {};
1138	window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (str, key, value) { params[key] = value; });
1139	return params;
1140};
1141
1142function form2Json(form)
1143{
1144	var array = form.serializeArray();
1145	var result = {};
1146	
1147	var item;
1148	for (var i in array)
1149	{
1150		item = array[i];
1151		
1152		result[item.name] = item.value;
1153	}
1154	
1155	return result;
1156	
1157}
1158
1159function formatNumber(x) 
1160{
1161	return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
1162}
1163
1164function checkCorporateRegiNumber(number){
1165	var numberMap = number.replace(/-/gi, '').split('').map(function (d){
1166		return parseInt(d, 10);
1167	});
1168	
1169	if(numberMap.length == 10){
1170		var keyArr = [1, 3, 7, 1, 3, 7, 1, 3, 5];
1171		var chk = 0;
1172		
1173		keyArr.forEach(function(d, i){
1174			chk += d * numberMap[i];
1175		});
1176		
1177		chk += parseInt((keyArr[8] * numberMap[8])/ 10, 10);
1178		return Math.floor(numberMap[9]) === ( (10 - (chk % 10) ) % 10);
1179	}
1180	
1181	return false;
1182}
1183

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.