" +
"" );
}
}
/**
* 增加作業代碼歷程
*/
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 = "