//當 browser 沒有支援 console object, console 將不起作用 if( typeof( console ) == 'undefined' ){ console = new Object(); console.log = function(){}; console.info = function(){}; console.warn = function(){}; console.error = function(){}; console.dir = function(){}; } /** * 輔助查詢模組 * @author Eason Lin * @version 1.0 */ var AssistModule = (function () { var _self = {}; var _pidMap= {}; _self.enable = false; var _$dialogAssist = undefined; /************************************************ * private method * ************************************************/ /** * 取得全部輔助查詢作業代碼資料 */ function getAssistPidMap() { $.ajax({ type: 'POST', url: 'Assist!loadConfig', success: function( data ){ if ( data.hasOwnProperty( 'result' ) ) { _pidMap = data[ 'result' ]; } else if ( data.hasOwnProperty( 'errMsg' ) ) { showStatusMsg( 'ng', data.errMsg ); } else { console.log( 'Not expected ajax response !' ); } }, async: false }); } /** * 設定此作業代碼的輔助查詢作業代碼清單 * @parm pid 作業代碼 */ function settingAssistPidList( pid ) { if ( _pidMap.hasOwnProperty( pid ) ) { var ridArray =_pidMap[ pid ]; $.each( ridArray, function( index, value ) { var v_pid = value[ 'pid' ]; var v_cname = value[ 'cname' ]; var $input = $( "" + "" + v_pid + ' '+ v_cname + "" ); bindRightClickEvent( $input, v_pid ); _$dialogAssist.find( 'table' ).append( $input ); }); } } /** * 當按下滑鼠右鍵的時候,要另開視窗 */ function bindRightClickEvent( $element, pid ) { $element.mousedown(function(event) { switch (event.which) { case 3: console.log('Right Mouse button pressed.'); AssistModule.rightClickPid( pid ); break; } }); } /************************************************ * public method * ************************************************/ /** * 初始化輔助查詢視窗。 */ _self.register = function( pid ) { _self.enable = false; if( !pid ) { alert( '請設定作業代碼!!' ); return false; } _$dialogAssist = $( "#dialogAssist" ); if ( _$dialogAssist.length > 1 ) { alert( '輔助視窗 dialogAssist 設定錯誤!!!' ); return; } if ( _$dialogAssist.length == 0 ) { $( 'BODY' ).append( "
" ); _$dialogAssist = $( "#dialogAssist" ); _$dialogAssist.append( "
" ); } _$dialogAssist.dialog({ width: 300, autoOpen: false, modal: true }); //取得全部輔助查詢作業代碼資料 getAssistPidMap(); //設定此作業代碼的輔助查詢作業代碼清單 settingAssistPidList( pid ); _self.enable = true; }; _self.open = function() { if( !_self.enable ) return; _$dialogAssist.dialog( "open" ); }; _self.dbClickPid = function( pid ) { if( !_self.enable ) return; if ( StoreModule.enable ) { StoreModule.go( pid ); }else { $( 'form input[name$="pid"]', _$dialogAssist ).val( pid.toUpperCase() ); $( 'form', _$dialogAssist ).submit(); } }; _self.rightClickPid = function( pid ) { if( !_self.enable ) return; var pidUrl = pid; $.ajax({ type: 'GET', url: 'Store!getCxtPidUrl', data: 'pid=' + pid, success: function( data ) { if ( data.hasOwnProperty( 'result' ) ) { pidUrl = data[ 'result' ]; } else if ( data.hasOwnProperty( 'errMsg' ) ){ console.log('error:'+ data.errMsg); } else { console.log( 'Not expected ajax response !' ); } }, async:false }); var d = new Date(); var wname = d.getTime(); scrW=screen.width - 10; scrH=screen.height - 10; openX = 0; openY = 20; var cwindow = window.open(pidUrl,wname, "status=1,resizable=1,scrollbars=1,width=" + scrW+ ",height=" + scrH + ",left=" + openX + ",top=" + openY ); console.log('111111111111111111111111111111111111111111111111111111111111111111'); var $_childwindows; if ( window.top.menu ) $_childwindows = window.top.menu.$_childwindows; else if ( window.opener.menu ) //由menu點右鍵開啟的 $_childwindows = window.opener.menu.$_childwindows; $_childwindows[$_childwindows.length] = cwindow; }; return _self; }()); /** * 儲存資料模組 * * 儲存至local * * @author Eason Lin * @version 1.0 */ var StoreModule = (function () { var _self = {}; _self.enable = false; _self.CompatibleAdv = undefined; _self.hasExcutedCallbak = { doReturn : undefined, doGoNext : undefined } var _nowPid = ""; //目前的作業代碼 var _storeManager = defaultStoreManager(); var _$storeSelector = {}; var _$dialogAssist = undefined; var _settings = { pid : null, doReturn : function( node ) { //提供callback function,當此作業是從案上一頁回來的,會執行此function。 console.log( "execute doReturn callback method." ); }, doGoNext : function( node ) { //提供callbackfunction,當此作業是從案跳至作業按鈕過來的,會執行此function。 console.log( "execute doGoNext callback method." ); } }; /************************************************ * public method * ************************************************/ _self.register = function( settings ) { console.log( '##### StoreModule inital #####' ); _$dialogAssist = $( "#dialogAssist" ); _self.enable = false; getSettings( settings ); _self.doReturn = _settings.doReturn; _self.doGoNext = _settings.doGoNext; if( !load() ) return; _nowPid = _settings.pid; if( !_nowPid ) { alert( "作業代碼不可為空" ); return; } _self.enable = true; if ( _self.CompatibleAdv ) { /***************************************************************************************** * Examine the following scenario : * * Acol -----------> Tradevan -----------> Tradevan page * (return) (includes extension.js) (return) * * Adjust workflow if Acol return Tradevan page * */ if( _storeManager.expectNode && _nowPid != _storeManager.expectNode.pid ) { var lastWorkFlowNode = getLastWorkFlowNode(); if ( lastWorkFlowNode && lastWorkFlowNode.pid == _nowPid ){ storeExpectNode( lastWorkFlowNode ); delLastWorkFlowNode(); _storeManager.source = "B"; } } //***************************************************************************************** } if ( _storeManager.expectNode && _nowPid == _storeManager.expectNode.pid ) { if ( _storeManager.source == "B" ) { //案 回上頁 var expectNode = getExpectNode(); showOnPageByReturn( expectNode ); _self.hasExcutedCallbak.doReturn = true; _settings.doReturn( expectNode ); } else if ( _storeManager.source == "N" ) { //案 連至下個作業 var lastWorkFlowNode = getLastWorkFlowNode(); showOnPageByNext( lastWorkFlowNode ); _self.hasExcutedCallbak.doGoNext = true; _settings.doGoNext(lastWorkFlowNode); } } else { console.log( '##### reset storeManager #####' ); _storeManager = defaultStoreManager(); save(); } //清空 source 和 expectNode 欄位 _storeManager.source = ""; _storeManager.expectNode = null; save(); configAssistForm(); configRtBtn(); /** * 自動autoPaste報單號碼,分配到五個欄位上。 */ if ( DeclNoModule.enable ) { DeclNoModule.autoPasteNotTriCallback(); } }; function getSettings( settings ) { if( settings && typeof( settings ) == "object" ) return $.extend( _settings, settings ); else if ( settings && typeof( settings ) == "string" ) _settings.pid = settings; return _settings; } /** * 前往作業 */ _self.go = function( nextPid, skip ) { console.log( 'StoreModule enable:' + _self.enable ); if( ! _self.enable ) return; console.log( '跳至作業代碼:' + nextPid ); //1.將 nextPid node(空資料) 儲存至expectPid var node = { pid : nextPid }; storeExpectNode( node ); //2.將 nowPid node(含資料) 加進 workflowStack var nowPidNode = getNowPidNode( skip ); addWorkFlow( nowPidNode ); //3.設定source值 = next _storeManager.source = "N"; //存檔 save(); if( !_self.CompatibleAdv ) { var pathname = window.location.pathname; $( 'form input[name$="pid"]', _$dialogAssist ).val( nextPid ); $( 'form input[name$="context"]', _$dialogAssist ).val( pathname ); $( 'form', _$dialogAssist ).submit(); } }; /** * 點擊回前一作業 */ _self.rtn = function() { console.log( '點擊回前一作業' ); console.log( 'StoreModule enable:' + _self.enable ); if ( !_self.enable ) return; //1.將 lastWorkFlow node 搬移到 expect node var lastWorkFlowNode = getLastWorkFlowNode(); storeExpectNode( lastWorkFlowNode ); //.2.刪除 lastStackPid. delLastWorkFlowNode(); //3.設定source值 = back _storeManager.source = "B"; //存檔 save(); if( !_self.CompatibleAdv ) { var pathname = window.location.pathname; $( 'form input[name$="pid"]', _$dialogAssist ).val( lastWorkFlowNode.pid ); $( 'form input[name$="context"]', _$dialogAssist ).val( pathname ); $( 'form', _$dialogAssist ).submit(); } }; /** * 取得目前作業代碼 */ _self.getNowPid = function() { return _nowPid; }; /************************************************ * private method * ************************************************/ function defaultStoreManager() { var manager = {}; manager.workFlow = []; manager.source = null; manager.expectNode = { pid: "" }; return manager; } /** * load menu */ function load() { if ( window.top.header ){ _$storeSelector = $( "#storeArea", window.top.header.document ); } else if ( window.opener ) {//由menu點右鍵開啟的 if ( window.opener.top.header ) { _$storeSelector = $( "#storeArea", window.opener.top.header.document ); } } if ( !_$storeSelector.length || _$storeSelector.length != 1 ) { alert( "'#storeArea' div not found!!!" ); return false; } try { _storeManager = JSON.parse( _$storeSelector.text() ); } catch ( e ) { //無法parsing '' _storeManager = defaultStoreManager(); save(); _storeManager = JSON.parse( _$storeSelector.text() ); } _self.storeManager = _storeManager; return true; } function setStoreManager(storeManager) { _storeManager = storeManager; } function configRtBtn() { var $rtBtn = $( '#rtBtn', '#workFlowBtn' ); var workFlowSize = getWorkFlowSize(); if( workFlowSize > 0 ) { $rtBtn.show(); $( document ).bind( 'keydown.store', 'esc', function( evt ){ $rtBtn.trigger( 'click' ); }); } else $rtBtn.hide(); } function configAssistForm() { if ( _$dialogAssist.length > 1 ){ alert( '輔助視窗 dialogAssist 設定錯誤!!!' ); return; } if ( _$dialogAssist.length == 0 ) { $( 'BODY' ).append( "
" ); _$dialogAssist = $( "#dialogAssist" ); _$dialogAssist.append( "
" + "
" + " " + " " + "
" ); } } /** * 增加作業代碼歷程 */ function addWorkFlow( node ) { _storeManager.workFlow.push( node ); } function getWorkFlowSize() { return _storeManager.workFlow.length; } function getLastWorkFlowNode() { return _storeManager.workFlow[ _storeManager.workFlow.length-1 ]; } function delLastWorkFlowNode() { _storeManager.workFlow.pop(); } /** * 取得expectNode資料 */ function getExpectNode() { return _storeManager.expectNode; } /** * 取得目前作業需要儲存的資料欄位 * 從server取得欄位設定 */ function getNowPidNode( skip ) { var node = {}; node.pid = _nowPid; node.select = {}; node.text = {}; node.radio = {}; node.checkbox = {}; node.textarea = {}; if ( skip ) node.skip = true; //for select var $allSelect = $( 'select', '#main'); $allSelect.each(function() { var selectName = $( this ).attr( 'name' ); if ( selectName == undefined ) { return; } var $optioned = $( this ).find( "option:selected" ); node.select[ selectName ] = []; $optioned.each(function() { var optionedValue = $( this ).attr( "value" ); node.select[ selectName ].push( optionedValue ); }); }); //input[type=text] var $allTextInput = $( 'input[type=text]', '#main').not( '.ui-jqgrid' ); $allTextInput.each(function() { var inputName = $( this ).attr( 'name' ); node.text[ inputName ] = $( this ).val(); }); //input[type="radio"] var $allRadio = $( 'input[type="radio"]', '#main' ).filter( ':checked' ); $allRadio.each(function() { var radioName = $( this) .attr( 'name' ); node.radio[ radioName ] = $( this ).val(); }); //input[type="checkbox"] var $allCheckboxed = $( 'input[type="checkbox"]', '#main').filter( ':checked' ); $allCheckboxed.each(function(){ var checkboxName = $( this ).attr( 'name' ); var checkboxValue = $( this ).val(); if ( !node.checkbox.hasOwnProperty( checkboxName ) ){ node.checkbox[ checkboxName ] = []; } node.checkbox[ checkboxName ].push( checkboxValue ); }); //textarea var $allTextarea = $( 'textarea', '#main' ); $allTextarea.each(function() { var textareaName = $( this) .attr( 'name' ); if ( textareaName == undefined ) return ; node.textarea[ textareaName ] = $( this ).val(); }); return node; } /** * 將node資料產生到畫面上 */ function showOnPageByReturn( node ) { for ( var selectName in node.select ) { console.log( "selectName:" + selectName ); var $select = $( "select[name='"+selectName+"']", '#main' ); console.log( '$mappedSelect length:' + $select.length + ", mappedSelectName:" + selectName ); //只抓第一個select if( $select.length > 0 ) { $.each( node.select[ selectName ], function( index,value ){ var $option = $select .eq(0) .find( "option[value='" + value + "']" ); if( $option.length > 0 ) { $option.attr( "selected", "true"); } }); } } for ( var inputName in node.text ) { mappingField( inputName,node.text[ inputName ] ); } for ( var checkboxName in node.checkbox ) { console.log( "checkboxName:" + checkboxName ); var valueArray = node.checkbox[ checkboxName ]; $.each( valueArray, function( index,value ) { var $checkbox = $( 'input[type=checkbox][name="' + checkboxName + '"][value="' + value + '"]', '#main' ); console.log( '$mappedCheckbox element length:' + $checkbox.length + ", mappedCheckboxName:" + checkboxName ); $checkbox.attr( "checked", true ); }); } for ( var radioName in node.radio ) { console.log( "radioName:" + radioName ); var $radio = $( 'input[type=radio][name="' + radioName + '"][value="' + node.radio[ radioName ] + '"]', '#main' ); console.log( '$mappedRadio element length:' + $radio.length + ", mappedRadioName:" + radioName ); $radio.attr( "checked", true ); } for ( var textareaName in node.textarea ) { console.log( "textareaName:" + textareaName ); var $textarea = $( "textarea[name='" + textareaName + "']", '#main' ); console.log( '$mappedTextarea element length:' + $textarea.length + ", mappedTextareaName:" + textareaName ); //只抓第一個mapping的 if ( $textarea.length ) { $textarea.eq( 0 ).val( node.textarea[ textareaName ] ); } } } function showOnPageByNext( lastWorkFlowNode ) { var textFields = lastWorkFlowNode.text; if ( lastWorkFlowNode.skip ) return; //從server取得stroeInfo資訊. var storeInfo = getStoreInfo(); ////有設定要對應到畫面上的資訊 if ( storeInfo[ lastWorkFlowNode.pid ] ) { var mapped = storeInfo[ lastWorkFlowNode.pid ][ _nowPid ]; //有設定此作業要mapping if ( mapped ) { var storeMap = mapped.keyMap; for( var inputName in storeMap ) { if ( textFields.hasOwnProperty( inputName ) ) { //matched var mappedInputName = inputName; if ( storeMap[ inputName ] != '' ) { //有設定相對應欄位name mappedInputName = storeMap[ inputName ]; } var textValue = textFields[ inputName ]; mappingField( mappedInputName,textValue ); } } } } } /** * */ function mappingField( inputName, textValue ) { var $input = $( "input[name='" + inputName + "']", '#main' ); console.log( '$mappedInput length:' + $input.length + ", mappedInputName:" + inputName ); if ( $input.length > 0 ) { $input.val( textValue ); } } /** * 取得 storeInfo */ function getStoreInfo() { var storeInfo = {}; $.ajax({ type: 'POST', url: 'Store!loadConfig', success: function( data ){ if ( data.hasOwnProperty( 'result' ) ) { storeInfo = data[ 'result' ]; } else if ( data.hasOwnProperty( 'errMsg' ) ){ showStatusMsg( 'ng', data.errMsg ); } else { console.log( 'Not expected ajax response !' ); } }, async:false }); return storeInfo; } /** * save */ function save() { _$storeSelector.text( JSON.stringify( _storeManager ) ); } /** * 將 nextPid node(空資料) 儲存至expectNode */ function storeExpectNode( node ) { _storeManager.expectNode = node; } _self.storeManager = _storeManager; _self.getNowPidNode = getNowPidNode; _self.getStoreInfo = getStoreInfo; _self.setStoreManager = setStoreManager; return _self; }()); /** * 報單號碼共用元件 * * @author Eason Lin * @version 1.0 */ var DeclNoModule = (function() { var _self = {}; //是否要自動trigger F6查詢。 _self.autoQry = false; /** * 如果是報單號碼第5個欄位打完,或是貼上完報單號碼,執行callback function. */ _self.afterEnterDeclNo = function( event ) { console.log( "excute 'afterEnterDeclNo' callback function." ) }; _self.enable = false; var _$declNoSpan = null; /************************************************ * private method * ************************************************/ /** * 1.如果報單內容完整輸入,則將五個欄位合而為一 (第二節可以不打,自動補空白) 2.自動將各欄位轉大寫 */ function changeEvent( event, param ) { var declno = ""; for ( var i = 1; i <= 5; i++ ) { var $perDeclNo = $( "input[name='declNo"+i+"']", $( this ) ); //var maxlen = $perDeclNo.attr("maxlength"); $perDeclNo.val( $perDeclNo.val().toUpperCase() );//自動轉大寫 var text = $perDeclNo.val(); if ( i == 2 && ( text.length == 0 || text.trim().length == 0 ) ) { // 第二節可以不打或是只打一個空白,則自動補空白 declno += " "; } else { declno += text.toUpperCase(); } } // 將結果存回隱藏合併欄位 $( '.declNo', $( this ) ).val( declno.trim() ); if ( declno.trim().length == 14 ) { // 如果是報單號碼第5個欄位打完,或是貼上完報單號碼,才要執行callback function. if( typeof param != 'undefined' && param.programmatic == true ) { _self.afterEnterDeclNo( event ); if ( _self.autoQry ) { var e = $.Event( "keydown" ); e.keyCode = 117; //F6 $( document ).trigger( e ); } } } } function sleep(milliseconds) { var start = new Date().getTime(); for (var i = 0; i < 1e7; i++) { if ((new Date().getTime() - start) > milliseconds){ break; } } } /** * 輸入後焦點要自動換下一欄 */ function inputEvent( e ) { /* var keyCode = e.keyCode; //檔住ctrl, or alt or shift, or p or tab if ( keyCode == 16 || keyCode == 17 || keyCode == 18 || keyCode == 86 || keyCode == 9 ) return; //檔住 左右鍵 if ( keyCode == 37 || keyCode == 39 ) { return; } //檔住home按鍵 if (keyCode == 36 ) return; console.log( "keyCode:" + keyCode ); */ var $this = $( this ); var attrName = $this.attr( 'name' ); var index = attrName.substring( 6, 7 ); if ( !isNaN( parseInt( index ) ) ) { var maxlen = $this.attr( 'maxlength' ); //輸入長度相等 if ( $this.val().length == maxlen ) { var nIndex = parseInt( index ) + 1; if ( nIndex == 6 ) { //強制觸發change event $this.trigger( 'change', { programmatic: true } ); } else { //只找siblings階層 //下一個全選 + focus $this.siblings( "input[name='declNo" + nIndex + "']" ) .focus(); } } } } /** * 用退格鍵(backspace)回到上一欄報單欄位 by keyup */ function backspaceKeyupEvent( e ) { var keyCode = e.keyCode; if ( keyCode == 8 ){ var attrName = $( this ).attr( 'name' ); var index = attrName.substring( 6, 7 ); if ( !isNaN( parseInt( index ) ) && $( this ).val().length == 0 ) { var preIndex = parseInt( index ) - 1; if ( preIndex == 0 ) { //強制觸發change event $( this ).change(); } else { //只找siblings階層 //前一個 focus $( this ).siblings( "input[name='declNo" + preIndex + "']" ).select(); } } } } /** * 用退格鍵(backspace)回到上一欄報單欄位 by keydown */ function backspaceKeydownEvent( e ) { var keyCode = e.keyCode; if ( keyCode == 8 ){ var attrName = $( this ).attr( 'name' ); var index = attrName.substring( 6, 7); if ( !isNaN( parseInt( index ) ) && $( this ).val().length == 0 ) { var preIndex = parseInt( index ) - 1; $( this ).siblings( "input[name='declNo" + preIndex + "']" ).select(); } } } /** * focusin欄位自動全選反白 */ function focusinEvent() { $( this ).select(); } /** * double click 記錄報單欄位,記錄到剪貼簿上 (IE only) * @param e * @returns */ function dbClickvent( e ) { var declNo = $( '.declNo', $( this ) ).val(); // IE if ( window.clipboardData && window.clipboardData.setData ) { window.clipboardData.setData( 'Text', declNo ); } /** * * @Note Eason * Other broswer not support clipboardData.setData, * so using HTML5 sessionStorage to store. }else if( sessionStorage ){ sessionStorage.setItem('declNo',text); }*/ } function pasteEvent( e ) { e.preventDefault(); var index = $( this ).attr( 'name' ).substring( 6, 7); if ( index != 1 ) return ; //只允許第一個觸發 var text = null; // IE if ( window.clipboardData && window.clipboardData.getData ) { text = window.clipboardData.getData( 'Text' ); //other broswer }else { text = e.originalEvent.clipboardData.getData( 'Text' ); } text = text.replace(/\//g,''); //replace '/' forward slash paste( text.trim(), $( this ).parent(),e ); //貼上報單號碼資料 //trigger change event , 如果報單內容完整輸入,則將五個欄位合而為一 $( "input[name='declNo1']", $( this ).parent() ).trigger('change', { programmatic: true } ); } function paste( text, $declNoSpan ) { if ( text.length == 14 ) { $( "input[name='declNo1']", $declNoSpan ).val( text.substr( 0, 2) ); $( "input[name='declNo2']", $declNoSpan ).val( text.substr( 2, 2) ); $( "input[name='declNo3']", $declNoSpan ).val( text.substr( 4, 2) ); $( "input[name='declNo4']", $declNoSpan ).val( text.substr( 6, 3) ); $( "input[name='declNo5']", $declNoSpan ).val( text.substr( 9, 5) ); //如果長度是13 判斷第三碼是否為空白,且第四碼不是空白( 表示中間只有一個空白) }else if( text.length == 13 && text.substr( 2, 1)==' ' && text.substr( 3, 1)!=' ' ) { $( "input[name='declNo1']", $declNoSpan ).val( text.substr( 0, 2) ); //註: 之後接著trigger change event,會自動幫第四個補空白,所以這邊就不補了。 $( "input[name='declNo2']", $declNoSpan ).val( text.substr( 2, 1) ); $( "input[name='declNo3']", $declNoSpan ).val( text.substr( 3, 2) ); $( "input[name='declNo4']", $declNoSpan ).val( text.substr( 5, 3) ); $( "input[name='declNo5']", $declNoSpan ).val( text.substr( 8, 5) ); } } function autoPaste() { $( '.declNo', _$declNoSpan ).each(function() { var $declNo = $( this ); var text = $declNo.val(); paste( text,$( this ).parent() ); if ( text.length == 14 ) { //觸發change event $( "input[name='declNo1']", $( this ).parent() ).trigger( 'change', { programmatic: true } ); } }); } /** * only for Utils use */ function autoPasteNotTriCallback( $declSapnEle ) { var $declNoArea = $declSapnEle == null ? _$declNoSpan : $declSapnEle ; $( '.declNo', $declNoArea ).each(function() { var $declNo = $( this ); var text = $declNo.val(); paste( text,$( this ).parent() ); if ( text.length == 14 ) { //觸發change event $( "input[name='declNo1']", $( this ).parent() ).change(); } }); } /************************************************ * public method * ************************************************/ _self.init = function() { _$declNoSpan = $( 'span.declNo' ); if ( _$declNoSpan.length == 0) return; /** * 1. 如果報單內容完整輸入,則將五個欄位合而為一 (第二節可以不打,自動補空白) * 2. 自動將各欄位轉大寫 * 3. double click 要複製報單號碼(IE only) */ _$declNoSpan.bind( "change", changeEvent ) .bind( "dblclick", dbClickvent ); /** * 1. 輸入後焦點要自動換下一欄 * 2. 點欄位自動全選反白 * 4. 允許在第一欄複製貼上14碼的報單號碼 並正確分配在欄位中 * 5. 允許用退格鍵(backspace)回到上一欄報單欄位 * */ $( "[name^='declNo']:text", _$declNoSpan) .bind( "input", inputEvent) .bind( "keyup", backspaceKeyupEvent) .bind( "keydown", backspaceKeydownEvent) .bind( "focusin", focusinEvent) .bind( "paste", pasteEvent); if ($.browser.msie && $.browser.version == 8 ) { console.log("##### IE8 #####"); $( "[name^='declNo']:text", _$declNoSpan).bind( "keyup", inputEvent); } //如果報單號碼有值(且14碼),自動填入到五個欄位上。 autoPasteNotTriCallback(); _self.enable = true; $( document ).on( 'keydown', function( e ) { //// home鍵 if ( e.keyCode == 36 ) $( "input[name='declNo1']", _$declNoSpan ).select(); }); }; /** * 提供 autoPaste function */ _self.autoPaste = function() { if( _self.enable ){ autoPaste(); } }; /** * only for Utils use */ _self.autoPasteNotTriCallback = function( $declSapnEle ) { if( _self.enable ){ autoPasteNotTriCallback( $declSapnEle ); } }; return _self; }()); /** * 記錄報單號碼/主分號 共用元件 * @author Eason Lin * @version 1.0 */ var HistoryModule = (function() { var _self = {}; _self.enable = false; //是否要自動trigger F6查詢。 _self.autoQry = false; //提供callback function var _options = { doAfterSelect : function( datta ) { console.log( "execute doAfterSelect callback method." ); }, $declSapnEle : undefined //設定要貼上的報單號碼欄位,如果沒設定,default全部都會貼上 }; var _dataMap = {}; var _jdlg; var _$historySelector; /************************************************ * private method * ************************************************/ function bindF12Key() { $( document ).bind( "keydown.modulejsEvent", function( e ) { if ( e.keyCode == 123 && !e.shiftKey && !e.ctrlKey) { loadData(); /** * 開啟F12選擇視窗 */ openDlg(); /** * 檔住browser原本F12快捷鍵 */ var event = window.event || e; event.keyCode = 0; return false; } }); } function initStoreData () { var pageHeader = window.top.header; //目前視窗的header if ( !pageHeader ) //不存在,表示是從menu開啟的 pageHeader = window.top.opener.top.header; _$historySelector = $( "#historyArea", pageHeader.document ); if ( !_$historySelector.length || _$historySelector.length != 1 ) { alert( "'#historyArea' div not found!!!" ); return false; } try { _dataMap = JSON.parse( _$historySelector.text() ); } catch( e ) { _dataMap = {}; _dataMap[ "load" ] = true; _dataMap[ "curType" ] = "declNo"; _dataMap[ "declNo" ] = []; _dataMap[ "mhawb" ] = []; } console.log( _dataMap ); } function loadData() { // initStoreData(); } function saveData() { _$historySelector.text( JSON.stringify( _dataMap ) ); } /** * 開啟選擇視窗 */ function openDlg() { chooseData(); _jdlg.dialog( "open" ); _jdlg.find( "ul" ).find( "li" ).first().find( "input:radio" ).focus(); /* _jdlg.find("input[type='radio'][name='_dataType_'][value='" + _dataMap["curType"] + "']") .focus();*/ } /** * 組成資料 */ function chooseData() { console.log( '### chooseData ###' ); var type = _dataMap[ "curType" ]; var jtbl = _jdlg.find( "ul" ); jtbl.empty(); _jdlg.find( "[name='_dataType_'][value='" + type + "']" ) .attr( "checked", true ); if ( type == "declNo" ) { //選擇報單號碼 var list = _dataMap[ "declNo" ]; var checked = true; for ( var i = 0 ; i < list.length; i++ ) { if ( formatDeclNo( list[i] ).trim() == "" ) continue; var line = "
  • "+"  
  • "; var jrow = $( line ); jrow .bind( "dblclick", { data: list[ i ] }, clickSelDataEvent ) .bind( "keydown", { data: list[ i ] }, enterSelDataEvent ); jtbl.append( jrow ); } } else if ( type == "mhawb" ) { //選擇海空運號碼 var list = _dataMap[ "mhawb" ]; var checked = true; for ( var i = 0; i < list.length; i++ ) { var p = list[ i ].indexOf( ';' ); //海空運以';'分開 var mawb = p >= 0 ? list[i].substring( 0, p ) : list[ i ]; var hawb = p >= 0 ? list[i].substring(p + 1) : "*"; if ( mawb.trim() == "" ) continue; var line = "
  • "+"  
  • "; var jrow = $( line ); jrow .bind( "dblclick", { data: list[i] }, clickSelDataEvent ) .bind( "keydown", { data: list[i] }, enterSelDataEvent ); jtbl.append( jrow ); } } //第一個要focus _jdlg.find( "ul" ).find( "li" ).first().find( "input:radio" ).focus(); } /** *將報單號碼以'/'分割 */ function formatDeclNo( text ) { if ( text.length == 14 && text.indexOf( '/' ) < 0 ) { text = text.substring( 0, 2 ) + '/' + text.substring( 2, 4 ) + '/' + text.substring( 4, 6 ) + '/' + text.substring( 6, 9 ) + '/' + text.substring( 9 ); } return text; } /** * dblick event 使用者 double click選擇一個資料之事件 * @param evt */ function clickSelDataEvent( evt ) { //關閉視窗。 _jdlg.dialog( "close" ); var data = evt.data[ "data" ]; //將資料設定到畫面上 passToPage( data ); //callback doAfterSelect _options.doAfterSelect( data ); } /** * */ function enterSelDataEvent( e ) { var keyCode = e.keyCode; if( keyCode == 13 ) { //關閉視窗。 _jdlg.dialog( "close" ); var data = e.data[ "data" ]; //將資料設定到畫面上 passToPage( data ); //callback doAfterSelect _options.doAfterSelect( data ); } } function keyUpAndDownEvent( e ) { //Arrow Up , Arrow Down if ( e.keyCode == 38 || e.keyCode == 40 ) { var $next ; if( e.keyCode == 38 ) { if ( $( "input[name='_dataType_']:checked" ).val() == "declNo" ) { $next = $( "[name=advCode]:checked" ) .parent( "li" ) .prev() .find( "input" ); } else { var $next = $( "[name=advCodeM]:checked" ) .parent( "li" ) .prev() .find( "input" ); } } if ( e.keyCode == 40 ) { if ( $( "input[name='_dataType_']:checked" ).val() == "declNo" ) { $next = $( "[name=advCode]:checked" ) .parent( "li" ) .next() .find( "input" ); } else { $next = $( "[name=advCodeM]:checked" ) .parent( "li" ) .next() .find( "input" ); } } $next.focus().attr( "checked", true ); return false; } //Arrow Left Arrow Right if( e.keyCode == 37 || e.keyCode == 39 ) { if( e.keyCode == 37 ) { $( "input[name='_dataType_']" ) .filter( '[value=declNo]' ) .focus() .attr( "checked", true ) .click(); } if ( e.keyCode == 39 ) { $("input[name='_dataType_']") .filter( '[value=mhawb]' ) .focus() .attr( "checked", true ) .click(); } return false; } } function dialogOpenEvent( event, ui) { $( document ).on( "keydown.keyUpAndDownEvent", keyUpAndDownEvent ); } function dialogCloseEvent( event, ui ) { $( document ).off( "keydown.keyUpAndDownEvent" ); } /** * 將資料設定到畫面上 * @param data */ function passToPage( data ) { console.log( "### passToPage ###" ); var type = _dataMap[ "curType" ]; if ( type == "declNo" ) { //報單號碼 console.log( "declNo:" + data ); $( '.declNo' ).val( data ); if ( $( '.declNo', 'span.declNo' ).length > 0 ) { //call DeclNoModule DeclNoModule.autoPasteNotTriCallback( _options.$declSapnEle ); } } else if ( type == "mhawb" ) { //海空運別 var p = data.indexOf( ';' ); var mawb = p >= 0 ? data.substring( 0, p ) : data; var hawb = p >= 0 ? data.substring( p + 1 ) : ""; console.log( 'mawb:' + mawb + ',hawb:' + hawb ); $('.mawb').val( mawb ); $('.hawb').val ( hawb ); } // 自動trigger F6 查詢 if( _self.autoQry ) { setTimeout(function(){ var e = $.Event( "keydown" ); e.keyCode = 117; //F6 $( document ).trigger( e ); }, 0.5 * 1000 ); } } function addData( data, type ) { if ( !_dataMap ) _dataMap = { type: "declNo", load: false }; if ( !_dataMap[ type ] ) _dataMap[ type ] = []; // 從原列表中移除相同的報單 var list = _dataMap[ type ]; for ( var i = 0; i < list.length; i++ ) { if ( data == list[i] ) { // 如果剛好是第一筆,則無需後續處理 if ( i == 0 ) return; list.splice( i, 1 ); break; } } // 將新增資料放在最前面 list.splice( 0, 0, data ); //加到第一個,如果存在就刪除 if ( type == "declNo" ) { // 報單號碼 _dataMap["declNo"] = _.without( _dataMap["declNo"], data ); _dataMap["declNo"].unshift( data ); }else if ( type == "mhawb" ) { //海空運別 _dataMap["mhawb"] = _.without( _dataMap["mhawb"], data ); _dataMap["mhawb"].unshift( data ); } saveData(); } /************************************************ * public method * ************************************************/ _self.register = function( options ) { $.extend( _options, options ); }; _self.init = function() { var html = ""; $( "#main" ).append( html ); _jdlg = $( "#_dataDlg_" ); _jdlg.dialog({ autoOpen: false, close: dialogCloseEvent, open: dialogOpenEvent, modal: true, width: 350, height: 300 }); bindF12Key(); // initStoreData(); _self.enable = true; }; /** * 變更選擇資料類別 event */ _self.typeChgEvent = function( src ) { var type = $( src ).val(); _dataMap[ "curType" ] = type; chooseData(); saveData(); }; _self.addDeclNo = function( data ) { addData( data, "declNo" ); }; _self.addMhawb = function( data ) { addData( data, "mhawb"); }; _self.keyUpAndDownEvent = keyUpAndDownEvent; return _self; }()); /** * default 啟用 * 報單號碼共用元件 * 記錄報單號碼/主分號共用元件 */ $( function() { DeclNoModule.init(); console.log( "DeclNoModule initial " + ( DeclNoModule.enable ? "success" : "fail" ) + "." ); /** * /如果有include漢美的advconfig.js * 則不啟用 F12 記錄報單號碼/主分號共用元件 */ if ( typeof advConfigRoot === "undefined" ) { HistoryModule.init(); console.log( "HistoryModule-2016215 initial " + ( HistoryModule.enable ? "success" :" fail" ) + "." ); } });