diff --git a/common/js/common.js b/common/js/common.js index 159f20c10..22a957822 100644 --- a/common/js/common.js +++ b/common/js/common.js @@ -4,978 +4,110 @@ * @brief 몇가지 유용한 & 기본적으로 자주 사용되는 자바스크립트 함수들 모음 **/ -/* jQuery 참조변수($) 제거 */ -if(jQuery) jQuery.noConflict(); - -(function($) { - /* OS check */ - var UA = navigator.userAgent.toLowerCase(); - $.os = { - Linux: /linux/.test(UA), - Unix: /x11/.test(UA), - Mac: /mac/.test(UA), - Windows: /win/.test(UA) - }; - $.os.name = ($.os.Windows) ? 'Windows' : - ($.os.Linux) ? 'Linux' : - ($.os.Unix) ? 'Unix' : - ($.os.Mac) ? 'Mac' : ''; - - /** - * @brief XE 공용 유틸리티 함수 - * @namespace XE - */ - window.XE = { - loaded_popup_menus : new Array(), - addedDocument : new Array(), - /** - * @brief 특정 name을 가진 체크박스들의 checked 속성 변경 - * @param [itemName='cart',][options={}] - */ - checkboxToggleAll : function() { - var itemName='cart'; - var options = { - wrap : null, - checked : 'toggle', - doClick : false - }; - - switch(arguments.length) { - case 1: - if(typeof(arguments[0]) == "string") { - itemName = arguments[0]; - } else { - $.extend(options, arguments[0] || {}); - } - break; - case 2: - itemName = arguments[0]; - $.extend(options, arguments[1] || {}); - } - - if(options.doClick == true) options.checked = null; - if(typeof(options.wrap) == "string") options.wrap ='#'+options.wrap; - - if(options.wrap) { - var obj = $(options.wrap).find('input[name='+itemName+']:checkbox'); - } else { - var obj = $('input[name='+itemName+']:checkbox'); - } - - if(options.checked == 'toggle') { - obj.each(function() { - $(this).attr('checked', ($(this).attr('checked')) ? false : true); - }); - } else { - (options.doClick == true) ? obj.click() : obj.attr('checked', options.checked); - } - }, - - /** - * @brief 문서/회원 등 팝업 메뉴 출력 - */ - displayPopupMenu : function(ret_obj, response_tags, params) { - var target_srl = params["target_srl"]; - var menu_id = params["menu_id"]; - var menus = ret_obj['menus']; - var html = ""; - - if(this.loaded_popup_menus[menu_id]) { - html = this.loaded_popup_menus[menu_id]; - - } else { - if(menus) { - var item = menus['item']; - if(typeof(item.length)=='undefined' || item.length<1) item = new Array(item); - if(item.length) { - for(var i=0;i'+str+' '; - } - } - } - this.loaded_popup_menus[menu_id] = html; - } - - /* 레이어 출력 */ - if(html) { - var area = $('#popup_menu_area').html(''); - var areaOffset = {top:params['page_y'], left:params['page_x']}; - - if(area.outerHeight()+areaOffset.top > $(window).height()+$(window).scrollTop()) - areaOffset.top = $(window).height() - area.outerHeight() + $(window).scrollTop(); - if(area.outerWidth()+areaOffset.left > $(window).width()+$(window).scrollLeft()) - areaOffset.left = $(window).width() - area.outerWidth() + $(window).scrollLeft(); - - area.css({ top:areaOffset.top, left:areaOffset.left }).show(); - } - } - } - -}) (jQuery); - - - -/* jQuery(document).ready() */ -jQuery(function($) { - /* 팝업메뉴 레이어 생성 */ - if(!$('#popup_menu_area').length) { - var menuObj = $('
') - .attr('id', 'popup_menu_area') - .css({display:'none', zIndex:9999}); - $(document.body).append(menuObj); - } - - $(document).click(function(evt) { - var area = $('#popup_menu_area'); - if(!area.length) return; - - // 이전에 호출되었을지 모르는 팝업메뉴 숨김 - area.hide(); - - var targetObj = $(evt.target); - if(!targetObj.length) return; - - // obj의 nodeName이 div나 span이 아니면 나올대까지 상위를 찾음 - if(targetObj.length && $.inArray(targetObj.attr('nodeName'), ['DIV', 'SPAN', 'A']) == -1) targetObj = targetObj.parent(); - if(!targetObj.length || $.inArray(targetObj.attr('nodeName'), ['DIV', 'SPAN', 'A']) == -1) return; - - // 객체의 className값을 구함 - var class_name = targetObj.attr('className'); - if(class_name.indexOf('_') <= 0) return; - // className을 분리 - var class_name_list = class_name.split(' '); - - var menu_id = ''; - var menu_id_regx = /^([a-zA-Z]+)_([0-9]+)$/; - - - for(var i = 0, c = class_name_list.length; i < c; i++) { - if(menu_id_regx.test(class_name_list[i])) { - menu_id = class_name_list[i]; - } - } - - if(!menu_id) return; - - // module명과 대상 번호가 없으면 return - var tmp_arr = menu_id.split('_'); - var module_name = tmp_arr[0]; - var target_srl = tmp_arr[1]; - if(!module_name || !target_srl || target_srl < 1) return; - - // action이름을 규칙에 맞게 작성 - var action_name = "get" + module_name.substr(0,1).toUpperCase() + module_name.substr(1,module_name.length-1) + "Menu"; - - // 서버에 메뉴를 요청 - var params = new Array(); - params["target_srl"] = target_srl; - params["mid"] = params["cur_mid"] = current_mid; - params["cur_act"] = current_url.getQuery('act'); - params["menu_id"] = menu_id; - params["page_x"] = evt.pageX; - params["page_y"] = evt.pageY; - if(typeof(xeVid)!='undefined') params["vid"] = xeVid; - - var response_tags = new Array("error","message","menus"); - - if(typeof(XE.loaded_popup_menus[menu_id]) != 'undefined') { - XE.displayPopupMenu(params, response_tags, params); - return; - } - show_waiting_message = false; - exec_xml(module_name, action_name, params, XE.displayPopupMenu, response_tags, params); - show_waiting_message = true; - }); - - /* select - option의 disabled=disabled 속성을 IE에서도 체크하기 위한 함수 */ - if($.browser.msie) { - $('select').each(function(i, sels) { - var disabled_exists = false; - var first_enable = new Array(); - - for(var j=0; j < sels.options.length; j++) { - if(sels.options[j].disabled) { - sels.options[j].style.color = '#CCCCCC'; - disabled_exists = true; - }else{ - first_enable[i] = (first_enable[i] > -1) ? first_enable[i] : j; - } - } - - if(!disabled_exists) return; - - sels.oldonchange = sels.onchange; - sels.onchange = function() { - if(this.options[this.selectedIndex].disabled) { - - this.selectedIndex = first_enable[i]; - /* - if(this.options.length<=1) this.selectedIndex = -1; - else if(this.selectedIndex < this.options.length - 1) this.selectedIndex++; - else this.selectedIndex--; - */ - - } else { - if(this.oldonchange) this.oldonchange(); - } - }; - - if(sels.selectedIndex >= 0 && sels.options[ sels.selectedIndex ].disabled) sels.onchange(); - - }); - } - - /* 단락에디터 fold 컴포넌트 펼치기/접기 */ - var drEditorFold = $('.xe_content .fold_button'); - if(drEditorFold.size()) { - var fold_container = $('div.fold_container', drEditorFold); - $('button.more', drEditorFold).click(function() { - $(this).hide().next('button').show().parent().next(fold_container).show(); - }); - $('button.less', drEditorFold).click(function() { - $(this).hide().prev('button').show().parent().next(fold_container).hide(); - }); - } - -}); - - -/** - * @brief location.href에서 특정 key의 값을 return - **/ -String.prototype.getQuery = function(key) { - var idx = this.indexOf('?'); - if(idx == -1) return null; - var query_string = this.substr(idx+1, this.length); - var args = {}; - query_string.replace(/([^=]+)=([^&]*)(&|$)/g, function() { args[arguments[1]] = arguments[2]; }); - - var q = args[key]; - if(typeof(q)=="undefined") q = ""; - - return q; -} - -/** - * @brief location.href에서 특정 key의 값을 return - **/ -String.prototype.setQuery = function(key, val) { - var idx = this.indexOf('?'); - var uri = this; - uri = uri.replace(/#$/,''); - - if(idx != -1) { - uri = this.substr(0, idx); - var query_string = this.substr(idx+1, this.length); - var args = new Array(); - query_string.replace(/([^=]+)=([^&]*)(&|$)/g, function() { args[arguments[1]] = arguments[2]; }); - - args[key] = val; - - var q_list = new Array(); - for(var i in args) { - if( !args.hasOwnProperty(i) ) continue; - var arg = args[i]; - if(!arg.toString().trim()) continue; - arg = decodeURI(arg); - q_list[q_list.length] = i+'='+arg; - } - uri = uri+"?"+q_list.join("&"); - } else { - if(val.toString().trim()) uri = uri+"?"+key+"="+val; - } - - var re = /https:\/\/([^:\/]+)(:\d+|)/i; - var check = re.exec(uri); - if(check) - { - var toReplace = "http://"+check[1]; - if(typeof(http_port)!='undefined' && http_port != 80) - { - toReplace += ":" + http_port; - } - uri = uri.replace(re,toReplace); - } - var bUseSSL = false; - if(typeof(enforce_ssl)!='undefined' && enforce_ssl) - { - bUseSSL = true; - } - else if(typeof(ssl_actions)!='undefined' && typeof(ssl_actions.length)!='undefined' && uri.getQuery('act')) { - var act = uri.getQuery('act'); - for(i=0;i-1 && !url.getQuery('vid')) url = url.setQuery('vid',xeVid); - try { - if(target != "_blank" && winopen_list[target]) { - winopen_list[target].close(); - winopen_list[target] = null; - } - } catch(e) { - } - - if(typeof(target) == 'undefined') target = '_blank'; - if(typeof(attribute) == 'undefined') attribute = ''; - var win = window.open(url, target, attribute); - win.focus(); - if(target != "_blank") winopen_list[target] = win; -} - -/** - * @brief 팝업으로만 띄우기 - * common/tpl/popup_layout.html이 요청되는 XE내의 팝업일 경우에 사용 - **/ -function popopen(url, target) { - if(typeof(target) == "undefined") target = "_blank"; - if(typeof(xeVid)!='undefined' && url.indexOf(request_uri)>-1 && !url.getQuery('vid')) url = url.setQuery('vid',xeVid); - winopen(url, target, "left=10,top=10,width=10,height=10,scrollbars=no,resizable=yes,toolbars=no"); -} - -/** - * @brief 메일 보내기용 - **/ -function sendMailTo(to) { - location.href="mailto:"+to; -} - -/** - * @brief url이동 (open_window 값이 N 가 아니면 새창으로 띄움) - **/ -function move_url(url, open_wnidow) { - if(!url) return false; - if(typeof(open_wnidow) == 'undefined') open_wnidow = 'N'; - if(open_wnidow=='N') { - open_wnidow = false; - } else { - open_wnidow = true; - } - - if(/^\./.test(url)) url = request_uri+url; - - if(open_wnidow) { - winopen(url); - } else { - location.href=url; - } - - return false; -} - -/** - * @brief 멀티미디어 출력용 (IE에서 플래쉬/동영상 주변에 점선 생김 방지용) - **/ -function displayMultimedia(src, width, height, options) { - var html = _displayMultimedia(src, width, height, options); - if(html) document.writeln(html); -} -function _displayMultimedia(src, width, height, options) { - if(src.indexOf('files') == 0) src = request_uri + src; - - var defaults = { - wmode : 'transparent', - allowScriptAccess : 'sameDomain', - quality : 'high', - flashvars : '', - autostart : false - }; - - var params = jQuery.extend(defaults, options || {}); - var autostart = (params.autostart && params.autostart != 'false') ? 'true' : 'false'; - delete(params.autostart); - - var clsid = ""; - var codebase = ""; - var html = ""; - - if(/\.(gif|jpg|jpeg|bmp|png)$/i.test(src)){ - html = ''; - } else if(/\.flv$/i.test(src) || /\.mov$/i.test(src) || /\.moov$/i.test(src) || /\.m4v$/i.test(src)) { - html = ''; - } else if(/\.swf/i.test(src)) { - clsid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; - - if(typeof(enforce_ssl)!='undefined' && enforce_ssl){ codebase = "https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; } - else { codebase = "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; } - html = ''; - html += ''; - for(var name in params) { - if(params[name] != 'undefined' && params[name] != '') { - html += ''; - } - } - html += '' - + '' - + ''; - } else { - if (jQuery.browser.mozilla || jQuery.browser.opera) { - // firefox and opera uses 0 or 1 for autostart parameter. - autostart = (params.autostart && params.autostart != 'false') ? '1' : '0'; - } - - html = ' 400) { - $body.css({ overflow:'auto', overflowX:'hidden', height:400+'px' }); - } - } - - var $win = $(window); - var $pc = $('#popup_content'); - var w = Math.max($pc[0].offsetWidth, 600); - var h = $pc[0].offsetHeight; - var dw = $win.width(); - var dh = $win.height(); - var _w = 0, _h = 0; - - if (w != dw) _w = w - dw; - if (h != dh) _h = h - dh; - - if (_w || _h) { - window.resizeBy(_w, _h); - } - - if (!arguments.callee.executed) { - setTimeout(setFixedPopupSize, 300); - arguments.callee.executed = true; - } -} - -/** - * @brief 추천/비추천,스크랩,신고기능등 특정 srl에 대한 특정 module/action을 호출하는 함수 - **/ -function doCallModuleAction(module, action, target_srl) { - var params = new Array(); - params['target_srl'] = target_srl; - params['cur_mid'] = current_mid; - exec_xml(module, action, params, completeCallModuleAction); -} - -function completeCallModuleAction(ret_obj, response_tags) { - if(ret_obj['message']!='success') alert(ret_obj['message']); - location.reload(); -} - -function completeMessage(ret_obj) { - alert(ret_obj['message']); - location.reload(); -} - - - -/* 언어코드 (lang_type) 쿠키값 변경 */ -function doChangeLangType(obj) { - if(typeof(obj) == "string") { - setLangType(obj); - } else { - var val = obj.options[obj.selectedIndex].value; - setLangType(val); - } - location.reload(); -} -function setLangType(lang_type) { - var expire = new Date(); - expire.setTime(expire.getTime()+ (7000 * 24 * 3600000)); - xSetCookie('lang_type', lang_type, expire, '/'); -} - -/* 미리보기 */ -function doDocumentPreview(obj) { - var fo_obj = obj; - while(fo_obj.nodeName != "FORM") { - fo_obj = fo_obj.parentNode; - } - if(fo_obj.nodeName != "FORM") return; - var editor_sequence = fo_obj.getAttribute('editor_sequence'); - - var content = editorGetContent(editor_sequence); - - var win = window.open("", "previewDocument","toolbars=no,width=700px;height=800px,scrollbars=yes,resizable=yes"); - - var dummy_obj = jQuery("#previewDocument"); - - if(!dummy_obj.length) { - jQuery( - '
'+ - ''+ - ''+ - ''+ - '
' - ).appendTo(document.body); - - dummy_obj = jQuery("#previewDocument")[0]; - } - - if(dummy_obj) { - dummy_obj.content.value = content; - dummy_obj.submit(); - } -} - -/* 게시글 저장 */ -function doDocumentSave(obj) { - var editor_sequence = obj.form.getAttribute('editor_sequence'); - var prev_content = editorRelKeys[editor_sequence]['content'].value; - if(typeof(editor_sequence)!='undefined' && editor_sequence && typeof(editorRelKeys)!='undefined' && typeof(editorGetContent)=='function') { - var content = editorGetContent(editor_sequence); - editorRelKeys[editor_sequence]['content'].value = content; - } - - var params={}, responses=['error','message','document_srl'], elms=obj.form.elements, data=jQuery(obj.form).serializeArray();; - jQuery.each(data, function(i, field){ - var val = jQuery.trim(field.value); - if(!val) return true; - if(/\[\]$/.test(field.name)) field.name = field.name.replace(/\[\]$/, ''); - if(params[field.name]) params[field.name] += '|@|'+val; - else params[field.name] = field.value; - }); - - exec_xml('member','procMemberSaveDocument', params, completeDocumentSave, responses, params, obj.form); - - editorRelKeys[editor_sequence]['content'].value = prev_content; - return false; -} - -function completeDocumentSave(ret_obj) { - jQuery('input[name=document_srl]').eq(0).val(ret_obj['document_srl']); - alert(ret_obj['message']); -} - -/* 저장된 게시글 불러오기 */ -var objForSavedDoc = null; -function doDocumentLoad(obj) { - // 저장된 게시글 목록 불러오기 - objForSavedDoc = obj.form; - popopen(request_uri.setQuery('module','member').setQuery('act','dispSavedDocumentList')); -} - -/* 저장된 게시글의 선택 */ -function doDocumentSelect(document_srl) { - if(!opener || !opener.objForSavedDoc) { - window.close(); - return; - } - - // 게시글을 가져와서 등록하기 - opener.location.href = opener.current_url.setQuery('document_srl', document_srl).setQuery('act', 'dispBoardWrite'); - window.close(); -} - - -/* 스킨 정보 */ -function viewSkinInfo(module, skin) { - popopen("./?module=module&act=dispModuleSkinInfo&selected_module="+module+"&skin="+skin, 'SkinInfo'); -} - - -/* 관리자가 문서를 관리하기 위해서 선택시 세션에 넣음 */ -var addedDocument = new Array(); -function doAddDocumentCart(obj) { - var srl = obj.value; - addedDocument[addedDocument.length] = srl; - setTimeout(function() { callAddDocumentCart(addedDocument.length); }, 100); -} - -function callAddDocumentCart(document_length) { - if(addedDocument.length<1 || document_length != addedDocument.length) return; - var params = new Array(); - params["srls"] = addedDocument.join(","); - exec_xml("document","procDocumentAddCart", params, null); - addedDocument = new Array(); -} - -/* ff의 rgb(a,b,c)를 #... 로 변경 */ -function transRGB2Hex(value) { - if(!value) return value; - if(value.indexOf('#') > -1) return value.replace(/^#/, ''); - - if(value.toLowerCase().indexOf('rgb') < 0) return value; - value = value.replace(/^rgb\(/i, '').replace(/\)$/, ''); - value_list = value.split(','); - - var hex = ''; - for(var i = 0; i < value_list.length; i++) { - var color = parseInt(value_list[i], 10).toString(16); - if(color.length == 1) color = '0'+color; - hex += color; - } - return hex; -} - -/* 보안 로그인 모드로 전환 */ -function toggleSecuritySignIn() { - var href = location.href; - if(/https:\/\//i.test(href)) location.href = href.replace(/^https/i,'http'); - else location.href = href.replace(/^http/i,'https'); -} - -function reloadDocument() { - location.reload(); -} - - -/** -* -* Base64 encode / decode -* http://www.webtoolkit.info/ -* -**/ - -var Base64 = { - - // private property - _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", - - // public method for encoding - encode : function (input) { - var output = ""; - var chr1, chr2, chr3, enc1, enc2, enc3, enc4; - var i = 0; - - input = Base64._utf8_encode(input); - - while (i < input.length) { - - chr1 = input.charCodeAt(i++); - chr2 = input.charCodeAt(i++); - chr3 = input.charCodeAt(i++); - - enc1 = chr1 >> 2; - enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); - enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); - enc4 = chr3 & 63; - - if (isNaN(chr2)) { - enc3 = enc4 = 64; - } else if (isNaN(chr3)) { - enc4 = 64; - } - - output = output + - this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + - this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); - - } - - return output; - }, - - // public method for decoding - decode : function (input) { - var output = ""; - var chr1, chr2, chr3; - var enc1, enc2, enc3, enc4; - var i = 0; - - input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); - - while (i < input.length) { - - enc1 = this._keyStr.indexOf(input.charAt(i++)); - enc2 = this._keyStr.indexOf(input.charAt(i++)); - enc3 = this._keyStr.indexOf(input.charAt(i++)); - enc4 = this._keyStr.indexOf(input.charAt(i++)); - - chr1 = (enc1 << 2) | (enc2 >> 4); - chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); - chr3 = ((enc3 & 3) << 6) | enc4; - - output = output + String.fromCharCode(chr1); - - if (enc3 != 64) { - output = output + String.fromCharCode(chr2); - } - if (enc4 != 64) { - output = output + String.fromCharCode(chr3); - } - - } - - output = Base64._utf8_decode(output); - - return output; - - }, - - // private method for UTF-8 encoding - _utf8_encode : function (string) { - string = string.replace(/\r\n/g,"\n"); - var utftext = ""; - - for (var n = 0; n < string.length; n++) { - - var c = string.charCodeAt(n); - - if (c < 128) { - utftext += String.fromCharCode(c); - } - else if((c > 127) && (c < 2048)) { - utftext += String.fromCharCode((c >> 6) | 192); - utftext += String.fromCharCode((c & 63) | 128); - } - else { - utftext += String.fromCharCode((c >> 12) | 224); - utftext += String.fromCharCode(((c >> 6) & 63) | 128); - utftext += String.fromCharCode((c & 63) | 128); - } - - } - - return utftext; - }, - - // private method for UTF-8 decoding - _utf8_decode : function (utftext) { - var string = ""; - var i = 0; - var c = c1 = c2 = 0; - - while ( i < utftext.length ) { - - c = utftext.charCodeAt(i); - - if (c < 128) { - string += String.fromCharCode(c); - i++; - } - else if((c > 191) && (c < 224)) { - c2 = utftext.charCodeAt(i+1); - string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); - i += 2; - } - else { - c2 = utftext.charCodeAt(i+1); - c3 = utftext.charCodeAt(i+2); - string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); - i += 3; - } - - } - - return string; - } - -} - - - - - - -/* ---------------------------------------------- - * DEPRECATED - * 하위호환용으로 남겨 놓음 - * ------------------------------------------- */ - -if(typeof(resizeImageContents) == 'undefined') { - function resizeImageContents() {} -} - -if(typeof(activateOptionDisabled) == 'undefined') { - function activateOptionDisabled() {} -} - -objectExtend = jQuery.extend; - -/** - * @brief 특정 Element의 display 옵션 토글 - **/ -function toggleDisplay(objId) { - jQuery('#'+objId).toggle(); -} - -/* 체크박스 선택 */ -function checkboxSelectAll(formObj, name, checked) { - var itemName = name; - var option = {}; - if(typeof(formObj) != "undefined") option.wrap = formObj; - if(typeof(checked) != "undefined") option.checked = checked; - - XE.checkboxToggleAll(itemName, option); -} - -/* 체크박스를 실행 */ -function clickCheckBoxAll(formObj, name) { - var itemName = name; - var option = { doClick:true }; - if(typeof(formObj) != "undefined") option.wrap = formObj; - - XE.checkboxToggleAll(itemName, option); -} - -/** - * @brief 에디터에서 사용하되 내용 여닫는 코드 (zb5beta beta 호환용으로 남겨 놓음) - **/ -function svc_folder_open(id) { - jQuery("#_folder_open_"+id).hide(); - jQuery("#_folder_close_"+id).show(); - jQuery("#_folder_"+id).show(); -} -function svc_folder_close(id) { - jQuery("#_folder_open_"+id).show(); - jQuery("#_folder_close_"+id).hide(); - jQuery("#_folder_"+id).hide(); -} - -/** - * @brief 날짜 선택 (달력 열기) - **/ -function open_calendar(fo_id, day_str, callback_func) { - if(typeof(day_str)=="undefined") day_str = ""; - - var url = "./common/tpl/calendar.php?"; - if(fo_id) url+="fo_id="+fo_id; - if(day_str) url+="&day_str="+day_str; - if(callback_func) url+="&callback_func="+callback_func; - - popopen(url, 'Calendar'); -} - -var loaded_popup_menus = XE.loaded_popup_menus; -function createPopupMenu() {} -function chkPopupMenu() {} -function displayPopupMenu(ret_obj, response_tags, params) { - XE.displayPopupMenu(ret_obj, response_tags, params); -} - -function GetObjLeft(obj) { - return jQuery(obj).offset().left; -} -function GetObjTop(obj) { - return jQuery(obj).offset().top; -} - -function replaceOuterHTML(obj, html) { - jQuery(obj).replaceWith(html); -} - -function getOuterHTML(obj) { - return jQuery(obj).html().trim(); -} - -jQuery(function(){ - jQuery(".lang_code").each( - function() - { - var objText = jQuery(this); - var targetName = objText.attr("id"); - if(typeof(targetName) == "undefined") targetName = objText.attr("name"); - if(typeof(targetName) == "undefined") return; - objText.after("find_langcode"); - } - ); -}); +if(jQuery)jQuery.noConflict();(function($){var UA=navigator.userAgent.toLowerCase();$.os={Linux:/linux/.test(UA),Unix:/x11/.test(UA),Mac:/mac/.test(UA),Windows:/win/.test(UA)};$.os.name=($.os.Windows)?'Windows':($.os.Linux)?'Linux':($.os.Unix)?'Unix':($.os.Mac)?'Mac':'';window.XE={loaded_popup_menus:new Array(),addedDocument:new Array(),checkboxToggleAll:function(){var itemName='cart';var options={wrap:null,checked:'toggle',doClick:false};switch(arguments.length){case 1:if(typeof(arguments[0])=="string"){itemName=arguments[0];}else{$.extend(options,arguments[0]||{});} +break;case 2:itemName=arguments[0];$.extend(options,arguments[1]||{});} +if(options.doClick==true)options.checked=null;if(typeof(options.wrap)=="string")options.wrap='#'+options.wrap;if(options.wrap){var obj=$(options.wrap).find('input[name='+itemName+']:checkbox');}else{var obj=$('input[name='+itemName+']:checkbox');} +if(options.checked=='toggle'){obj.each(function(){$(this).attr('checked',($(this).attr('checked'))?false:true);});}else{(options.doClick==true)?obj.click():obj.attr('checked',options.checked);}},displayPopupMenu:function(ret_obj,response_tags,params){var target_srl=params["target_srl"];var menu_id=params["menu_id"];var menus=ret_obj['menus'];var html="";if(this.loaded_popup_menus[menu_id]){html=this.loaded_popup_menus[menu_id];}else{if(menus){var item=menus['item'];if(typeof(item.length)=='undefined'||item.length<1)item=new Array(item);if(item.length){for(var i=0;i'+str+' ';}}} +this.loaded_popup_menus[menu_id]=html;} +if(html){var area=$('#popup_menu_area').html('
    '+html+'
');var areaOffset={top:params['page_y'],left:params['page_x']};if(area.outerHeight()+areaOffset.top>$(window).height()+$(window).scrollTop()) +areaOffset.top=$(window).height()-area.outerHeight()+$(window).scrollTop();if(area.outerWidth()+areaOffset.left>$(window).width()+$(window).scrollLeft()) +areaOffset.left=$(window).width()-area.outerWidth()+$(window).scrollLeft();area.css({top:areaOffset.top,left:areaOffset.left}).show();}}}})(jQuery);jQuery(function($){if(!$('#popup_menu_area').length){var menuObj=$('
').attr('id','popup_menu_area').css({display:'none',zIndex:9999});$(document.body).append(menuObj);} +$(document).click(function(evt){var area=$('#popup_menu_area');if(!area.length)return;area.hide();var targetObj=$(evt.target);if(!targetObj.length)return;if(targetObj.length&&$.inArray(targetObj.attr('nodeName'),['DIV','SPAN','A'])==-1)targetObj=targetObj.parent();if(!targetObj.length||$.inArray(targetObj.attr('nodeName'),['DIV','SPAN','A'])==-1)return;var class_name=targetObj.attr('className');if(class_name.indexOf('_')<=0)return;var class_name_list=class_name.split(' ');var menu_id='';var menu_id_regx=/^([a-zA-Z]+)_([0-9]+)$/;for(var i=0,c=class_name_list.length;i-1)?first_enable[i]:j;}} +if(!disabled_exists)return;sels.oldonchange=sels.onchange;sels.onchange=function(){if(this.options[this.selectedIndex].disabled){this.selectedIndex=first_enable[i];}else{if(this.oldonchange)this.oldonchange();}};if(sels.selectedIndex>=0&&sels.options[sels.selectedIndex].disabled)sels.onchange();});} +var drEditorFold=$('.xe_content .fold_button');if(drEditorFold.size()){var fold_container=$('div.fold_container',drEditorFold);$('button.more',drEditorFold).click(function(){$(this).hide().next('button').show().parent().next(fold_container).show();});$('button.less',drEditorFold).click(function(){$(this).hide().prev('button').show().parent().next(fold_container).hide();});}});String.prototype.getQuery=function(key){var idx=this.indexOf('?');if(idx==-1)return null;var query_string=this.substr(idx+1,this.length);var args={};query_string.replace(/([^=]+)=([^&]*)(&|$)/g,function(){args[arguments[1]]=arguments[2];});var q=args[key];if(typeof(q)=="undefined")q="";return q;} +String.prototype.setQuery=function(key,val){var idx=this.indexOf('?');var uri=this;uri=uri.replace(/#$/,'');if(idx!=-1){uri=this.substr(0,idx);var query_string=this.substr(idx+1,this.length);var args=new Array();query_string.replace(/([^=]+)=([^&]*)(&|$)/g,function(){args[arguments[1]]=arguments[2];});args[key]=val;var q_list=new Array();for(var i in args){if(!args.hasOwnProperty(i))continue;var arg=args[i];if(!arg.toString().trim())continue;arg=decodeURI(arg);q_list[q_list.length]=i+'='+arg;} +uri=uri+"?"+q_list.join("&");}else{if(val.toString().trim())uri=uri+"?"+key+"="+val;} +var re=/https:\/\/([^:\/]+)(:\d+|)/i;var check=re.exec(uri);if(check) +{var toReplace="http://"+check[1];if(typeof(http_port)!='undefined'&&http_port!=80) +{toReplace+=":"+http_port;} +uri=uri.replace(re,toReplace);} +var bUseSSL=false;if(typeof(enforce_ssl)!='undefined'&&enforce_ssl) +{bUseSSL=true;} +else if(typeof(ssl_actions)!='undefined'&&typeof(ssl_actions.length)!='undefined'&&uri.getQuery('act')){var act=uri.getQuery('act');for(i=0;i-1&&!url.getQuery('vid'))url=url.setQuery('vid',xeVid);try{if(target!="_blank"&&winopen_list[target]){winopen_list[target].close();winopen_list[target]=null;}}catch(e){} +if(typeof(target)=='undefined')target='_blank';if(typeof(attribute)=='undefined')attribute='';var win=window.open(url,target,attribute);win.focus();if(target!="_blank")winopen_list[target]=win;} +function popopen(url,target){if(typeof(target)=="undefined")target="_blank";if(typeof(xeVid)!='undefined'&&url.indexOf(request_uri)>-1&&!url.getQuery('vid'))url=url.setQuery('vid',xeVid);winopen(url,target,"left=10,top=10,width=10,height=10,scrollbars=no,resizable=yes,toolbars=no");} +function sendMailTo(to){location.href="mailto:"+to;} +function move_url(url,open_wnidow){if(!url)return false;if(typeof(open_wnidow)=='undefined')open_wnidow='N';if(open_wnidow=='N'){open_wnidow=false;}else{open_wnidow=true;} +if(/^\./.test(url))url=request_uri+url;if(open_wnidow){winopen(url);}else{location.href=url;} +return false;} +function displayMultimedia(src,width,height,options){var html=_displayMultimedia(src,width,height,options);if(html)document.writeln(html);} +function _displayMultimedia(src,width,height,options){if(src.indexOf('files')==0)src=request_uri+src;var defaults={wmode:'transparent',allowScriptAccess:'sameDomain',quality:'high',flashvars:'',autostart:false};var params=jQuery.extend(defaults,options||{});var autostart=(params.autostart&¶ms.autostart!='false')?'true':'false';delete(params.autostart);var clsid="";var codebase="";var html="";if(/\.(gif|jpg|jpeg|bmp|png)$/i.test(src)){html='';}else if(/\.flv$/i.test(src)||/\.mov$/i.test(src)||/\.moov$/i.test(src)||/\.m4v$/i.test(src)){html='';}else if(/\.swf/i.test(src)){clsid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';if(typeof(enforce_ssl)!='undefined'&&enforce_ssl){codebase="https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0";} +else{codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0";} +html='';html+='';for(var name in params){if(params[name]!='undefined'&¶ms[name]!=''){html+='';}} +html+='' ++'' ++'';}else{if(jQuery.browser.mozilla||jQuery.browser.opera){autostart=(params.autostart&¶ms.autostart!='false')?'1':'0';} +html='400){$body.css({overflow:'auto',overflowX:'hidden',height:400+'px'});}} +var $win=$(window);var $pc=$('#popup_content');var w=Math.max($pc[0].offsetWidth,600);var h=$pc[0].offsetHeight;var dw=$win.width();var dh=$win.height();var _w=0,_h=0;if(w!=dw)_w=w-dw;if(h!=dh)_h=h-dh;if(_w||_h){window.resizeBy(_w,_h);} +if(!arguments.callee.executed){setTimeout(setFixedPopupSize,300);arguments.callee.executed=true;}} +function doCallModuleAction(module,action,target_srl){var params=new Array();params['target_srl']=target_srl;params['cur_mid']=current_mid;exec_xml(module,action,params,completeCallModuleAction);} +function completeCallModuleAction(ret_obj,response_tags){if(ret_obj['message']!='success')alert(ret_obj['message']);location.reload();} +function completeMessage(ret_obj){alert(ret_obj['message']);location.reload();} +function doChangeLangType(obj){if(typeof(obj)=="string"){setLangType(obj);}else{var val=obj.options[obj.selectedIndex].value;setLangType(val);} +location.reload();} +function setLangType(lang_type){var expire=new Date();expire.setTime(expire.getTime()+(7000*24*3600000));xSetCookie('lang_type',lang_type,expire,'/');} +function doDocumentPreview(obj){var fo_obj=obj;while(fo_obj.nodeName!="FORM"){fo_obj=fo_obj.parentNode;} +if(fo_obj.nodeName!="FORM")return;var editor_sequence=fo_obj.getAttribute('editor_sequence');var content=editorGetContent(editor_sequence);var win=window.open("","previewDocument","toolbars=no,width=700px;height=800px,scrollbars=yes,resizable=yes");var dummy_obj=jQuery("#previewDocument");if(!dummy_obj.length){jQuery('
'+''+''+''+'
').appendTo(document.body);dummy_obj=jQuery("#previewDocument")[0];} +if(dummy_obj){dummy_obj.content.value=content;dummy_obj.submit();}} +function doDocumentSave(obj){var editor_sequence=obj.form.getAttribute('editor_sequence');var prev_content=editorRelKeys[editor_sequence]['content'].value;if(typeof(editor_sequence)!='undefined'&&editor_sequence&&typeof(editorRelKeys)!='undefined'&&typeof(editorGetContent)=='function'){var content=editorGetContent(editor_sequence);editorRelKeys[editor_sequence]['content'].value=content;} +var params={},responses=['error','message','document_srl'],elms=obj.form.elements,data=jQuery(obj.form).serializeArray();;jQuery.each(data,function(i,field){var val=jQuery.trim(field.value);if(!val)return true;if(/\[\]$/.test(field.name))field.name=field.name.replace(/\[\]$/,'');if(params[field.name])params[field.name]+='|@|'+val;else params[field.name]=field.value;});exec_xml('member','procMemberSaveDocument',params,completeDocumentSave,responses,params,obj.form);editorRelKeys[editor_sequence]['content'].value=prev_content;return false;} +function completeDocumentSave(ret_obj){jQuery('input[name=document_srl]').eq(0).val(ret_obj['document_srl']);alert(ret_obj['message']);} +var objForSavedDoc=null;function doDocumentLoad(obj){objForSavedDoc=obj.form;popopen(request_uri.setQuery('module','member').setQuery('act','dispSavedDocumentList'));} +function doDocumentSelect(document_srl){if(!opener||!opener.objForSavedDoc){window.close();return;} +opener.location.href=opener.current_url.setQuery('document_srl',document_srl).setQuery('act','dispBoardWrite');window.close();} +function viewSkinInfo(module,skin){popopen("./?module=module&act=dispModuleSkinInfo&selected_module="+module+"&skin="+skin,'SkinInfo');} +var addedDocument=new Array();function doAddDocumentCart(obj){var srl=obj.value;addedDocument[addedDocument.length]=srl;setTimeout(function(){callAddDocumentCart(addedDocument.length);},100);} +function callAddDocumentCart(document_length){if(addedDocument.length<1||document_length!=addedDocument.length)return;var params=new Array();params["srls"]=addedDocument.join(",");exec_xml("document","procDocumentAddCart",params,null);addedDocument=new Array();} +function transRGB2Hex(value){if(!value)return value;if(value.indexOf('#')>-1)return value.replace(/^#/,'');if(value.toLowerCase().indexOf('rgb')<0)return value;value=value.replace(/^rgb\(/i,'').replace(/\)$/,'');value_list=value.split(',');var hex='';for(var i=0;i>2;enc2=((chr1&3)<<4)|(chr2>>4);enc3=((chr2&15)<<2)|(chr3>>6);enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64;}else if(isNaN(chr3)){enc4=64;} +output=output+ +this._keyStr.charAt(enc1)+this._keyStr.charAt(enc2)+ +this._keyStr.charAt(enc3)+this._keyStr.charAt(enc4);} +return output;},decode:function(input){var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(i>4);chr2=((enc2&15)<<4)|(enc3>>2);chr3=((enc3&3)<<6)|enc4;output=output+String.fromCharCode(chr1);if(enc3!=64){output=output+String.fromCharCode(chr2);} +if(enc4!=64){output=output+String.fromCharCode(chr3);}} +output=Base64._utf8_decode(output);return output;},_utf8_encode:function(string){string=string.replace(/\r\n/g,"\n");var utftext="";for(var n=0;n127)&&(c<2048)){utftext+=String.fromCharCode((c>>6)|192);utftext+=String.fromCharCode((c&63)|128);} +else{utftext+=String.fromCharCode((c>>12)|224);utftext+=String.fromCharCode(((c>>6)&63)|128);utftext+=String.fromCharCode((c&63)|128);}} +return utftext;},_utf8_decode:function(utftext){var string="";var i=0;var c=c1=c2=0;while(i191)&&(c<224)){c2=utftext.charCodeAt(i+1);string+=String.fromCharCode(((c&31)<<6)|(c2&63));i+=2;} +else{c2=utftext.charCodeAt(i+1);c3=utftext.charCodeAt(i+2);string+=String.fromCharCode(((c&15)<<12)|((c2&63)<<6)|(c3&63));i+=3;}} +return string;}} +if(typeof(resizeImageContents)=='undefined'){function resizeImageContents(){}} +if(typeof(activateOptionDisabled)=='undefined'){function activateOptionDisabled(){}} +objectExtend=jQuery.extend;function toggleDisplay(objId){jQuery('#'+objId).toggle();} +function checkboxSelectAll(formObj,name,checked){var itemName=name;var option={};if(typeof(formObj)!="undefined")option.wrap=formObj;if(typeof(checked)!="undefined")option.checked=checked;XE.checkboxToggleAll(itemName,option);} +function clickCheckBoxAll(formObj,name){var itemName=name;var option={doClick:true};if(typeof(formObj)!="undefined")option.wrap=formObj;XE.checkboxToggleAll(itemName,option);} +function svc_folder_open(id){jQuery("#_folder_open_"+id).hide();jQuery("#_folder_close_"+id).show();jQuery("#_folder_"+id).show();} +function svc_folder_close(id){jQuery("#_folder_open_"+id).show();jQuery("#_folder_close_"+id).hide();jQuery("#_folder_"+id).hide();} +function open_calendar(fo_id,day_str,callback_func){if(typeof(day_str)=="undefined")day_str="";var url="./common/tpl/calendar.php?";if(fo_id)url+="fo_id="+fo_id;if(day_str)url+="&day_str="+day_str;if(callback_func)url+="&callback_func="+callback_func;popopen(url,'Calendar');} +var loaded_popup_menus=XE.loaded_popup_menus;function createPopupMenu(){} +function chkPopupMenu(){} +function displayPopupMenu(ret_obj,response_tags,params){XE.displayPopupMenu(ret_obj,response_tags,params);} +function GetObjLeft(obj){return jQuery(obj).offset().left;} +function GetObjTop(obj){return jQuery(obj).offset().top;} +function replaceOuterHTML(obj,html){jQuery(obj).replaceWith(html);} +function getOuterHTML(obj){return jQuery(obj).html().trim();} +jQuery(function(){jQuery(".lang_code").each(function() +{var objText=jQuery(this);var targetName=objText.attr("id");if(typeof(targetName)=="undefined")targetName=objText.attr("name");if(typeof(targetName)=="undefined")return;objText.after("find_langcode");});}); \ No newline at end of file diff --git a/common/js/iepngfix_tilebg.js b/common/js/iepngfix_tilebg.js index 1a5863011..72ba3f3e2 100644 --- a/common/js/iepngfix_tilebg.js +++ b/common/js/iepngfix_tilebg.js @@ -3,171 +3,20 @@ // This is licensed under the GNU LGPL, version 2.1 or later. // For details, see: http://creativecommons.org/licenses/LGPL/2.1/ - -var IEPNGFix = window.IEPNGFix || {}; - -IEPNGFix.tileBG = function(elm, pngSrc, ready) { - // Params: A reference to a DOM element, the PNG src file pathname, and a - // hidden "ready-to-run" passed when called back after image preloading. - - var data = this.data[elm.uniqueID], - elmW = Math.max(elm.clientWidth, elm.scrollWidth), - elmH = Math.max(elm.clientHeight, elm.scrollHeight), - bgX = elm.currentStyle.backgroundPositionX, - bgY = elm.currentStyle.backgroundPositionY, - bgR = elm.currentStyle.backgroundRepeat; - - // Cache of DIVs created per element, and image preloader/data. - if (!data.tiles) { - data.tiles = { - elm: elm, - src: '', - cache: [], - img: new Image(), - old: {} - }; - } - var tiles = data.tiles, - pngW = tiles.img.width, - pngH = tiles.img.height; - - if (pngSrc) { - if (!ready && pngSrc != tiles.src) { - // New image? Preload it with a callback to detect dimensions. - tiles.img.onload = function() { - this.onload = null; - IEPNGFix.tileBG(elm, pngSrc, 1); - }; - return tiles.img.src = pngSrc; - } - } else { - // No image? - if (tiles.src) ready = 1; - pngW = pngH = 0; - } - tiles.src = pngSrc; - - if (!ready && elmW == tiles.old.w && elmH == tiles.old.h && - bgX == tiles.old.x && bgY == tiles.old.y && bgR == tiles.old.r) { - return; - } - - // Convert English and percentage positions to pixels. - var pos = { - top: '0%', - left: '0%', - center: '50%', - bottom: '100%', - right: '100%' - }, - x, - y, - pc; - x = pos[bgX] || bgX; - y = pos[bgY] || bgY; - if (pc = x.match(/(\d+)%/)) { - x = Math.round((elmW - pngW) * (parseInt(pc[1]) / 100)); - } - if (pc = y.match(/(\d+)%/)) { - y = Math.round((elmH - pngH) * (parseInt(pc[1]) / 100)); - } - x = parseInt(x); - y = parseInt(y); - - // Handle backgroundRepeat. - var repeatX = { 'repeat': 1, 'repeat-x': 1 }[bgR], - repeatY = { 'repeat': 1, 'repeat-y': 1 }[bgR]; - if (repeatX) { - x %= pngW; - if (x > 0) x -= pngW; - } - if (repeatY) { - y %= pngH; - if (y > 0) y -= pngH; - } - - // Go! - this.hook.enabled = 0; - if (!({ relative: 1, absolute: 1 }[elm.currentStyle.position])) { - elm.style.position = 'relative'; - } - var count = 0, - xPos, - maxX = repeatX ? elmW : x + 0.1, - yPos, - maxY = repeatY ? elmH : y + 0.1, - d, - s, - isNew; - if (pngW && pngH) { - for (xPos = x; xPos < maxX; xPos += pngW) { - for (yPos = y; yPos < maxY; yPos += pngH) { - isNew = 0; - if (!tiles.cache[count]) { - tiles.cache[count] = document.createElement('div'); - isNew = 1; - } - var clipR = (xPos + pngW > elmW ? elmW - xPos : pngW), - clipB = (yPos + pngH > elmH ? elmH - yPos : pngH); - d = tiles.cache[count]; - s = d.style; - s.behavior = 'none'; - s.left = xPos + 'px'; - s.top = yPos + 'px'; - s.width = clipR + 'px'; - s.height = clipB + 'px'; - s.clip = 'rect(' + - (yPos < 0 ? 0 - yPos : 0) + 'px,' + - clipR + 'px,' + - clipB + 'px,' + - (xPos < 0 ? 0 - xPos : 0) + 'px)'; - s.display = 'block'; - if (isNew) { - s.position = 'absolute'; - s.zIndex = -999; - if (elm.firstChild) { - elm.insertBefore(d, elm.firstChild); - } else { - elm.appendChild(d); - } - } - this.fix(d, pngSrc, 0); - count++; - } - } - } - while (count < tiles.cache.length) { - this.fix(tiles.cache[count], '', 0); - tiles.cache[count++].style.display = 'none'; - } - - this.hook.enabled = 1; - - // Cache so updates are infrequent. - tiles.old = { - w: elmW, - h: elmH, - x: bgX, - y: bgY, - r: bgR - }; -}; - - -IEPNGFix.update = function() { - // Update all PNG backgrounds. - for (var i in IEPNGFix.data) { - var t = IEPNGFix.data[i].tiles; - if (t && t.elm && t.src) { - IEPNGFix.tileBG(t.elm, t.src); - } - } -}; -IEPNGFix.update.timer = 0; - -if (window.attachEvent && !window.opera) { - window.attachEvent('onresize', function() { - clearTimeout(IEPNGFix.update.timer); - IEPNGFix.update.timer = setTimeout(IEPNGFix.update, 100); - }); -} +var IEPNGFix=window.IEPNGFix||{};IEPNGFix.tileBG=function(elm,pngSrc,ready){var data=this.data[elm.uniqueID],elmW=Math.max(elm.clientWidth,elm.scrollWidth),elmH=Math.max(elm.clientHeight,elm.scrollHeight),bgX=elm.currentStyle.backgroundPositionX,bgY=elm.currentStyle.backgroundPositionY,bgR=elm.currentStyle.backgroundRepeat;if(!data.tiles){data.tiles={elm:elm,src:'',cache:[],img:new Image(),old:{}};} +var tiles=data.tiles,pngW=tiles.img.width,pngH=tiles.img.height;if(pngSrc){if(!ready&&pngSrc!=tiles.src){tiles.img.onload=function(){this.onload=null;IEPNGFix.tileBG(elm,pngSrc,1);};return tiles.img.src=pngSrc;}}else{if(tiles.src)ready=1;pngW=pngH=0;} +tiles.src=pngSrc;if(!ready&&elmW==tiles.old.w&&elmH==tiles.old.h&&bgX==tiles.old.x&&bgY==tiles.old.y&&bgR==tiles.old.r){return;} +var pos={top:'0%',left:'0%',center:'50%',bottom:'100%',right:'100%'},x,y,pc;x=pos[bgX]||bgX;y=pos[bgY]||bgY;if(pc=x.match(/(\d+)%/)){x=Math.round((elmW-pngW)*(parseInt(pc[1])/100));} +if(pc=y.match(/(\d+)%/)){y=Math.round((elmH-pngH)*(parseInt(pc[1])/100));} +x=parseInt(x);y=parseInt(y);var repeatX={'repeat':1,'repeat-x':1}[bgR],repeatY={'repeat':1,'repeat-y':1}[bgR];if(repeatX){x%=pngW;if(x>0)x-=pngW;} +if(repeatY){y%=pngH;if(y>0)y-=pngH;} +this.hook.enabled=0;if(!({relative:1,absolute:1}[elm.currentStyle.position])){elm.style.position='relative';} +var count=0,xPos,maxX=repeatX?elmW:x+0.1,yPos,maxY=repeatY?elmH:y+0.1,d,s,isNew;if(pngW&&pngH){for(xPos=x;xPoselmW?elmW-xPos:pngW),clipB=(yPos+pngH>elmH?elmH-yPos:pngH);d=tiles.cache[count];s=d.style;s.behavior='none';s.left=xPos+'px';s.top=yPos+'px';s.width=clipR+'px';s.height=clipB+'px';s.clip='rect('+ +(yPos<0?0-yPos:0)+'px,'+ +clipR+'px,'+ +clipB+'px,'+ +(xPos<0?0-xPos:0)+'px)';s.display='block';if(isNew){s.position='absolute';s.zIndex=-999;if(elm.firstChild){elm.insertBefore(d,elm.firstChild);}else{elm.appendChild(d);}} +this.fix(d,pngSrc,0);count++;}}} +while(count= 0) _apps.splice(nIndex, 1); - - if ($.isArray(_apps[sName])) { - nIndex = $.inArray(oApp, _apps[sName]); - if (nIndex >= 0) _apps[sName].splice(nIndex, 1); - } - - // unregister event - if ($.isFunction(oApp.deactivate)) oApp.deactivate(); - }, - - /** - * @brief overrides broadcast method - */ - broadcast : function(msg, params) { - this._broadcast(this, msg, params); - }, - - _broadcast : function(sender, msg, params) { - for(var i=0; i < _apps.length; i++) { - _apps[i]._cast(sender, msg, params); - } - - - // cast to child plugins - this._cast(sender, msg, params); - } -} - -_app_base = { - _plugins : [], - _messages : {}, - - /** - * @brief get plugin - */ - getPlugin : function(sPluginName) { - sPluginName = sPluginName.toLowerCase(); - if ($.isArray(this._plugins[sPluginName])) { - return this._plugins[sPluginName]; - } else { - return []; - } - }, - - /** - * @brief register a plugin instance - */ - registerPlugin : function(oPlugin) { - var self = this; - var sName = oPlugin.getName().toLowerCase(); - - // check if the plugin is already registered - if ($.inArray(oPlugin, this._plugins) >= 0) return false; - - // push the plugin into the _plugins array - this._plugins.push(oPlugin); - - if (!$.isArray(this._plugins[sName])) this._plugins[sName] = []; - this._plugins[sName].push(oPlugin); - - // register method pool - $.each(oPlugin._binded_fn, function(api, fn){ self.registerHandler(api, fn); }); - - // binding - oPlugin.oApp = this; - - // registered event - if ($.isFunction(oPlugin.activate)) oPlugin.activate(); - - return true; - }, - - /** - * @brief register api message handler - */ - registerHandler : function(api, func) { - var msgs = this._messages; api = api.toUpperCase(); - if (!$.isArray(msgs[api])) msgs[api] = []; - msgs[api].push(func); - }, - - cast : function(msg, params) { - return this._cast(this, msg, params || []); - }, - - broadcast : function(sender, msg, params) { - if (this.parent && this.parent._broadcast) { - this.parent._broadcast(sender, msg, params); - } - }, - - _cast : function(sender, msg, params) { - var i, len; - var aMsg = this._messages; - - msg = msg.toUpperCase(); - - // BEFORE hooker - if (aMsg['BEFORE_'+msg] || this['API_BEFORE_'+msg]) { - var bContinue = this._cast(sender, 'BEFORE_'+msg, params); - if (!bContinue) return; - } - - // main api function - var vRet = [], sFn = 'API_'+msg; - if ($.isArray(aMsg[msg])) { - for(i=0; i < aMsg[msg].length; i++) { - vRet.push( aMsg[msg][i](sender, params) ); - } - } - if (vRet.length < 2) vRet = vRet[0]; - - // AFTER hooker - if (aMsg['AFTER_'+msg] || this['API_AFTER_'+msg]) { - this._cast(sender, 'AFTER_'+msg, params); - } - - if (!/^(?:AFTER|BEFORE)_/.test(msg)) { // top level function - return vRet; - } else { - return $.isArray(vRet)?($.inArray(false, vRet)<0):((typeof vRet=='undefined')?true:!!vRet); - } - } -}; - -_plugin_base = { - oApp : null, - - cast : function(msg, params) { - if (this.oApp && this.oApp._cast) { - return this.oApp._cast(this, msg, params || []); - } - }, - - broadcast : function(msg, params) { - if (this.oApp && this.oApp.broadcast) { - this.oApp.broadcast(this, mag, params || []); - } - } - - /** - * Event handler prototype - * - * function (oSender, params) - */ -}; - -function getTypeBase() { - var _base = function() { - var self = this; - var pool = null; - - if ($.isArray(this._plugins)) this._plugins = []; - if (this._messages) this._messages = {}; - else this._binded_fn = {}; - - // bind functions - $.each(this, function(key, val){ - if (!$.isFunction(val)) return true; - if (!/^API_([A-Z0-9_]+)$/.test(key)) return true; - - var api = RegExp.$1; - var fn = function(sender, params){ return self[key](sender, params) }; - - if (self._messages) self._messages[api] = [fn]; - else self._binded_fn[api] = fn; - }); - - if ($.isFunction(this.init)) this.init.apply(this, arguments); - }; - - return _base; -} - -window.xe = $.extend(_app_base, _xe_base); -window.xe.lang = {}; // language repository - -// domready event -$(function(){ xe.broadcast('ONREADY'); }); - -// load event -$(window).load(function(){ xe.broadcast('ONLOAD'); }); - -})(jQuery); +(function($){var _xe_base,_app_base,_plugin_base;var _apps=[];_xe_base={getName:function(){return'Core';},createApp:function(sName,oDef){var _base=getTypeBase();$.extend(_base.prototype,_app_base,oDef);_base.prototype.getName=function(){return sName;};return _base;},createPlugin:function(sName,oDef){var _base=getTypeBase();$.extend(_base.prototype,_plugin_base,oDef);_base.prototype.getName=function(){return sName;};return _base;},getApps:function(){return $.makeArray(_apps);},getApp:function(indexOrName){indexOrName=(indexOrName||'').toLowerCase();if(typeof _apps[indexOrName]!='undefined'){return _apps[indexOrName];}else{return null;}},registerApp:function(oApp){var sName=oApp.getName().toLowerCase();_apps.push(oApp);if(!$.isArray(_apps[sName])){_apps[sName]=[];} +_apps[sName].push(oApp);oApp.parent=this;if($.isFunction(oApp.activate))oApp.activate();},unregisterApp:function(oApp){var sName=oPlugin.getName().toLowerCase();var nIndex=$.inArray(oApp,_apps);if(nIndex>=0)_apps.splice(nIndex,1);if($.isArray(_apps[sName])){nIndex=$.inArray(oApp,_apps[sName]);if(nIndex>=0)_apps[sName].splice(nIndex,1);} +if($.isFunction(oApp.deactivate))oApp.deactivate();},broadcast:function(msg,params){this._broadcast(this,msg,params);},_broadcast:function(sender,msg,params){for(var i=0;i<_apps.length;i++){_apps[i]._cast(sender,msg,params);} +this._cast(sender,msg,params);}} +_app_base={_plugins:[],_messages:{},getPlugin:function(sPluginName){sPluginName=sPluginName.toLowerCase();if($.isArray(this._plugins[sPluginName])){return this._plugins[sPluginName];}else{return[];}},registerPlugin:function(oPlugin){var self=this;var sName=oPlugin.getName().toLowerCase();if($.inArray(oPlugin,this._plugins)>=0)return false;this._plugins.push(oPlugin);if(!$.isArray(this._plugins[sName]))this._plugins[sName]=[];this._plugins[sName].push(oPlugin);$.each(oPlugin._binded_fn,function(api,fn){self.registerHandler(api,fn);});oPlugin.oApp=this;if($.isFunction(oPlugin.activate))oPlugin.activate();return true;},registerHandler:function(api,func){var msgs=this._messages;api=api.toUpperCase();if(!$.isArray(msgs[api]))msgs[api]=[];msgs[api].push(func);},cast:function(msg,params){return this._cast(this,msg,params||[]);},broadcast:function(sender,msg,params){if(this.parent&&this.parent._broadcast){this.parent._broadcast(sender,msg,params);}},_cast:function(sender,msg,params){var i,len;var aMsg=this._messages;msg=msg.toUpperCase();if(aMsg['BEFORE_'+msg]||this['API_BEFORE_'+msg]){var bContinue=this._cast(sender,'BEFORE_'+msg,params);if(!bContinue)return;} +var vRet=[],sFn='API_'+msg;if($.isArray(aMsg[msg])){for(i=0;i'+str+' '; + } + } + } + this.loaded_popup_menus[menu_id] = html; + } + + /* 레이어 출력 */ + if(html) { + var area = $('#popup_menu_area').html('
    '+html+'
'); + var areaOffset = {top:params['page_y'], left:params['page_x']}; + + if(area.outerHeight()+areaOffset.top > $(window).height()+$(window).scrollTop()) + areaOffset.top = $(window).height() - area.outerHeight() + $(window).scrollTop(); + if(area.outerWidth()+areaOffset.left > $(window).width()+$(window).scrollLeft()) + areaOffset.left = $(window).width() - area.outerWidth() + $(window).scrollLeft(); + + area.css({ top:areaOffset.top, left:areaOffset.left }).show(); + } + } + } + +}) (jQuery); + + + +/* jQuery(document).ready() */ +jQuery(function($) { + /* 팝업메뉴 레이어 생성 */ + if(!$('#popup_menu_area').length) { + var menuObj = $('
') + .attr('id', 'popup_menu_area') + .css({display:'none', zIndex:9999}); + $(document.body).append(menuObj); + } + + $(document).click(function(evt) { + var area = $('#popup_menu_area'); + if(!area.length) return; + + // 이전에 호출되었을지 모르는 팝업메뉴 숨김 + area.hide(); + + var targetObj = $(evt.target); + if(!targetObj.length) return; + + // obj의 nodeName이 div나 span이 아니면 나올대까지 상위를 찾음 + if(targetObj.length && $.inArray(targetObj.attr('nodeName'), ['DIV', 'SPAN', 'A']) == -1) targetObj = targetObj.parent(); + if(!targetObj.length || $.inArray(targetObj.attr('nodeName'), ['DIV', 'SPAN', 'A']) == -1) return; + + // 객체의 className값을 구함 + var class_name = targetObj.attr('className'); + if(class_name.indexOf('_') <= 0) return; + // className을 분리 + var class_name_list = class_name.split(' '); + + var menu_id = ''; + var menu_id_regx = /^([a-zA-Z]+)_([0-9]+)$/; + + + for(var i = 0, c = class_name_list.length; i < c; i++) { + if(menu_id_regx.test(class_name_list[i])) { + menu_id = class_name_list[i]; + } + } + + if(!menu_id) return; + + // module명과 대상 번호가 없으면 return + var tmp_arr = menu_id.split('_'); + var module_name = tmp_arr[0]; + var target_srl = tmp_arr[1]; + if(!module_name || !target_srl || target_srl < 1) return; + + // action이름을 규칙에 맞게 작성 + var action_name = "get" + module_name.substr(0,1).toUpperCase() + module_name.substr(1,module_name.length-1) + "Menu"; + + // 서버에 메뉴를 요청 + var params = new Array(); + params["target_srl"] = target_srl; + params["mid"] = params["cur_mid"] = current_mid; + params["cur_act"] = current_url.getQuery('act'); + params["menu_id"] = menu_id; + params["page_x"] = evt.pageX; + params["page_y"] = evt.pageY; + if(typeof(xeVid)!='undefined') params["vid"] = xeVid; + + var response_tags = new Array("error","message","menus"); + + if(typeof(XE.loaded_popup_menus[menu_id]) != 'undefined') { + XE.displayPopupMenu(params, response_tags, params); + return; + } + show_waiting_message = false; + exec_xml(module_name, action_name, params, XE.displayPopupMenu, response_tags, params); + show_waiting_message = true; + }); + + /* select - option의 disabled=disabled 속성을 IE에서도 체크하기 위한 함수 */ + if($.browser.msie) { + $('select').each(function(i, sels) { + var disabled_exists = false; + var first_enable = new Array(); + + for(var j=0; j < sels.options.length; j++) { + if(sels.options[j].disabled) { + sels.options[j].style.color = '#CCCCCC'; + disabled_exists = true; + }else{ + first_enable[i] = (first_enable[i] > -1) ? first_enable[i] : j; + } + } + + if(!disabled_exists) return; + + sels.oldonchange = sels.onchange; + sels.onchange = function() { + if(this.options[this.selectedIndex].disabled) { + + this.selectedIndex = first_enable[i]; + /* + if(this.options.length<=1) this.selectedIndex = -1; + else if(this.selectedIndex < this.options.length - 1) this.selectedIndex++; + else this.selectedIndex--; + */ + + } else { + if(this.oldonchange) this.oldonchange(); + } + }; + + if(sels.selectedIndex >= 0 && sels.options[ sels.selectedIndex ].disabled) sels.onchange(); + + }); + } + + /* 단락에디터 fold 컴포넌트 펼치기/접기 */ + var drEditorFold = $('.xe_content .fold_button'); + if(drEditorFold.size()) { + var fold_container = $('div.fold_container', drEditorFold); + $('button.more', drEditorFold).click(function() { + $(this).hide().next('button').show().parent().next(fold_container).show(); + }); + $('button.less', drEditorFold).click(function() { + $(this).hide().prev('button').show().parent().next(fold_container).hide(); + }); + } + +}); + + +/** + * @brief location.href에서 특정 key의 값을 return + **/ +String.prototype.getQuery = function(key) { + var idx = this.indexOf('?'); + if(idx == -1) return null; + var query_string = this.substr(idx+1, this.length); + var args = {}; + query_string.replace(/([^=]+)=([^&]*)(&|$)/g, function() { args[arguments[1]] = arguments[2]; }); + + var q = args[key]; + if(typeof(q)=="undefined") q = ""; + + return q; +} + +/** + * @brief location.href에서 특정 key의 값을 return + **/ +String.prototype.setQuery = function(key, val) { + var idx = this.indexOf('?'); + var uri = this; + uri = uri.replace(/#$/,''); + + if(idx != -1) { + uri = this.substr(0, idx); + var query_string = this.substr(idx+1, this.length); + var args = new Array(); + query_string.replace(/([^=]+)=([^&]*)(&|$)/g, function() { args[arguments[1]] = arguments[2]; }); + + args[key] = val; + + var q_list = new Array(); + for(var i in args) { + if( !args.hasOwnProperty(i) ) continue; + var arg = args[i]; + if(!arg.toString().trim()) continue; + arg = decodeURI(arg); + q_list[q_list.length] = i+'='+arg; + } + uri = uri+"?"+q_list.join("&"); + } else { + if(val.toString().trim()) uri = uri+"?"+key+"="+val; + } + + var re = /https:\/\/([^:\/]+)(:\d+|)/i; + var check = re.exec(uri); + if(check) + { + var toReplace = "http://"+check[1]; + if(typeof(http_port)!='undefined' && http_port != 80) + { + toReplace += ":" + http_port; + } + uri = uri.replace(re,toReplace); + } + var bUseSSL = false; + if(typeof(enforce_ssl)!='undefined' && enforce_ssl) + { + bUseSSL = true; + } + else if(typeof(ssl_actions)!='undefined' && typeof(ssl_actions.length)!='undefined' && uri.getQuery('act')) { + var act = uri.getQuery('act'); + for(i=0;i-1 && !url.getQuery('vid')) url = url.setQuery('vid',xeVid); + try { + if(target != "_blank" && winopen_list[target]) { + winopen_list[target].close(); + winopen_list[target] = null; + } + } catch(e) { + } + + if(typeof(target) == 'undefined') target = '_blank'; + if(typeof(attribute) == 'undefined') attribute = ''; + var win = window.open(url, target, attribute); + win.focus(); + if(target != "_blank") winopen_list[target] = win; +} + +/** + * @brief 팝업으로만 띄우기 + * common/tpl/popup_layout.html이 요청되는 XE내의 팝업일 경우에 사용 + **/ +function popopen(url, target) { + if(typeof(target) == "undefined") target = "_blank"; + if(typeof(xeVid)!='undefined' && url.indexOf(request_uri)>-1 && !url.getQuery('vid')) url = url.setQuery('vid',xeVid); + winopen(url, target, "left=10,top=10,width=10,height=10,scrollbars=no,resizable=yes,toolbars=no"); +} + +/** + * @brief 메일 보내기용 + **/ +function sendMailTo(to) { + location.href="mailto:"+to; +} + +/** + * @brief url이동 (open_window 값이 N 가 아니면 새창으로 띄움) + **/ +function move_url(url, open_wnidow) { + if(!url) return false; + if(typeof(open_wnidow) == 'undefined') open_wnidow = 'N'; + if(open_wnidow=='N') { + open_wnidow = false; + } else { + open_wnidow = true; + } + + if(/^\./.test(url)) url = request_uri+url; + + if(open_wnidow) { + winopen(url); + } else { + location.href=url; + } + + return false; +} + +/** + * @brief 멀티미디어 출력용 (IE에서 플래쉬/동영상 주변에 점선 생김 방지용) + **/ +function displayMultimedia(src, width, height, options) { + var html = _displayMultimedia(src, width, height, options); + if(html) document.writeln(html); +} +function _displayMultimedia(src, width, height, options) { + if(src.indexOf('files') == 0) src = request_uri + src; + + var defaults = { + wmode : 'transparent', + allowScriptAccess : 'sameDomain', + quality : 'high', + flashvars : '', + autostart : false + }; + + var params = jQuery.extend(defaults, options || {}); + var autostart = (params.autostart && params.autostart != 'false') ? 'true' : 'false'; + delete(params.autostart); + + var clsid = ""; + var codebase = ""; + var html = ""; + + if(/\.(gif|jpg|jpeg|bmp|png)$/i.test(src)){ + html = ''; + } else if(/\.flv$/i.test(src) || /\.mov$/i.test(src) || /\.moov$/i.test(src) || /\.m4v$/i.test(src)) { + html = ''; + } else if(/\.swf/i.test(src)) { + clsid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; + + if(typeof(enforce_ssl)!='undefined' && enforce_ssl){ codebase = "https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; } + else { codebase = "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; } + html = ''; + html += ''; + for(var name in params) { + if(params[name] != 'undefined' && params[name] != '') { + html += ''; + } + } + html += '' + + '' + + ''; + } else { + if (jQuery.browser.mozilla || jQuery.browser.opera) { + // firefox and opera uses 0 or 1 for autostart parameter. + autostart = (params.autostart && params.autostart != 'false') ? '1' : '0'; + } + + html = ' 400) { + $body.css({ overflow:'auto', overflowX:'hidden', height:400+'px' }); + } + } + + var $win = $(window); + var $pc = $('#popup_content'); + var w = Math.max($pc[0].offsetWidth, 600); + var h = $pc[0].offsetHeight; + var dw = $win.width(); + var dh = $win.height(); + var _w = 0, _h = 0; + + if (w != dw) _w = w - dw; + if (h != dh) _h = h - dh; + + if (_w || _h) { + window.resizeBy(_w, _h); + } + + if (!arguments.callee.executed) { + setTimeout(setFixedPopupSize, 300); + arguments.callee.executed = true; + } +} + +/** + * @brief 추천/비추천,스크랩,신고기능등 특정 srl에 대한 특정 module/action을 호출하는 함수 + **/ +function doCallModuleAction(module, action, target_srl) { + var params = new Array(); + params['target_srl'] = target_srl; + params['cur_mid'] = current_mid; + exec_xml(module, action, params, completeCallModuleAction); +} + +function completeCallModuleAction(ret_obj, response_tags) { + if(ret_obj['message']!='success') alert(ret_obj['message']); + location.reload(); +} + +function completeMessage(ret_obj) { + alert(ret_obj['message']); + location.reload(); +} + + + +/* 언어코드 (lang_type) 쿠키값 변경 */ +function doChangeLangType(obj) { + if(typeof(obj) == "string") { + setLangType(obj); + } else { + var val = obj.options[obj.selectedIndex].value; + setLangType(val); + } + location.reload(); +} +function setLangType(lang_type) { + var expire = new Date(); + expire.setTime(expire.getTime()+ (7000 * 24 * 3600000)); + xSetCookie('lang_type', lang_type, expire, '/'); +} + +/* 미리보기 */ +function doDocumentPreview(obj) { + var fo_obj = obj; + while(fo_obj.nodeName != "FORM") { + fo_obj = fo_obj.parentNode; + } + if(fo_obj.nodeName != "FORM") return; + var editor_sequence = fo_obj.getAttribute('editor_sequence'); + + var content = editorGetContent(editor_sequence); + + var win = window.open("", "previewDocument","toolbars=no,width=700px;height=800px,scrollbars=yes,resizable=yes"); + + var dummy_obj = jQuery("#previewDocument"); + + if(!dummy_obj.length) { + jQuery( + '
'+ + ''+ + ''+ + ''+ + '
' + ).appendTo(document.body); + + dummy_obj = jQuery("#previewDocument")[0]; + } + + if(dummy_obj) { + dummy_obj.content.value = content; + dummy_obj.submit(); + } +} + +/* 게시글 저장 */ +function doDocumentSave(obj) { + var editor_sequence = obj.form.getAttribute('editor_sequence'); + var prev_content = editorRelKeys[editor_sequence]['content'].value; + if(typeof(editor_sequence)!='undefined' && editor_sequence && typeof(editorRelKeys)!='undefined' && typeof(editorGetContent)=='function') { + var content = editorGetContent(editor_sequence); + editorRelKeys[editor_sequence]['content'].value = content; + } + + var params={}, responses=['error','message','document_srl'], elms=obj.form.elements, data=jQuery(obj.form).serializeArray();; + jQuery.each(data, function(i, field){ + var val = jQuery.trim(field.value); + if(!val) return true; + if(/\[\]$/.test(field.name)) field.name = field.name.replace(/\[\]$/, ''); + if(params[field.name]) params[field.name] += '|@|'+val; + else params[field.name] = field.value; + }); + + exec_xml('member','procMemberSaveDocument', params, completeDocumentSave, responses, params, obj.form); + + editorRelKeys[editor_sequence]['content'].value = prev_content; + return false; +} + +function completeDocumentSave(ret_obj) { + jQuery('input[name=document_srl]').eq(0).val(ret_obj['document_srl']); + alert(ret_obj['message']); +} + +/* 저장된 게시글 불러오기 */ +var objForSavedDoc = null; +function doDocumentLoad(obj) { + // 저장된 게시글 목록 불러오기 + objForSavedDoc = obj.form; + popopen(request_uri.setQuery('module','member').setQuery('act','dispSavedDocumentList')); +} + +/* 저장된 게시글의 선택 */ +function doDocumentSelect(document_srl) { + if(!opener || !opener.objForSavedDoc) { + window.close(); + return; + } + + // 게시글을 가져와서 등록하기 + opener.location.href = opener.current_url.setQuery('document_srl', document_srl).setQuery('act', 'dispBoardWrite'); + window.close(); +} + + +/* 스킨 정보 */ +function viewSkinInfo(module, skin) { + popopen("./?module=module&act=dispModuleSkinInfo&selected_module="+module+"&skin="+skin, 'SkinInfo'); +} + + +/* 관리자가 문서를 관리하기 위해서 선택시 세션에 넣음 */ +var addedDocument = new Array(); +function doAddDocumentCart(obj) { + var srl = obj.value; + addedDocument[addedDocument.length] = srl; + setTimeout(function() { callAddDocumentCart(addedDocument.length); }, 100); +} + +function callAddDocumentCart(document_length) { + if(addedDocument.length<1 || document_length != addedDocument.length) return; + var params = new Array(); + params["srls"] = addedDocument.join(","); + exec_xml("document","procDocumentAddCart", params, null); + addedDocument = new Array(); +} + +/* ff의 rgb(a,b,c)를 #... 로 변경 */ +function transRGB2Hex(value) { + if(!value) return value; + if(value.indexOf('#') > -1) return value.replace(/^#/, ''); + + if(value.toLowerCase().indexOf('rgb') < 0) return value; + value = value.replace(/^rgb\(/i, '').replace(/\)$/, ''); + value_list = value.split(','); + + var hex = ''; + for(var i = 0; i < value_list.length; i++) { + var color = parseInt(value_list[i], 10).toString(16); + if(color.length == 1) color = '0'+color; + hex += color; + } + return hex; +} + +/* 보안 로그인 모드로 전환 */ +function toggleSecuritySignIn() { + var href = location.href; + if(/https:\/\//i.test(href)) location.href = href.replace(/^https/i,'http'); + else location.href = href.replace(/^http/i,'https'); +} + +function reloadDocument() { + location.reload(); +} + + +/** +* +* Base64 encode / decode +* http://www.webtoolkit.info/ +* +**/ + +var Base64 = { + + // private property + _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", + + // public method for encoding + encode : function (input) { + var output = ""; + var chr1, chr2, chr3, enc1, enc2, enc3, enc4; + var i = 0; + + input = Base64._utf8_encode(input); + + while (i < input.length) { + + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + + output = output + + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); + + } + + return output; + }, + + // public method for decoding + decode : function (input) { + var output = ""; + var chr1, chr2, chr3; + var enc1, enc2, enc3, enc4; + var i = 0; + + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + + while (i < input.length) { + + enc1 = this._keyStr.indexOf(input.charAt(i++)); + enc2 = this._keyStr.indexOf(input.charAt(i++)); + enc3 = this._keyStr.indexOf(input.charAt(i++)); + enc4 = this._keyStr.indexOf(input.charAt(i++)); + + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + + output = output + String.fromCharCode(chr1); + + if (enc3 != 64) { + output = output + String.fromCharCode(chr2); + } + if (enc4 != 64) { + output = output + String.fromCharCode(chr3); + } + + } + + output = Base64._utf8_decode(output); + + return output; + + }, + + // private method for UTF-8 encoding + _utf8_encode : function (string) { + string = string.replace(/\r\n/g,"\n"); + var utftext = ""; + + for (var n = 0; n < string.length; n++) { + + var c = string.charCodeAt(n); + + if (c < 128) { + utftext += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + + } + + return utftext; + }, + + // private method for UTF-8 decoding + _utf8_decode : function (utftext) { + var string = ""; + var i = 0; + var c = c1 = c2 = 0; + + while ( i < utftext.length ) { + + c = utftext.charCodeAt(i); + + if (c < 128) { + string += String.fromCharCode(c); + i++; + } + else if((c > 191) && (c < 224)) { + c2 = utftext.charCodeAt(i+1); + string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 2; + } + else { + c2 = utftext.charCodeAt(i+1); + c3 = utftext.charCodeAt(i+2); + string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + + } + + return string; + } + +} + + + + + + +/* ---------------------------------------------- + * DEPRECATED + * 하위호환용으로 남겨 놓음 + * ------------------------------------------- */ + +if(typeof(resizeImageContents) == 'undefined') { + function resizeImageContents() {} +} + +if(typeof(activateOptionDisabled) == 'undefined') { + function activateOptionDisabled() {} +} + +objectExtend = jQuery.extend; + +/** + * @brief 특정 Element의 display 옵션 토글 + **/ +function toggleDisplay(objId) { + jQuery('#'+objId).toggle(); +} + +/* 체크박스 선택 */ +function checkboxSelectAll(formObj, name, checked) { + var itemName = name; + var option = {}; + if(typeof(formObj) != "undefined") option.wrap = formObj; + if(typeof(checked) != "undefined") option.checked = checked; + + XE.checkboxToggleAll(itemName, option); +} + +/* 체크박스를 실행 */ +function clickCheckBoxAll(formObj, name) { + var itemName = name; + var option = { doClick:true }; + if(typeof(formObj) != "undefined") option.wrap = formObj; + + XE.checkboxToggleAll(itemName, option); +} + +/** + * @brief 에디터에서 사용하되 내용 여닫는 코드 (zb5beta beta 호환용으로 남겨 놓음) + **/ +function svc_folder_open(id) { + jQuery("#_folder_open_"+id).hide(); + jQuery("#_folder_close_"+id).show(); + jQuery("#_folder_"+id).show(); +} +function svc_folder_close(id) { + jQuery("#_folder_open_"+id).show(); + jQuery("#_folder_close_"+id).hide(); + jQuery("#_folder_"+id).hide(); +} + +/** + * @brief 날짜 선택 (달력 열기) + **/ +function open_calendar(fo_id, day_str, callback_func) { + if(typeof(day_str)=="undefined") day_str = ""; + + var url = "./common/tpl/calendar.php?"; + if(fo_id) url+="fo_id="+fo_id; + if(day_str) url+="&day_str="+day_str; + if(callback_func) url+="&callback_func="+callback_func; + + popopen(url, 'Calendar'); +} + +var loaded_popup_menus = XE.loaded_popup_menus; +function createPopupMenu() {} +function chkPopupMenu() {} +function displayPopupMenu(ret_obj, response_tags, params) { + XE.displayPopupMenu(ret_obj, response_tags, params); +} + +function GetObjLeft(obj) { + return jQuery(obj).offset().left; +} +function GetObjTop(obj) { + return jQuery(obj).offset().top; +} + +function replaceOuterHTML(obj, html) { + jQuery(obj).replaceWith(html); +} + +function getOuterHTML(obj) { + return jQuery(obj).html().trim(); +} + +jQuery(function(){ + jQuery(".lang_code").each( + function() + { + var objText = jQuery(this); + var targetName = objText.attr("id"); + if(typeof(targetName) == "undefined") targetName = objText.attr("name"); + if(typeof(targetName) == "undefined") return; + objText.after("find_langcode"); + } + ); +}); diff --git a/common/js/src/iepngfix_tilebg.js b/common/js/src/iepngfix_tilebg.js new file mode 100644 index 000000000..1a5863011 --- /dev/null +++ b/common/js/src/iepngfix_tilebg.js @@ -0,0 +1,173 @@ +// IE5.5+ PNG Alpha Fix v2.0 Alpha: Background Tiling Support +// (c) 2008 Angus Turnbull http://www.twinhelix.com + +// This is licensed under the GNU LGPL, version 2.1 or later. +// For details, see: http://creativecommons.org/licenses/LGPL/2.1/ + +var IEPNGFix = window.IEPNGFix || {}; + +IEPNGFix.tileBG = function(elm, pngSrc, ready) { + // Params: A reference to a DOM element, the PNG src file pathname, and a + // hidden "ready-to-run" passed when called back after image preloading. + + var data = this.data[elm.uniqueID], + elmW = Math.max(elm.clientWidth, elm.scrollWidth), + elmH = Math.max(elm.clientHeight, elm.scrollHeight), + bgX = elm.currentStyle.backgroundPositionX, + bgY = elm.currentStyle.backgroundPositionY, + bgR = elm.currentStyle.backgroundRepeat; + + // Cache of DIVs created per element, and image preloader/data. + if (!data.tiles) { + data.tiles = { + elm: elm, + src: '', + cache: [], + img: new Image(), + old: {} + }; + } + var tiles = data.tiles, + pngW = tiles.img.width, + pngH = tiles.img.height; + + if (pngSrc) { + if (!ready && pngSrc != tiles.src) { + // New image? Preload it with a callback to detect dimensions. + tiles.img.onload = function() { + this.onload = null; + IEPNGFix.tileBG(elm, pngSrc, 1); + }; + return tiles.img.src = pngSrc; + } + } else { + // No image? + if (tiles.src) ready = 1; + pngW = pngH = 0; + } + tiles.src = pngSrc; + + if (!ready && elmW == tiles.old.w && elmH == tiles.old.h && + bgX == tiles.old.x && bgY == tiles.old.y && bgR == tiles.old.r) { + return; + } + + // Convert English and percentage positions to pixels. + var pos = { + top: '0%', + left: '0%', + center: '50%', + bottom: '100%', + right: '100%' + }, + x, + y, + pc; + x = pos[bgX] || bgX; + y = pos[bgY] || bgY; + if (pc = x.match(/(\d+)%/)) { + x = Math.round((elmW - pngW) * (parseInt(pc[1]) / 100)); + } + if (pc = y.match(/(\d+)%/)) { + y = Math.round((elmH - pngH) * (parseInt(pc[1]) / 100)); + } + x = parseInt(x); + y = parseInt(y); + + // Handle backgroundRepeat. + var repeatX = { 'repeat': 1, 'repeat-x': 1 }[bgR], + repeatY = { 'repeat': 1, 'repeat-y': 1 }[bgR]; + if (repeatX) { + x %= pngW; + if (x > 0) x -= pngW; + } + if (repeatY) { + y %= pngH; + if (y > 0) y -= pngH; + } + + // Go! + this.hook.enabled = 0; + if (!({ relative: 1, absolute: 1 }[elm.currentStyle.position])) { + elm.style.position = 'relative'; + } + var count = 0, + xPos, + maxX = repeatX ? elmW : x + 0.1, + yPos, + maxY = repeatY ? elmH : y + 0.1, + d, + s, + isNew; + if (pngW && pngH) { + for (xPos = x; xPos < maxX; xPos += pngW) { + for (yPos = y; yPos < maxY; yPos += pngH) { + isNew = 0; + if (!tiles.cache[count]) { + tiles.cache[count] = document.createElement('div'); + isNew = 1; + } + var clipR = (xPos + pngW > elmW ? elmW - xPos : pngW), + clipB = (yPos + pngH > elmH ? elmH - yPos : pngH); + d = tiles.cache[count]; + s = d.style; + s.behavior = 'none'; + s.left = xPos + 'px'; + s.top = yPos + 'px'; + s.width = clipR + 'px'; + s.height = clipB + 'px'; + s.clip = 'rect(' + + (yPos < 0 ? 0 - yPos : 0) + 'px,' + + clipR + 'px,' + + clipB + 'px,' + + (xPos < 0 ? 0 - xPos : 0) + 'px)'; + s.display = 'block'; + if (isNew) { + s.position = 'absolute'; + s.zIndex = -999; + if (elm.firstChild) { + elm.insertBefore(d, elm.firstChild); + } else { + elm.appendChild(d); + } + } + this.fix(d, pngSrc, 0); + count++; + } + } + } + while (count < tiles.cache.length) { + this.fix(tiles.cache[count], '', 0); + tiles.cache[count++].style.display = 'none'; + } + + this.hook.enabled = 1; + + // Cache so updates are infrequent. + tiles.old = { + w: elmW, + h: elmH, + x: bgX, + y: bgY, + r: bgR + }; +}; + + +IEPNGFix.update = function() { + // Update all PNG backgrounds. + for (var i in IEPNGFix.data) { + var t = IEPNGFix.data[i].tiles; + if (t && t.elm && t.src) { + IEPNGFix.tileBG(t.elm, t.src); + } + } +}; +IEPNGFix.update.timer = 0; + +if (window.attachEvent && !window.opera) { + window.attachEvent('onresize', function() { + clearTimeout(IEPNGFix.update.timer); + IEPNGFix.update.timer = setTimeout(IEPNGFix.update, 100); + }); +} diff --git a/common/js/jquery-1.4.2-full.js b/common/js/src/jquery.js similarity index 100% rename from common/js/jquery-1.4.2-full.js rename to common/js/src/jquery.js diff --git a/common/js/src/js_app.js b/common/js/src/js_app.js new file mode 100644 index 000000000..d116113d6 --- /dev/null +++ b/common/js/src/js_app.js @@ -0,0 +1,279 @@ +/** + * @file js_app.js + * @author taggon (gonom9@gmail.com) + * @brief XE JavaScript Application Framework (JAF) + * @namespace xe + * @update 20100701 + */ +(function($){ + +var _xe_base, _app_base, _plugin_base; +var _apps = []; + +_xe_base = { + /** + * @brief return the name of Core module + */ + getName : function() { + return 'Core'; + }, + + /** + * @brief Create an application class + */ + createApp : function(sName, oDef) { + var _base = getTypeBase(); + + $.extend(_base.prototype, _app_base, oDef); + + _base.prototype.getName = function() { + return sName; + }; + + return _base; + }, + + /** + * @brief Create a plugin class + */ + createPlugin : function(sName, oDef) { + var _base = getTypeBase(); + + $.extend(_base.prototype, _plugin_base, oDef); + + _base.prototype.getName = function() { + return sName; + }; + + return _base; + }, + + /** + * @brief Get the array of applications + */ + getApps : function() { + return $.makeArray(_apps); + }, + + /** + * @brief Get one application + */ + getApp : function(indexOrName) { + indexOrName = (indexOrName||'').toLowerCase(); + if(typeof _apps[indexOrName] != 'undefined') { + return _apps[indexOrName]; + } else { + return null; + } + }, + + /** + * @brief Register an application instance + */ + registerApp : function(oApp) { + var sName = oApp.getName().toLowerCase(); + + _apps.push(oApp); + if (!$.isArray(_apps[sName])) { + _apps[sName] = []; + } + _apps[sName].push(oApp); + + oApp.parent = this; + + // register event + if ($.isFunction(oApp.activate)) oApp.activate(); + }, + + /** + * @brief Unregister an application instance + */ + unregisterApp : function(oApp) { + var sName = oPlugin.getName().toLowerCase(); + var nIndex = $.inArray(oApp, _apps); + + if (nIndex >= 0) _apps.splice(nIndex, 1); + + if ($.isArray(_apps[sName])) { + nIndex = $.inArray(oApp, _apps[sName]); + if (nIndex >= 0) _apps[sName].splice(nIndex, 1); + } + + // unregister event + if ($.isFunction(oApp.deactivate)) oApp.deactivate(); + }, + + /** + * @brief overrides broadcast method + */ + broadcast : function(msg, params) { + this._broadcast(this, msg, params); + }, + + _broadcast : function(sender, msg, params) { + for(var i=0; i < _apps.length; i++) { + _apps[i]._cast(sender, msg, params); + } + + + // cast to child plugins + this._cast(sender, msg, params); + } +} + +_app_base = { + _plugins : [], + _messages : {}, + + /** + * @brief get plugin + */ + getPlugin : function(sPluginName) { + sPluginName = sPluginName.toLowerCase(); + if ($.isArray(this._plugins[sPluginName])) { + return this._plugins[sPluginName]; + } else { + return []; + } + }, + + /** + * @brief register a plugin instance + */ + registerPlugin : function(oPlugin) { + var self = this; + var sName = oPlugin.getName().toLowerCase(); + + // check if the plugin is already registered + if ($.inArray(oPlugin, this._plugins) >= 0) return false; + + // push the plugin into the _plugins array + this._plugins.push(oPlugin); + + if (!$.isArray(this._plugins[sName])) this._plugins[sName] = []; + this._plugins[sName].push(oPlugin); + + // register method pool + $.each(oPlugin._binded_fn, function(api, fn){ self.registerHandler(api, fn); }); + + // binding + oPlugin.oApp = this; + + // registered event + if ($.isFunction(oPlugin.activate)) oPlugin.activate(); + + return true; + }, + + /** + * @brief register api message handler + */ + registerHandler : function(api, func) { + var msgs = this._messages; api = api.toUpperCase(); + if (!$.isArray(msgs[api])) msgs[api] = []; + msgs[api].push(func); + }, + + cast : function(msg, params) { + return this._cast(this, msg, params || []); + }, + + broadcast : function(sender, msg, params) { + if (this.parent && this.parent._broadcast) { + this.parent._broadcast(sender, msg, params); + } + }, + + _cast : function(sender, msg, params) { + var i, len; + var aMsg = this._messages; + + msg = msg.toUpperCase(); + + // BEFORE hooker + if (aMsg['BEFORE_'+msg] || this['API_BEFORE_'+msg]) { + var bContinue = this._cast(sender, 'BEFORE_'+msg, params); + if (!bContinue) return; + } + + // main api function + var vRet = [], sFn = 'API_'+msg; + if ($.isArray(aMsg[msg])) { + for(i=0; i < aMsg[msg].length; i++) { + vRet.push( aMsg[msg][i](sender, params) ); + } + } + if (vRet.length < 2) vRet = vRet[0]; + + // AFTER hooker + if (aMsg['AFTER_'+msg] || this['API_AFTER_'+msg]) { + this._cast(sender, 'AFTER_'+msg, params); + } + + if (!/^(?:AFTER|BEFORE)_/.test(msg)) { // top level function + return vRet; + } else { + return $.isArray(vRet)?($.inArray(false, vRet)<0):((typeof vRet=='undefined')?true:!!vRet); + } + } +}; + +_plugin_base = { + oApp : null, + + cast : function(msg, params) { + if (this.oApp && this.oApp._cast) { + return this.oApp._cast(this, msg, params || []); + } + }, + + broadcast : function(msg, params) { + if (this.oApp && this.oApp.broadcast) { + this.oApp.broadcast(this, mag, params || []); + } + } + + /** + * Event handler prototype + * + * function (oSender, params) + */ +}; + +function getTypeBase() { + var _base = function() { + var self = this; + var pool = null; + + if ($.isArray(this._plugins)) this._plugins = []; + if (this._messages) this._messages = {}; + else this._binded_fn = {}; + + // bind functions + $.each(this, function(key, val){ + if (!$.isFunction(val)) return true; + if (!/^API_([A-Z0-9_]+)$/.test(key)) return true; + + var api = RegExp.$1; + var fn = function(sender, params){ return self[key](sender, params) }; + + if (self._messages) self._messages[api] = [fn]; + else self._binded_fn[api] = fn; + }); + + if ($.isFunction(this.init)) this.init.apply(this, arguments); + }; + + return _base; +} + +window.xe = $.extend(_app_base, _xe_base); +window.xe.lang = {}; // language repository + +// domready event +$(function(){ xe.broadcast('ONREADY'); }); + +// load event +$(window).load(function(){ xe.broadcast('ONLOAD'); }); + +})(jQuery); diff --git a/common/js/src/x.js b/common/js/src/x.js new file mode 100644 index 000000000..72bfd87e4 --- /dev/null +++ b/common/js/src/x.js @@ -0,0 +1,676 @@ +/** + * x.js compiled from X 4.0 with XC 0.27b. + * Distributed by GNU LGPL. For copyrights, license, documentation and more visit Cross-Browser.com + * Copyright 2001-2005 Michael Foster (Cross-Browser.com) + **/ +function xDeprecate(funcName) { + var msg = 'DEPRECATED : '+funcName+'() is deprecated function.'; + if (typeof console == 'object' && typeof console.log == 'function') { + console.log(msg); + } +} + +var xOp7Up,xOp6Dn,xIE4Up,xIE4,xIE5,xIE6,xNN4,xUA=navigator.userAgent.toLowerCase(); +if(window.opera){ + var i=xUA.indexOf('opera'); + if(i!=-1){ + var v=parseInt(xUA.charAt(i+6)); + xOp7Up=v>=7; + xOp6Dn=v<7; + } +} +else if(navigator.vendor!='KDE' && document.all && xUA.indexOf('msie')!=-1){ + xIE4Up=parseFloat(navigator.appVersion)>=4; + xIE4=xUA.indexOf('msie 4')!=-1; + xIE5=xUA.indexOf('msie 5')!=-1; + xIE6=xUA.indexOf('msie 6')!=-1; +} +else if(document.layers){xNN4=true;} +var xMac=xUA.indexOf('mac')!=-1; +var xFF=xUA.indexOf('firefox')!=-1; + +// (element, event(without 'on'), event listener(function name)[, caption]) +function xAddEventListener(e,eT,eL,cap) +{ + xDeprecate('xAddEventListener'); + if(!(e=xGetElementById(e))) return; + eT=eT.toLowerCase(); + if((!xIE4Up && !xOp7Up) && e==window) { + if(eT=='resize') { window.xPCW=xClientWidth(); window.xPCH=xClientHeight(); window.xREL=eL; xResizeEvent(); return; } + if(eT=='scroll') { window.xPSL=xScrollLeft(); window.xPST=xScrollTop(); window.xSEL=eL; xScrollEvent(); return; } + } + var eh='e.on'+eT+'=eL'; + if(e.addEventListener) e.addEventListener(eT,eL,cap); + else if(e.attachEvent) e.attachEvent('on'+eT,eL); + else eval(eh); +} +// called only from the above +function xResizeEvent() +{ + xDeprecate('xResizeEvent'); + if (window.xREL) setTimeout('xResizeEvent()', 250); + var cw = xClientWidth(), ch = xClientHeight(); + if (window.xPCW != cw || window.xPCH != ch) { window.xPCW = cw; window.xPCH = ch; if (window.xREL) window.xREL(); } +} + +function xScrollEvent() +{ + xDeprecate('xScrollEvent'); + if (window.xSEL) setTimeout('xScrollEvent()', 250); + var sl = xScrollLeft(), st = xScrollTop(); + if (window.xPSL != sl || window.xPST != st) { window.xPSL = sl; window.xPST = st; if (window.xSEL) window.xSEL(); } +} + +function xAppendChild(oParent, oChild) +{ + xDeprecate('xAppendChild'); + if (oParent.appendChild) return oParent.appendChild(oChild); + else return null; +} + +function xClientHeight() +{ + xDeprecate('xClientHeight'); + var h=0; + if(xOp6Dn) h=window.innerHeight; + else if(document.compatMode == 'CSS1Compat' && !window.opera && document.documentElement && document.documentElement.clientHeight) + h=document.documentElement.clientHeight; + else if(document.body && document.body.clientHeight) + h=document.body.clientHeight; + else if(xDef(window.innerWidth,window.innerHeight,document.width)) { + h=window.innerHeight; + if(document.width>window.innerWidth) h-=16; + } + return h; +} + +function xClientWidth() +{ + xDeprecate('xClientWidth'); + var w=0; + if(xOp6Dn) w=window.innerWidth; + else if(document.compatMode == 'CSS1Compat' && !window.opera && document.documentElement && document.documentElement.clientWidth) + w=document.documentElement.clientWidth; + else if(document.body && document.body.clientWidth) + w=document.body.clientWidth; + else if(xDef(window.innerWidth,window.innerHeight,document.height)) { + w=window.innerWidth; + if(document.height>window.innerHeight) w-=16; + } + return w; +} + +function xCreateElement(sTag) +{ + xDeprecate('xCreateElement'); + if (document.createElement) return document.createElement(sTag); + else return null; +} + +function xDef() +{ + xDeprecate('xDef'); + for(var i=0; i 0) { + var offset = document.cookie.indexOf(search); + if (offset != -1) { + offset += search.length; + var end = document.cookie.indexOf(";", offset); + if (end == -1) end = document.cookie.length; + value = unescape(document.cookie.substring(offset, end)); + } + } + return value; +} + +function xGetElementById(e) +{ + xDeprecate('xGetElementById'); + if(typeof(e)!='string') return e; + if(document.getElementById) e=document.getElementById(e); + else if(document.all) e=document.all[e]; + else e=null; + return e; +} + +function xGetElementsByAttribute(sTag, sAtt, sRE, fn) +{ + xDeprecate('xGetElementsByAttribute'); + var a, list, found = new Array(), re = new RegExp(sRE, 'i'); + list = xGetElementsByTagName(sTag); + for (var i = 0; i < list.length; ++i) { + a = list[i].getAttribute(sAtt); + if (!a) {a = list[i][sAtt];} + if (typeof(a)=='string' && a.search(re) != -1) { + found[found.length] = list[i]; + if (fn) fn(list[i]); + } + } + return found; +} + +function xGetElementsByClassName(c,p,t,f) +{ + xDeprecate('xGetElementsByClassName'); + var found = new Array(); + var re = new RegExp('\\b'+c+'\\b', 'i'); + var list = xGetElementsByTagName(t, p); + for (var i = 0; i < list.length; ++i) { + if (list[i].className && list[i].className.search(re) != -1) { + found[found.length] = list[i]; + if (f) f(list[i]); + } + } + return found; +} + +function xGetElementsByTagName(t,p) +{ + xDeprecate('xGetElementsByTagName'); + var list = null; + t = t || '*'; + p = p || document; + if (xIE4 || xIE5) { + if (t == '*') list = p.all; + else list = p.all.tags(t); + } + else if (p.getElementsByTagName) list = p.getElementsByTagName(t); + return list || new Array(); +} + +function xGetURLArguments() +{ + xDeprecate('xGetURLArguments'); + var idx = location.href.indexOf('?'); + var params = new Array(); + if (idx != -1) { + var pairs = location.href.substring(idx+1, location.href.length).split('&'); + for (var i=0; i=0) { + var pt=0,pb=0,bt=0,bb=0; + if (document.compatMode=='CSS1Compat') { + var gcs = xGetComputedStyle; + pt=gcs(e,'padding-top',1); + if (pt !== null) { + pb=gcs(e,'padding-bottom',1); + bt=gcs(e,'border-top-width',1); + bb=gcs(e,'border-bottom-width',1); + } + // Should we try this as a last resort? + // At this point getComputedStyle and currentStyle do not exist. + else if(xDef(e.offsetHeight,e.style.height)){ + e.style.height=h+'px'; + pt=e.offsetHeight-h; + } + } + h-=(pt+pb+bt+bb); + if(isNaN(h)||h<0) return null; + else e.style.height=h+'px'; + } + h=e.offsetHeight; + } + else if(css && xDef(e.style.pixelHeight)) { + if(h>=0) e.style.pixelHeight=h; + h=e.style.pixelHeight; + } + return h; +} + +function xHex(sn, digits, prefix) +{ + xDeprecate('xHex'); + var p = ''; + var n = Math.ceil(sn); + if (prefix) p = prefix; + n = n.toString(16); + for (var i=0; i < digits - n.length; ++i) { + p += '0'; + } + return p + n; +} + +function xHide(e){ xDeprecate('xHide'); return xVisibility(e,0);} + +function xInnerHtml(e,h) +{ + xDeprecate('xInnerHtml'); + if(!(e=xGetElementById(e)) || !xStr(e.innerHTML)) return null; + var s = e.innerHTML; + if (xStr(h)) {e.innerHTML = h;} + return s; +} + +function xLeft(e, iX) +{ + xDeprecate('xLeft'); + if(!(e=xGetElementById(e))) return 0; + var css=xDef(e.style); + if (css && xStr(e.style.left)) { + if(xNum(iX)) e.style.left=iX+'px'; + else { + iX=parseInt(e.style.left); + if(isNaN(iX)) iX=0; + } + } + else if(css && xDef(e.style.pixelLeft)) { + if(xNum(iX)) e.style.pixelLeft=iX; + else iX=e.style.pixelLeft; + } + return iX; +} + +function xMoveTo(e,x,y) +{ + xDeprecate('xMoveTo'); + xLeft(e,x); + xTop(e,y); +} + +function xName(e) +{ + xDeprecate('xName'); + if (!e) return e; + else if (e.id && e.id != "") return e.id; + else if (e.name && e.name != "") return e.name; + else if (e.nodeName && e.nodeName != "") return e.nodeName; + else if (e.tagName && e.tagName != "") return e.tagName; + else return e; +} + +function xNextSib(e,t) +{ + xDeprecate('xNextSib'); + var s = e ? e.nextSibling : null; + if (t) while (s && s.nodeName != t) { s = s.nextSibling; } + else while (s && s.nodeType != 1) { s = s.nextSibling; } + return s; +} + +function xNum() +{ + xDeprecate('xNum'); + for(var i=0; i=0) { + var pl=0,pr=0,bl=0,br=0; + if (document.compatMode=='CSS1Compat') { + var gcs = xGetComputedStyle; + pl=gcs(e,'padding-left',1); + if (pl !== null) { + pr=gcs(e,'padding-right',1); + bl=gcs(e,'border-left-width',1); + br=gcs(e,'border-right-width',1); + } + // Should we try this as a last resort? + // At this point getComputedStyle and currentStyle do not exist. + else if(xDef(e.offsetWidth,e.style.width)){ + e.style.width=w+'px'; + pl=e.offsetWidth-w; + } + } + w-=(pl+pr+bl+br); + if(isNaN(w)||w<0) return null; + else e.style.width=w+'px'; + } + w=e.offsetWidth; + } + else if(css && xDef(e.style.pixelWidth)) { + if(w>=0) e.style.pixelWidth=w; + w=e.style.pixelWidth; + } + return w; +} + +function xZIndex(e,uZ) +{ + xDeprecate('xZIndex'); + if(!(e=xGetElementById(e))) return 0; + if(e.style && xDef(e.style.zIndex)) { + if(xNum(uZ)) e.style.zIndex=uZ; + uZ=parseInt(e.style.zIndex); + } + return uZ; +} + +function xStopPropagation(evt) +{ + xDeprecate('xStopPropagation'); + if (evt && evt.stopPropagation) evt.stopPropagation(); + else if (window.event) window.event.cancelBubble = true; +} + diff --git a/common/js/src/xml_handler.js b/common/js/src/xml_handler.js new file mode 100644 index 000000000..2f6689e16 --- /dev/null +++ b/common/js/src/xml_handler.js @@ -0,0 +1,409 @@ +/** + * @file common/js/xml_handler.js + * @brief XE에서 ajax기능을 이용함에 있어 module, act를 잘 사용하기 위한 자바스크립트 + **/ + +// xml handler을 이용하는 user function +var show_waiting_message = true; + +/* This work is licensed under Creative Commons GNU LGPL License. + + License: http://creativecommons.org/licenses/LGPL/2.1/ + Version: 0.9 + Author: Stefan Goessner/2006 + Web: http://goessner.net/ +*/ +function xml2json(xml, tab, ignoreAttrib) { + var X = { + toObj: function(xml) { + var o = {}; + if (xml.nodeType==1) { // element node .. + if (ignoreAttrib && xml.attributes.length) // element with attributes .. + for (var i=0; i 1) + o = X.escape(X.innerXml(xml)); + else + for (var n=xml.firstChild; n; n=n.nextSibling){ + //o["#cdata"] = X.escape(n.nodeValue); + o = X.escape(n.nodeValue); + } + } + } + if (!xml.attributes.length && !xml.firstChild) o = null; + } + else if (xml.nodeType==9) { // document.node + o = X.toObj(xml.documentElement); + } + else + alert("unhandled node type: " + xml.nodeType); + return o; + }, + toJson: function(o, name, ind) { + var json = name ? ("\""+name+"\"") : ""; + if (o instanceof Array) { + for (var i=0,n=o.length; i 1 ? ("\n"+ind+"\t"+o.join(",\n"+ind+"\t")+"\n"+ind) : o.join("")) + "]"; + } + else if (o == null) + json += (name&&":") + "null"; + else if (typeof(o) == "object") { + var arr = []; + for (var m in o) + arr[arr.length] = X.toJson(o[m], m, ind+"\t"); + json += (name?":{":"{") + (arr.length > 1 ? ("\n"+ind+"\t"+arr.join(",\n"+ind+"\t")+"\n"+ind) : arr.join("")) + "}"; + } + else if (typeof(o) == "string") + json += (name&&":") + "\"" + o.toString() + "\""; + else + json += (name&&":") + o.toString(); + return json; + }, + innerXml: function(node) { + var s = "" + if ("innerHTML" in node) + s = node.innerHTML; + else { + var asXml = function(n) { + var s = ""; + if (n.nodeType == 1) { + s += "<" + n.nodeName; + for (var i=0; i"; + } + else + s += "/>"; + } + else if (n.nodeType == 3) + s += n.nodeValue; + else if (n.nodeType == 4) + s += ""; + return s; + }; + for (var c=node.firstChild; c; c=c.nextSibling) + s += asXml(c); + } + return s; + }, + escape: function(txt) { + return txt.replace(/[\\]/g, "\\\\") + .replace(/[\"]/g, '\\"') + .replace(/[\n]/g, '\\n') + .replace(/[\r]/g, '\\r'); + }, + removeWhite: function(e) { + e.normalize(); + for (var n = e.firstChild; n; ) { + if (n.nodeType == 3) { // text node + if (!n.nodeValue.match(/[^ \f\n\r\t\v]/)) { // pure whitespace text node + var nxt = n.nextSibling; + e.removeChild(n); + n = nxt; + } + else + n = n.nextSibling; + } + else if (n.nodeType == 1) { // element node + X.removeWhite(n); + n = n.nextSibling; + } + else // any other node + n = n.nextSibling; + } + return e; + } + }; + if (xml.nodeType == 9) // document node + xml = xml.documentElement; + + var json_obj = X.toObj(X.removeWhite(xml)), json_str; + + if (typeof(JSON)=='object' && jQuery.isFunction(JSON.stringify) && false) { + var obj = {}; obj[xml.nodeName] = json_obj; + json_str = JSON.stringify(obj); + return json_str; + } else { + json_str = X.toJson(json_obj, xml.nodeName, ""); + return "{" + (tab ? json_str.replace(/\t/g, tab) : json_str.replace(/\t|\n/g, "")) + "}"; + } +} + +(function($){ +/** + * @brief exec_xml + * @author taggon + **/ +$.exec_xml = window.exec_xml = function(module, act, params, callback_func, response_tags, callback_func_arg, fo_obj) { + var xml_path = request_uri+"index.php" + if(!params) params = {}; + + // {{{ set parameters + if($.isArray(params)) params = arr2obj(params); + params['module'] = module; + params['act'] = act; + + if(typeof(xeVid)!='undefined') params['vid'] = xeVid; + if(typeof(response_tags)=="undefined" || response_tags.length<1) response_tags = ['error','message']; + else { + response_tags.push('error', 'message'); + } + // }}} set parameters + + // use ssl? + if ($.isArray(ssl_actions) && params['act'] && $.inArray(params['act'], ssl_actions) >= 0) + { + var url = default_url || request_uri; + var port = window.https_port || 443; + var _ul = $('').attr('href', url)[0]; + var target = 'https://' + _ul.hostname.replace(/:\d+$/, ''); + + if(port != 443) target += ':'+port; + if(_ul.pathname[0] != '/') target += '/'; + + target += _ul.pathname; + xml_path = target.replace(/\/$/, '')+'/index.php'; + } + + var _u1 = $('').attr('href', location.href)[0]; + var _u2 = $('').attr('href', xml_path)[0]; + + // 현 url과 ajax call 대상 url의 schema 또는 port가 다르면 직접 form 전송 + if(_u1.protocol != _u2.protocol || _u1.port != _u2.port) return send_by_form(xml_path, params); + + var xml = [], i = 0; + xml[i++] = ''; + xml[i++] = ''; + xml[i++] = ''; + + $.each(params, function(key, val) { + xml[i++] = '<'+key+'>'; + }); + + xml[i++] = ''; + xml[i++] = ''; + + var _xhr = null; + if (_xhr && _xhr.readyState != 0) _xhr.abort(); + + // 전송 성공시 + function onsuccess(data, textStatus, xhr) { + var resp_xml = $(data).find('response')[0], resp_obj, txt='', ret=[], tags={}, json_str=''; + + waiting_obj.css('visibility', 'hidden'); + + if(!resp_xml) { + alert(_xhr.responseText); + return null; + } + + json_str = xml2json(resp_xml, false, false); + resp_obj = (typeof(JSON)=='object' && $.isFunction(JSON.parse))?JSON.parse(json_str):eval('('+json_str+')'); + resp_obj = resp_obj.response; + + if (typeof(resp_obj)=='undefined') { + ret['error'] = -1; + ret['message'] = 'Unexpected error occured.'; + try { + if(typeof(txt=resp_xml.childNodes[0].firstChild.data)!='undefined') ret['message'] += '\r\n'+txt; + } catch(e){}; + return ret; + } + + $.each(response_tags, function(key, val){ tags[val] = true; }); + tags["redirect_url"] = true; + tags["act"] = true; + $.each(resp_obj, function(key, val){ if(tags[key]) ret[key] = val; }); + + if(ret['error'] != 0) { + if ($.isFunction($.exec_xml.onerror)) { + return $.exec_xml.onerror(module, act, ret, callback_func, response_tags, callback_func_arg, fo_obj); + } + + alert(ret['message'] || 'error!'); + return null; + } + + if(ret['redirect_url']) { + location.href = ret['redirect_url'].replace(/&/g, '&'); + return null; + } + + if($.isFunction(callback_func)) callback_func(ret, response_tags, callback_func_arg, fo_obj); + } + + // 모든 xml데이터는 POST방식으로 전송. try-catch문으로 오류 발생시 대처 + try { + $.ajax({ + url : xml_path, + type : 'POST', + dataType : 'xml', + data : xml.join('\n'), + contentType : 'text/plain', + beforeSend : function(xhr){ _xhr = xhr; }, + success : onsuccess, + error : function(xhr, textStatus) { + waiting_obj.css('visibility', 'hidden'); + + var msg = ''; + if (textStatus == 'parsererror') { + msg = 'The result is not valid XML :\n-------------------------------------\n'; + if(xhr.responseText == "") return; + msg += xhr.responseText.replace(/<[^>]+>/g, ''); + } else { + msg = textStatus; + } + + alert(msg); + } + }); + } catch(e) { + alert(e); + return; + } + + // ajax 통신중 대기 메세지 출력 (show_waiting_message값을 false로 세팅시 보이지 않음) + var waiting_obj = $('#waitingforserverresponse'); + if(show_waiting_message && waiting_obj.length) { + var d = $(document); + waiting_obj.html(waiting_message).css({ + 'top' : (d.scrollTop()+20)+'px', + 'left' : (d.scrollLeft()+20)+'px', + 'visibility' : 'visible' + }); + } +} +function send_by_form(url, params) { + var frame_id = 'xeTmpIframe'; + var form_id = 'xeVirtualForm'; + + if (!$('#'+frame_id).length) { + $(''.replace(/%id%/g, frame_id)).appendTo(document.body); + } + + $('#'+form_id).remove(); + var form = $('
'.replace(/%id%/g, form_id)).attr({ + 'id' : form_id, + 'method' : 'post', + 'action' : url, + 'target' : frame_id + }); + + params['xeVirtualRequestMethod'] = 'xml'; + params['xeRequestURI'] = location.href.replace(/#(.*)$/i,''); + params['xeVirtualRequestUrl'] = request_uri; + + $.each(params, function(key, value){ + $('').attr('name', key).attr('value', value).appendTo(form); + }); + + form.appendTo(document.body).submit(); +} +function arr2obj(arr) { + var ret = {}; + for(var key in arr) { + if(arr.hasOwnProperty(key)) ret[key] = arr[key]; + } + return ret; +} + +/** + * @brief exec_json (exec_xml와 같은 용도) + **/ +$.exec_json = function(action,data,func){ + if(typeof(data) == 'undefined') data = {}; + action = action.split("."); + if(action.length == 2){ + + if(show_waiting_message) { + $("#waitingforserverresponse").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible'); + } + + $.extend(data,{module:action[0],act:action[1]}); + if(typeof(xeVid)!='undefined') $.extend(data,{vid:xeVid}); + $.ajax({ + type:"POST" + ,dataType:"json" + ,url:request_uri + ,contentType:"application/json" + ,data:$.param(data) + ,success : function(data){ + $("#waitingforserverresponse").css('visibility','hidden'); + if(data.error > 0) alert(data.message); + if($.isFunction(func)) func(data); + } + }); + } +}; + +$.fn.exec_html = function(action,data,type,func,args){ + if(typeof(data) == 'undefined') data = {}; + if(!$.inArray(type, ['html','append','prepend'])) type = 'html'; + + var self = $(this); + action = action.split("."); + if(action.length == 2){ + if(show_waiting_message) { + $("#waitingforserverresponse").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible'); + } + + $.extend(data,{module:action[0],act:action[1]}); + $.ajax({ + type:"POST" + ,dataType:"html" + ,url:request_uri + ,data:$.param(data) + ,success : function(html){ + $("#waitingforserverresponse").css('visibility','hidden'); + self[type](html); + if($.isFunction(func)) func(args); + } + }); + } +}; +})(jQuery); diff --git a/common/js/src/xml_js_filter.js b/common/js/src/xml_js_filter.js new file mode 100644 index 000000000..6113346ef --- /dev/null +++ b/common/js/src/xml_js_filter.js @@ -0,0 +1,301 @@ +/** + * @file common/js/xml_js_filter.js + * @author taggon (taggon@gmail.com) + * @brief xml filter (validator) plugin + * + * A rule is a method validate one field. + * A filter is made up of one or more rules. + **/ +(function($){ + +var messages = []; +var rules = []; +var filters = []; +var callbacks = []; +var extras = {}; + +var Validator = xe.createApp('Validator', { + init : function() { + // {{{ add filters + // email + var regEmail = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)*$/; + this.cast('ADD_RULE', ['email', regEmail]); + this.cast('ADD_RULE', ['email_address', regEmail]); + + // userid + var regUserid = /^[a-z]+[\w-]*[a-z0-9_]+$/i; + this.cast('ADD_RULE', ['userid', regUserid]); + this.cast('ADD_RULE', ['user_id', regUserid]); + + // url + var regUrl = /^(https?|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/; + this.cast('ADD_RULE', ['url', regUrl]); + this.cast('ADD_RULE', ['homepage', regUrl]); + + // korean + var regKor = /^[가-힣]*$/; + this.cast('ADD_RULE', ['korean', regKor]); + + // korean_number + var regKorNum = /^[가-힣0-9]*$/; + this.cast('ADD_RULE', ['korean_number', regKorNum]); + + // alpha + var regAlpha = /^[a-z]*$/i; + this.cast('ADD_RULE', ['alpha', regAlpha]); + + // alpha_number + var regAlphaNum = /^[a-z][a-z0-9_]*$/i; + this.cast('ADD_RULE', ['alpha_number', regAlphaNum]); + + // number + var regNum = /^[0-9]*$/; + this.cast('ADD_RULE', ['number', regNum]); + // }}} add filters + }, + // run validator + run : function(oForm) { + var filter = ''; + + if (oForm._filter) filter = oForm._filter.value; + + var params = [oForm, filter]; + var result = this.cast('VALIDATE', params); + if (typeof result == 'undefined') result = false; + + return result; + }, + API_ONREADY : function() { + var self = this; + + // hook form submit event + $('form') + .each(function(){ + if (this.onsubmit) { + this['xe:onsubmit'] = this.onsubmit; + this.onsubmit = null; + } + }) + .submit(function(){ + var legacyFn = this['xe:onsubmit']; + var hasLegacyFn = $.isFunction(legacyFn); + var bResult = hasLegacyFn?legacyFn.apply(this):self.run(this); + + return bResult; + }); + }, + API_VALIDATE : function(sender, params) { + var self = this, result = true, form = params[0], filter=null, callback=null; + + if (form.elements['_filter']) filter = form.elements['_filter'].value; + if (!filter) return true; + if ($.isFunction(callbacks[filter])) callback = callbacks[filter]; + filter = $.extend({}, filters[filter.toLowerCase()] || {}, extras); + + $.each(filter, function(name) { + var _el = form.elements[name]; + + if (!_el) return true; + + var el = $(_el), val = $.trim(get_value(el)); + var minlen = parseInt(this.minlength) || 0; + var maxlen = parseInt(this.maxlength) || 0; + var rule = (this.rule || '').split(','); + + if (this.required && !val) return (result = (!!self.cast('ALERT', [form, name, 'isnull']) && false)); + if (!this.required && !val) return (result = true); + if ((minlen && val.length < minlen) || (maxlen && val.length > maxlen)) return (result = (!!self.cast('ALERT', [form, name, 'outofrange', minlen, maxlen]) && false)); + + if (this.equalto) { + var eq_val = get_value($(form.elements[this.equalto])); + if (eq_val != val) return (result = (!!self.cast('ALERT', [form, name, 'equalto']) && false)); + } + + $.each(rule, function() { + var ret = self.cast('APPLY_RULE', [this, val]); + if (!ret) { + self.cast('ALERT', [form, name, 'invalid_'+this]); + return (result = false); + } + }); + + if (!result) return false; + }); + + if (!result) return false; + if ($.isFunction(callback)) return callback(form); + + return true; + }, + API_ADD_RULE : function(sender, params) { + var name = params[0].toLowerCase(); + rules[name] = params[1]; + }, + API_DEL_RULE : function(sender, params) { + var name = params[0].toLowerCase(); + delete rules[name]; + }, + API_GET_RULE : function(sender, params) { + var name = params[0].toLowerCase(); + + if (rules[name]) { + return rules[name]; + } else { + return null; + } + }, + API_ADD_FILTER : function(sender, params) { + var name = params[0].toLowerCase(); + var filter = params[1]; + + filters[name] = filter; + }, + API_DEL_FILTER : function(sender, params) { + var name = params[0].toLowerCase(); + delete filters[name]; + }, + API_GET_FILTER : function(sender, params) { + var name = params[0].toLowerCase(); + + if (filters[name]) { + return filters[name]; + } else { + return null; + } + }, + API_ADD_EXTRA_FIELD : function(sender, params) { + var name = params[0].toLowerCase(); + var prop = params[1]; + + extras[name] = prop; + }, + API_GET_EXTRA_FIELD : function(sender, params) { + var name = params[0].toLowerCase(); + return extras[name]; + }, + API_DEL_EXTRA_FIELD : function(sender, params) { + var name = params[0].toLowerCase(); + delete extras[name]; + }, + API_APPLY_RULE : function(sender, params) { + var name = params[0].toLowerCase(); + var value = params[1]; + + if (typeof(rules[name]) == 'undefined') return true; // no filter + if ($.isFunction(rules[name])) return rules[name](value); + if (rules[name] instanceof RegExp) return rules[name].test(value); + + return true; + }, + API_ALERT : function(sender, params) { + var form = params[0]; + var field_name = params[1]; + var msg_code = params[2]; + var minlen = params[3]; + var maxlen = params[4]; + + var field_msg = this.cast('GET_MESSAGE', [field_name]); + var msg = this.cast('GET_MESSAGE', [msg_code]); + + if (msg != msg_code) msg = (msg.indexOf('%s')<0)?(field_msg+msg):(msg.replace('%s',field_msg)); + if (minlen||maxlen) msg += '('+(minlen||'')+'~'+(maxlen||'')+')'; + + this.cast('SHOW_ALERT', [msg]); + + // set focus + $(form.elements[field_name]).focus(); + }, + API_SHOW_ALERT : function(sender, params) { + alert(params[0]); + }, + API_ADD_MESSAGE : function(sender, params) { + var msg_code = params[0]; + var msg_str = params[1]; + + messages[msg_code] = msg_str; + }, + API_GET_MESSAGE : function(sender, params) { + var msg_code = params[0]; + + return messages[msg_code] || msg_code; + }, + API_ADD_CALLBACK : function(sender, params) { + var name = params[0]; + var func = params[1]; + + callbacks[name] = func; + }, + API_REMOVE_CALLBACK : function(sender, params) { + var name = params[0]; + + delete callbacks[name]; + } +}); + +var oValidator = new Validator; + +// register validator +xe.registerApp(oValidator); + +// 호환성을 위해 추가한 플러그인 - 에디터에서 컨텐트를 가져와서 설정한다. +var EditorStub = xe.createPlugin('editor_stub', { + API_BEFORE_VALIDATE : function(sender, params) { + var form = params[0]; + var seq = form.getAttribute('editor_sequence'); + + if (seq) { + try { + editorRelKeys[seq].content.value = editorRelKeys[seq].func(seq) || ''; + } catch(e) { } + } + } +}); +oValidator.registerPlugin(new EditorStub); + +// functions +function get_value(elem) { + var vals = []; + if (elem.is(':radio')){ + return elem.filter(':checked').val(); + } else if (elem.is(':checkbox')) { + elem.filter(':checked').each(function(){ + vals.push(this.value); + }); + return vals.join('|@|'); + } else { + return elem.val(); + } +} + +})(jQuery); + +/** + * @function filterAlertMessage + * @brief ajax로 서버에 요청후 결과를 처리할 callback_function을 지정하지 않았을 시 호출되는 기본 함수 + **/ +function filterAlertMessage(ret_obj) { + var error = ret_obj["error"]; + var message = ret_obj["message"]; + var act = ret_obj["act"]; + var redirect_url = ret_obj["redirect_url"]; + var url = location.href; + + if(typeof(message)!="undefined"&&message&&message!="success") alert(message); + + if(typeof(act)!="undefined" && act) url = current_url.setQuery("act", act); + else if(typeof(redirect_url)!="undefined" && redirect_url) url = redirect_url; + + if(url == location.href) url = url.replace(/#(.*)$/,''); + + location.href = url; +} + +/** + * @brief Function to process filters + * @deprecated + */ +function procFilter(fo_obj, filter_func) +{ + filter_func(fo_obj); + return false; +} diff --git a/common/js/x.js b/common/js/x.js index 72bfd87e4..95d2ee04c 100644 --- a/common/js/x.js +++ b/common/js/x.js @@ -1,676 +1,174 @@ -/** - * x.js compiled from X 4.0 with XC 0.27b. - * Distributed by GNU LGPL. For copyrights, license, documentation and more visit Cross-Browser.com - * Copyright 2001-2005 Michael Foster (Cross-Browser.com) - **/ -function xDeprecate(funcName) { - var msg = 'DEPRECATED : '+funcName+'() is deprecated function.'; - if (typeof console == 'object' && typeof console.log == 'function') { - console.log(msg); - } -} - -var xOp7Up,xOp6Dn,xIE4Up,xIE4,xIE5,xIE6,xNN4,xUA=navigator.userAgent.toLowerCase(); -if(window.opera){ - var i=xUA.indexOf('opera'); - if(i!=-1){ - var v=parseInt(xUA.charAt(i+6)); - xOp7Up=v>=7; - xOp6Dn=v<7; - } -} -else if(navigator.vendor!='KDE' && document.all && xUA.indexOf('msie')!=-1){ - xIE4Up=parseFloat(navigator.appVersion)>=4; - xIE4=xUA.indexOf('msie 4')!=-1; - xIE5=xUA.indexOf('msie 5')!=-1; - xIE6=xUA.indexOf('msie 6')!=-1; -} -else if(document.layers){xNN4=true;} -var xMac=xUA.indexOf('mac')!=-1; -var xFF=xUA.indexOf('firefox')!=-1; - -// (element, event(without 'on'), event listener(function name)[, caption]) -function xAddEventListener(e,eT,eL,cap) -{ - xDeprecate('xAddEventListener'); - if(!(e=xGetElementById(e))) return; - eT=eT.toLowerCase(); - if((!xIE4Up && !xOp7Up) && e==window) { - if(eT=='resize') { window.xPCW=xClientWidth(); window.xPCH=xClientHeight(); window.xREL=eL; xResizeEvent(); return; } - if(eT=='scroll') { window.xPSL=xScrollLeft(); window.xPST=xScrollTop(); window.xSEL=eL; xScrollEvent(); return; } - } - var eh='e.on'+eT+'=eL'; - if(e.addEventListener) e.addEventListener(eT,eL,cap); - else if(e.attachEvent) e.attachEvent('on'+eT,eL); - else eval(eh); -} -// called only from the above -function xResizeEvent() -{ - xDeprecate('xResizeEvent'); - if (window.xREL) setTimeout('xResizeEvent()', 250); - var cw = xClientWidth(), ch = xClientHeight(); - if (window.xPCW != cw || window.xPCH != ch) { window.xPCW = cw; window.xPCH = ch; if (window.xREL) window.xREL(); } -} - -function xScrollEvent() -{ - xDeprecate('xScrollEvent'); - if (window.xSEL) setTimeout('xScrollEvent()', 250); - var sl = xScrollLeft(), st = xScrollTop(); - if (window.xPSL != sl || window.xPST != st) { window.xPSL = sl; window.xPST = st; if (window.xSEL) window.xSEL(); } -} - -function xAppendChild(oParent, oChild) -{ - xDeprecate('xAppendChild'); - if (oParent.appendChild) return oParent.appendChild(oChild); - else return null; -} - -function xClientHeight() -{ - xDeprecate('xClientHeight'); - var h=0; - if(xOp6Dn) h=window.innerHeight; - else if(document.compatMode == 'CSS1Compat' && !window.opera && document.documentElement && document.documentElement.clientHeight) - h=document.documentElement.clientHeight; - else if(document.body && document.body.clientHeight) - h=document.body.clientHeight; - else if(xDef(window.innerWidth,window.innerHeight,document.width)) { - h=window.innerHeight; - if(document.width>window.innerWidth) h-=16; - } - return h; -} - -function xClientWidth() -{ - xDeprecate('xClientWidth'); - var w=0; - if(xOp6Dn) w=window.innerWidth; - else if(document.compatMode == 'CSS1Compat' && !window.opera && document.documentElement && document.documentElement.clientWidth) - w=document.documentElement.clientWidth; - else if(document.body && document.body.clientWidth) - w=document.body.clientWidth; - else if(xDef(window.innerWidth,window.innerHeight,document.height)) { - w=window.innerWidth; - if(document.height>window.innerHeight) w-=16; - } - return w; -} - -function xCreateElement(sTag) -{ - xDeprecate('xCreateElement'); - if (document.createElement) return document.createElement(sTag); - else return null; -} - -function xDef() -{ - xDeprecate('xDef'); - for(var i=0; i 0) { - var offset = document.cookie.indexOf(search); - if (offset != -1) { - offset += search.length; - var end = document.cookie.indexOf(";", offset); - if (end == -1) end = document.cookie.length; - value = unescape(document.cookie.substring(offset, end)); - } - } - return value; -} - -function xGetElementById(e) -{ - xDeprecate('xGetElementById'); - if(typeof(e)!='string') return e; - if(document.getElementById) e=document.getElementById(e); - else if(document.all) e=document.all[e]; - else e=null; - return e; -} - -function xGetElementsByAttribute(sTag, sAtt, sRE, fn) -{ - xDeprecate('xGetElementsByAttribute'); - var a, list, found = new Array(), re = new RegExp(sRE, 'i'); - list = xGetElementsByTagName(sTag); - for (var i = 0; i < list.length; ++i) { - a = list[i].getAttribute(sAtt); - if (!a) {a = list[i][sAtt];} - if (typeof(a)=='string' && a.search(re) != -1) { - found[found.length] = list[i]; - if (fn) fn(list[i]); - } - } - return found; -} - -function xGetElementsByClassName(c,p,t,f) -{ - xDeprecate('xGetElementsByClassName'); - var found = new Array(); - var re = new RegExp('\\b'+c+'\\b', 'i'); - var list = xGetElementsByTagName(t, p); - for (var i = 0; i < list.length; ++i) { - if (list[i].className && list[i].className.search(re) != -1) { - found[found.length] = list[i]; - if (f) f(list[i]); - } - } - return found; -} - -function xGetElementsByTagName(t,p) -{ - xDeprecate('xGetElementsByTagName'); - var list = null; - t = t || '*'; - p = p || document; - if (xIE4 || xIE5) { - if (t == '*') list = p.all; - else list = p.all.tags(t); - } - else if (p.getElementsByTagName) list = p.getElementsByTagName(t); - return list || new Array(); -} - -function xGetURLArguments() -{ - xDeprecate('xGetURLArguments'); - var idx = location.href.indexOf('?'); - var params = new Array(); - if (idx != -1) { - var pairs = location.href.substring(idx+1, location.href.length).split('&'); - for (var i=0; i=0) { - var pt=0,pb=0,bt=0,bb=0; - if (document.compatMode=='CSS1Compat') { - var gcs = xGetComputedStyle; - pt=gcs(e,'padding-top',1); - if (pt !== null) { - pb=gcs(e,'padding-bottom',1); - bt=gcs(e,'border-top-width',1); - bb=gcs(e,'border-bottom-width',1); - } - // Should we try this as a last resort? - // At this point getComputedStyle and currentStyle do not exist. - else if(xDef(e.offsetHeight,e.style.height)){ - e.style.height=h+'px'; - pt=e.offsetHeight-h; - } - } - h-=(pt+pb+bt+bb); - if(isNaN(h)||h<0) return null; - else e.style.height=h+'px'; - } - h=e.offsetHeight; - } - else if(css && xDef(e.style.pixelHeight)) { - if(h>=0) e.style.pixelHeight=h; - h=e.style.pixelHeight; - } - return h; -} - -function xHex(sn, digits, prefix) -{ - xDeprecate('xHex'); - var p = ''; - var n = Math.ceil(sn); - if (prefix) p = prefix; - n = n.toString(16); - for (var i=0; i < digits - n.length; ++i) { - p += '0'; - } - return p + n; -} - -function xHide(e){ xDeprecate('xHide'); return xVisibility(e,0);} - -function xInnerHtml(e,h) -{ - xDeprecate('xInnerHtml'); - if(!(e=xGetElementById(e)) || !xStr(e.innerHTML)) return null; - var s = e.innerHTML; - if (xStr(h)) {e.innerHTML = h;} - return s; -} - -function xLeft(e, iX) -{ - xDeprecate('xLeft'); - if(!(e=xGetElementById(e))) return 0; - var css=xDef(e.style); - if (css && xStr(e.style.left)) { - if(xNum(iX)) e.style.left=iX+'px'; - else { - iX=parseInt(e.style.left); - if(isNaN(iX)) iX=0; - } - } - else if(css && xDef(e.style.pixelLeft)) { - if(xNum(iX)) e.style.pixelLeft=iX; - else iX=e.style.pixelLeft; - } - return iX; -} - -function xMoveTo(e,x,y) -{ - xDeprecate('xMoveTo'); - xLeft(e,x); - xTop(e,y); -} - -function xName(e) -{ - xDeprecate('xName'); - if (!e) return e; - else if (e.id && e.id != "") return e.id; - else if (e.name && e.name != "") return e.name; - else if (e.nodeName && e.nodeName != "") return e.nodeName; - else if (e.tagName && e.tagName != "") return e.tagName; - else return e; -} - -function xNextSib(e,t) -{ - xDeprecate('xNextSib'); - var s = e ? e.nextSibling : null; - if (t) while (s && s.nodeName != t) { s = s.nextSibling; } - else while (s && s.nodeType != 1) { s = s.nextSibling; } - return s; -} - -function xNum() -{ - xDeprecate('xNum'); - for(var i=0; i=0) { - var pl=0,pr=0,bl=0,br=0; - if (document.compatMode=='CSS1Compat') { - var gcs = xGetComputedStyle; - pl=gcs(e,'padding-left',1); - if (pl !== null) { - pr=gcs(e,'padding-right',1); - bl=gcs(e,'border-left-width',1); - br=gcs(e,'border-right-width',1); - } - // Should we try this as a last resort? - // At this point getComputedStyle and currentStyle do not exist. - else if(xDef(e.offsetWidth,e.style.width)){ - e.style.width=w+'px'; - pl=e.offsetWidth-w; - } - } - w-=(pl+pr+bl+br); - if(isNaN(w)||w<0) return null; - else e.style.width=w+'px'; - } - w=e.offsetWidth; - } - else if(css && xDef(e.style.pixelWidth)) { - if(w>=0) e.style.pixelWidth=w; - w=e.style.pixelWidth; - } - return w; -} - -function xZIndex(e,uZ) -{ - xDeprecate('xZIndex'); - if(!(e=xGetElementById(e))) return 0; - if(e.style && xDef(e.style.zIndex)) { - if(xNum(uZ)) e.style.zIndex=uZ; - uZ=parseInt(e.style.zIndex); - } - return uZ; -} - -function xStopPropagation(evt) -{ - xDeprecate('xStopPropagation'); - if (evt && evt.stopPropagation) evt.stopPropagation(); - else if (window.event) window.event.cancelBubble = true; -} - +/** + * x.js compiled from X 4.0 with XC 0.27b. + * Distributed by GNU LGPL. For copyrights, license, documentation and more visit Cross-Browser.com + * Copyright 2001-2005 Michael Foster (Cross-Browser.com) + **/ +function xDeprecate(funcName){var msg='DEPRECATED : '+funcName+'() is deprecated function.';if(typeof console=='object'&&typeof console.log=='function'){console.log(msg);}} +var xOp7Up,xOp6Dn,xIE4Up,xIE4,xIE5,xIE6,xNN4,xUA=navigator.userAgent.toLowerCase();if(window.opera){var i=xUA.indexOf('opera');if(i!=-1){var v=parseInt(xUA.charAt(i+6));xOp7Up=v>=7;xOp6Dn=v<7;}} +else if(navigator.vendor!='KDE'&&document.all&&xUA.indexOf('msie')!=-1){xIE4Up=parseFloat(navigator.appVersion)>=4;xIE4=xUA.indexOf('msie 4')!=-1;xIE5=xUA.indexOf('msie 5')!=-1;xIE6=xUA.indexOf('msie 6')!=-1;} +else if(document.layers){xNN4=true;} +var xMac=xUA.indexOf('mac')!=-1;var xFF=xUA.indexOf('firefox')!=-1;function xAddEventListener(e,eT,eL,cap) +{xDeprecate('xAddEventListener');if(!(e=xGetElementById(e)))return;eT=eT.toLowerCase();if((!xIE4Up&&!xOp7Up)&&e==window){if(eT=='resize'){window.xPCW=xClientWidth();window.xPCH=xClientHeight();window.xREL=eL;xResizeEvent();return;} +if(eT=='scroll'){window.xPSL=xScrollLeft();window.xPST=xScrollTop();window.xSEL=eL;xScrollEvent();return;}} +var eh='e.on'+eT+'=eL';if(e.addEventListener)e.addEventListener(eT,eL,cap);else if(e.attachEvent)e.attachEvent('on'+eT,eL);else eval(eh);} +function xResizeEvent() +{xDeprecate('xResizeEvent');if(window.xREL)setTimeout('xResizeEvent()',250);var cw=xClientWidth(),ch=xClientHeight();if(window.xPCW!=cw||window.xPCH!=ch){window.xPCW=cw;window.xPCH=ch;if(window.xREL)window.xREL();}} +function xScrollEvent() +{xDeprecate('xScrollEvent');if(window.xSEL)setTimeout('xScrollEvent()',250);var sl=xScrollLeft(),st=xScrollTop();if(window.xPSL!=sl||window.xPST!=st){window.xPSL=sl;window.xPST=st;if(window.xSEL)window.xSEL();}} +function xAppendChild(oParent,oChild) +{xDeprecate('xAppendChild');if(oParent.appendChild)return oParent.appendChild(oChild);else return null;} +function xClientHeight() +{xDeprecate('xClientHeight');var h=0;if(xOp6Dn)h=window.innerHeight;else if(document.compatMode=='CSS1Compat'&&!window.opera&&document.documentElement&&document.documentElement.clientHeight) +h=document.documentElement.clientHeight;else if(document.body&&document.body.clientHeight) +h=document.body.clientHeight;else if(xDef(window.innerWidth,window.innerHeight,document.width)){h=window.innerHeight;if(document.width>window.innerWidth)h-=16;} +return h;} +function xClientWidth() +{xDeprecate('xClientWidth');var w=0;if(xOp6Dn)w=window.innerWidth;else if(document.compatMode=='CSS1Compat'&&!window.opera&&document.documentElement&&document.documentElement.clientWidth) +w=document.documentElement.clientWidth;else if(document.body&&document.body.clientWidth) +w=document.body.clientWidth;else if(xDef(window.innerWidth,window.innerHeight,document.height)){w=window.innerWidth;if(document.height>window.innerHeight)w-=16;} +return w;} +function xCreateElement(sTag) +{xDeprecate('xCreateElement');if(document.createElement)return document.createElement(sTag);else return null;} +function xDef() +{xDeprecate('xDef');for(var i=0;i0){var offset=document.cookie.indexOf(search);if(offset!=-1){offset+=search.length;var end=document.cookie.indexOf(";",offset);if(end==-1)end=document.cookie.length;value=unescape(document.cookie.substring(offset,end));}} +return value;} +function xGetElementById(e) +{xDeprecate('xGetElementById');if(typeof(e)!='string')return e;if(document.getElementById)e=document.getElementById(e);else if(document.all)e=document.all[e];else e=null;return e;} +function xGetElementsByAttribute(sTag,sAtt,sRE,fn) +{xDeprecate('xGetElementsByAttribute');var a,list,found=new Array(),re=new RegExp(sRE,'i');list=xGetElementsByTagName(sTag);for(var i=0;i=0){var pt=0,pb=0,bt=0,bb=0;if(document.compatMode=='CSS1Compat'){var gcs=xGetComputedStyle;pt=gcs(e,'padding-top',1);if(pt!==null){pb=gcs(e,'padding-bottom',1);bt=gcs(e,'border-top-width',1);bb=gcs(e,'border-bottom-width',1);} +else if(xDef(e.offsetHeight,e.style.height)){e.style.height=h+'px';pt=e.offsetHeight-h;}} +h-=(pt+pb+bt+bb);if(isNaN(h)||h<0)return null;else e.style.height=h+'px';} +h=e.offsetHeight;} +else if(css&&xDef(e.style.pixelHeight)){if(h>=0)e.style.pixelHeight=h;h=e.style.pixelHeight;} +return h;} +function xHex(sn,digits,prefix) +{xDeprecate('xHex');var p='';var n=Math.ceil(sn);if(prefix)p=prefix;n=n.toString(16);for(var i=0;i=0){var pl=0,pr=0,bl=0,br=0;if(document.compatMode=='CSS1Compat'){var gcs=xGetComputedStyle;pl=gcs(e,'padding-left',1);if(pl!==null){pr=gcs(e,'padding-right',1);bl=gcs(e,'border-left-width',1);br=gcs(e,'border-right-width',1);} +else if(xDef(e.offsetWidth,e.style.width)){e.style.width=w+'px';pl=e.offsetWidth-w;}} +w-=(pl+pr+bl+br);if(isNaN(w)||w<0)return null;else e.style.width=w+'px';} +w=e.offsetWidth;} +else if(css&&xDef(e.style.pixelWidth)){if(w>=0)e.style.pixelWidth=w;w=e.style.pixelWidth;} +return w;} +function xZIndex(e,uZ) +{xDeprecate('xZIndex');if(!(e=xGetElementById(e)))return 0;if(e.style&&xDef(e.style.zIndex)){if(xNum(uZ))e.style.zIndex=uZ;uZ=parseInt(e.style.zIndex);} +return uZ;} +function xStopPropagation(evt) +{xDeprecate('xStopPropagation');if(evt&&evt.stopPropagation)evt.stopPropagation();else if(window.event)window.event.cancelBubble=true;} \ No newline at end of file diff --git a/common/js/xml_handler.js b/common/js/xml_handler.js index 2f6689e16..74d2f0556 100644 --- a/common/js/xml_handler.js +++ b/common/js/xml_handler.js @@ -2,408 +2,71 @@ * @file common/js/xml_handler.js * @brief XE에서 ajax기능을 이용함에 있어 module, act를 잘 사용하기 위한 자바스크립트 **/ - -// xml handler을 이용하는 user function -var show_waiting_message = true; - -/* This work is licensed under Creative Commons GNU LGPL License. - - License: http://creativecommons.org/licenses/LGPL/2.1/ - Version: 0.9 - Author: Stefan Goessner/2006 - Web: http://goessner.net/ -*/ -function xml2json(xml, tab, ignoreAttrib) { - var X = { - toObj: function(xml) { - var o = {}; - if (xml.nodeType==1) { // element node .. - if (ignoreAttrib && xml.attributes.length) // element with attributes .. - for (var i=0; i 1) - o = X.escape(X.innerXml(xml)); - else - for (var n=xml.firstChild; n; n=n.nextSibling){ - //o["#cdata"] = X.escape(n.nodeValue); - o = X.escape(n.nodeValue); - } - } - } - if (!xml.attributes.length && !xml.firstChild) o = null; - } - else if (xml.nodeType==9) { // document.node - o = X.toObj(xml.documentElement); - } - else - alert("unhandled node type: " + xml.nodeType); - return o; - }, - toJson: function(o, name, ind) { - var json = name ? ("\""+name+"\"") : ""; - if (o instanceof Array) { - for (var i=0,n=o.length; i 1 ? ("\n"+ind+"\t"+o.join(",\n"+ind+"\t")+"\n"+ind) : o.join("")) + "]"; - } - else if (o == null) - json += (name&&":") + "null"; - else if (typeof(o) == "object") { - var arr = []; - for (var m in o) - arr[arr.length] = X.toJson(o[m], m, ind+"\t"); - json += (name?":{":"{") + (arr.length > 1 ? ("\n"+ind+"\t"+arr.join(",\n"+ind+"\t")+"\n"+ind) : arr.join("")) + "}"; - } - else if (typeof(o) == "string") - json += (name&&":") + "\"" + o.toString() + "\""; - else - json += (name&&":") + o.toString(); - return json; - }, - innerXml: function(node) { - var s = "" - if ("innerHTML" in node) - s = node.innerHTML; - else { - var asXml = function(n) { - var s = ""; - if (n.nodeType == 1) { - s += "<" + n.nodeName; - for (var i=0; i"; - } - else - s += "/>"; - } - else if (n.nodeType == 3) - s += n.nodeValue; - else if (n.nodeType == 4) - s += ""; - return s; - }; - for (var c=node.firstChild; c; c=c.nextSibling) - s += asXml(c); - } - return s; - }, - escape: function(txt) { - return txt.replace(/[\\]/g, "\\\\") - .replace(/[\"]/g, '\\"') - .replace(/[\n]/g, '\\n') - .replace(/[\r]/g, '\\r'); - }, - removeWhite: function(e) { - e.normalize(); - for (var n = e.firstChild; n; ) { - if (n.nodeType == 3) { // text node - if (!n.nodeValue.match(/[^ \f\n\r\t\v]/)) { // pure whitespace text node - var nxt = n.nextSibling; - e.removeChild(n); - n = nxt; - } - else - n = n.nextSibling; - } - else if (n.nodeType == 1) { // element node - X.removeWhite(n); - n = n.nextSibling; - } - else // any other node - n = n.nextSibling; - } - return e; - } - }; - if (xml.nodeType == 9) // document node - xml = xml.documentElement; - - var json_obj = X.toObj(X.removeWhite(xml)), json_str; - - if (typeof(JSON)=='object' && jQuery.isFunction(JSON.stringify) && false) { - var obj = {}; obj[xml.nodeName] = json_obj; - json_str = JSON.stringify(obj); - return json_str; - } else { - json_str = X.toJson(json_obj, xml.nodeName, ""); - return "{" + (tab ? json_str.replace(/\t/g, tab) : json_str.replace(/\t|\n/g, "")) + "}"; - } -} - -(function($){ -/** - * @brief exec_xml - * @author taggon - **/ -$.exec_xml = window.exec_xml = function(module, act, params, callback_func, response_tags, callback_func_arg, fo_obj) { - var xml_path = request_uri+"index.php" - if(!params) params = {}; - - // {{{ set parameters - if($.isArray(params)) params = arr2obj(params); - params['module'] = module; - params['act'] = act; - - if(typeof(xeVid)!='undefined') params['vid'] = xeVid; - if(typeof(response_tags)=="undefined" || response_tags.length<1) response_tags = ['error','message']; - else { - response_tags.push('error', 'message'); - } - // }}} set parameters - - // use ssl? - if ($.isArray(ssl_actions) && params['act'] && $.inArray(params['act'], ssl_actions) >= 0) - { - var url = default_url || request_uri; - var port = window.https_port || 443; - var _ul = $('
').attr('href', url)[0]; - var target = 'https://' + _ul.hostname.replace(/:\d+$/, ''); - - if(port != 443) target += ':'+port; - if(_ul.pathname[0] != '/') target += '/'; - - target += _ul.pathname; - xml_path = target.replace(/\/$/, '')+'/index.php'; - } - - var _u1 = $('').attr('href', location.href)[0]; - var _u2 = $('').attr('href', xml_path)[0]; - - // 현 url과 ajax call 대상 url의 schema 또는 port가 다르면 직접 form 전송 - if(_u1.protocol != _u2.protocol || _u1.port != _u2.port) return send_by_form(xml_path, params); - - var xml = [], i = 0; - xml[i++] = ''; - xml[i++] = ''; - xml[i++] = ''; - - $.each(params, function(key, val) { - xml[i++] = '<'+key+'>'; - }); - - xml[i++] = ''; - xml[i++] = ''; - - var _xhr = null; - if (_xhr && _xhr.readyState != 0) _xhr.abort(); - - // 전송 성공시 - function onsuccess(data, textStatus, xhr) { - var resp_xml = $(data).find('response')[0], resp_obj, txt='', ret=[], tags={}, json_str=''; - - waiting_obj.css('visibility', 'hidden'); - - if(!resp_xml) { - alert(_xhr.responseText); - return null; - } - - json_str = xml2json(resp_xml, false, false); - resp_obj = (typeof(JSON)=='object' && $.isFunction(JSON.parse))?JSON.parse(json_str):eval('('+json_str+')'); - resp_obj = resp_obj.response; - - if (typeof(resp_obj)=='undefined') { - ret['error'] = -1; - ret['message'] = 'Unexpected error occured.'; - try { - if(typeof(txt=resp_xml.childNodes[0].firstChild.data)!='undefined') ret['message'] += '\r\n'+txt; - } catch(e){}; - return ret; - } - - $.each(response_tags, function(key, val){ tags[val] = true; }); - tags["redirect_url"] = true; - tags["act"] = true; - $.each(resp_obj, function(key, val){ if(tags[key]) ret[key] = val; }); - - if(ret['error'] != 0) { - if ($.isFunction($.exec_xml.onerror)) { - return $.exec_xml.onerror(module, act, ret, callback_func, response_tags, callback_func_arg, fo_obj); - } - - alert(ret['message'] || 'error!'); - return null; - } - - if(ret['redirect_url']) { - location.href = ret['redirect_url'].replace(/&/g, '&'); - return null; - } - - if($.isFunction(callback_func)) callback_func(ret, response_tags, callback_func_arg, fo_obj); - } - - // 모든 xml데이터는 POST방식으로 전송. try-catch문으로 오류 발생시 대처 - try { - $.ajax({ - url : xml_path, - type : 'POST', - dataType : 'xml', - data : xml.join('\n'), - contentType : 'text/plain', - beforeSend : function(xhr){ _xhr = xhr; }, - success : onsuccess, - error : function(xhr, textStatus) { - waiting_obj.css('visibility', 'hidden'); - - var msg = ''; - if (textStatus == 'parsererror') { - msg = 'The result is not valid XML :\n-------------------------------------\n'; - if(xhr.responseText == "") return; - msg += xhr.responseText.replace(/<[^>]+>/g, ''); - } else { - msg = textStatus; - } - - alert(msg); - } - }); - } catch(e) { - alert(e); - return; - } - - // ajax 통신중 대기 메세지 출력 (show_waiting_message값을 false로 세팅시 보이지 않음) - var waiting_obj = $('#waitingforserverresponse'); - if(show_waiting_message && waiting_obj.length) { - var d = $(document); - waiting_obj.html(waiting_message).css({ - 'top' : (d.scrollTop()+20)+'px', - 'left' : (d.scrollLeft()+20)+'px', - 'visibility' : 'visible' - }); - } -} -function send_by_form(url, params) { - var frame_id = 'xeTmpIframe'; - var form_id = 'xeVirtualForm'; - - if (!$('#'+frame_id).length) { - $(''.replace(/%id%/g, frame_id)).appendTo(document.body); - } - - $('#'+form_id).remove(); - var form = $('
'.replace(/%id%/g, form_id)).attr({ - 'id' : form_id, - 'method' : 'post', - 'action' : url, - 'target' : frame_id - }); - - params['xeVirtualRequestMethod'] = 'xml'; - params['xeRequestURI'] = location.href.replace(/#(.*)$/i,''); - params['xeVirtualRequestUrl'] = request_uri; - - $.each(params, function(key, value){ - $('').attr('name', key).attr('value', value).appendTo(form); - }); - - form.appendTo(document.body).submit(); -} -function arr2obj(arr) { - var ret = {}; - for(var key in arr) { - if(arr.hasOwnProperty(key)) ret[key] = arr[key]; - } - return ret; -} - -/** - * @brief exec_json (exec_xml와 같은 용도) - **/ -$.exec_json = function(action,data,func){ - if(typeof(data) == 'undefined') data = {}; - action = action.split("."); - if(action.length == 2){ - - if(show_waiting_message) { - $("#waitingforserverresponse").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible'); - } - - $.extend(data,{module:action[0],act:action[1]}); - if(typeof(xeVid)!='undefined') $.extend(data,{vid:xeVid}); - $.ajax({ - type:"POST" - ,dataType:"json" - ,url:request_uri - ,contentType:"application/json" - ,data:$.param(data) - ,success : function(data){ - $("#waitingforserverresponse").css('visibility','hidden'); - if(data.error > 0) alert(data.message); - if($.isFunction(func)) func(data); - } - }); - } -}; - -$.fn.exec_html = function(action,data,type,func,args){ - if(typeof(data) == 'undefined') data = {}; - if(!$.inArray(type, ['html','append','prepend'])) type = 'html'; - - var self = $(this); - action = action.split("."); - if(action.length == 2){ - if(show_waiting_message) { - $("#waitingforserverresponse").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible'); - } - - $.extend(data,{module:action[0],act:action[1]}); - $.ajax({ - type:"POST" - ,dataType:"html" - ,url:request_uri - ,data:$.param(data) - ,success : function(html){ - $("#waitingforserverresponse").css('visibility','hidden'); - self[type](html); - if($.isFunction(func)) func(args); - } - }); - } -}; -})(jQuery); +var show_waiting_message=true;function xml2json(xml,tab,ignoreAttrib){var X={toObj:function(xml){var o={};if(xml.nodeType==1){if(ignoreAttrib&&xml.attributes.length) +for(var i=0;i1) +o=X.escape(X.innerXml(xml));else +for(var n=xml.firstChild;n;n=n.nextSibling){o=X.escape(n.nodeValue);}}} +if(!xml.attributes.length&&!xml.firstChild)o=null;} +else if(xml.nodeType==9){o=X.toObj(xml.documentElement);} +else +alert("unhandled node type: "+xml.nodeType);return o;},toJson:function(o,name,ind){var json=name?("\""+name+"\""):"";if(o instanceof Array){for(var i=0,n=o.length;i1?("\n"+ind+"\t"+o.join(",\n"+ind+"\t")+"\n"+ind):o.join(""))+"]";} +else if(o==null) +json+=(name&&":")+"null";else if(typeof(o)=="object"){var arr=[];for(var m in o) +arr[arr.length]=X.toJson(o[m],m,ind+"\t");json+=(name?":{":"{")+(arr.length>1?("\n"+ind+"\t"+arr.join(",\n"+ind+"\t")+"\n"+ind):arr.join(""))+"}";} +else if(typeof(o)=="string") +json+=(name&&":")+"\""+o.toString()+"\"";else +json+=(name&&":")+o.toString();return json;},innerXml:function(node){var s="" +if("innerHTML"in node) +s=node.innerHTML;else{var asXml=function(n){var s="";if(n.nodeType==1){s+="<"+n.nodeName;for(var i=0;i";for(var c=n.firstChild;c;c=c.nextSibling) +s+=asXml(c);s+="";} +else +s+="/>";} +else if(n.nodeType==3) +s+=n.nodeValue;else if(n.nodeType==4) +s+="";return s;};for(var c=node.firstChild;c;c=c.nextSibling) +s+=asXml(c);} +return s;},escape:function(txt){return txt.replace(/[\\]/g,"\\\\").replace(/[\"]/g,'\\"').replace(/[\n]/g,'\\n').replace(/[\r]/g,'\\r');},removeWhite:function(e){e.normalize();for(var n=e.firstChild;n;){if(n.nodeType==3){if(!n.nodeValue.match(/[^ \f\n\r\t\v]/)){var nxt=n.nextSibling;e.removeChild(n);n=nxt;} +else +n=n.nextSibling;} +else if(n.nodeType==1){X.removeWhite(n);n=n.nextSibling;} +else +n=n.nextSibling;} +return e;}};if(xml.nodeType==9) +xml=xml.documentElement;var json_obj=X.toObj(X.removeWhite(xml)),json_str;if(typeof(JSON)=='object'&&jQuery.isFunction(JSON.stringify)&&false){var obj={};obj[xml.nodeName]=json_obj;json_str=JSON.stringify(obj);return json_str;}else{json_str=X.toJson(json_obj,xml.nodeName,"");return"{"+(tab?json_str.replace(/\t/g,tab):json_str.replace(/\t|\n/g,""))+"}";}} +(function($){$.exec_xml=window.exec_xml=function(module,act,params,callback_func,response_tags,callback_func_arg,fo_obj){var xml_path=request_uri+"index.php" +if(!params)params={};if($.isArray(params))params=arr2obj(params);params['module']=module;params['act']=act;if(typeof(xeVid)!='undefined')params['vid']=xeVid;if(typeof(response_tags)=="undefined"||response_tags.length<1)response_tags=['error','message'];else{response_tags.push('error','message');} +if($.isArray(ssl_actions)&¶ms['act']&&$.inArray(params['act'],ssl_actions)>=0) +{var url=default_url||request_uri;var port=window.https_port||443;var _ul=$('
').attr('href',url)[0];var target='https://'+_ul.hostname.replace(/:\d+$/,'');if(port!=443)target+=':'+port;if(_ul.pathname[0]!='/')target+='/';target+=_ul.pathname;xml_path=target.replace(/\/$/,'')+'/index.php';} +var _u1=$('').attr('href',location.href)[0];var _u2=$('').attr('href',xml_path)[0];if(_u1.protocol!=_u2.protocol||_u1.port!=_u2.port)return send_by_form(xml_path,params);var xml=[],i=0;xml[i++]='';xml[i++]='';xml[i++]='';$.each(params,function(key,val){xml[i++]='<'+key+'>';});xml[i++]='';xml[i++]='';var _xhr=null;if(_xhr&&_xhr.readyState!=0)_xhr.abort();function onsuccess(data,textStatus,xhr){var resp_xml=$(data).find('response')[0],resp_obj,txt='',ret=[],tags={},json_str='';waiting_obj.css('visibility','hidden');if(!resp_xml){alert(_xhr.responseText);return null;} +json_str=xml2json(resp_xml,false,false);resp_obj=(typeof(JSON)=='object'&&$.isFunction(JSON.parse))?JSON.parse(json_str):eval('('+json_str+')');resp_obj=resp_obj.response;if(typeof(resp_obj)=='undefined'){ret['error']=-1;ret['message']='Unexpected error occured.';try{if(typeof(txt=resp_xml.childNodes[0].firstChild.data)!='undefined')ret['message']+='\r\n'+txt;}catch(e){};return ret;} +$.each(response_tags,function(key,val){tags[val]=true;});tags["redirect_url"]=true;tags["act"]=true;$.each(resp_obj,function(key,val){if(tags[key])ret[key]=val;});if(ret['error']!=0){if($.isFunction($.exec_xml.onerror)){return $.exec_xml.onerror(module,act,ret,callback_func,response_tags,callback_func_arg,fo_obj);} +alert(ret['message']||'error!');return null;} +if(ret['redirect_url']){location.href=ret['redirect_url'].replace(/&/g,'&');return null;} +if($.isFunction(callback_func))callback_func(ret,response_tags,callback_func_arg,fo_obj);} +try{$.ajax({url:xml_path,type:'POST',dataType:'xml',data:xml.join('\n'),contentType:'text/plain',beforeSend:function(xhr){_xhr=xhr;},success:onsuccess,error:function(xhr,textStatus){waiting_obj.css('visibility','hidden');var msg='';if(textStatus=='parsererror'){msg='The result is not valid XML :\n-------------------------------------\n';if(xhr.responseText=="")return;msg+=xhr.responseText.replace(/<[^>]+>/g,'');}else{msg=textStatus;} +alert(msg);}});}catch(e){alert(e);return;} +var waiting_obj=$('#waitingforserverresponse');if(show_waiting_message&&waiting_obj.length){var d=$(document);waiting_obj.html(waiting_message).css({'top':(d.scrollTop()+20)+'px','left':(d.scrollLeft()+20)+'px','visibility':'visible'});}} +function send_by_form(url,params){var frame_id='xeTmpIframe';var form_id='xeVirtualForm';if(!$('#'+frame_id).length){$(''.replace(/%id%/g,frame_id)).appendTo(document.body);} +$('#'+form_id).remove();var form=$('
'.replace(/%id%/g,form_id)).attr({'id':form_id,'method':'post','action':url,'target':frame_id});params['xeVirtualRequestMethod']='xml';params['xeRequestURI']=location.href.replace(/#(.*)$/i,'');params['xeVirtualRequestUrl']=request_uri;$.each(params,function(key,value){$('').attr('name',key).attr('value',value).appendTo(form);});form.appendTo(document.body).submit();} +function arr2obj(arr){var ret={};for(var key in arr){if(arr.hasOwnProperty(key))ret[key]=arr[key];} +return ret;} +$.exec_json=function(action,data,func){if(typeof(data)=='undefined')data={};action=action.split(".");if(action.length==2){if(show_waiting_message){$("#waitingforserverresponse").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible');} +$.extend(data,{module:action[0],act:action[1]});if(typeof(xeVid)!='undefined')$.extend(data,{vid:xeVid});$.ajax({type:"POST",dataType:"json",url:request_uri,contentType:"application/json",data:$.param(data),success:function(data){$("#waitingforserverresponse").css('visibility','hidden');if(data.error>0)alert(data.message);if($.isFunction(func))func(data);}});}};$.fn.exec_html=function(action,data,type,func,args){if(typeof(data)=='undefined')data={};if(!$.inArray(type,['html','append','prepend']))type='html';var self=$(this);action=action.split(".");if(action.length==2){if(show_waiting_message){$("#waitingforserverresponse").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible');} +$.extend(data,{module:action[0],act:action[1]});$.ajax({type:"POST",dataType:"html",url:request_uri,data:$.param(data),success:function(html){$("#waitingforserverresponse").css('visibility','hidden');self[type](html);if($.isFunction(func))func(args);}});}};})(jQuery); \ No newline at end of file diff --git a/common/js/xml_js_filter.js b/common/js/xml_js_filter.js index 6113346ef..9f727cd93 100644 --- a/common/js/xml_js_filter.js +++ b/common/js/xml_js_filter.js @@ -6,296 +6,7 @@ * A rule is a method validate one field. * A filter is made up of one or more rules. **/ -(function($){ - -var messages = []; -var rules = []; -var filters = []; -var callbacks = []; -var extras = {}; - -var Validator = xe.createApp('Validator', { - init : function() { - // {{{ add filters - // email - var regEmail = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)*$/; - this.cast('ADD_RULE', ['email', regEmail]); - this.cast('ADD_RULE', ['email_address', regEmail]); - - // userid - var regUserid = /^[a-z]+[\w-]*[a-z0-9_]+$/i; - this.cast('ADD_RULE', ['userid', regUserid]); - this.cast('ADD_RULE', ['user_id', regUserid]); - - // url - var regUrl = /^(https?|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/; - this.cast('ADD_RULE', ['url', regUrl]); - this.cast('ADD_RULE', ['homepage', regUrl]); - - // korean - var regKor = /^[가-힣]*$/; - this.cast('ADD_RULE', ['korean', regKor]); - - // korean_number - var regKorNum = /^[가-힣0-9]*$/; - this.cast('ADD_RULE', ['korean_number', regKorNum]); - - // alpha - var regAlpha = /^[a-z]*$/i; - this.cast('ADD_RULE', ['alpha', regAlpha]); - - // alpha_number - var regAlphaNum = /^[a-z][a-z0-9_]*$/i; - this.cast('ADD_RULE', ['alpha_number', regAlphaNum]); - - // number - var regNum = /^[0-9]*$/; - this.cast('ADD_RULE', ['number', regNum]); - // }}} add filters - }, - // run validator - run : function(oForm) { - var filter = ''; - - if (oForm._filter) filter = oForm._filter.value; - - var params = [oForm, filter]; - var result = this.cast('VALIDATE', params); - if (typeof result == 'undefined') result = false; - - return result; - }, - API_ONREADY : function() { - var self = this; - - // hook form submit event - $('form') - .each(function(){ - if (this.onsubmit) { - this['xe:onsubmit'] = this.onsubmit; - this.onsubmit = null; - } - }) - .submit(function(){ - var legacyFn = this['xe:onsubmit']; - var hasLegacyFn = $.isFunction(legacyFn); - var bResult = hasLegacyFn?legacyFn.apply(this):self.run(this); - - return bResult; - }); - }, - API_VALIDATE : function(sender, params) { - var self = this, result = true, form = params[0], filter=null, callback=null; - - if (form.elements['_filter']) filter = form.elements['_filter'].value; - if (!filter) return true; - if ($.isFunction(callbacks[filter])) callback = callbacks[filter]; - filter = $.extend({}, filters[filter.toLowerCase()] || {}, extras); - - $.each(filter, function(name) { - var _el = form.elements[name]; - - if (!_el) return true; - - var el = $(_el), val = $.trim(get_value(el)); - var minlen = parseInt(this.minlength) || 0; - var maxlen = parseInt(this.maxlength) || 0; - var rule = (this.rule || '').split(','); - - if (this.required && !val) return (result = (!!self.cast('ALERT', [form, name, 'isnull']) && false)); - if (!this.required && !val) return (result = true); - if ((minlen && val.length < minlen) || (maxlen && val.length > maxlen)) return (result = (!!self.cast('ALERT', [form, name, 'outofrange', minlen, maxlen]) && false)); - - if (this.equalto) { - var eq_val = get_value($(form.elements[this.equalto])); - if (eq_val != val) return (result = (!!self.cast('ALERT', [form, name, 'equalto']) && false)); - } - - $.each(rule, function() { - var ret = self.cast('APPLY_RULE', [this, val]); - if (!ret) { - self.cast('ALERT', [form, name, 'invalid_'+this]); - return (result = false); - } - }); - - if (!result) return false; - }); - - if (!result) return false; - if ($.isFunction(callback)) return callback(form); - - return true; - }, - API_ADD_RULE : function(sender, params) { - var name = params[0].toLowerCase(); - rules[name] = params[1]; - }, - API_DEL_RULE : function(sender, params) { - var name = params[0].toLowerCase(); - delete rules[name]; - }, - API_GET_RULE : function(sender, params) { - var name = params[0].toLowerCase(); - - if (rules[name]) { - return rules[name]; - } else { - return null; - } - }, - API_ADD_FILTER : function(sender, params) { - var name = params[0].toLowerCase(); - var filter = params[1]; - - filters[name] = filter; - }, - API_DEL_FILTER : function(sender, params) { - var name = params[0].toLowerCase(); - delete filters[name]; - }, - API_GET_FILTER : function(sender, params) { - var name = params[0].toLowerCase(); - - if (filters[name]) { - return filters[name]; - } else { - return null; - } - }, - API_ADD_EXTRA_FIELD : function(sender, params) { - var name = params[0].toLowerCase(); - var prop = params[1]; - - extras[name] = prop; - }, - API_GET_EXTRA_FIELD : function(sender, params) { - var name = params[0].toLowerCase(); - return extras[name]; - }, - API_DEL_EXTRA_FIELD : function(sender, params) { - var name = params[0].toLowerCase(); - delete extras[name]; - }, - API_APPLY_RULE : function(sender, params) { - var name = params[0].toLowerCase(); - var value = params[1]; - - if (typeof(rules[name]) == 'undefined') return true; // no filter - if ($.isFunction(rules[name])) return rules[name](value); - if (rules[name] instanceof RegExp) return rules[name].test(value); - - return true; - }, - API_ALERT : function(sender, params) { - var form = params[0]; - var field_name = params[1]; - var msg_code = params[2]; - var minlen = params[3]; - var maxlen = params[4]; - - var field_msg = this.cast('GET_MESSAGE', [field_name]); - var msg = this.cast('GET_MESSAGE', [msg_code]); - - if (msg != msg_code) msg = (msg.indexOf('%s')<0)?(field_msg+msg):(msg.replace('%s',field_msg)); - if (minlen||maxlen) msg += '('+(minlen||'')+'~'+(maxlen||'')+')'; - - this.cast('SHOW_ALERT', [msg]); - - // set focus - $(form.elements[field_name]).focus(); - }, - API_SHOW_ALERT : function(sender, params) { - alert(params[0]); - }, - API_ADD_MESSAGE : function(sender, params) { - var msg_code = params[0]; - var msg_str = params[1]; - - messages[msg_code] = msg_str; - }, - API_GET_MESSAGE : function(sender, params) { - var msg_code = params[0]; - - return messages[msg_code] || msg_code; - }, - API_ADD_CALLBACK : function(sender, params) { - var name = params[0]; - var func = params[1]; - - callbacks[name] = func; - }, - API_REMOVE_CALLBACK : function(sender, params) { - var name = params[0]; - - delete callbacks[name]; - } -}); - -var oValidator = new Validator; - -// register validator -xe.registerApp(oValidator); - -// 호환성을 위해 추가한 플러그인 - 에디터에서 컨텐트를 가져와서 설정한다. -var EditorStub = xe.createPlugin('editor_stub', { - API_BEFORE_VALIDATE : function(sender, params) { - var form = params[0]; - var seq = form.getAttribute('editor_sequence'); - - if (seq) { - try { - editorRelKeys[seq].content.value = editorRelKeys[seq].func(seq) || ''; - } catch(e) { } - } - } -}); -oValidator.registerPlugin(new EditorStub); - -// functions -function get_value(elem) { - var vals = []; - if (elem.is(':radio')){ - return elem.filter(':checked').val(); - } else if (elem.is(':checkbox')) { - elem.filter(':checked').each(function(){ - vals.push(this.value); - }); - return vals.join('|@|'); - } else { - return elem.val(); - } -} - -})(jQuery); - -/** - * @function filterAlertMessage - * @brief ajax로 서버에 요청후 결과를 처리할 callback_function을 지정하지 않았을 시 호출되는 기본 함수 - **/ -function filterAlertMessage(ret_obj) { - var error = ret_obj["error"]; - var message = ret_obj["message"]; - var act = ret_obj["act"]; - var redirect_url = ret_obj["redirect_url"]; - var url = location.href; - - if(typeof(message)!="undefined"&&message&&message!="success") alert(message); - - if(typeof(act)!="undefined" && act) url = current_url.setQuery("act", act); - else if(typeof(redirect_url)!="undefined" && redirect_url) url = redirect_url; - - if(url == location.href) url = url.replace(/#(.*)$/,''); - - location.href = url; -} - -/** - * @brief Function to process filters - * @deprecated - */ -function procFilter(fo_obj, filter_func) -{ - filter_func(fo_obj); - return false; -} +(function($){var messages=[];var rules=[];var filters=[];var callbacks=[];var extras={};var Validator=xe.createApp('Validator',{init:function(){var regEmail=/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)*$/;this.cast('ADD_RULE',['email',regEmail]);this.cast('ADD_RULE',['email_address',regEmail]);var regUserid=/^[a-z]+[\w-]*[a-z0-9_]+$/i;this.cast('ADD_RULE',['userid',regUserid]);this.cast('ADD_RULE',['user_id',regUserid]);var regUrl=/^(https?|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/;this.cast('ADD_RULE',['url',regUrl]);this.cast('ADD_RULE',['homepage',regUrl]);var regKor=/^[가-힣]*$/;this.cast('ADD_RULE',['korean',regKor]);var regKorNum=/^[가-힣0-9]*$/;this.cast('ADD_RULE',['korean_number',regKorNum]);var regAlpha=/^[a-z]*$/i;this.cast('ADD_RULE',['alpha',regAlpha]);var regAlphaNum=/^[a-z][a-z0-9_]*$/i;this.cast('ADD_RULE',['alpha_number',regAlphaNum]);var regNum=/^[0-9]*$/;this.cast('ADD_RULE',['number',regNum]);},run:function(oForm){var filter='';if(oForm._filter)filter=oForm._filter.value;var params=[oForm,filter];var result=this.cast('VALIDATE',params);if(typeof result=='undefined')result=false;return result;},API_ONREADY:function(){var self=this;$('form').each(function(){if(this.onsubmit){this['xe:onsubmit']=this.onsubmit;this.onsubmit=null;}}).submit(function(){var legacyFn=this['xe:onsubmit'];var hasLegacyFn=$.isFunction(legacyFn);var bResult=hasLegacyFn?legacyFn.apply(this):self.run(this);return bResult;});},API_VALIDATE:function(sender,params){var self=this,result=true,form=params[0],filter=null,callback=null;if(form.elements['_filter'])filter=form.elements['_filter'].value;if(!filter)return true;if($.isFunction(callbacks[filter]))callback=callbacks[filter];filter=$.extend({},filters[filter.toLowerCase()]||{},extras);$.each(filter,function(name){var _el=form.elements[name];if(!_el)return true;var el=$(_el),val=$.trim(get_value(el));var minlen=parseInt(this.minlength)||0;var maxlen=parseInt(this.maxlength)||0;var rule=(this.rule||'').split(',');if(this.required&&!val)return(result=(!!self.cast('ALERT',[form,name,'isnull'])&&false));if(!this.required&&!val)return(result=true);if((minlen&&val.lengthmaxlen))return(result=(!!self.cast('ALERT',[form,name,'outofrange',minlen,maxlen])&&false));if(this.equalto){var eq_val=get_value($(form.elements[this.equalto]));if(eq_val!=val)return(result=(!!self.cast('ALERT',[form,name,'equalto'])&&false));} +$.each(rule,function(){var ret=self.cast('APPLY_RULE',[this,val]);if(!ret){self.cast('ALERT',[form,name,'invalid_'+this]);return(result=false);}});if(!result)return false;});if(!result)return false;if($.isFunction(callback))return callback(form);return true;},API_ADD_RULE:function(sender,params){var name=params[0].toLowerCase();rules[name]=params[1];},API_DEL_RULE:function(sender,params){var name=params[0].toLowerCase();delete rules[name];},API_GET_RULE:function(sender,params){var name=params[0].toLowerCase();if(rules[name]){return rules[name];}else{return null;}},API_ADD_FILTER:function(sender,params){var name=params[0].toLowerCase();var filter=params[1];filters[name]=filter;},API_DEL_FILTER:function(sender,params){var name=params[0].toLowerCase();delete filters[name];},API_GET_FILTER:function(sender,params){var name=params[0].toLowerCase();if(filters[name]){return filters[name];}else{return null;}},API_ADD_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();var prop=params[1];extras[name]=prop;},API_GET_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();return extras[name];},API_DEL_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();delete extras[name];},API_APPLY_RULE:function(sender,params){var name=params[0].toLowerCase();var value=params[1];if(typeof(rules[name])=='undefined')return true;if($.isFunction(rules[name]))return rules[name](value);if(rules[name]instanceof RegExp)return rules[name].test(value);return true;},API_ALERT:function(sender,params){var form=params[0];var field_name=params[1];var msg_code=params[2];var minlen=params[3];var maxlen=params[4];var field_msg=this.cast('GET_MESSAGE',[field_name]);var msg=this.cast('GET_MESSAGE',[msg_code]);if(msg!=msg_code)msg=(msg.indexOf('%s')<0)?(field_msg+msg):(msg.replace('%s',field_msg));if(minlen||maxlen)msg+='('+(minlen||'')+'~'+(maxlen||'')+')';this.cast('SHOW_ALERT',[msg]);$(form.elements[field_name]).focus();},API_SHOW_ALERT:function(sender,params){alert(params[0]);},API_ADD_MESSAGE:function(sender,params){var msg_code=params[0];var msg_str=params[1];messages[msg_code]=msg_str;},API_GET_MESSAGE:function(sender,params){var msg_code=params[0];return messages[msg_code]||msg_code;},API_ADD_CALLBACK:function(sender,params){var name=params[0];var func=params[1];callbacks[name]=func;},API_REMOVE_CALLBACK:function(sender,params){var name=params[0];delete callbacks[name];}});var oValidator=new Validator;xe.registerApp(oValidator);var EditorStub=xe.createPlugin('editor_stub',{API_BEFORE_VALIDATE:function(sender,params){var form=params[0];var seq=form.getAttribute('editor_sequence');if(seq){try{editorRelKeys[seq].content.value=editorRelKeys[seq].func(seq)||'';}catch(e){}}}});oValidator.registerPlugin(new EditorStub);function get_value(elem){var vals=[];if(elem.is(':radio')){return elem.filter(':checked').val();}else if(elem.is(':checkbox')){elem.filter(':checked').each(function(){vals.push(this.value);});return vals.join('|@|');}else{return elem.val();}}})(jQuery);function filterAlertMessage(ret_obj){var error=ret_obj["error"];var message=ret_obj["message"];var act=ret_obj["act"];var redirect_url=ret_obj["redirect_url"];var url=location.href;if(typeof(message)!="undefined"&&message&&message!="success")alert(message);if(typeof(act)!="undefined"&&act)url=current_url.setQuery("act",act);else if(typeof(redirect_url)!="undefined"&&redirect_url)url=redirect_url;if(url==location.href)url=url.replace(/#(.*)$/,'');location.href=url;} +function procFilter(fo_obj,filter_func) +{filter_func(fo_obj);return false;} \ No newline at end of file