// 這個 BaRaBaRa 是以 jQuery 當作基礎的,所以記得 在此之前務必 引入 jQuery. // // we need something like sprintf // (function(window) { var re = { not_string: /[^s]/, number: /[def]/, text: /^[^\x25]+/, modulo: /^\x25{2}/, placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/, key: /^([a-z_][a-z_\d]*)/i, key_access: /^\.([a-z_][a-z_\d]*)/i, index_access: /^\[(\d+)\]/, sign: /^[\+\-]/ } function sprintf() { var key = arguments[0], cache = sprintf.cache if (!(cache[key] && cache.hasOwnProperty(key))) { cache[key] = sprintf.parse(key) } return sprintf.format.call(null, cache[key], arguments) } sprintf.format = function(parse_tree, argv) { var cursor = 1, tree_length = parse_tree.length, node_type = "", arg, output = [], i, k, match, pad, pad_character, pad_length, is_positive = true, sign = "" for (i = 0; i < tree_length; i++) { node_type = get_type(parse_tree[i]) if (node_type === "string") { output[output.length] = parse_tree[i] } else if (node_type === "array") { match = parse_tree[i] // convenience purposes only if (match[2]) { // keyword argument arg = argv[cursor] for (k = 0; k < match[2].length; k++) { if (!arg.hasOwnProperty(match[2][k])) { throw new Error(sprintf("[sprintf] property '%s' does not exist", match[2][k])) } arg = arg[match[2][k]] } } else if (match[1]) { // positional argument (explicit) arg = argv[match[1]] } else { // positional argument (implicit) arg = argv[cursor++] } if (get_type(arg) == "function") { arg = arg() } if (re.not_string.test(match[8]) && (get_type(arg) != "number" && isNaN(arg))) { throw new TypeError(sprintf("[sprintf] expecting number but found %s", get_type(arg))) } if (re.number.test(match[8])) { is_positive = arg >= 0 } switch (match[8]) { case "b": arg = arg.toString(2) break case "c": arg = String.fromCharCode(arg) break case "d": arg = parseInt(arg, 10) break case "e": arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential() break case "f": arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg) break case "o": arg = arg.toString(8) break case "s": arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg) break case "u": arg = arg >>> 0 break case "x": arg = arg.toString(16) break case "X": arg = arg.toString(16).toUpperCase() break } if (!is_positive || (re.number.test(match[8]) && match[3])) { sign = is_positive ? "+" : "-" arg = arg.toString().replace(re.sign, "") } pad_character = match[4] ? match[4] == "0" ? "0" : match[4].charAt(1) : " " pad_length = match[6] - (sign + arg).length pad = match[6] ? str_repeat(pad_character, pad_length) : "" output[output.length] = match[5] ? sign + arg + pad : (pad_character == 0 ? sign + pad + arg : pad + sign + arg) } } return output.join("") } sprintf.cache = {} sprintf.parse = function(fmt) { var _fmt = fmt, match = [], parse_tree = [], arg_names = 0 while (_fmt) { if ((match = re.text.exec(_fmt)) !== null) { parse_tree[parse_tree.length] = match[0] } else if ((match = re.modulo.exec(_fmt)) !== null) { parse_tree[parse_tree.length] = "%" } else if ((match = re.placeholder.exec(_fmt)) !== null) { if (match[2]) { arg_names |= 1 var field_list = [], replacement_field = match[2], field_match = [] if ((field_match = re.key.exec(replacement_field)) !== null) { field_list[field_list.length] = field_match[1] while ((replacement_field = replacement_field.substring(field_match[0].length)) !== "") { if ((field_match = re.key_access.exec(replacement_field)) !== null) { field_list[field_list.length] = field_match[1] } else if ((field_match = re.index_access.exec(replacement_field)) !== null) { field_list[field_list.length] = field_match[1] } else { throw new SyntaxError("[sprintf] failed to parse named argument key") } } } else { throw new SyntaxError("[sprintf] failed to parse named argument key") } match[2] = field_list } else { arg_names |= 2 } if (arg_names === 3) { throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported") } parse_tree[parse_tree.length] = match } else { throw new SyntaxError("[sprintf] unexpected placeholder") } _fmt = _fmt.substring(match[0].length) } return parse_tree } var vsprintf = function(fmt, argv, _argv) { _argv = (argv || []).slice(0) _argv.splice(0, 0, fmt) return sprintf.apply(null, _argv) } /** * helpers */ function get_type(variable) { return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase() } function str_repeat(input, multiplier) { return Array(multiplier + 1).join(input) } /** * export to either browser or node.js */ if (typeof exports !== "undefined") { exports.sprintf = sprintf exports.vsprintf = vsprintf } else { window.sprintf = sprintf window.vsprintf = vsprintf if (typeof define === "function" && define.amd) { define(function() { return { sprintf: sprintf, vsprintf: vsprintf } }) } } })(typeof window === "undefined" ? this : window) // // somthing attached to jQuery // jQuery.fn.outerHTML = function() { return jQuery('
').append(this.eq(0).clone()).html(); }; jQuery.fn.disabled = function(status) { jQuery(this).each(function(){ jQuery(this)[0].disabled=status; }) return; }; jQuery.fn.tagName = function() { return this.prop("tagName"); }; var _wx_datsrc = {}; jQuery.fn.valByDatSrc = function(){ jQuery(this).find("[wx-datsrc]").each(function(){ var out2html = ($(this).prop("tagName").toLowerCase()=="div" || $(this).prop("tagName").toLowerCase()=="span" || $(this).prop("tagName").toLowerCase()=="td" || $(this).prop("tagName").toLowerCase()=="a"); if (out2html){ jQuery(this).attr("wx-value",jQuery(this).html()); }else{ jQuery(this).attr("wx-value",jQuery(this).val()); } if (jQuery(this).attr("wx-display")!=null){ //$.clog(jQuery(this).attr("wx-display")) var tmp = jQuery(this).attr("wx-display").split(','); var out = Array(); var match = jQuery(this).attr("wx-match"); //$.clog(match) if (match==null) match = "sn"; for(var i=0; i"+jQuery(this).attr("wx-datsrc")+"<"+jQuery(this).attr("wx-value")); if (jQuery.isNothing(_wx_datsrc[jQuery(this).attr("wx-datsrc")])===true){ // //$.clog(typeof(_wx_datsrc[jQuery(this).attr("wx-datsrc")])); // //$.clog(_wx_datsrc[jQuery(this).attr("wx-datsrc")]); // //$.clog("bye"); return true; } // //$.clog(_wx_datsrc[jQuery(this).attr("wx-datsrc")][jQuery(this).attr("wx-value")+""]); jQuery(this).xval(_wx_datsrc[jQuery(this).attr("wx-datsrc")][jQuery(this).attr("wx-value")+""]); } } }); return jQuery(this); } jQuery.fn.xval =function(data){ if (jQuery(this).prop("tagName").toLowerCase()=="span" || jQuery(this).prop("tagName")=="div"){ jQuery(this).html(data); }else{ if (jQuery(this).prop("tagName").toLowerCase()=="input" || jQuery(this).prop("tagName")=="text"){ jQuery(this).prop("value",data); jQuery(this).attr("value",data); jQuery(this).val(data); }else if (jQuery(this).prop("tagName").toLowerCase()=="textarea"){ jQuery(this).html(data); jQuery(this).text(data); jQuery(this).val(data); }else if(jQuery(this).prop("tagName").toLowerCase()=="select"){ jQuery(this).children().each(function(){ if (jQuery(this).val()==data){ jQuery(this).attr("selected", "selected"); jQuery(this).prop("selected", true); } }).trigger("change"); } } jQuery(this).wx("orival",data); jQuery(this).wx("value",data); } jQuery.fn.valByDat = function(data,role){ var root = jQuery(this).wx("role"); var selector = "[wx-field]"; // 亦可指定 role if ($.isNothing(role)==false){ var roles = role.split(/,/g); var selTemp = []; for(var idx in roles){ selTemp.push(selector+"[wx-role='"+roles[idx]+"']"); //$.clog(selector+"[wx-role='"+roles[idx]+"']"); } selector = selTemp.join(","); } jQuery(this).find(selector).each(function(){ var field = jQuery(this).wx("field"); //$.clog(selector+" : "+field+"="+data[field]+" > "+$.isNothing(data[field])); // 目前循攬到的物件 在 data 中有相對應的資料 if ($.isNothing(data[field])==false){ var tsData = data[field]; var tsTag = jQuery(this).prop("tagName").toLowerCase(); // 沒有特別標註此物件類型的就直接給 value 跟 wx-value if (tsTag=="span" || tsTag=="div" || tsTag=="b" || tsTag=="a" || tsTag=="h1" || tsTag=="h2" || tsTag=="h3" || tsTag=="label" ){ jQuery(this).html(tsData); }else if (tsTag=="img"){ jQuery(this).attr("src",tsData); }else{ jQuery(this).xval(tsData); //$.clog(field+">"+jQuery(this).wx("type")); switch(jQuery(this).wx("type")){ case "radio": //$.clog("In"); // prop 才能有效改變顯示,所以取得是否有的時候就要 用 prop $("[wx-role='"+root+"'] [wx-role='rdoItem'][wx-field='"+field+"']").prop('checked', false); $("[wx-role='"+root+"'] [wx-role='rdoItem'][wx-field='"+field+"'][wx-value='"+tsData+"']").prop('checked', true); break; } } jQuery(this).wx("orival",tsData); jQuery(this).wx("value",tsData); } }); } jQuery.fn.wx = function(attr,value) { if ($.isNothing(value,true)){ return $(this).attr("wx-"+attr); }else{ // 注意 attr = setAttribute , value 會被轉為字串 return $(this).attr("wx-"+attr,value); } }; jQuery.setHint = function(selector,content,delay){ var oriHint = $(selector).attr("placeholder"); if ($.isNothing(delay)){ delay = 1000; } if (!$.isNothing(content,true)){ $(selector).attr("placeholder",content); setTimeout(function(){ $(selector).attr("placeholder",oriHint); },delay); } }; jQuery.setFocus = function(selector,msecs){ setTimeout(function(){ $(selector).trigger("focus"); },msecs); } jQuery.clog = function(obj){ var err = new Error(); var caller_line = err.stack.split("\n")[2]; var index = caller_line.indexOf("at "); var clean = caller_line.slice(index+2, caller_line.length); console.log(clean+" :> "+obj); } var _wx_reusable_pool = {}; jQuery.reuse = function(name,parm) { var optObject = true; if (_wx_reusable_pool[name]==null){ if ($.isNothing(name,true)==false){ var tmpnode = name; optObject = false; }else{ return false; } }else{ var tmpnode = _wx_reusable_pool[name]; } if (parm!=null){ jQuery.each(parm,function(key,value){ var re = new RegExp('##'+key+'##', "g"); tmpnode = tmpnode.replace(re,value); }) } return optObject==true?jQuery(tmpnode):tmpnode; }; jQuery.collectReusable = function(){ $("[wx-reusename] [wx-reusename] [wx-reusename]").each(function(){ _wx_reusable_pool[$(this).attr("wx-reusename")]=$(this).outerHTML(); $(this).remove(); }); $("[wx-reusename] [wx-reusename]").each(function(){ _wx_reusable_pool[$(this).attr("wx-reusename")]=$(this).outerHTML(); $(this).remove(); }); $("[wx-reusename]").each(function(){ _wx_reusable_pool[$(this).attr("wx-reusename")]=$(this).outerHTML(); $(this).remove(); }); } jQuery.isNothing = function(obj,escstr){ if (escstr==null) escstr = false; if (obj==null) return true; var rtnval = false; switch(typeof obj){ case "object": return false; break; case "string": if (escstr==true){ return false; }else{ if (obj === ""){ return true; } return false; } break; case "undefined": return false; break; } if (typeof obj !== "string" && isNaN(obj)) return true; return false; } jQuery.numFormat = function(str) { return (str+"").replace(/.(?=(?:[0-9]{3})+\b)/g, '$&,'); }; jQuery.stringify = function (obj) { var t = typeof (obj); if (t != "object" || obj === null) { // simple data type if (t == "string") obj = '"'+obj+'"'; return String(obj); } else { // recurse array or object var n, v, json = [], arr = (obj && obj.constructor == Array); for (n in obj) { v = obj[n]; t = typeof(v); if (t == "string") v = '"'+v+'"'; else if (t == "object" && v !== null) v = JSON.stringify(v); json.push((arr ? "" : '"' + n + '":') + String(v)); } return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); } }; jQuery.jsonEncode = function(obj){ return encodeURIComponent(jQuery.stringify(obj)); } jQuery.jsonDecode = function(jsonstring){ return $.parseJSON(decodeURIComponent(jsonstring)); } jQuery.padLeft = function(str, len) { str = '' + str; return str.length >= len ? str : new Array(len - str.length + 1).join("0") + str; } jQuery.padRight = function(str, len) { str = '' + str; return str.length >= len ? str : str + new Array(len - str.length + 1).join("0"); } jQuery.strTotime = function (text, now) { // discuss at: http://locutus.io/php/strtotime/ // original by: Caio Ariede (http://caioariede.com) // improved by: Kevin van Zonneveld (http://kvz.io) // improved by: Caio Ariede (http://caioariede.com) // improved by: A. Matías Quezada (http://amatiasq.com) // improved by: preuter // improved by: Brett Zamir (http://brett-zamir.me) // improved by: Mirko Faber // input by: David // bugfixed by: Wagner B. Soares // bugfixed by: Artur Tchernychev // bugfixed by: Stephan Bösch-Plepelits (http://github.com/plepe) // note 1: Examples all have a fixed timestamp to prevent // note 1: tests to fail because of variable time(zones) // example 1: strtotime('+1 day', 1129633200) // returns 1: 1129719600 // example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200) // returns 2: 1130425202 // example 3: strtotime('last month', 1129633200) // returns 3: 1127041200 // example 4: strtotime('2009-05-04 08:30:00 GMT') // returns 4: 1241425800 // example 5: strtotime('2009-05-04 08:30:00+00') // returns 5: 1241425800 // example 6: strtotime('2009-05-04 08:30:00+02:00') // returns 6: 1241418600 // example 7: strtotime('2009-05-04T08:30:00Z') // returns 7: 1241425800 var parsed var match var today var year var date var days var ranges var len var times var regex var i var fail = false if (!text) { return fail } // Unecessary spaces text = text.replace(/^\s+|\s+$/g, '') .replace(/\s{2,}/g, ' ') .replace(/[\t\r\n]/g, '') .toLowerCase() // in contrast to php, js Date.parse function interprets: // dates given as yyyy-mm-dd as in timezone: UTC, // dates with "." or "-" as MDY instead of DMY // dates with two-digit years differently // etc...etc... // ...therefore we manually parse lots of common date formats var pattern = new RegExp([ '^(\\d{1,4})', '([\\-\\.\\/:])', '(\\d{1,2})', '([\\-\\.\\/:])', '(\\d{1,4})', '(?:\\s(\\d{1,2}):(\\d{2})?:?(\\d{2})?)?', '(?:\\s([A-Z]+)?)?$' ].join('')) match = text.match(pattern) if (match && match[2] === match[4]) { if (match[1] > 1901) { switch (match[2]) { case '-': // YYYY-M-D if (match[3] > 12 || match[5] > 31) { return fail } return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 case '.': // YYYY.M.D is not parsed by strtotime() return fail case '/': // YYYY/M/D if (match[3] > 12 || match[5] > 31) { return fail } return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } } else if (match[5] > 1901) { switch (match[2]) { case '-': // D-M-YYYY if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 case '.': // D.M.YYYY if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 case '/': // M/D/YYYY if (match[1] > 12 || match[3] > 31) { return fail } return new Date(match[5], parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } } else { switch (match[2]) { case '-': // YY-M-D if (match[3] > 12 || match[5] > 31 || (match[1] < 70 && match[1] > 38)) { return fail } year = match[1] >= 0 && match[1] <= 38 ? +match[1] + 2000 : match[1] return new Date(year, parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 case '.': // D.M.YY or H.MM.SS if (match[5] >= 70) { // D.M.YY if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } if (match[5] < 60 && !match[6]) { // H.MM.SS if (match[1] > 23 || match[3] > 59) { return fail } today = new Date() return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0, match[9] || 0) / 1000 } // invalid format, cannot be parsed return fail case '/': // M/D/YY if (match[1] > 12 || match[3] > 31 || (match[5] < 70 && match[5] > 38)) { return fail } year = match[5] >= 0 && match[5] <= 38 ? +match[5] + 2000 : match[5] return new Date(year, parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 case ':': // HH:MM:SS if (match[1] > 23 || match[3] > 59 || match[5] > 59) { return fail } today = new Date() return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0) / 1000 } } } // other formats and "now" should be parsed by Date.parse() if (text === 'now') { return now === null || isNaN(now) ? new Date().getTime() / 1000 | 0 : now | 0 } if (!isNaN(parsed = Date.parse(text))) { return parsed / 1000 | 0 } // Browsers !== Chrome have problems parsing ISO 8601 date strings, as they do // not accept lower case characters, space, or shortened time zones. // Therefore, fix these problems and try again. // Examples: // 2015-04-15 20:33:59+02 // 2015-04-15 20:33:59z // 2015-04-15t20:33:59+02:00 pattern = new RegExp([ '^([0-9]{4}-[0-9]{2}-[0-9]{2})', '[ t]', '([0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]+)?)', '([\\+-][0-9]{2}(:[0-9]{2})?|z)' ].join('')) match = text.match(pattern) if (match) { // @todo: time zone information if (match[4] === 'z') { match[4] = 'Z' } else if (match[4].match(/^([+-][0-9]{2})$/)) { match[4] = match[4] + ':00' } if (!isNaN(parsed = Date.parse(match[1] + 'T' + match[2] + match[4]))) { return parsed / 1000 | 0 } } date = now ? new Date(now * 1000) : new Date() days = { 'sun': 0, 'mon': 1, 'tue': 2, 'wed': 3, 'thu': 4, 'fri': 5, 'sat': 6 } ranges = { 'yea': 'FullYear', 'mon': 'Month', 'day': 'Date', 'hou': 'Hours', 'min': 'Minutes', 'sec': 'Seconds' } function lastNext (type, range, modifier) { var diff var day = days[range] if (typeof day !== 'undefined') { diff = day - date.getDay() if (diff === 0) { diff = 7 * modifier } else if (diff > 0 && type === 'last') { diff -= 7 } else if (diff < 0 && type === 'next') { diff += 7 } date.setDate(date.getDate() + diff) } } function process (val) { // @todo: Reconcile this with regex using \s, taking into account // browser issues with split and regexes var splt = val.split(' ') var type = splt[0] var range = splt[1].substring(0, 3) var typeIsNumber = /\d+/.test(type) var ago = splt[2] === 'ago' var num = (type === 'last' ? -1 : 1) * (ago ? -1 : 1) if (typeIsNumber) { num *= parseInt(type, 10) } if (ranges.hasOwnProperty(range) && !splt[1].match(/^mon(day|\.)?$/i)) { return date['set' + ranges[range]](date['get' + ranges[range]]() + num) } if (range === 'wee') { return date.setDate(date.getDate() + (num * 7)) } if (type === 'next' || type === 'last') { lastNext(type, range, num) } else if (!typeIsNumber) { return false } return true } times = '(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec' + '|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?' + '|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)' regex = '([+-]?\\d+\\s' + times + '|' + '(last|next)\\s' + times + ')(\\sago)?' match = text.match(new RegExp(regex, 'gi')) if (!match) { return fail } for (i = 0, len = match.length; i < len; i++) { if (!process(match[i])) { return fail } } return (date.getTime() / 1000) } jQuery.dateTimeStr = function(type,timestamp,istw){ if (timestamp==null) timestamp = jQuery.now(); if (istw==null) istw = false; var dd = new Date(timestamp); var ddyear = dd.getFullYear(); if (istw) ddyear -= 1911; switch(type){ case "Y/m/d": return ddyear+'/'+jQuery.padLeft(dd.getMonth()+1,2)+'/'+jQuery.padLeft(dd.getDate(),2); break; case "Y/m/d H:i:s": return ddyear+'/'+jQuery.padLeft(dd.getMonth()+1,2)+'/'+jQuery.padLeft(dd.getDate(),2)+' '+jQuery.padLeft(dd.getHours(),2)+':'+jQuery.padLeft(dd.getMinutes(),2)+':'+jQuery.padLeft(dd.getSeconds(),2); break; case "Y-m-d": return ddyear+'-'+jQuery.padLeft(dd.getMonth()+1,2)+'-'+jQuery.padLeft(dd.getDate(),2); break; case "H:i:s": return jQuery.padLeft(dd.getHours(),2)+':'+jQuery.padLeft(dd.getMinutes(),2)+':'+jQuery.padLeft(dd.getSeconds(),2); break; case "Y-m-d H:i:s": default: return ddyear+'-'+jQuery.padLeft(dd.getMonth()+1,2)+'-'+jQuery.padLeft(dd.getDate(),2)+' '+jQuery.padLeft(dd.getHours(),2)+':'+jQuery.padLeft(dd.getMinutes(),2)+':'+jQuery.padLeft(dd.getSeconds(),2); break; } } jQuery.parseSecret = function (secret,isStaff){ if (isStaff==null) isStaff = false; var tmpBase = Array(); tmpBase[0] = '221309'; tmpBase[1] = '681229'; tmpBase[2] = '978978'; var tmpChar = Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); var tmpLv1Key = secret.substr(0,1); var tmpLv2Key = (tmpLv1Key%3); if (isNaN(parseInt(tmpLv2Key,10))) return false; var tmpKey = tmpBase[tmpLv2Key]; var tmpBody = secret.substr(1,secret.length-2); var tmpCheckSum = 0//secret.substr(secret.length-2,1); var tmpSN = ''; for(var j=0;j var _cntQuery = {}; var _cntPageName = null; var _cntSubPageName = null; var _cntPageNo = 1; var _cntPageOrderBy = "sn"; var _cntPageOrderDir = "ASC"; var _cntPageSize = 10; var _cntPageTotal = 1; // 系統預設-切換頁面方法實作 var _SYSNAME = "WORXPACE";//OPTOP // 頁數提示方法實作 function _pageHint(res){ if (res!=null){ _cntPageNo = res.jin.view.pagenum; _cntPageTotal = Math.ceil(res.trecs/res.jin.view.pagesize); $("[wx-role='hint-rows']").html(res.trecs); $("[wx-role='hint-page']").val(res.jin.view.pagenum); $("[wx-role='hint-pages']").html(_cntPageTotal); }else{ $("[wx-role='hint-rows']").html("0"); $("[wx-role='hint-page']").val("0"); $("[wx-role='hint-pages']").html("0"); } } // 自動焦點方法實作 function _autoFocus(){ $("[autofocus]:visible").focus(); } // 填入內容使用 function _fillOptions(target,data,valuefield,displayfield,defval,isremove){ var selector = target; // 要給予多層指定時,由呼叫者指定所以從 [ 開始 if (selector.substr(0,1)!="["){ // 只針對一項/層 時可以用 $ / wx- / # if (selector.substr(0,1)=="$"){ selector = "select[wx-"+selector.substr(1)+"]"; }else if(selector.substr(0,3)=="wx-"){ selector = "select["+selector+"]"; }else if(selector.substr(0,1)=="#"){ selector = ""+selector+""; }else{ selector = "#"+selector; } } if (isremove==null || isremove==true) $(selector+" option").remove(); jQuery.each(data,function(key,value){ if (valuefield==null && displayfield==null){ $(selector).append($("").attr("value",key).text(value)); }else{ $(selector).append($("").attr("value",value[valuefield]).text(value[displayfield])); } }); if (defval!=null){ $(selector).xval(defval); } } // 定義本系統的常用項目 var _wx_docroot = "/"; // 文件根相對站台網域的相對位置 "/op/" // 預設 ajax.fail 的執行。 function _defGoFailFunc(res,st,jx){ alert($.stringify(arguments)); var errHint = "相關資訊:\n"+res.status+" "+res.statusText; _popWin({ "title":"服務異常", "content":"您目前執行的操作,無法被服務端執行,若您確認網路連線正常,可以嘗試重新整理 Ctrl+F5 您的瀏覽器後再執行所需的服務!!
"+errHint+"
", "noCaption":"了解", "noAction":function(){ window.location.href=_wx_docroot; } }); } function _defNotice(code,text){ switch(code){ case 400: var msg = ""; switch(text){ case "Info Required Not Specified": msg = "進行查閱所需的資料缺乏,建議您 Ctrl+F5 重新整理後再嘗試操作。"; break; default: mag = "無法到達您所需要的服務。"; break; } _popWin({ "title":"缺乏關鍵資料!", "content":msg+"
"+code+":"+text+"
", "noCaption":"回到主畫面", "noAction":function(){ window.location.href=_wx_docroot; } }); break case 401: var msg = ""; switch(text){ default: msg = "未標示/授權的資訊或地點,你可能處於無法使用此服務的網路,或者你必須要標示你所處的位置。"; break; } _popWin({ "title":"未標示/授權定位!", "content":msg+"
"+code+":"+text+"
", "noCaption":"回到主畫面", "noAction":function(){ window.location.href=_wx_docroot; } }); break case 403: var msg = ""; switch(text){ default: msg = "您目前的登入身份/網路位置,無法提供你欲前往的服務權限。"; break; } _popWin({ "title":"沒有服務的權限!", "content":msg+"
"+code+":"+text+"
", "noCaption":"回到主畫面", "noAction":function(){ window.location.href=_wx_docroot; } }); break case 404: var msg = ""; switch(text){ default: msg = "找不到相關資料或者服務。"; break; } _popWin({ "title":"沒有相應的資訊!", "content":msg+"
"+code+":"+text+"
", "noCaption":"回到主畫面", "noAction":function(){ window.location.href=_wx_docroot; } }); break case 405: var msg = ""; switch(text){ default: msg = "您抵達服務的方式並不正常,以致無法進入該服務,請依 系統介面 的操作執行相關功能。"; break; } _popWin({ "title":"不支援的輸入方式!", "content":msg+"
"+code+":"+text+"
", "noCaption":"回到主畫面", "noAction":function(){ window.location.href=_wx_docroot; } }); break case 422: var msg = ""; switch(text){ case "Unprocessable Entity - Fail": msg = "進行資料驗證無法通過查核,建議您 Ctrl+F5 重新整理後再嘗試操作。"; break; case "Unprocessable Entity - Empty": msg = "進行資料驗證時發現空值,建議您 Ctrl+F5 重新整理後再嘗試操作。"; break; default: msg = "輸入資料驗證發生了問題,建議您 Ctrl+F5 重新整理後再嘗試操作。"; break; } _popWin({ "title":"發生資料驗證問題!", "content":msg+"
"+code+":"+text+"
", "noCaption":"回到主畫面", "noAction":function(){ window.location.href=_wx_docroot; } }); break case 500: var msg = ""; switch(text){ case "Server Internal Error - Database": msg = "無法連線資料庫,這可能是一個短時間內無法排除除的問題,建議您稍後再嘗試連結。"; break; default: msg = "目前伺服主機無法提供正常的服務,這可能是一個短時間內無法排除除的問題,建議您稍後再嘗試連結。"; break; } _popWin({ "title":"發生伺服器上的問題!", "content":msg+"
"+code+":"+text+"
", "noCaption":"回到主畫面", "noAction":function(){ window.location.href=_wx_docroot; } }); break case 501: var msg = ""; switch(text){ default: msg = "嘗試要執行的功能,尚未開始提供服務,請選取介面上標示為可進行的操作。"; break; } _popWin({ "title":"尚未提供的服務!", "content":msg+"
"+code+":"+text+"
", "noCaption":"回到主畫面", "noAction":function(){ window.location.href=_wx_docroot; } }); break } } // 清除輸入欄位數值 function _cleanField(target){ target.find(" input[type='checkbox']").prop("checked", false); target.find(" [wx-default]").each(function(){ switch($(this).tagName().toLocaleLowerCase()){ case "div": $(this).html($(this).attr("wx-default")); break; default: if ($(this).attr("type")=="checkbox"){ if ($.isNothing($(this).attr("wx-default")) && $(this).attr("wx-default")!="1" && $(this).attr("wx-default")!="true" && $(this).attr("wx-default")!="Yes" && $(this).attr("wx-default")!="On"){ $(this).prop("checked", false); }else{ $(this).prop("checked", true); } }else{ $(this).val($(this).attr("wx-default")); $(this).attr("wx-value",$(this).attr("wx-default")); } break; } }); } function _initFields(role){ if (role==null) role=""; $(role+"[wx-field]").each(function(){ if ($(this).attr("type")=="checkbox") return true; var theVal = ""; if ($.isNothing($(this).val())==false){ theVal = $(this).val() } if ($.isNothing($(this).wx("default"))==true){ $(this).wx("default",theVal); $(this).xval(theVal); } if ($.isNothing($(this).wx("value"))==true){ $(this).wx("value",theVal); $(this).xval(theVal); } if ($.isNothing($(this).wx("orival"))==true){ $(this).wx("orival",theVal); $(this).xval(theVal); } }); $(role+"[wx-role='rdoItem']").on("click",function(){ $("["+$(this).wx("for").replace(/\$/,"wx-")+"][wx-field='"+$(this).wx("field")+"']").val($(this).val()); }); $("[wx-type='number']").each(function(){ var tsVal = $("[wx-type='number']").val(); if ($.isNothing(tsVal)) tsVal = 0; tsVal = tsVal*1; if (tsVal<0) tsVal = 0; $(this).xval(tsVal); }); $("[wx-type='number']").on("change",function(){ $("[wx-type='number']").val(_rtnNumQty($("[wx-type='number']").val())); }); } function _rtnNumQty(tsVal){ if ($.isNothing(tsVal)) tsVal = 0; tsVal = tsVal*1; if (tsVal<0) tsVal = 0; return(tsVal); } function _autoPager(ctnRole,shrBtn,tRecs,view,action){ if (view.pagenum==view.pagecount){ $(ctnRole).addClass("hide"); $(shrBtn).wx("cond",""); }else{ $(ctnRole).removeClass("hide"); var pageNext = view.pagenum * 1 + 1; var pageNextFrom = ( pageNext - 1 ) * view.pagesize * 1 + 1; var pageNextTo = ( pageNext ) * view.pagesize; var pageTotalRecs = tRecs; if (pageNextTo>=pageTotalRecs){ pageNextTo = pageTotalRecs; } $(ctnRole+" [wx-role='btnReadMore']").removeClass("hide"); $(ctnRole+" [wx-role='btnReadMore']").wx("page",pageNext); $(ctnRole+" [wx-role='btnReadMore']").unbind("click"); if ($.isFunction(action)){ $(ctnRole+" [wx-role='btnReadMore']").on("click",action); }else{ $(ctnRole+" [wx-role='btnReadMore']").on("click",function(){ $(shrBtn).wx("page",$(this).wx("page")); $(shrBtn).trigger("click"); }); } $(ctnRole+" [wx-role='hintRowNextFrom']").html(pageNextFrom); $(ctnRole+" [wx-role='hintRowNextTo']").html(pageNextTo); $(ctnRole+" [wx-role='hintRowTotal']").html(pageTotalRecs); } }/** * jQuery TWzipcode plugin * https://code.essoduke.org/twzipcode/ * Copyright 2017 essoduke.org, Licensed MIT. * * Changelog * ------------------------------- * 新增 html5 [data-*] 新增為元素屬性的功能。 * * @author essoduke.org * @version 1.7.13 * @license MIT License */ ;(function ($, window, document, undefined) { 'use strict'; // Zipcode JSON data var data = { '基隆市': {'仁愛區': '200', '信義區': '201', '中正區': '202', '中山區': '203', '安樂區': '204', '暖暖區': '205', '七堵區': '206'}, '臺北市': {'中正區': '100', '大同區': '103', '中山區': '104', '松山區': '105', '大安區': '106', '萬華區': '108', '信義區': '110', '士林區': '111', '北投區': '112', '內湖區': '114', '南港區': '115', '文山區': '116'}, '新北市': { '萬里區': '207', '金山區': '208', '板橋區': '220', '汐止區': '221', '深坑區': '222', '石碇區': '223', '瑞芳區': '224', '平溪區': '226', '雙溪區': '227', '貢寮區': '228', '新店區': '231', '坪林區': '232', '烏來區': '233', '永和區': '234', '中和區': '235', '土城區': '236', '三峽區': '237', '樹林區': '238', '鶯歌區': '239', '三重區': '241', '新莊區': '242', '泰山區': '243', '林口區': '244', '蘆洲區': '247', '五股區': '248', '八里區': '249', '淡水區': '251', '三芝區': '252', '石門區': '253' }, '宜蘭縣': { '宜蘭市': '260', '頭城鎮': '261', '礁溪鄉': '262', '壯圍鄉': '263', '員山鄉': '264', '羅東鎮': '265', '三星鄉': '266', '大同鄉': '267', '五結鄉': '268', '冬山鄉': '269', '蘇澳鎮': '270', '南澳鄉': '272', '釣魚臺列嶼': '290' }, '新竹市': {'東區': '300', '北區': '300', '香山區': '300'}, '新竹縣': { '竹北市': '302', '湖口鄉': '303', '新豐鄉': '304', '新埔鎮': '305', '關西鎮': '306', '芎林鄉': '307', '寶山鄉': '308', '竹東鎮': '310', '五峰鄉': '311', '橫山鄉': '312', '尖石鄉': '313', '北埔鄉': '314', '峨嵋鄉': '315' }, '桃園市': { '中壢區': '320', '平鎮區': '324', '龍潭區': '325', '楊梅區': '326', '新屋區': '327', '觀音區': '328', '桃園區': '330', '龜山區': '333', '八德區': '334', '大溪區': '335', '復興區': '336', '大園區': '337', '蘆竹區': '338' }, '苗栗縣': { '竹南鎮': '350', '頭份市': '351', '三灣鄉': '352', '南庄鄉': '353', '獅潭鄉': '354', '後龍鎮': '356', '通霄鎮': '357', '苑裡鎮': '358', '苗栗市': '360', '造橋鄉': '361', '頭屋鄉': '362', '公館鄉': '363', '大湖鄉': '364', '泰安鄉': '365', '銅鑼鄉': '366', '三義鄉': '367', '西湖鄉': '368', '卓蘭鎮': '369' }, '臺中市': { '中區': '400', '東區': '401', '南區': '402', '西區': '403', '北區': '404', '北屯區': '406', '西屯區': '407', '南屯區': '408', '太平區': '411', '大里區': '412', '霧峰區': '413', '烏日區': '414', '豐原區': '420', '后里區': '421', '石岡區': '422', '東勢區': '423', '和平區': '424', '新社區': '426', '潭子區': '427', '大雅區': '428', '神岡區': '429', '大肚區': '432', '沙鹿區': '433', '龍井區': '434', '梧棲區': '435', '清水區': '436', '大甲區': '437', '外埔區': '438', '大安區': '439' }, '彰化縣': { '彰化市': '500', '芬園鄉': '502', '花壇鄉': '503', '秀水鄉': '504', '鹿港鎮': '505', '福興鄉': '506', '線西鄉': '507', '和美鎮': '508', '伸港鄉': '509', '員林市': '510', '社頭鄉': '511', '永靖鄉': '512', '埔心鄉': '513', '溪湖鎮': '514', '大村鄉': '515', '埔鹽鄉': '516', '田中鎮': '520', '北斗鎮': '521', '田尾鄉': '522', '埤頭鄉': '523', '溪州鄉': '524', '竹塘鄉': '525', '二林鎮': '526', '大城鄉': '527', '芳苑鄉': '528', '二水鄉': '530' }, '南投縣': { '南投市': '540', '中寮鄉': '541', '草屯鎮': '542', '國姓鄉': '544', '埔里鎮': '545', '仁愛鄉': '546', '名間鄉': '551', '集集鎮': '552', '水里鄉': '553', '魚池鄉': '555', '信義鄉': '556', '竹山鎮': '557', '鹿谷鄉': '558' }, '嘉義市': {'東區': '600', '西區': '600'}, '嘉義縣': { '番路鄉': '602', '梅山鄉': '603', '竹崎鄉': '604', '阿里山': '605', '中埔鄉': '606', '大埔鄉': '607', '水上鄉': '608', '鹿草鄉': '611', '太保市': '612', '朴子市': '613', '東石鄉': '614', '六腳鄉': '615', '新港鄉': '616', '民雄鄉': '621', '大林鎮': '622', '溪口鄉': '623', '義竹鄉': '624', '布袋鎮': '625' }, '雲林縣': { '斗南鎮': '630', '大埤鄉': '631', '虎尾鎮': '632', '土庫鎮': '633', '褒忠鄉': '634', '東勢鄉': '635', '臺西鄉': '636', '崙背鄉': '637', '麥寮鄉': '638', '斗六市': '640', '林內鄉': '643', '古坑鄉': '646', '莿桐鄉': '647', '西螺鎮': '648', '二崙鄉': '649', '北港鎮': '651', '水林鄉': '652', '口湖鄉': '653', '四湖鄉': '654', '元長鄉': '655' }, '臺南市': { '中西區': '700', '東區': '701', '南區': '702', '北區': '704', '安平區': '708', '安南區': '709', '永康區': '710', '歸仁區': '711', '新化區': '712', '左鎮區': '713', '玉井區': '714', '楠西區': '715', '南化區': '716', '仁德區': '717', '關廟區': '718', '龍崎區': '719', '官田區': '720', '麻豆區': '721', '佳里區': '722', '西港區': '723', '七股區': '724', '將軍區': '725', '學甲區': '726', '北門區': '727', '新營區': '730', '後壁區': '731', '白河區': '732', '東山區': '733', '六甲區': '734', '下營區': '735', '柳營區': '736', '鹽水區': '737', '善化區': '741', '大內區': '742', '山上區': '743', '新市區': '744', '安定區': '745' }, '高雄市': { '新興區': '800', '前金區': '801', '苓雅區': '802', '鹽埕區': '803', '鼓山區': '804', '旗津區': '805', '前鎮區': '806', '三民區': '807', '楠梓區': '811', '小港區': '812', '左營區': '813', '仁武區': '814', '大社區': '815', '東沙群島': '817', '南沙群島': '819', '岡山區': '820', '路竹區': '821', '阿蓮區': '822', '田寮區': '823', '燕巢區': '824', '橋頭區': '825', '梓官區': '826', '彌陀區': '827', '永安區': '828', '湖內區': '829', '鳳山區': '830', '大寮區': '831', '林園區': '832', '鳥松區': '833', '大樹區': '840', '旗山區': '842', '美濃區': '843', '六龜區': '844', '內門區': '845', '杉林區': '846', '甲仙區': '847', '桃源區': '848', '那瑪夏區': '849', '茂林區': '851', '茄萣區': '852' }, '屏東縣': { '屏東市': '900', '三地門鄉': '901', '霧臺鄉': '902', '瑪家鄉': '903', '九如鄉': '904', '里港鄉': '905', '高樹鄉': '906', '鹽埔鄉': '907', '長治鄉': '908', '麟洛鄉': '909', '竹田鄉': '911', '內埔鄉': '912', '萬丹鄉': '913', '潮州鎮': '920', '泰武鄉': '921', '來義鄉': '922', '萬巒鄉': '923', '崁頂鄉': '924', '新埤鄉': '925', '南州鄉': '926', '林邊鄉': '927', '東港鎮': '928', '琉球鄉': '929', '佳冬鄉': '931', '新園鄉': '932', '枋寮鄉': '940', '枋山鄉': '941', '春日鄉': '942', '獅子鄉': '943', '車城鄉': '944', '牡丹鄉': '945', '恆春鎮': '946', '滿州鄉': '947' }, '臺東縣': { '臺東市': '950', '綠島鄉': '951', '蘭嶼鄉': '952', '延平鄉': '953', '卑南鄉': '954', '鹿野鄉': '955', '關山鎮': '956', '海端鄉': '957', '池上鄉': '958', '東河鄉': '959', '成功鎮': '961', '長濱鄉': '962', '太麻里鄉': '963', '金峰鄉': '964', '大武鄉': '965', '達仁鄉': '966' }, '花蓮縣': { '花蓮市': '970', '新城鄉': '971', '秀林鄉': '972', '吉安鄉': '973', '壽豐鄉': '974', '鳳林鎮': '975', '光復鄉': '976', '豐濱鄉': '977', '瑞穗鄉': '978', '萬榮鄉': '979', '玉里鎮': '981', '卓溪鄉': '982', '富里鄉': '983' }, '金門縣': {'金沙鎮': '890', '金湖鎮': '891', '金寧鄉': '892', '金城鎮': '893', '烈嶼鄉': '894', '烏坵鄉': '896'}, '連江縣': {'南竿鄉': '209', '北竿鄉': '210', '莒光鄉': '211', '東引鄉': '212'}, '澎湖縣': {'馬公市': '880', '西嶼鄉': '881', '望安鄉': '882', '七美鄉': '883', '白沙鄉': '884', '湖西鄉': '885'} }; /** * twzipcode Constructor * @param {Object} container HTML element * @param {(Object|string)} options User settings * @constructor */ function TWzipcode (container, options) { /** * Default settings * @type {Object} */ var defaults = { 'countyName' : 'county', 'css' : [], 'detect' : false, // v1.6.7 'districtName' : 'district', 'googleMapsKey' : '', // v1.6.9 'hideCounty' : [], // v1.7.9 'hideDistrict' : [], // v1.7.9 'onCountySelect' : null, // v1.5 'onDistrictSelect' : null, // v1.5 'onZipcodeKeyUp' : null, // v1.5 'afterZipcodeSetup' : null, // v1.7.13 add by Mxp.TW 'readonly' : false, 'zipcodeName' : 'zipcode', 'zipcodePlaceholder' : '郵遞區號', 'zipcodeIntoDistrict' : false, // v1.6.6 }; /** * DOM of selector * @type {Object} */ this.container = $(container); /** * Merge the options * @type {Object} */ this.options = $.extend({}, defaults, options); // initialize this.init(); } /** * TWzipcode prototype */ TWzipcode.prototype = { VERSION: '1.7.12', /** * Method: Get all post data * @return {Object} */ data: function () { var wrap = this.wrap; return 'undefined' !== typeof data[wrap.county.val()] ? data[wrap.county.val()] : data; }, /** * Method: Serialize the data * @return {string} */ serialize: function () { var result = [], obj = {}, ele = {}, s = {}; obj = this.container.find('select,input'); if (obj.length) { obj.each(function () { ele = $(this); result.push(ele.attr('name') + '=' + ele.val()); }); } else { $(this).children().each(function () { s = $(this); result.push(s.attr('name') + '=' + s.val()); }); } return result.join('&'); }, /** * Method: Destroy the container. * @this {TWzipcode} */ destroy: function () { $.data(this.container.get(0), 'twzipcode', null); if (this.container.length) { return this.container.empty().off('change.twzipcode keyup.twzipcode blur.twzipcode'); } }, /** * Method: Get elements of instance * @param {(string|Array)} opts Type name * @param {Function} callback Function callback */ get: function (callback) { var self = this, result = [], n; function putin (o) { if ('undefined' !== typeof self.wrap[o]) { result.push(self.wrap[o].val()); } } if ('function' === typeof callback) { callback.call(this, this.wrap.county.val(), this.wrap.district.val(), this.wrap.zipcode.val()); } else if ('string' === typeof callback) { callback.split(',').forEach(putin); } else if (Array.isArray(callback)) { callback.forEach(putin); } else { result = this.wrap; } return result; }, /** * Method: Set value for elements. * @param {(string|number|Object)} opts Input value */ set: function (opts) { var self = this, def = { 'county' : '', 'district' : '', 'zipcode' : '' }, opt = $.extend({}, def, opts); try { if ('string' === typeof opts || 'number' === typeof opts) { self.wrap.zipcode.val(opts).trigger('blur.twzipcode'); } else { if (opt.zipcode) { self.wrap.zipcode.val(opt.zipcode).trigger('blur.twzipcode'); } if (opt.county) { self.wrap.county.val(opt.county).trigger('change.twzipcode'); } if (opt.district) { self.wrap.district.val(opt.district).trigger('change.twzipcode'); } } } catch (ignore) { console.warn(ignore.message); } finally { return self.container; } }, /** * Method: Reset the selected items to default. * @this {TWzipcode} */ reset: function (container, obj) { var self = this, wrap = self.wrap, opts = self.options, county = '', list = { 'county': '', 'district': '' }, tpl = []; switch (obj) { case 'district': wrap.district.html(list.district); break; default: wrap.county.html(list.county); wrap.district.html(list.district); for (county in data) { if ('undefined' !== typeof data[county] && -1 === opts.hideCounty.indexOf(county)) { tpl.push(''); } } $(tpl.join('')).appendTo(wrap.county); break; } wrap.zipcode.val(''); }, /** * Binding the event of the elements * @this {TWzipcode} */ bindings: function () { var self = this, opts = self.options, wrap = self.wrap, dz = '', dc = '', dd = ''; // county wrap.county.on('change.twzipcode', function () { var val = $(this).val(), district = '', tpl = []; wrap.district.empty(); if (val) { if (true === opts.zipcodeIntoDistrict) { for (district in data[val]) { if ('undefined' !== typeof data[val][district] && (-1 === opts.hideDistrict.indexOf(district) && -1 === opts.hideDistrict.indexOf(data[val][district])) ) { tpl.push(''); } } } else { for (district in data[val]) { if ('undefined' !== typeof data[val][district] && (-1 === opts.hideDistrict.indexOf(district) && -1 === opts.hideDistrict.indexOf(data[val][district])) ) { tpl.push(''); } } } wrap.district.append(tpl.join('')).trigger('change.twzipcode'); } else { wrap.county.find('option:first').prop('selected', true); self.reset('district'); } // County callback binding if ('function' === typeof opts.onCountySelect) { opts.onCountySelect.call(this); } }); // District wrap.district.on('change.twzipcode', function () { var val = $(this).val(); if (wrap.county.val()) { wrap.zipcode.val(data[wrap.county.val()][val]); } // District callback binding if ('function' === typeof opts.onDistrictSelect) { opts.onDistrictSelect.call(this); } }); // Zipcode wrap.zipcode.on('keyup.twzipcode blur.twzipcode', function () { var obj = $(this), val = '', i = '', j = ''; obj.val(obj.val().replace(/[^0-9]/g, '')); val = obj.val().toString(); if (3 === val.length) { for (i in data) { if ('undefined' !== typeof data[i]) { for (j in data[i]) { if ('undefined' !== typeof data[i][j] && val === data[i][j] ) { wrap.county.val(i).trigger('change.twzipcode'); wrap.district.val(j).trigger('change.twzipcode'); break; } } } } } // Zipcode callback binding if ('function' === typeof opts.onZipcodeKeyUp) { opts.onZipcodeKeyUp.call(this); } }); // Put [data-*] into attributes of element (function () { var zip = self.role.zipcode.data(), county = self.role.county.data(), district = self.role.district.data(), n; for (n in zip) { if ('role' !== n) { self.role.zipcode.find(':input').attr(n, zip[n]); } } for (n in county) { if ('role' !== n) { self.role.county.find('select').attr(n, county[n]); } } for (n in district) { if ('role' !== n) { self.role.district.find('select').attr(n, district[n]); } } }()); dz = 'undefined' !== typeof opts.zipcodeSel ? opts.zipcodeSel : ( 'undefined' !== typeof self.role.zipcode.data('value') ? self.role.zipcode.data('value') : opts.zipcodeSel ); dc = 'undefined' !== typeof opts.countySel ? opts.countySel : ( 'undefined' !== typeof self.role.county.data('value') ? self.role.county.data('value') : opts.countySel ); dd = 'undefined' !== typeof opts.districtSel ? opts.districtSel : ( 'undefined' !== typeof self.role.district.data('value') ? self.role.district.data('value') : opts.districtSel ); // Default value if (dc) { self.wrap.county.val(dc).trigger('change.twzipcode'); if ('undefined' !== typeof data[dc][dd]) { self.wrap.district.val(dd).trigger('change.twzipcode'); } } if (dz && 3 === dz.toString().length) { self.wrap.zipcode.val(dz).trigger('blur.twzipcode'); } }, /** * Geolocation detect * @this {TWzipcode} */ geoLocation: function (callback) { var self = this, geolocation = navigator.geolocation, options = { 'maximumAge': 600000, 'timeout': 3000, 'enableHighAccuracy': false }, opts = self.options; if (!geolocation || !callback) { return; } geolocation.getCurrentPosition( function (loc) { var latlng = {}; if (('coords' in loc) && ('latitude' in loc.coords) && ('longitude' in loc.coords) ) { latlng = [loc.coords.latitude, loc.coords.longitude]; $.getJSON( 'https://maps.googleapis.com/maps/api/geocode/json', { 'key': opts.googleMapsKey, 'sensor': false, 'latlng': latlng.join(',') }, function (data) { var postal = ''; if (data && 'undefined' !== typeof data.results && 'undefined' !== typeof data.results[0].address_components && 'undefined' !== typeof data.results[0].address_components[0] ) { postal = data.results[0] .address_components[data.results[0].address_components.length - 1] .long_name; if (postal) { self.wrap.zipcode.val(postal.toString()).trigger('blur.twzipcode'); } } if ('function' === typeof callback) { callback.call(self, loc); } }); } }, function (error) { console.error(error); }, options ); }, /** * twzipcode Initialize * @this {TWzipcode} */ init: function () { var self = this, container = self.container, opts = self.options, role = { county: container.find('[data-role=county]:first'), district: container.find('[data-role=district]:first'), zipcode: container.find('[data-role=zipcode]:first') }, countyName = role.county.data('name') || opts.countyName, districtName = role.district.data('name') || opts.districtName, zipcodeName = role.zipcode.data('name') || opts.zipcodeName, zipcodePlaceholder = role.zipcode.data('placeholder') || opts.zipcodePlaceholder, readonly = role.zipcode.data('readonly') || opts.readonly; // Elements create $('') .attr('name', districtName) .addClass(role.district.data('style') || ('undefined' !== typeof opts.css[1] ? opts.css[1] : '')) .appendTo(role.district.length ? role.district : container); $('') .attr({'type': 'text', 'name': zipcodeName, 'placeholder': zipcodePlaceholder}) .prop('readonly', readonly) .addClass(role.zipcode.data('style') || ('undefined' !== typeof opts.css[2] ? opts.css[2] : '')) .appendTo(role.zipcode.length ? role.zipcode : container); self.wrap = { 'county': container.find('select[name="' + countyName + '"]:first'), 'district': container.find('select[name="' + districtName + '"]:first'), 'zipcode': container.find('input[type=text][name="' + zipcodeName + '"]:first') }; if (true === opts.zipcodeIntoDistrict) { self.wrap.zipcode.hide(); } self.role = role; // Reset the elements self.reset(); // Elements events binding self.bindings(); // Geolocation self.geoLocation(opts.detect); // v.1.7.13 binding afterZipcodeSetup event. if ('function' === typeof opts.afterZipcodeSetup) { opts.afterZipcodeSetup.call(this); } } }; /** * jQuery twzipcode instance * @param {Object} options Plugin settings * @public */ $.fn.twzipcode = function (options) { var instance = {}, result = [], args = arguments, id = 'twzipcode'; if ('string' === typeof options) { this.each(function () { instance = $.data(this, id); if (instance instanceof TWzipcode && 'function' === typeof instance[options]) { result = instance[options].apply(instance, Array.prototype.slice.call(args, 1)); } }); return 'undefined' !== typeof result ? result : this; } else { return this.each(function () { if (!$.data(this, id)) { $.data(this, id, new TWzipcode(this, options)); } }); } }; })(window.jQuery || {}, window, document); //#EOF // 付款方式 _wx_datsrc['payMethod'] = {}; _wx_datsrc.payMethod['0'] = {"pay_method_sn":"0","pay_method_name":"\u4fe1\u7528\u5361"}; _wx_datsrc.payMethod['1'] = {"pay_method_sn":"1","pay_method_name":"Line Pay"}; _wx_datsrc.payMethod['2'] = {"pay_method_sn":"2","pay_method_name":"ATM\u532f\u6b3e"}; // 寄送地區 _wx_datsrc['shippingArea'] = {}; _wx_datsrc.shippingArea['1'] = {"shipping_sn":"1","shiping_area":"\u53f0\u7063\u672c\u5cf6"}; _wx_datsrc.shippingArea['2'] = {"shipping_sn":"2","shiping_area":"\u53f0\u7063\u96e2\u5cf6 (\u91d1\u9580\u3001\u6f8e\u6e56\u3001\u9023\u6c5f)"}; // 訂單狀態 _wx_datsrc['orderStatus'] = {}; _wx_datsrc.orderStatus['0'] = {"od_status_sn":"0","od_status_name":"\u5f85\u4ed8\u6b3e","description":""}; _wx_datsrc.orderStatus['1'] = {"od_status_sn":"1","od_status_name":"\u8655\u7406\u4e2d","description":""}; _wx_datsrc.orderStatus['2'] = {"od_status_sn":"2","od_status_name":"\u5df2\u51fa\u8ca8","description":""}; _wx_datsrc.orderStatus['3'] = {"od_status_sn":"3","od_status_name":"\u5df2\u53d6\u6d88","description":""}; _wx_datsrc.orderStatus['4'] = {"od_status_sn":"4","od_status_name":"\u5df2\u9000\u4ef6","description":""}; _wx_datsrc.orderStatus['5'] = {"od_status_sn":"5","od_status_name":"\u9000\u8ca8\u7533\u8acb\u4e2d","description":""}; _wx_datsrc.orderStatus['6'] = {"od_status_sn":"6","od_status_name":"\u5df2\u9000\u8ca8","description":""}; // 付款狀態 _wx_datsrc['payStatus'] = {}; _wx_datsrc.payStatus['0'] = {"pay_status_sn":"0","pay_staus":"\u7121\u6b3e\u9805","description":"\u521d\u59cb\u72c0\u614b\uff0c\u6216\u6d88\u8cbb\u8005\u5c1a\u672a\u4ed8\u6b3e\u5373\u9000\u8ca8\u5f8c\u986f\u793a\u72c0\u614b"}; _wx_datsrc.payStatus['1'] = {"pay_status_sn":"1","pay_staus":"\u5c1a\u672a\u4ed8\u6b3e","description":"\u6d88\u8cbb\u8005\u6210\u7acb\u8a02\u55ae\u5f8c\u5c1a\u672a\u56de\u5831\u4ed8\u6b3e\u72c0\u614b"}; _wx_datsrc.payStatus['2'] = {"pay_status_sn":"2","pay_staus":"\u5c1a\u672a\u78ba\u8a8d\u6b3e\u9805","description":"\u6210\u7acb\u8a02\u55ae\u5f8c --> \u56de\u5831\u532f\u6b3e\u5f8c\u72c0\u614b\u986f\u793a "}; _wx_datsrc.payStatus['3'] = {"pay_status_sn":"3","pay_staus":"\u5df2\u78ba\u8a8d\u6b3e\u9805","description":"\u5f8c\u53f0\u7ba1\u7406\u4eba\u54e1\u5c0d\u5e33\u5f8c\u986f\u793a\u72c0\u614b\r\n\u7531\u5ba2\u6236\u8f49\u5e33\u5f8c\u56de\u8986\u8cc7\u6599\u4f86\u5c0d\u5e33\uff0c\u5c0d\u5e33\u5b8c\u6210\u5f8c\u6703\u8b8a\u66f4\u70ba\u201c\u5df2\u78ba\u8a8d\u6b3e\u9805\u201d\u3002"}; _wx_datsrc.payStatus['4'] = {"pay_status_sn":"4","pay_staus":"\u5c1a\u672a\u9000\u6b3e","description":"\u6d88\u8cbb\u8005\u8981\u6c42\u9000\u8ca8\u5f8c\uff0c\u5c1a\u672a\u5c07\u6b3e\u9805\u9000\u7d66\u6d88\u8cbb\u8005 Refunded Pending"}; _wx_datsrc.payStatus['5'] = {"pay_status_sn":"5","pay_staus":"\u5df2\u9000\u6b3e","description":"\u6d88\u8cbb\u8005\u8981\u6c42\u9000\u8ca8\u5f8c\uff0c\u6b3e\u9805\u5df2\u7d93\u9000\u7d66\u6d88\u8cbb\u8005Refunded"}; // 商品類別 _wx_datsrc['pdtCategory'] = {}; _wx_datsrc.pdtCategory['1'] = {"pdt_cate_sn":"1","pdt_cate_name":"\u8cbc\u7d19"}; _wx_datsrc.pdtCategory['2'] = {"pdt_cate_sn":"2","pdt_cate_name":"\u8863\u670d"}; _wx_datsrc.pdtCategory['3'] = {"pdt_cate_sn":"3","pdt_cate_name":"\u6d3b\u52d5\u6307\u5b9a\u8d08\u54c1(\u52a0\u8cfc)"}; $(document).ready(function () { // 蒐集可回收利用的物件放置於 _wx_reusable_pool // initEvents(); $.collectReusable(); initEvents(); initEventsProduct(); // initPhotoswipe(); initEventsMessage(); initEventsShoppingCart(); initEventsOrder(); initEventsPayment(); initLayout(); }); /* declare array _wx_datsrc which stand for common data */ function initEvents(){ _fillOptions("#slt_od_payway", _wx_datsrc.payMethod,"pay_method_sn","pay_method_name",2,true); _fillOptions("#slt_od_shipping", _wx_datsrc.shippingArea,"shipping_sn","shiping_area",1,true); } /*________ init modal _________*/ function initLayout(){ /*________ init modal _________ 1. PhotoSwipe 的 z-index 是1500,popup win 要顯示在最上層 */ $("#modal_default").css("z-index","1700"); // popup win $("#modal_cart").css("z-index","1550"); // shopping cart $("#modal_Remittance").css("z-index","1600"); // modal_Remittance 回報匯款視窗 $("modal_comfirm_psw").css("z-index","1600"); // $("button.close").addClass('hide'); var galleryZIndex = $(".pswp").css("z-index"); //1500 var zIndex = $("#modal_default").css('z-index'); //$.clog("galleryZIndex: " + galleryZIndex); //$.clog("zIndex: " + zIndex); $(".pswp__button--arrow--left").click(function(){ initEventsProduct(); }); $(".pswp__button--arrow--right").click(function(){ initEventsProduct(); }); /*________ credit card _ next field ________*/ $("[wx-role='inpCreditCardNum']:input").keyup(function(e){ if($(this).val().length==$(this).attr('maxlength')){ //$.clog($(this).val().length); $(this).closest("div").next("div").find("[wx-role='inpCreditCardNum']:input").focus(); } }); } /*_______________ load products _________________*/ function initEventsProduct(){ var api = _gfApi(); // $.clog(_apiUrl+"def/worxpace/searchProducts"); $.go(_apiUrl+"def/worxpace/searchProducts",api,function(res,st,jx){ // res.code is a number switch(res.code){ case 200: var date = new Date(); var preOrderCode = ""; //產生 photoswipe 產品圖片等資訊 $("[wx-role='ctrBody'][wx-for='figPdts'] [wx-reusable]").remove(); for(var i in res.data){ var item = res.data[i]; //將spec 做urlencode 避免標點符號影響html,後面reuse會設置給wx-rawdat item["pdt_spec_2"] = encodeURIComponent(res.data[i].pdt_spec_2); item["pdt_off_time_onlydate"] = item["pdt_off_time"].substr(0,10); $("[wx-role='ctrBody'][wx-for='figPdts']").append($.reuse("figPdtItem",item)); if (item["pdt_max"]<0){ $("[wx-role='hintQtySaled'][wx-for='"+item["pdt_sn"]+"']").addClass("hide"); } if (item["pdt_off_time"]=="0000-00-00 00:00:00"){ $("[wx-role='hintExpireDate'][wx-for='"+item["pdt_sn"]+"']").addClass("hide"); } // $.clog(res.data[i].pdt_spec_2); //{"F":"F"}, {"6":"6","8":"8","10":"10","12":"12","S":"S","M":"M","L":"L","XL":"XL","2XL":"2XL","3XL":"3XL","4XL":"4XL","5XL":"5XL","6XL":"6XL"} // $.clog("A__ "+encodeURIComponent(res.data[i].pdt_spec_2)); // $.clog("B__ "+decodeURIComponent(encodeURIComponent(res.data[i].pdt_spec_2))); var decodedSpec = decodeURIComponent(item["pdt_spec_2"]); $.clog(decodedSpec); var spec = {}; spec = JSON.parse(decodedSpec); $.clog(spec); var div = ""; div = $('
'); var tag_p = $("

"); //LOOP JSON & Append Color Button jQuery.each(spec, function(index, itemData){ $.clog(itemData); $("[wx-role='pSpec2'][wx-for='"+res.data[i].pdt_code+"']").remove(); //spec button 的外層

$("[wx-role='aPdtSpec2'][wx-for='"+res.data[i].pdt_code+"']").remove(); //spec button 的外層

var tag_a = ""; tag_a = $(''+itemData+""); if(itemData =="F"){ $.clog(itemData); tag_a = $(''+itemData+""); //FIXIT clicked 有時會沒有效 $("[wx-role='addToCart'][wx-for='"+res.data[i].pdt_code+"']").wx("spec",itemData); //FIXIT 有時會沒有效 }else if(itemData !="F"){ $.clog("pdt_spec_2: " + itemData); //10707130A } tag_p.append(tag_a); }); tag_p.insertBefore($("a[wx-role='addToCart'][wx-for='"+res.data[i].pdt_code+"']"));//將整個button的

嵌在 加入購物車按鈕前 //已預購 N 件 顯示 preOrderCode = res.data[i].pdt_code; searchPreOrder(preOrderCode); var onTime = new Date(res.data[i].pdt_on_time); var offTime = new Date(res.data[i].pdt_off_time); if( date < onTime){ //$.clog(res.data[i].pdt_code+" onTime: " + onTime + " | offTime:" + offTime); $("[wx-role='addToCart'][wx-for='"+res.data[i].pdt_code+"']").html(res.data[i].pdt_on_time+ " 開放預購"); $("[wx-role='addToCart'][wx-for='"+res.data[i].pdt_code+"']").addClass("not-active"); $("[wx-role='aPdtSpec2'][wx-for='"+res.data[i].pdt_code+"']").addClass("not-active size"); }else if( date >offTime){ //FOCUS TODO //$.clog(res.data[i].pdt_code+" onTime: " + onTime + " | offTime:" + offTime); $("[wx-role='addToCart'][wx-for='"+res.data[i].pdt_code+"']").html("已截止預購"); $("[wx-role='addToCart'][wx-for='"+res.data[i].pdt_code+"']").addClass("not-active order_expired"); $("[wx-role='aPdtSpec2'][wx-for='"+res.data[i].pdt_code+"']").addClass("not-active size"); }else{ $("[wx-role='addToCart'][wx-for='"+res.data[i].pdt_code+"']").html("加入購物車"); $("[wx-role='addToCart'][wx-for='"+res.data[i].pdt_code+"']").removeClass("not-active"); $("[wx-role='aPdtSpec2'][wx-for='"+res.data[i].pdt_code+"']").removeClass("not-active size"); } }//END of res.data loop break; case 404: _defNotice(res.code,res.response); break; default: _defNotice(res.code,res.response); break; } }); } //get current time function getNow(){ var today = new Date(); var month = today.getMonth()+1; var day = today.getDate(); var output = today.getFullYear() + '-' + (month<10 ? '0' : '') + month + '-' + (day<10 ? '0' : '') + day + " " + today.getHours() +":"+today.getMinutes()+":"+today.getSeconds(); return output; } //display quantities of preordered product function searchPreOrder(pdtCode){ //$.clog("searchPreOrder");//TEST var api = _gfApi(); api.query = {"pdt_code":pdtCode}; $.go(_apiUrl+"def/worxpace/searchPreOrder",api,function(res,st,jx){ // res.code is a number switch(res.code){ case 200: var preOrderSold = 0; if(res.trecs == 0){ $("[wx-role='orderedQty']").html(0); } if(res.trecs>0){ //$.clog("searchPreOrder Found"); //TEST //取得產品的編號,將其設定於購物車按鈕中/或各產品 for(var i in res.data){ //$.clog(res.data[i].pdt_qty);//TEST preOrderSold += parseInt(res.data[i].pdt_qty); $("[wx-role='orderedQty']").html(preOrderSold); } } //$.clog("preOrderSold: " + preOrderSold); break; case 404: _defNotice(res.code,res.response); break; default: _defNotice(res.code,res.response); break; } }); } function initEventsMessage(){ //1. send message //2. send email/phone to customer // wx("for") = attr("wx-for"); $("[wx-role='btnSendMessage']").on("click",function(event){ event.preventDefault(); var field_data = {}; var email = $("[wx-role='inpCustomerEmail']").val(); var customer = $("[wx-role='inpCustomerName']").val(); var content = $("[wx-role='txtCustomerMessage']").val(); if(!isValidEmailAddress(email)){ _popWin({ "title":"Email 格式錯誤", "content":"

您所輸入的Email 格式錯誤,請重新輸入
",
				"noCaption":"OK"
			});
			return;      
		}
		if(customer.length < 2){
			_popWin({  
				"title":"姓名不得少於2個字",
				"content":"
請重新輸入名字
",
				"noCaption":"OK"
			});
			return;      
		}
		if(content.length < 10){
			_popWin({  
				"title":"訊息內容不得少於10個字",
				"content":"
請輸入超過10個字的訊息
",
				"noCaption":"OK"
			});
			return;      
		}

		if($.isNothing(customer)===false && $.isNothing(email)===false && $.isNothing(content)===false){
			field_data.msg_email = email;
			field_data.msg_customer = customer;
			field_data.msg_content = content;
			field_data.msg_code = "##tabseq##";
			field_data.msg_time = getNow();
			//$.clog(field_data);//TEST
			sendMessage(field_data);
		}
	}); // btnSendMessage click event 
}


function initEventsShoppingCart(){
	// viewCart("btnViewCart");
	$("[wx-role='inpTotalClothes']").attr("disabled",true); //所有商品數量隱藏欄位


	$("body").on("click","[wx-role='aPdtSpec2']",function(){
		var target =$(this).wx("for");  // 該產品編號
		var size = $(this).wx("default"); //該產品尺寸
		$("[wx-role='addToCart'][wx-for='"+target+"']").wx("spec",size); 

		$("[wx-role='aPdtSpec2'][wx-for='"+target+"']").removeClass("clicked"); //預設沒有 clicked 這個class
		$("[wx-role='aPdtSpec2'][wx-for='"+target+"'][wx-default='"+size+"']").addClass("clicked");//選到加上clicked這個class,會改變顏色

	});//END of aClothesSize click Event


	/* __ count items  __ */
	countItems();

	/* __ addToCart __ */
	$("body").on("click","[wx-role='addToCart']",function(){ //pdt 1 
		var field_data = {};
		var pdt_sn = $(this).wx("value");
		var pdt_code = $(this).wx("for");
		var pdt_spec_2 = $(this).wx("spec");
		var pdt_status = parseInt($(this).wx("cond"));
		var pdt_category = parseInt($(this).wx("disptype"));
		var btnSpec = $("[wx-role='aPdtSpec2'][wx-for='"+pdt_code+"']").attr("default");
		if(pdt_category ===2 || pdt_category ===3){ //pdt_status ===2 &&
			//$.clog(pdt_code);
			if(!$("[wx-role='aPdtSpec2'][wx-for='"+pdt_code+"']").hasClass('clicked')){//[wx-disptype='"+pdt_category+"']
				_popWin({  
					"title":"您尚未選擇尺寸",
					"content":"
請先點選尺寸
",
					"noCaption":"OK"
				});
				return;  
			}
		}
		// TODO FIXIT
		// 商品類別[1] sticker,
		if(pdt_category ===1){ //parseInt(pdt_status) ===1 && 
			if(!$("[wx-role='aPdtSpec2'][wx-for='"+pdt_code+"']").hasClass('clicked')){//[wx-disptype='"+pdt_category+"'][wx-for='"+pdt_code+"']
				_popWin({  
					"title":"您尚未選擇顏色",
					"content":"
請先點選顏色
",
					"noCaption":"OK"
				});
				return;  
			}

		}
		// var preOrderSize = $("[wx-role='aClothesSize']").wx("default");
		//$.clog("addToCart clicked : " + pdt_sn + "/" + pdt_code + "/ " +pdt_spec_2 ); // hard code : sn
		field_data.pdt_sn = pdt_sn;
		field_data.pdt_code = pdt_code;
		field_data.pdt_spec_2 = pdt_spec_2;
		field_data.pdt_status = pdt_status;
		field_data.pdt_category = pdt_category;
		field_data.pdt_qty = 1; //預設數量為1
		//$.clog(field_data);
		addToCart(field_data);

	});//END of addToCart Event


	/*__ 圓形購物車圖示 viewCart 檢視購物車 __*/
	$("[wx-role='btnViewCart']").on("click",function(){

		viewCart("btnViewCart");
		//將購物車中所有數量顯示在購物車清單中。

	});

	/*__ 當購物車中商品數量直接變更時 [ qty ] __*/
	$("body").on("change","[wx-role='inpPdtQty']",function(event){
		event.preventDefault();  
		var field_data = {};
		var parmeters = {};
		var pdtCode = $(this).wx("for");
		var pdtSn =  $(this).wx("value");
		var qty =parseInt($(this).val());
		var pdt_spec_2 =$(this).wx("spec"); 
		var pdt_status = parseInt($(this).wx("cond"));
		var pdt_category = parseInt($(this).wx("disptype"));
		//$.clog("______ [ qty ] ______|| pdtSpec2: "+pdt_spec_2+" qty: "+qty+" pdtCode: "+pdtCode+" pdtSn: "+pdtSn+" pdt_status: "+pdt_status+" pdt_category: "+pdt_category);
		field_data.pdt_code = pdtCode;
		field_data.pdt_sn = pdtSn;
		field_data.pdt_qty = qty;
		field_data.pdt_spec_2 = pdt_spec_2;
		field_data.pdt_status = pdt_status;
		field_data.pdt_category = pdt_category;
		// var name = $("[wx-role='spanPdtName'][wx-for='"+pdtCode+"']").html();
		if(qty===0 || qty.length===0){
			//$.clog(qty);//TEST
			removeItemFromCart(field_data); 
		}else{
			updateCart(field_data); // pdt_code & qty
		}
	});
	/*__ 當購物車中商品數量增加時 [ + ] __*/
	$("body").on("click","[wx-role='btnPlus']",function(event){
		var pdtCode = $(this).wx("for");
		var pdtSn =  $(this).wx("value");
		var spec = $(this).wx("spec");
		var category = $(this).wx("disptype");
		var status = $(this).wx("cond");

		//pdt_code + status + category + spec
		var qty =parseInt($("[wx-role='inpPdtQty'][wx-for='"+pdtCode+"'][wx-cond='"+status+"'][wx-disptype='"+category+"'][wx-spec='"+spec+"']").val());


		qty+=1;
		//$.clog(qty);//TEST
		var field_data = {};
		field_data.pdt_code = pdtCode;
		field_data.pdt_sn = pdtSn;
		field_data.pdt_qty = qty;
		field_data.pdt_spec_2 = spec;
		field_data.pdt_status = status;
		field_data.pdt_category = category;
		$("[wx-role='inpPdtQty'][wx-for='"+pdtCode+"'][wx-cond='"+status+"'][wx-disptype='"+category+"'][wx-spec='"+spec+"']").val(qty);
		//$.clog("[wx-role='inpPdtQty'][wx-for='"+pdtCode+"'][wx-cond='"+status+"'][wx-disptype='"+category+"'][wx-rawdat='"+spec+"']");

		updateCart(field_data); // pdt_code & qty
	});

	/*__ 當購物車中商品數量減少時 [ - ]__*/
	$("body").on("click","[wx-role='btnMinus']",function(event){
		event.preventDefault();  
		var pdtCode = $(this).wx("for");
		var pdtSn =  $(this).wx("value");
		var spec = $(this).wx("spec");
		var qty =parseInt($("[wx-role='inpPdtQty'][wx-for='"+pdtCode+"'][wx-spec='"+spec+"']").val());
		var pdtSpec2 = $("[wx-role='spanPdtSpec2'][wx-default='"+spec+"'][wx-for='"+pdtCode+"']").wx("value"); 
		var category = $(this).wx("disptype");
		var status = $(this).wx("cond");


		if(qty===1){
			$("[wx-role='btnViewCart']").attr("data-target","#modal_cart");
			//_______set modal attributes to button [ - ] to close #modal_cart 
			//$.clog("remove Item From Cart");//TEST
			var field_data = {};
			field_data.pdt_code = pdtCode;
			field_data.pdt_sn = pdtSn;
			field_data.pdt_qty = qty;
			field_data.pdt_spec_2 = spec;
			field_data.pdt_status = status;
			field_data.pdt_category = category;
			removeItemFromCart(field_data); 
		}else{
			qty-=1;
			//$.clog(qty);//TEST
			$("[wx-role='inpPdtQty'][wx-for='"+pdtCode+"'][wx-spec='"+spec+"']").val(qty);
			//$.clog("[wx-role='inpPdtQty'][wx-for='"+pdtCode+"'][wx-default='"+spec+"']");
			var field_data = {};
			field_data.pdt_code = pdtCode;
			field_data.pdt_sn = pdtSn;
			field_data.pdt_qty = qty;
			field_data.pdt_spec_2 = spec;
			field_data.pdt_status = status;
			field_data.pdt_category = category;
			updateCart(field_data); // pdt_code & qty
		}      
	});


	/*__ 選擇寄送地區 變更事件 【 運費(本島) = 80 || (離島) = 100 】__*/
	$("[wx-role='sltShippingArea']").on("change",function(){
		var shippingArea =parseInt($(this).val());
		var cartTotal = parseInt($("[wx-role='spanOrderSubtotal'][wx-for='tableRow']").html());
		var shippingMethod = parseInt($("[wx-role='sltShippingMethod']").val());
		var shippingFee = 80; //預設值 TEST
		var totalAmount = 0;
		var totalItems = parseInt($("[wx-role='inpTotalClothes']").val()); //所有商品數量隱藏欄位

		if(totalItems<5){
			if(shippingArea===1){
				shippingFee = 80;
			}
			if(shippingArea===2){// 離島
				if(shippingMethod===1){
					shippingFee = 80;
				}else{
					_popWin({  
						"title":"離島無法超商取貨",
						"content":"
離島無法超商取貨,請選擇郵寄
",
						"yesCaption":"OK",
						"yesAction":function(){
							$("[wx-role='sltShippingMethod'] option[value=1]").prop('selected',true); //FIXED. 回到預設值 : 郵寄
							viewCart("btnViewCart");
						}
					});
				}
			}
		}else{
			shippingFee = 0;
			if(shippingArea===2){// 離島
				if(shippingMethod!=1){
					_popWin({  
						"title":"離島無法超商取貨",
						"content":"
離島無法超商取貨,請選擇郵寄
",
						"yesCaption":"OK",
						"yesAction":function(){
							$("[wx-role='sltShippingMethod'] option[value=1]").prop('selected',true); //FIXED. 回到預設值 : 郵寄
							viewCart("btnViewCart");
						}
					});
				}
			}
		}
		$("[wx-role='spanShippingFee']").html(shippingFee);
		totalAmount = parseInt(shippingFee+cartTotal);
		$("[wx-role='spanOrderTotalAmount']").html(totalAmount);
		//$.clog("shippingArea: " + shippingArea); //TEST
		//$.clog("shippingFee: " + shippingFee+"   + cartTotal: " + cartTotal + " = " + totalAmount);//TEST
	});


	/*__ 選擇付款方式 __*/ 
	$("[wx-role='sltPayMethod']").on("change",function(){
		//line pay , credit card, ATM 
		// if this.val == line pay, popupWin, but don't close this modal of cart.
		var payMethod = parseInt($(this).val());
		// alert(payMethod);
		if(payMethod===0){      // credit card

			_popWin({  
				"title":"不適用信用卡收款",
				"content":"
ODYSSEY 2018 為愛展翼\n大會師活動不適用 信用卡 收款方式,\n請選擇 ATM 付款。
",
				"yesCaption":"OK",
				"yesAction":function(){
					$("[wx-role='sltPayMethod'] option[value=2]").prop('selected',true); //FIXED. 回到預設值 : ATM
					viewCart("btnViewCart");
				}
			});
			return false;
		}
		if(payMethod===1){      // line pay

			_popWin({  
				"title":"LINE PAY 尚未建置",
				"content":"
LINE PAY 付款鏈接建置中
",
				"yesCaption":"OK",
				"yesAction":function(){
					$("[wx-role='sltPayMethod'] option[value=2]").prop('selected',true); //FIXED. 回到預設值 : ATM
					viewCart("btnViewCart");
				}
			});
			return false;
		}
	});


	/*__ 選擇寄送方式 變更事件 【 1: 郵寄, 2:超商取貨 】__*/
	$("[wx-role='sltShippingMethod']").on("change",function(){
		var shippingArea =parseInt($("[wx-role='sltShippingArea']").val());
		var cartTotal = parseInt($("[wx-role='spanOrderSubtotal'][wx-for='tableRow']").html());
		var shippingMethod = parseInt($(this).val());
		var shippingFee = 80;//預設值 TEST
		var totalAmount = 0;
		var totalItems = parseInt($("[wx-role='inpTotalClothes']").val()); //所有商品數量隱藏欄位

		if(totalItems<5){
			if(shippingMethod===1){ //郵寄
				shippingFee = 80; //TEST
			}
			if(shippingMethod===2){// 超商取貨
				if(shippingArea===1){ //本島
					shippingFee = 80;//TEST
				}else{//離島
					_popWin({  
						"title":"離島無法超商取貨",
						"content":"
離島無法超商取貨,請選擇郵寄
",
						"yesCaption":"OK",
						"yesAction":function(){
							$("[wx-role='sltShippingMethod'] option[value=1]").prop('selected',true); //FIXED. 回到預設值 : 郵寄
							viewCart("btnViewCart");
						}
					});
				}  
			}

		}else{
			shippingFee =0;
			if(shippingArea===2){// 離島
				if(shippingMethod!=1){
					_popWin({  
						"title":"離島無法超商取貨",
						"content":"
離島無法超商取貨,請選擇郵寄
",
						"yesCaption":"OK",
						"yesAction":function(){
							$("[wx-role='sltShippingMethod'] option[value=1]").prop('selected',true); //FIXED. 回到預設值 : 郵寄
							viewCart("btnViewCart");
						}
					});
				}
			}
		}  

		$("[wx-role='spanShippingFee']").html(shippingFee);
		totalAmount = parseInt(shippingFee+cartTotal);
		$("[wx-role='spanOrderTotalAmount']").html(totalAmount);
		//$.clog("shippingArea: " + shippingArea); //TEST
		//$.clog("shippingFee: " + shippingFee+"   + cartTotal: " + cartTotal + " = " + totalAmount);//TEST
	});
	/* _______ 勾選 [ 與最後到貨的商品一起出貨 ] ______ 
      1. class="form-group hide" // 一開始隱藏
      2. 一開始為disabled, not checked

  */
	$("[wx-role='chkConfirmDelivery']").prop("checked",false);
	$("[wx-role='chkConfirmDelivery']").on("change",function(){
		if($(this).is(":checked")){
			$("[wx-role='btnCheckout']").removeAttr("disabled"); 
		}else{
			$("[wx-role='btnCheckout']").attr("disabled",true); //prop("disabled",true);
            $.clog("disable a");
		}
	});

	/*__ 結帳按鈕下 viewCart 檢視購物車 __*/
	$("[wx-role='btnCheckout']").on("click",function(){
		viewCart("btnCheckout");    //將購物車中所有數量顯示在購物車清單中。
	});


	$("[wx-role='inpCustomerBirth']").on("change",function(){
		var psw = $(this).val().split("-");
		var combinePsw = psw.join("");
		$("[wx-role='inpCustomerPsw']").val(combinePsw);
	});
} // END of initEventsShoppingCart

/*_________ [SEARCH] 取得日期區間欄位值 e.g. 消費日期from ~ to   2018-04-05~2018-05-05  ________*/

/*init Payment ___ 建置中 TODO  */
function initEventsPayment(){ 
	payByCreditCard();
	// usingLinePay();
	
	// ______ 回報匯款的 -> checkbox 選擇ATM ______
	$("[wx-role='chkTransferring']").change(function(){
		if($(this).is(":checked")){
			$("[wx-role='chkDeposit']").prop("checked",false);
			$("[wx-role='labAccount']").html("帳號末五碼");
			$("[wx-role='inpRemittingAccount5']").removeAttr("placeholder");
			$("[wx-role='inpRemittingAccount5']").val("");
				
		}else{

		}
	});
	// ______ 回報匯款 -> checkbox 選擇無摺 ______
	$("[wx-role='chkDeposit']").change(function(){
		if($(this).is(":checked")){
			$("[wx-role='chkTransferring']").prop("checked",false);
			$("[wx-role='labAccount']").html("無摺存款單備註");
			$("[wx-role='inpRemittingAccount5']").attr("placeholder","請填入存款單上的備註"); //TODO FOCUS 可以修改文字敘述
		}else{
			$("[wx-role='labAccount']").html("帳號末五碼");
			$("[wx-role='inpRemittingAccount5']").removeAttr("placeholder");
			$("[wx-role='inpRemittingAccount5']").val("");
		}
	});

	// ______ 回報匯款 -> 回報匯款按鈕
	// $("[wx-role='btnRemittance']").click(function(){
	$("body").on("click","[wx-role='btnRemittance']",function(){
		//設置訂單編號給回報匯款表單按鈕
		$("[wx-role='sendRemittanceInfo']").wx("for",$(this).wx("for"));
	});

	// ______ 回報匯款 -> 確認回傳按鈕
	$("body").on("click","[wx-role='sendRemittanceInfo']",function(){
		//$.clog("[A] click");
		var odCode = $(this).wx("for");
		checkRemittanceInfoExisted(odCode);   
	});

	// ______ 回報匯款 -> 確認回傳按鈕 keypress 
	$("body").on("keypress","[wx-role='sendRemittanceInfo']",function(event){
		event.preventDefault();
		//$.clog("[A] keypress");
		var odCode = $(this).wx("for");

		checkRemittanceInfoExisted(odCode);   
	});
}



function checkRemittanceInfoExisted(odCode){
	
	var field_data={};
	// var memo = remittingAccount.split("");
	// memo = memo[0]+memo[1];
	// $.clog(memo);

	// _____ ATM匯款 _____
	if($("[wx-role='chkTransferring']").is(":checked")){
		var remittingDate =  $("[wx-role='inpRemittingDate']").val();
		var remittingAccount = $("[wx-role='inpRemittingAccount5']").val();
		if(remittingAccount.length===0){
			_popWin({
				"title":"匯款帳號欄位空白",
				"content":"請填您的匯款帳號後五碼",
				"yesCaption":"OK"
			});  
			return;
		}else if(remittingAccount.length!=5){ 
			_popWin({
				"title":"匯款帳號錯誤",
				"content":"請填您的匯款帳號後五碼",
				"yesCaption":"OK"
			});  
			return;
		}else if(remittingDate.length<8){
			_popWin({
				"title":"匯款日期錯誤",
				"content":"請填您的匯款日期",
				"yesCaption":"OK"
			});  
		}else{
			field_data.od_paid_date = remittingDate;
			field_data.debit_account = remittingAccount;
		}
	}

	// _____ 無摺存款 _____
	if($("[wx-role='chkDeposit']").is(":checked")){
		var remittingDate =  $("[wx-role='inpRemittingDate']").val();
		var remittingAccount = $("[wx-role='inpRemittingAccount5']").val();
		if(remittingAccount.length===0){
			_popWin({
				"title":"無摺存款單備註欄位空白",
				"content":"請填您的無摺存款單的備註欄內容",
				"yesCaption":"OK"
			});  
			return;
		}else if(remittingDate.length<8){
			_popWin({
				"title":"匯款日期錯誤",
				"content":"請填您的匯款日期",
				"yesCaption":"OK"
			});  
		}else{
			field_data.od_paid_date = remittingDate;
			field_data.debit_account = remittingAccount;
		}
	}


	console.log(field_data);  

	if($("[wx-role='chkDeposit']").is(":checked") || $("[wx-role='chkTransferring']").is(":checked")){
		if(!jQuery.isEmptyObject(field_data)){ 
		var api = _gfApi();
		api.query = {"od_code":odCode};
		api.view = {};
		api.data = [field_data]; 
		$.go(_apiUrl+"def/worxpace/checkRemittanceInfo",api,function(res,st,jx){
			$.clog(api.query);    //TEST
			$.clog("checkRemittanceInfoExisted");//TEST
			switch(res.code){
				case 200:
					_popWin({
						"title":"您已回傳過匯款資訊",
						"content":"您上一次輸入的
【 帳號 】 : "+res.data.debit_account+"
【匯款日期】: "+res.data.od_paid_date+"
您是否要覆蓋上一次的輸入 ?", "yesCaption":"是", "yesAction":function(){ var userCode = res.data.od_mobile; sendRemittanceInfo(field_data,odCode,userCode); }, "noCaption": "不用了" }); break; case 201: _popWin({ "title":"匯款資訊已回傳", "content":"感謝您的回覆,我們將儘快為您處理訂單。
(為了您的資料安全,稍後將回到首頁)", "yesCaption":"OK", "yesAction":function(){ window.location.reload(); } }); break; case 202: $("[wx-role='remittanceInfo']").hide(); break; case 400: _popWin({ "title":"[ 400 ] 請求錯誤", "content":"系統顯示錯誤,請洽客服中心", "yesCaption":"OK" }); break; case 404: _defNotice(res.code,res.response); break; } // end of switch }); }// END of !jQuery.isEmptyObject(field_data) }else{ _popWin({ "title":"請選擇匯款的方式", "content":"請勾選 【 ATM匯款 】 或是 【 無摺存款 】", "yesCaption":"OK" }); return; } } /*________ 進行更新 匯款帳號資訊 _________*/ function sendRemittanceInfo(field_data,odCode,userCode){ var api = _gfApi(); api.query = {"od_code":odCode,"od_mobile":userCode}; api.view = {}; api.data = [field_data]; $.go(_apiUrl+"def/worxpace/sendRemittanceInfo",api,function(res,st,jx){ //$.clog("sendRemittanceInfo");//TEST switch(res.code){ case 200: _popWin({ "title":"您已回傳匯款資訊", "content":"感謝您的回覆,我們將儘快為您處理訂單。
(為了您的資料安全,稍後將回到首頁)", "yesCaption":"OK", "yesAction":function(){ window.location.reload(); } }); break; case 400: _popWin({ "title":"[ 400 ] 請求錯誤", "content":"系統顯示錯誤,請洽客服中心", "yesCaption":"OK" }); break; } }); } /*___________ 使用信用卡付款,檢查信用卡是否正確 _____________*/ function payByCreditCard(){ //______declare variables to stands for date. var today = new Date(); var expFrom = today.getFullYear(); var expTo = today.getFullYear()+10; var c1 = $("[wx-role='inpCreditCardNum'][wx-field='1']").val(); var c2 = $("[wx-role='inpCreditCardNum'][wx-field='2']").val(); var c3 = $("[wx-role='inpCreditCardNum'][wx-field='3']").val(); var c4 = $("[wx-role='inpCreditCardNum'][wx-field='4']").val(); //__ loop expiration date ___ for (var i = expFrom ; i <= expTo; i++) { $("[wx-role='sltExpirationYear']").append(""); } //______ 確認付款按鈕:  取得信用卡資料 //______FIXIT $("[wx-role='btnPayByCreditCard']").on("click",function(event){ event.preventDefault(); var cardNum = c1+c2+c3+c4; var od_card_num = c4; var email = $("[wx-role='inpCardHolderEmail']").val(); var mobile = $("[wx-role='inpCardHolderMobile']").val(); var name = $("[wx-role='inpCardHolderName']").val(); var cvc = $("[wx-role='inpCVC']").val(); var validDate = []; var expirationDate=""; var validYear = $("[wx-role='sltExpirationYear']").val().split(""); validYear = validYear[2]+validYear[3]; validDate.push($("[wx-role='sltExpirationMonth']").val()); validDate.push(validYear); expirationDate = validDate.join("/");// 01/18 if($.isNothing(name)===true){ _popWin({ "title":"持卡人姓名欄位空白", "content":"
請輸入持卡人姓名
",
				"noCaption":"OK"
			});
			return;
		}
		if(!isValidMobile(mobile)){
			_popWin({  
				"title":"手機號碼格式錯誤",
				"content":"
您所輸入的手機號碼格式錯誤,請重新輸入
",
				"noCaption":"OK"
			});
			return;
		}
		if(!isValidEmailAddress(email)){
			_popWin({  
				"title":"Email 格式錯誤",
				"content":"
您所輸入的 Email 格式錯誤,請重新輸入
",
				"noCaption":"OK"
			});
			return;      
		}

		if($.isNothing(cvc)===true ||cvc.length<3){
			_popWin({  
				"title":"信用卡檢核碼錯誤",
				"content":"
請輸入信用卡卡背三碼檢核碼
",
				"noCaption":"OK"
			});
			return;
		}
		if(cardNum.length<16){
			_popWin({  
				"title":"信用卡卡號長度錯誤",
				"content":"
您所輸入的信用卡卡號長度不足,請重新輸入
",
				"noCaption":"OK"
			});
			return;

		}else{
			if(!doLuhnChecking(cardNum) || cardNum.length<16){
				//$.clog("cardNum.length :" +cardNum.length);//TEST
				_popWin({  
					"title":"信用卡卡號錯誤",
					"content":"
您所輸入的信用卡卡號錯誤,請重新輸入
",
					"noCaption":"OK"
				});
				return;
			}

			//______ 先丟出信用卡連線失敗 
			if(doLuhnChecking(cardNum) && isValidEmailAddress(email) && isValidMobile(mobile) && !$.isNothing(name) && !$.isNothing(cvc)){
				_popWin({  
					"title":"信用卡連線失敗",
					"content":"
信用卡伺服器連線失敗。
",
					"noCaption":"OK"
				});
			}
		}
	});
}

function initEventsOrder(){
	//_____________ 聯絡人地址 ___________________
	$("#twzipcode").twzipcode(); //呼叫顯示縣市地區郵遞區號
	$("#twzipcode select,#twzipcode input").addClass("hide"); 
	$("#twzipcode [wx-role]").removeClass('hide');
	$("[wx-role='inpAddress'][wx-field='od_addr_address']").focus(function(event){ 
		var postcode = $("#twzipcode").twzipcode("get","zipcode");
		$("[wx-role='inpPostcode']").val(postcode);

		if(postcode==""){
			$(this).blur();
			_popWin({
				"title":"郵遞區號未填",
				"content":"請填郵遞區號",
				"noCaption":"OK"
			});
		}
	});

	//_____________ 收件人地址 ___________________
	$("#twzipcode_addr").twzipcode(); //呼叫顯示縣市地區郵遞區號
	$("#twzipcode_addr select,#twzipcode_addr input").addClass("hide"); 
	$("#twzipcode_addr [wx-role]").removeClass('hide');
	$("[wx-role='inpNewAddress'][wx-field='od_new_address']").focus(function(event){ 
		var postcode = $("#twzipcode_addr").twzipcode("get","zipcode");
		$("[wx-role='inpNewPostcode']").val(postcode);

		if(postcode==""){
			$(this).blur();
			_popWin({
				"title":"郵遞區號未填",
				"content":"請填郵遞區號",
				"noCaption":"OK"
			});
		}
	});

	// ______ 開啟成為代收人欄位 ________20180702 FIXIT 加描述
	$("[wx-role='chkBeAPickUpPerson']").on("change",function(){
		if($(this).is(":checked")){
			$(this).prop("checked",true);//prop("checked", false);
			$("[wx-role='chkPickupCode']").prop("disabled",true);
			//$.clog("pickup code : " + $("[wx-role='chkBeAPickUpPerson']").val());//TEST
		}else{
			$(this).prop("checked",false);
			$("[wx-role='chkPickupCode']").prop("disabled",false);
			//$.clog("pickup code : unchecked"); //TEST
		}
	});//END OF Pickup person

	
	$("[wx-role='chkPickupCodeParty']").on("change",function(){
		if($(this).is(":checked")){
			$("[wx-role='chkPickupCode']").prop("checked",true);
			$("[wx-role='chkPickupCode']").trigger("change");
			$("[wx-role='inpPickupCode']").val("ODSPTY2018");
			$("[wx-role='inpPickupCode']").trigger("blur");
		}else{
			$("[wx-role='chkPickupCode']").prop("checked",false);
			$("[wx-role='chkPickupCode']").trigger("change");
		}
	});

	// ______ 開啟寄給代收人欄位 ________20180703 FIXIT 加描述
	$("[wx-role='chkPickupCode']").on("change",function(){
		if($(this).is(":checked")){
			$("[wx-role='inpPickupCode']").removeAttr("disabled"); //prop("disabled",false)
			$("[wx-role='labPickupCode']").append("");
			$("[wx-role='chkBeAPickUpPerson']").prop("disabled",true);
			$("[wx-role='chkImportCustomer']").attr("disabled",true);
			$("[wx-role='chkImportCustomer']").prop("checked",false);
			$("[wx-role='chkImportCustomer']").change();
			
			$("[wx-role='inpPickupCode']").unbind("blur");
			$("[wx-role='inpPickupCode']").blur(function(){
				if($(this).val()!==""){
					getPickUpPerson($(this).val());
				}
			});
			
		}else{
			$("[wx-role='inpPickupCode']").val("");
			$("[wx-role='inpPickupCode']").prop("disabled","disabled");    ////prop("disabled",true)

			$("[wx-role='labPickupCode'] > span").remove(); 
			$("[wx-role='chkBeAPickUpPerson']").prop("disabled",false); 

			$("[wx-role='inpPickupPerson']").val("");
			$("[wx-role='inpPickupMobile']").val("");
			$("#twzipcode_addr [wx-role]").val("");
			$("[wx-role='inpPickupAddress']").val("");

			$("[wx-role='inpPickupPerson']").removeAttr("disabled");
			$("[wx-role='inpPickupMobile']").removeAttr("disabled");
			$("#twzipcode_addr [wx-role]").removeAttr("disabled");
			$("[wx-role='inpPickupAddress']").removeAttr("disabled");

			$("[wx-role='chkImportCustomer']").removeAttr("disabled");
			
			
			$("[wx-role='txtOrderMemo']").val($("[wx-role='txtOrderMemo']").val().replace(/\[車友代收\]/g,''));
			$("[wx-role='spanShippingFee']").html(80);
			var shippingFee = parseInt($("[wx-role='spanShippingFee']").html());
			var cartTotal = parseInt($("[wx-role='spanOrderSubtotal'][wx-for='tableRow']").html());
			totalAmount = parseInt(shippingFee+cartTotal);
			$("[wx-role='spanTotalAmount']").html(totalAmount);
			$("[wx-role='spanOrderTotalAmount']").html(totalAmount);
			$.clog("shippingFee : " + shippingFee);
			$.clog("cartTotal: " + cartTotal);
			$.clog("totalAmount : " + totalAmount);
			$.clog("[wx-role='spanTotalAmount'] : "+$("[wx-role='spanTotalAmount']").html());
		}
	});//END OF Pickup person





	//________ 同訂購人資訊 FOCUS____________20180702
	$("[wx-role='chkImportCustomer']").on("change",function(){
		if($(this).is(":checked")){

			$("[wx-role='inpPickupAddress']").val($("[wx-role='inpAddress']").val());
			$("#twzipcode_addr").twzipcode('set',{
				'county' :$("[wx-role='sltCounty']").val(),
				'district':$("[wx-role='sltDistrict']").val()
			});

			$("[wx-role='inpPickupMobile']").val($("[wx-role='inpAddresseeMobile']").val());
			$("[wx-role='inpPickupPerson']").val($("[wx-role='inpAddresseeName']").val());
		}else{//清空收件人資訊
			$("[wx-role='sltPickupCounty']").val("");
			$("[wx-role='sltPickupDistrict']").val("");
			$("[wx-role='inpPickupAddress']").val("");
			$("[wx-role='inpPickupMobile']").val("");
			$("[wx-role='inpPickupPerson']").val("");
			$("#twzipcode_addr").twzipcode('set',{
				'county' :'縣市',
				'districtName':'鄉鎮市區'
			});
		}  
	});  //________ END OF 同聯絡人資訊 ____________

	// ______ 結帳頁面按鈕事件 : 【 ##od_total_amount## 付款 】 _______
	//之後改成正規表示法, TODOFIXIT
	$("[wx-role='btnPayNow']").on("click",function(){
		$("[wx-role='spanErrorMsg']").html(""); //確認密碼錯誤訊息清空
		$(this).removeAttr("data-dismiss","modal");
		var field_data = {};
		var payMethod =parseInt($("[wx-role='sltPayMethod']").val());
		var shippingArea=parseInt($("[wx-role='sltShippingArea']").val());
		var shippingFee=parseInt($("[wx-role='spanShippingFee']").html());
		var odSubtotal=parseInt($("[wx-role='spanOrderSubtotal']").html());
		var odTotalAmount =parseInt($("[wx-role='spanTotalAmount']").html());
		//訂購人info
		var customer = $("[wx-role='inpAddresseeName']").val();
		var tel = $("[wx-role='inpAddresseeTel']").val();
		var mobile =$("[wx-role='inpAddresseeMobile']").val();       
		var birthdate =   $("[wx-role='inpCustomerBirth']").val();       
		var postcode =$("#twzipcode").twzipcode("get","zipcode");
		postcode = postcode[0];
		var addrCounty = $("[wx-role='sltCounty']").val(); 
		var addrDist = $("[wx-role='sltDistrict']").val();   
		var address = $("[wx-role='inpAddress']").val();     
		//收件人info
		var pickupPerson =  $("[wx-role='inpPickupPerson']").val();   
		var pickupMobile =  $("[wx-role='inpPickupMobile']").val();   
		var pickupPostcode =  $("[wx-role='inpPickupPostcode']").val();   
		var pickupCounty =  $("[wx-role='sltPickupCounty']").val();   
		var pickupDist =  $("[wx-role='sltPickupDistrict']").val();   
		var pickupAddr =  $("[wx-role='inpPickupAddress']").val();   
		var customerFB = $("[wx-role='inpAddresseeFB']").val();
		var customerEmail = $("[wx-role='inpCustomerEmail']").val();
		var customerPsw = $("[wx-role='inpCustomerPsw']").val();
		// alert(customerPsw);
		// return;
		var memo =  $("[wx-role='txtOrderMemo'][wx-field='od_memo']").val(); 

		if(customer.length < 2){
			_popWin({
				"title":"訂購人欄位不可空白",
				"content":"請輸訂購人全名",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.od_customer = customer;
		}

		// TODOFIXIT 加驗證
		if(!isValidEmailAddress(customerEmail)){
			_popWin({
				"title":"Email 格式錯誤",
				"content":"請填入正確的Email",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.od_email = customerEmail;
		}


		if(customerFB.length === 0){
			_popWin({
				"title":"FB暱稱不可空白",
				"content":"請填入您的FB暱稱",
				"noCaption":"OK"
			});
			return;
		}else{   
			field_data.od_customer_fb = customerFB;
		}

		if(mobile.length < 8 || mobile.substr(0,1)!=="0" ){
			// alert("請輸入您包含區碼的聯絡電話");
			_popWin({
				"title":"手機號碼格式錯誤",
				"content":"請重新輸入您的聯絡手機共10碼數字,0 為開頭",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.od_mobile = mobile;
		}

		if(tel !=""){
			if(tel.length < 8 || tel.substr(0,1)!=="0"){
				// alert("請輸入您包含區碼的聯絡電話");
				_popWin({
					"title":"聯絡電話格式錯誤",
					"content":"請重新輸入您包含區碼的市話,0 為開頭",
					"noCaption":"OK"
				});
				return;
			}else{
				field_data.od_tel = tel;
			}
		}

		if(birthdate.length < 8){
			// alert("請輸入您包含區碼的聯絡電話");
			_popWin({
				"title":"生日格式錯誤",
				"content":"請重新輸入您的生日",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.od_birthdate = birthdate;
		}



		if(customerPsw.length < 8){
			_popWin({
				"title":"密碼長度不足",
				"content":"請重新輸入您的訂單密碼",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.od_psw = customerPsw;
		}


		if(postcode.length < 3){
			_popWin({
				"title":"郵遞區號尚未輸入",
				"content":"請重新輸入3碼郵遞區號",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.od_addr_postcode = postcode;
		}

		if(addrCounty.length < 2){
			// alert("請輸入您包含區碼的聯絡電話");
			_popWin({
				"title":"縣市尚未選擇",
				"content":"請重新選擇縣市",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.od_addr_county = addrCounty;
		}
		if(addrDist.length < 2){
			// alert("請輸入您包含區碼的聯絡電話");
			_popWin({
				"title":"區域尚未選擇",
				"content":"請重新選擇區域",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.od_addr_district = addrDist;
		}
		if(address.length < 5){
			// alert("請輸入您包含區碼的聯絡電話");
			_popWin({
				"title":"地址尚未填寫",
				"content":"請填寫地址",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.od_addr_address = address;
		}
		// // 代收
		// if($("[wx-role='chkCollectPerson']").is(":checked")){
		// 	field_data.pickup_code = pickupCode;
		// 	//$.clog("pickupCode : " + pickupCode);
		// }
		//____________ 收件人部分欄位驗證 ______________
		//pickup_code
		
		if($("[wx-role='chkPickupCode']").is(":checked")){
			var pickUpCode = $("[wx-role='inpPickupCode']").val(); //輸入代收人序號
			if(pickUpCode.length ==0){
				_popWin({
					"title":"代收人序號不可空白",
					"content":"請輸代收人序號",
					"noCaption":"OK"
				});
				return;
			}

		}// END of chkPickupCode

		if(pickupPerson.length < 2){
			_popWin({
				"title":"收件人欄位不可空白",
				"content":"請輸收件人全名",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.pickup_person = pickupPerson;
		}

		if(pickupMobile.length < 8 || pickupMobile.substr(0,1)!=="0" ){
			// alert("請輸入您包含區碼的聯絡電話");
			_popWin({
				"title":"收件人手機號碼格式錯誤",
				"content":"請重新輸入收件人的聯絡手機共10碼數字,0 為開頭",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.pickup_mobile = pickupMobile;
		}

		if(pickupPostcode.length < 2){
			_popWin({
				"title":"收件人郵遞區號尚未輸入",
				"content":"請重新輸入3碼郵遞區號",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.pickup_postcode = pickupPostcode;
		}

		if(pickupCounty.length < 2){
			// alert("請輸入您包含區碼的聯絡電話");
			_popWin({
				"title":"收件人縣市尚未選擇",
				"content":"請重新選擇縣市",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.pickup_county = pickupCounty;
		}
		if(pickupDist.length < 2){
			// alert("請輸入您包含區碼的聯絡電話");
			_popWin({
				"title":"收件人區域尚未選擇",
				"content":"請重新選擇區域",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.pickup_district = pickupDist;
		}
		if(pickupAddr.length < 5){
			// alert("請輸入您包含區碼的聯絡電話");
			_popWin({
				"title":"收件人地址尚未填寫",
				"content":"請填寫地址",
				"noCaption":"OK"
			});
			return;
		}else{
			field_data.pickup_address = pickupAddr;
		}
		//____________ 收件人 END _____________________
		if(memo !=""){
			field_data.od_memo = memo;
		} 
		/*____________ 進行結帳 ____________*/
		if(!jQuery.isEmptyObject(field_data)){ 
			// if($("[wx-role='inpConfirmPassword']").val() === customerPsw){
			if(payMethod===2){   //ATM 付款
				//$.clog(payMethod);//TEST
				//$.clog(field_data);
				$(this).removeAttr("data-target","#modal_pay_credit");
				$(this).removeAttr("data-dismiss","modal");
				$(this).attr("data-target","#modal_comfirm_psw"); //顯示確認密碼視窗

				$("#input_confirm_password").trigger("focus");
				// field_data.od_pay_way =payMethod ;
				// field_data.od_shipping_area =shippingArea ;
				// field_data.shipping_fee = shippingFee;
				// field_data.od_subtotal =odSubtotal ;
				// field_data.od_total_amount = odTotalAmount;
				/*___ 密碼確認 ___*/

				//FIXIT TODO if(psw === birthdate4){  //比對密碼是否和生日月日一樣,一樣的話,跳出視窗
				// confirmPassword(field_data);
				/*___ END OF 密碼確認 ___*/
				//}
			}else if(payMethod==1){  
				//再寫一次 預防LINEPAY
				$(this).removeAttr("data-target","#modal_pay_credit");
				$(this).removeAttr("data-dismiss","modal");
				$(this).attr("data-target","#modal_comfirm_psw");

				//$.clog(payMethod);//TEST
				_popWin({  
					"title":"LINE PAY 尚未建置",
					"content":"
LINE PAY 付款鏈接建置中
",
					"noCaption":"OK",
					"noAction":function(){
						$("[wx-role='sltPayMethod'] option[value=0]").prop('selected',true);//FIXED 回到預設值 : 信用卡
					}
				});
				return;
			}else{  //信用卡 FIXIT current circumstance :  DO NOTHING
				//$.clog(payMethod);//TEST
				//$.clog("pay with plastic");//TEST
				$(this).attr("data-dismiss","modal");
				$("#modal_pay_credit").modal("show");// $(this).attr("data-target","#modal_pay_credit");
				$(this).removeAttr("data-target","#modal_comfirm_psw");
				//TODO FIXIT 信用卡支付  current circumstance :  DO NOTHING
			}
		}else{
			_popWin({
				"title":"確認密碼欄位與設定訂單密碼", 
				"content":"請填完以下收件資訊",
				"yesCaption":"OK"
			});
		}

	}); // END OF btnPayNow click

	//代收序號 取得代收人資料
	function getPickUpPerson(pickUpCode){
		//$.clog("getPickUpPerson");//TEST
		var returnCode = "";
		var api = _gfApi();
		api.query = {"p_code":pickUpCode};
		$.go(_apiUrl+"def/worxpace/getPickUpPerson",api,function(res,st,jx){
			// res.code is a number
			$("[wx-role='txtOrderMemo']").val($("[wx-role='txtOrderMemo']").val().replace(/\[車友代收\]/g,''));

			var shippingFee = parseInt($("[wx-role='spanShippingFee']").html());
			var cartTotal = parseInt($("[wx-role='spanOrderSubtotal'][wx-for='tableRow']").html());
			totalAmount = parseInt(shippingFee+cartTotal);
			$("[wx-role='spanTotalAmount']").html(totalAmount);
			$("[wx-role='spanOrderTotalAmount']").html(totalAmount);
			
			switch(res.code){
				case 200:
					//$.clog("getPickUpPerson Found"); //TEST  
					//取得代收人資料
					for(var i in res.data){
						//$.clog(res.data[i]);
						//TESTFIXIT 填入收件人資料,再將所有欄位改成disabled
						$("[wx-role='inpPickupPerson']").val(res.data[i].p_name);
						$("[wx-role='inpPickupMobile']").val(res.data[i].p_mobile);
						//取得資料庫中會員地址
						$("#twzipcode_addr").twzipcode('set',{
							'zipcode': res.data[i].p_postcode,
							'county' :res.data[i].p_county,
							'district':res.data[i].p_district
						});
						$("[wx-role='inpPickupAddress']").val(res.data[i].p_address);
						$("[wx-role='inpPickupPerson']").attr("disabled",true);
						$("[wx-role='inpPickupMobile']").attr("disabled",true);
						$("[wx-role='inpPickupMobile']").attr("disabled",true);
						$("#twzipcode_addr [wx-role]").attr("disabled",true);
						$("[wx-role='inpPickupAddress']").attr("disabled",true);
						$("[wx-role='spanShippingFee']").html(0);
						$("[wx-role='txtOrderMemo']").val("[車友代收]"+$("[wx-role='txtOrderMemo']").val().replace(/\[車友代收\]/g,''));
						var shippingFee = $("[wx-role='spanShippingFee']").html();
						var cartTotal = parseInt($("[wx-role='spanOrderSubtotal'][wx-for='tableRow']").html());
						totalAmount = parseInt(shippingFee+cartTotal);
						$("[wx-role='spanTotalAmount']").html(totalAmount);
						$("[wx-role='spanOrderTotalAmount']").html(totalAmount);
								$.clog("B_shippingFee : " + shippingFee);
								$.clog("B_cartTotal: " + cartTotal);
								$.clog("B_totalAmount : " + totalAmount);
								$.clog("B_[wx-role='spanTotalAmount'] : "+$("[wx-role='spanTotalAmount']").html());



						/*
						$("[wx-role='spanOrderSubtotal'][wx-for='odTableRow']").html(cartTotal);
						$("[wx-role='spanTotalAmount']").html(totalAmount);
						*/
//						$("[wx-role='btnBackToCart']").trigger("click");
//						setTimeout(function(){
//							$("[wx-role='btnCheckout']").trigger("click");
//						},800);
												
						//107071218
					}
				break;
				case 404:
					_popWin({  
						"title":"代收人尚未完成訂單匯款",
						"content":"
您所輸入的代收人序號尚未確認匯款,
無法啟用。若需要此代收人為您代收商品,
請稍後再訂
",
						"noCaption":"OK"
					});
					
				break;

				default:
					_defNotice(res.code,res.response);
				break;
			}
		});
	
}
		// ____________  寄給代收人 : 輸入代收人序號後 事件  keydown  ____________

	/*
      field_data.od_customer
      field_data.od_email
      field_data.od_customer_fb
      field_data.od_mobile
      field_data.od_tel
      field_data.od_birthdate
      field_data.od_psw //////
      field_data.od_addr_postcode
      field_data.od_addr_county
      field_data.od_addr_district
      field_data.od_addr_address
      field_data.pickup_code ////////
      field_data.pickup_person
      field_data.pickup_mobile
      field_data.pickup_postcode
      field_data.pickup_county
      field_data.pickup_district
      field_data.pickup_address
      field_data.od_memo
  */
	//modal_comfirm_psw 視窗密碼輸入
	// FIXIT 密碼欄位要檢驗只能是數字?
	$("[wx-role='btnConfirmPassword']").on("click",function(event){
		event.preventDefault();  
		var field_data = {};
		field_data.od_psw = $("[wx-role='inpCustomerPsw']").val();
		var confirmPassword = $("[wx-role='inpConfirmPassword']").val();
		if(confirmPassword.length == 0 ){
			// 您尚未輸入確認密碼 
			$("[wx-role='spanErrorMsg']").html("您尚未輸入確認密碼");
		}else{
			// 有輸入密碼//輸入密碼錯誤
			if(confirmPassword.length != field_data.od_psw.length || confirmPassword != field_data.od_psw){
				$("[wx-role='spanErrorMsg']").html("確認密碼錯誤");
			}
			if(confirmPassword.length === field_data.od_psw.length && confirmPassword === field_data.od_psw){
				// $("[wx-role='spanErrorMsg']").html("成立訂單");
				field_data.od_pay_way =parseInt($("[wx-role='sltPayMethod']").val());
				field_data.od_shipping_area=parseInt($("[wx-role='sltShippingArea']").val());
				field_data.shipping_fee=parseInt($("[wx-role='spanShippingFee']").html());
				field_data.od_subtotal=parseInt($("[wx-role='spanOrderSubtotal']").html());
				field_data.od_total_amount =parseInt($("[wx-role='spanTotalAmount']").html());
				//訂購人info
				field_data.od_customer = $("[wx-role='inpAddresseeName']").val();
				field_data.od_email = $("[wx-role='inpCustomerEmail']").val();
				field_data.od_customer_fb = $("[wx-role='inpAddresseeFB']").val();
				field_data.od_tel = $("[wx-role='inpAddresseeTel']").val();
				field_data.od_mobile =$("[wx-role='inpAddresseeMobile']").val();       
				field_data.od_birthdate =   $("[wx-role='inpCustomerBirth']").val();       
				field_data.od_addr_postcode =$("#twzipcode").twzipcode("get","zipcode");
				field_data.od_addr_postcode = field_data.od_addr_postcode[0];
				field_data.od_addr_county = $("[wx-role='sltCounty']").val(); 
				field_data.od_addr_district = $("[wx-role='sltDistrict']").val();   
				field_data.od_addr_address = $("[wx-role='inpAddress']").val();     
				//收件人info
				field_data.pickup_person =  $("[wx-role='inpPickupPerson']").val();   
				field_data.pickup_mobile =  $("[wx-role='inpPickupMobile']").val();   
				field_data.pickup_postcode =  $("[wx-role='inpPickupPostcode']").val();   
				field_data.pickup_county =  $("[wx-role='sltPickupCounty']").val();   
				field_data.pickup_district =  $("[wx-role='sltPickupDistrict']").val();   
				field_data.pickup_address =  $("[wx-role='inpPickupAddress']").val();   
				//
				

				// alert(customerPsw);
				// return;
				field_data.od_memo =  $("[wx-role='txtOrderMemo'][wx-field='od_memo']").val(); 
				
         // $("modal_comfirm_psw").modal("hide");
				
				//判斷有無勾選成為代收人,有的話取得收件人資料
				if($("[wx-role='chkBeAPickUpPerson']").is(":checked")){
					field_data.p_code = "##tabseq##";
					field_data.p_name = field_data.pickup_person;
					field_data.p_mobile = field_data.pickup_mobile;
					field_data.p_postcode =field_data.pickup_postcode;
					field_data.p_county =field_data.pickup_county;
					field_data.p_district =field_data.pickup_district;
					field_data.p_address = field_data.pickup_address;
				}
				if($("[wx-role='chkPickupCode']").is(":checked")){
					if( $("[wx-role='inpPickupCode']").val() !=""){
						field_data.pickup_code = $("[wx-role='inpPickupCode']").val();

					}
					

				}
				//$.clog(field_data);
				placeOrder(field_data);
				
				$('#modal_comfirm_psw').modal('toggle');
				
			}

		}
	});

	//FIXITFOCUS  再多檢查幾次
	//inpConfirmPassword 確認密碼並結帳 的keydown事件。 避免按下enter 後會reload及造成錯誤。
		$("[wx-role='inpConfirmPassword']").on("keydown",function(e){ 
			// console.log("inpConfirmPassword  KEYDOWN");
			var key = e.which;
			if(key == 13){
			$("[wx-role='btnConfirmPassword']").click();
			// console.log("btnConfirmPassword");
			return false;
		}

	 });

//FIXIT 
   /* ____ 取消訂單 Cancel Order ____ */
	$("body").on("click","[wx-role='btnCancelOrder']",function(){
		// update od_status as 3 已取消
    	var odSn = $(this).wx("value");
		var odCode = $(this).wx("for");
		var userCode = $(this).wx("orival");//wx-orival
		//$.clog("[A] click cancelOrder");
		_popWin({
			"title":"編號 : " + odCode + " 訂單確定要取消?",
			"content":"【 注意 】 由於近期訂購與出貨流程繁複,若 『 尚未匯款 』可直接取消訂單。
若『 已經匯款 』的訂單,統一於 2018/10/28 Honda Odyssey 第三屆 全國大會師後處理退款事宜,如有不便之處,敬請見諒。", "yesCaption":"OK", "yesAction":function(){ cancelOrder(odSn,odCode,userCode); }, "noCaption":"不用了" }); }); $("body").on("keypress","[wx-role='btnCancelOrder']",function(){ var odSn = $(this).wx("value"); var odCode = $(this).wx("for"); var userCode = $(this).wx("orival");//wx-orival //$.clog("[B] keypress cancelOrder"); _popWin({ "title":"編號 : " + odCode + " 訂單確定要取消?", "content":"【 注意 】 由於近期訂購與出貨流程繁複,若 『 尚未匯款 』可直接取消訂單。
若『 已經匯款 』的訂單,統一於 2018/10/28 Honda Odyssey 第三屆 全國大會師後處理退款事宜,如有不便之處,敬請見諒。", "yesCaption":"OK", "yesAction":function(){ cancelOrder(odSn,odCode,userCode); }, "noCaption":"不用了" }); });//____________ Cancel Order _______________ // ______ 查詢訂單 Search Orders ________ $("[wx-role='btnSearchOrders']").on("click",function(){ var field_data = {}; var name = $("[wx-role='inpOrderCustomerName']").val(); var mobile = $("[wx-role='inpOrderCustomerMobile']").val(); var psw = $("[wx-role='inpOrderCustomerPsw']").val(); if(!isValidMobile(mobile)){ _popWin({ "title":"mobile 格式錯誤", "content":"
您所輸入的 mobile 格式錯誤,請重新輸入
",
				"noCaption":"OK"
			});
			return;
		}
		if(name.length<2){
			_popWin({  
				"title":"訂購人姓名 格式錯誤",
				"content":"
請輸入當初填寫收件資料的全名
",
				"noCaption":"OK"
			});
			return;
		}
		if(psw.length != 8){ //FIXIT FIXIT 正規化檢查
			_popWin({  
				"title":"密碼格式錯誤",
				"content":"
密碼長度錯誤,請輸入8位數字密碼
",
				"noCaption":"OK"
			});
			return;
		}
		if($.isNothing(name)===false && $.isNothing(mobile)===false && $.isNothing(psw)===false){
			field_data.od_mobile = mobile;
			field_data.od_customer= name;
			field_data.od_psw= psw;
			searchOrders(field_data);

		}
	});// END of function SearchOrder
} // End of function initEventsOrder

function cancelOrder(odSn,odCode,userCode){      
	//$.clog("cancelOrder");//TEST
	var api = _gfApi();
	api.query={"od_sn":odSn,"od_code":odCode};
	api.view={};
	api.data=[{"user_code":userCode}];
	//$.clog(api.query);  //TEST
	// return;
	$.go(_apiUrl+"def/worxpace/cancelOrder",api,function(res,st,jx){
		switch(res.code){
			case 200:
				$("[wx-role='btnRemittance'][wx-for='"+odCode+"']").hide();
				$("[wx-role='btnCancelOrder'][wx-for='"+odCode+"']").hide();
				_popWin({
					"title":"您的訂單目前為退貨處理中",
					"content":"若『 已經匯款 』 的訂單,統一於 2018/10/28 Honda Odyssey 第三屆 全國大會師後處理相關退款事宜,如有不便之處,敬請見諒。
(為了您的資料安全,稍後將回到首頁)", "yesCaption":"OK", "yesAction":function(){ // window.location.assign(window.location.href);//刷新當前頁 window.location.reload(); // searchOrders(); // $("[wx-role='spanOrderStatus'][wx-for='"+ +"']"). } }); break; case 201: $("[wx-role='btnRemittance'][wx-for='"+odCode+"']").hide(); $("[wx-role='btnCancelOrder'][wx-for='"+odCode+"']").hide(); _popWin({ "title":"訂單已經取消", "content":"訂單編號 "+odCode+" 已取消。
(為了您的資料安全,稍後將回到首頁)", "yesCaption":"OK", "yesAction":function(){ // window.location.assign(window.location.href);//刷新當前頁 window.location.reload(); // searchOrders(); // $("[wx-role='spanOrderStatus'][wx-for='"+ +"']"). } }); break; case 402: $("[wx-role='btnRemittance'][wx-for='"+odCode+"']").hide(); $("[wx-role='btnCancelOrder'][wx-for='"+odCode+"']").hide(); _popWin({ "title":"[ 402] 訂單已是取消狀態", "content":"訂單已取消", "yesCaption":"OK" }); break; case 403: $("[wx-role='btnRemittance'][wx-for='"+odCode+"']").hide(); $("[wx-role='btnCancelOrder'][wx-for='"+odCode+"']").hide(); _popWin({ "title":"[ 403 ] 退貨已在處理中", "content":"退貨已在處理中", "yesCaption":"OK" }); break; case 404: _popWin({ "title":"[DEFAULT] 不正確的請求", "content":"[DEFAULT] 搜尋欄位異常錯誤", "yesCaption":"OK" }); break; } }); } function sendMessage(field_data){ //$.clog("________ sendMessage _________");//TEST var api = _gfApi(); api.data=[field_data]; //$.clog(api.data); //TEST $.go(_apiUrl+"def/worxpace/sendMessage",api,function(res,st,jx){ switch(res.code){ case 200: $("input[wx-for='message']").val(""); $("[wx-role='txtCustomerMessage']").val(""); //$.clog("您已完成留言");//TEST _popWin({ "title":"您已完成留言", "content":"謝謝您寶貴的建議, 我們會盡速與您連繫並回覆您的意見。", "noCaption":"OK", }); break; case 404: //$.clog("資料新增失敗");//TEST _popWin({ "title":"留言訊息發送失敗", "content":"Ooops,留言訊息發送失敗", "noCaption":"OK", }); break; default: _defNotice(res.code,res.response); break; } }); } /*____________________ SHOPPING CART _________________________*/ function countItems(){ var api = _gfApi(); api.view={}; $.go(_apiUrl+"def/worxpace/countItems",api,function(res,st,jx){ // res.code is a number switch(res.code){ case 200: $("[wx-role='spanCountCartItem']").html(res.data.count); break; case 404: //$.clog("added to cart - fail");//TEST _popWin({ "title":"added to cart - fail", "content":"Ooops,added to cart - fail", "noCaption":"OK", }); break; default: _defNotice(res.code,res.response); break; } }); } function addToCart(field_data){ var api = _gfApi(); api.data=[field_data]; api.view={}; //$.clog(api.data); //TEST $.go(_apiUrl+"def/worxpace/addToCart",api,function(res,st,jx){ // res.code is a number switch(res.code){ case 200: //$.clog("________________added to cart_______________");//TEST $("[wx-role='spanCountCartItem']").html(res.data.count); _popWin({ "title":"商品已加入購物車", "content":"
商品已加入購物車\n-要選購其它尺寸/顏色請按繼續購物,\n-點選其它尺寸/顏色後再次加入購物車\n-或者您可選擇「前往結帳」立即完成訂單
",
					"yesCaption":"前往結帳",
					"yesAction":function(){
						//close photoswipe  FIXED
						$(".pswp__button--close").click(); 
						// set z-index of shopping cart modal as over 1500
						viewCart("btnViewCart");
						
					},
					"noCaption":"繼續購物",
					"noAction":function(){}
				});
				
				break;
			case 404:
				//$.clog("added to cart - fail");//TEST
				_popWin({   
					"title":"added to cart - fail",
					"content":"Ooops,added to cart - fail",
					"noCaption":"OK",
				});
				break;
			default:
				_defNotice(res.code,res.response);
				break;
		}
	});

}// END of addToCart


function viewCart(btnName) {
  var api = _gfApi();
  api.view = {};
  $.go(_apiUrl + "def/worxpace/viewCart", api, function (res, st, jx) {
    switch (res.code) {
      case 200:
        var total = 0;
        var totalAmount = 0;
        switch (btnName) {
          /* ______ 首頁的購物車圖示按鈕 ______ */
          case "btnViewCart":
            $("#modal_cart").modal("show");//顯示購物車的modal視窗
            $("[wx-role='tableRow'][wx-reusename='tableCart'] td").remove();//清空購物車商品列表
            // _____ 紀錄加入購物車的商品數量變數
            var normalQty = 0; //常態商品
            var preOrderQty = 0; //預購商品(非衣服、非活動限定商品)
            var preOrderClothesQty = 0; //預購商品(衣服)
				 // var ExclusivelySoldQty = 0; //活動限定(預購)商品 

            //____ 用 0 與 1 數字判別是否購買到 預購商品(衣服) | 常態商品 | 活動限定商品 | 非衣服、非活動限定商品 ____
            var chkPreOrder = 0; //預購商品(非衣服、非活動限定商品)
            var chkNormalOrder = 0; //常態商品
            var chkPreOrderClothes = 0; //預購商品(衣服)
            var chkExclusivelySold = 0; // 活動限定(預購)商品
         
            var countQty = 0; //累加所有商品紀錄
            for (var i in res.data) {
              //產生購物車商品列表
              $("#table_modal_cart").append($.reuse("tableCart", res.data[i]));
              total += res.data[i].pdt_subtotal; // 該筆商品小計金額

              // 紀錄商品數量 => 產品狀態 : [1]常態商品 | 產品類別 : [1]貼紙    
              if (parseInt(res.data[i].pdt_status) === 1) { //&& parseInt(res.data[i].pdt_category) === 1
              	$.clog("[1]常態商品勾選");
                chkNormalOrder = 1;
                normalQty += parseInt($("[wx-role='inpPdtQty'][wx-for='" + res.data[i].pdt_code + "'][wx-spec='" + res.data[i].pdt_spec_2 + "']").val());
                $("[wx-role='spanPdtSpec2'][wx-for='" + res.data[i].pdt_code + "']").addClass("hide"); //不顯示尺寸 pdt_spec_2
              } // end of pdt_status == 1 

              //紀錄預購商品 _ (衣服)的數量   產品狀態 : [2]上架(預購商品) | 產品類別 : [2]衣服  pdt_export : 2018-10-15
              if(parseInt(res.data[i].pdt_status) === 2 && parseInt(res.data[i].pdt_category) === 2) {
                chkPreOrderClothes = 1;
                preOrderClothesQty += parseInt($("[wx-role='inpPdtQty'][wx-for='" + res.data[i].pdt_code + "'][wx-spec='" + res.data[i].pdt_spec_2 + "']").val()); //取得預購商品的數量
                $.clog("預購商品 _ (衣服)勾選 _ 出貨時間 : " + res.data[i].pdt_export);
              }// end of pdt_status == 2

              //紀錄預購商品 _ (配件)的數量    產品狀態 : [2]上架(預購商品) | 產品類別 : 除了衣服之外
              if(parseInt(res.data[i].pdt_status) === 2 && parseInt(res.data[i].pdt_category) != 2) { //&& parseInt(res.data[i].pdt_category) === 3
                if(res.data[i].pdt_export === "2018-10-15"){ //非活動限定商品
                  chkPreOrder = 1;
                  $.clog("預購商品勾選 _ 出貨時間 : " + res.data[i].pdt_export);
                }else if(res.data[i].pdt_export === "2018-10-29"){ //活動限定商品
                  chkExclusivelySold = 1;
                  $.clog("活動限定商品 _ 出貨時間 : " + res.data[i].pdt_export);
                }
                preOrderQty += parseInt($("[wx-role='inpPdtQty'][wx-spec='" + res.data[i].pdt_spec_2 + "']").val()); //取得購買商品數量//[wx-cond='"+status+"']    
              }// end of pdt_status == 2

              countQty = normalQty + preOrderQty + preOrderClothesQty;  // 累加所有商品
            } //end of loop  for (var i in res.data)

            $("[wx-role='inpTotalItems']").val(countQty); //[隱藏欄位] : 填入累加後所有商品數量
            $("[wx-role='inpTotalClothes']").val(preOrderClothesQty); //[隱藏欄位] : 填入預購商品(衣服) 數量
            //TODOFIXIT  NOTICE 再用modal視窗,會干擾其他modal訊息,改用

顯示訊息 //_____ 商品運送、確定購買等初始化 _____ $("[wx-role='divConfirmDelivery']").addClass("hide"); $("[wx-role='chkConfirmDelivery']").prop("disabled", false); //預設disabled $("[wx-role='chkConfirmDelivery']").addClass("hide");//預設隱藏 $("[wx-role='btnCheckout']").attr("disabled", false); //結帳按鈕 預設disabled $.clog("disable b"); $("[wx-role='pDeliveryMessage']").addClass('hide'); //預設不顯示訊息。 // $("[wx-role='pDeliveryMessage']").css({"color": "blue","font-size": "16px"}); if (!$("[wx-role='chkConfirmDelivery']").is(":checked")) { // 勾選 [ 與最後到貨的商品一起出貨 ] 預設要是false $("[wx-role='chkConfirmDelivery']").prop("disabled", false); //若有checked, 要移除disabled $("[wx-role='btnCheckout']").attr("disabled", true); //結帳按鈕 加上disabled $.clog("disable c"); } // _______ END OF 常態、預購混和 __________ /* _____4. 只有購買常態商品時 _____ */ if (chkNormalOrder != 0 && chkPreOrderClothes === 0 && chkPreOrder === 0 && chkExclusivelySold === 0) { $("[wx-role='pDeliveryMessage']").html(""); $("[wx-role='pDeliveryMessage']").addClass('hide'); //顯示運送訊息 $("[wx-role='divConfirmDelivery']").addClass("hide"); //顯示[ 與最後到貨的商品一起出貨 ] $("[wx-role='btnCheckout']").attr("disabled", false); //結帳按鈕 預設disabled $.clog("disable e"); } /* _____5. 只有購買預購商品(非活動限定)時 _____ */ if (chkNormalOrder === 0 && chkPreOrderClothes === 0 && chkPreOrder !=0 && chkExclusivelySold === 0) { $("[wx-role='pDeliveryMessage']").removeClass('hide'); //顯示運送訊息 $("[wx-role='chkConfirmDelivery']").removeClass("hide");//預設隱藏 $("[wx-role='divConfirmDelivery']").removeClass("hide"); //顯示[ 與最後到貨的商品一起出貨 ] $("[wx-role='pDeliveryMessage']").html("【注意】 預購商品會於最後一個商品到貨後才寄送。若確定購買,請勾選『與最後到貨的商品一起出貨』。"); $("[wx-role='pDeliveryMessage']").removeClass("hide"); } /* _____6. 只有購買 預購商品(衣服) 時 _____ */ if (chkNormalOrder === 0 && chkPreOrderClothes != 0 && chkPreOrder ===0 && chkExclusivelySold === 0) { $("[wx-role='pDeliveryMessage']").removeClass('hide'); //顯示運送訊息 $("[wx-role='pDeliveryMessage']").html("【注意】 『大會紀念衫』將於預購截止後,10月初至中旬統一寄送。"); $("[wx-role='btnCheckout']").attr("disabled", false); //結帳按鈕 預設disabled $.clog("disable f"); } /* _____1. 當商品和活動限定商品混在一起購買時。 _____ */ if (chkPreOrderClothes === 0 && chkExclusivelySold !=0) { //chkNormalOrder != 0 先移除掉常態商品 $("[wx-role='pDeliveryMessage']").removeClass('hide'); //顯示運送訊息 $("[wx-role='divConfirmDelivery']").removeClass("hide"); //顯示[ 與最後到貨的商品一起出貨 ] $("[wx-role='chkConfirmDelivery']").removeClass("hide");//預設隱藏 $("[wx-role='pDeliveryMessage']").html("【 注意 】 加購的『活動限定商品』(若有加購其他『非活動限定商品』),將於 『 2018 Honda Odyssey 第三屆 全國大會師 』 活動後一併出貨,確定購買請勾選『與最後到貨的商品一起出貨』"); }// end of 1. /* _____2. 若預購商品(衣服) 和 活動限定商品 、非限定商品混在一起購買時 _____ */ if (chkExclusivelySold != 0 && chkPreOrderClothes != 0){ $("[wx-role='btnCheckout']").attr("disabled", true); //結帳按鈕 加上disabled $.clog("disable g"); $("[wx-role='pDeliveryMessage']").css({"color": "red"}); $("[wx-role='pDeliveryMessage']").html("【 注意 】 『活動限定商品』無法和『大會紀念衫』合併為同一訂單,必須分開訂購。
     請將『大會紀念衫』或『活動限定商品』其中一項移除,才能進行結帳。"); $("[wx-role='pDeliveryMessage']").removeClass("hide"); }// end of 2. /* _____3. 若常態商品和預購商品(衣服)混在一起買時 _____ */ if ((chkNormalOrder != 0 && chkPreOrderClothes != 0)||(chkPreOrder != 0 && chkPreOrderClothes != 0 && chkExclusivelySold === 0)){ $("[wx-role='pDeliveryMessage']").removeClass('hide'); //顯示運送訊息 $("[wx-role='divConfirmDelivery']").removeClass("hide"); //顯示[ 與最後到貨的商品一起出貨 ] $("[wx-role='chkConfirmDelivery']").removeClass("hide"); $("[wx-role='pDeliveryMessage']").html("【 注意 】 購物車中含有預購的『大會紀念衫』,因此您訂購的所有商品會於最後一個商品到貨後才寄送。若確定購買,請勾選『與最後到貨的商品一起出貨』。若分開訂購,運費也將分開計算。"); }// end of 3. // /* _____2. 若預購商品(衣服) 和 其他非活動限定商品混在一起購買時 _____ */ // if (chkPreOrder != 0 && chkPreOrderClothes != 0 && chkExclusivelySold === 0) { // $("[wx-role='pDeliveryMessage']").removeClass('hide'); //顯示運送訊息 // $("[wx-role='divConfirmDelivery']").removeClass("hide"); //顯示[ 與最後到貨的商品一起出貨 ] // $("[wx-role='pDeliveryMessage']").html("【 注意 】 購物車中含有預購的『大會紀念衫』,因此您訂購的所有商品會於最後一個商品到貨後才寄送。若確定購買,請勾選『與最後到貨的商品一起出貨』。若分開訂購,運費也將分開計算。"); // } /* _____ 填入 商品總計、運費、總金額 _____ */ var threshold = 0; // 計算購買商品累積金額 初始化 $("[wx-role='spanCartTotal']").html(total); $("[wx-role='spanOrderSubtotal'][wx-for='tableRow']").html(total); $("[wx-role='spanOrderSubtotal'][wx-for='tableRow']").wx("value", total); threshold = parseInt($("[wx-role='spanOrderSubtotal'][wx-for='tableRow']").wx("value")); /* _____ 若是單筆預購的衣服滿4件,或是總金額大於3000元 顯示成為代收人選項 _____*/ if (preOrderClothesQty >= 4 || threshold >= 3000) { $("[wx-role='spanShippingFee']").html(0); //default shipping fee is 0 $("[wx-role='spanFreeShipping']").removeClass('hide'); } else { $("[wx-role='spanShippingFee']").html(80); //default shipping fee is 80 $("[wx-role='spanFreeShipping']").addClass('hide'); } var shippingFee = parseInt($("[wx-role='spanShippingFee']").html()); totalAmount = parseInt(shippingFee + total); $("[wx-role='spanOrderTotalAmount']").html(totalAmount); break; /* ______ 購物車清單的結帳按鈕 _________ */ case "btnCheckout": // data-dismiss="modal" data-toggle="modal" data-target="#modal_checkout" var preOrderClothesQty = $("[wx-role='inpTotalClothes']").val(); var threshold = parseInt($("[wx-role='spanOrderSubtotal'][wx-for='tableRow']").wx("value")); // 累積金額初始化 $("[wx-role='spanPdtSize']").removeClass("hide"); $("[wx-role='odTableRow'][wx-reusename='checkoutCart'] td").remove(); for (var i in res.data) { //紀錄商品數量 => 產品狀態 : [1]常態商品 | 產品類別 : [1]貼紙 if (parseInt(res.data[i].pdt_status) === 1 && parseInt(res.data[i].pdt_category) === 1) { $("[wx-role='spanPdtSize'][wx-for='" + res.data[i].pdt_code + "']").addClass("hide"); } //紀錄預購商品 _ (配件)的數量 產品狀態 : [2]上架(預購商品) | 產品類別 : [3]accessories 配件 if (parseInt(res.data[i].pdt_status) === 2 && parseInt(res.data[i].pdt_category) === 3) { $("[wx-role='spanPdtSize'][wx-for='" + res.data[i].pdt_code + "']").addClass("hide"); } $("#table_modal_checkout_cart").append($.reuse("checkoutCart", res.data[i])); total += res.data[i].pdt_subtotal; } // END of for loop //若是單筆預購的衣服滿4件,或是總金額大於3000元 顯示成為代收人選項 if (preOrderClothesQty >= 4 || threshold >= 3000) { $("[wx-role='labCollectPerson']").removeClass('hide'); $("[wx-role='chkCollectPerson']").removeClass('hide'); } else { //若是單筆預購不達上述條件,移除代收人選項 $("[wx-role='labCollectPerson']").addClass('hide'); $("[wx-role='chkCollectPerson']").addClass('hide'); } $("[wx-role='spanOrderSubtotal'][wx-for='odTableRow']").html(total); var fee = parseInt($("[wx-role='spanShippingFee']").html()); $("[wx-role='spanTotalAmount']").html(fee + total); //$.clog(btnName);//TEST break; } break; case 404: $("#modal_cart").modal("hide"); //$.clog("[ view cart ] shopping cart is empty");//TEST _popWin({ "title": "購物車是空的", "content": "購物車尚無任何商品", "noCaption": "OK" }); break; default: _defNotice(res.code, res.response); break; } }); } // END of viewCart function updateCart(field_data){ // 成立訂單 及 個別刪完商品後。 //$.clog(field_data); //TEST //$.clog("updateCart");//TEST var api = _gfApi(); api.query = field_data; api.view = {}; $.go(_apiUrl+"def/worxpace/updateCart",api,function(res,st,jx){ //$.clog(api.query); //TEST //$.clog("updateCart");//TEST switch(res.code){ case 200: countItems(); viewCart("btnViewCart"); break; case 400: _defNotice(res.code,res.response); break; case 404: _defNotice(res.code,res.response); break; } // end of switch }); } function removeItemFromCart(field_data){ //$.clog("removeItemFromCart: " + field_data);//TEST var api = _gfApi(); api.query = field_data; api.view = {}; $.go(_apiUrl+"def/worxpace/removeItemFromCart",api,function(res,st,jx){ //$.clog("removeItemFromCart");// TEST switch(res.code){ case 200: countItems(); viewCart("btnViewCart");// location.reload(); break; case 400: _defNotice(res.code,res.response); break; case 404: _defNotice(res.code,res.response); break; } // end of switch }); } function emptyCart(){ // 成立訂單 及 個別刪完商品後。 var api = _gfApi(); api.view = {}; //$.clog(api.data); //TEST $.go(_apiUrl+"def/worxpace/emptyCart",api,function(res,st,jx){ switch(res.code){ case 200: $("#modal_checkout").modal("hide"); $("#modal_default").css("z-index","1200"); _popWin({ "title":"您已建立訂單", "content":"非常感謝您的訂購,您可到網站上查詢您的所有訂單。

【 ATM付款方式 】
收款銀行:中國信託(822)
收款帳號:392-540-219-454
請匯款後透過本舖的「訂單查詢」內的「回報匯款」登錄匯款帳號後五碼及匯款時間。

【 匯款確認 】
週一 至 週五 10:00 ~ 17:00 ,國定假日與例假日休息。

【 貼紙製作時程 】 : 約3~5個工作天。
如購買預購商品,所有商品將於最後一個到貨商品一同出貨,到貨時間請詳見通知", //TODO 文字 "noCaption":"OK", "noAction":function(){ location.reload(); // 先用reload } }); break; } // end of switch }); } /* ____________________ ORDER SLIP _____________________ */ function placeOrder(field_data){ if(!jQuery.isEmptyObject(field_data)){ //加入其他訂單元素 field_data.od_code="##tabseq##"; field_data.od_datetime= getNow(); var api = _gfApi(); api.data=[field_data]; api.view = {}; //$.clog(api.data); // TEST //$.clog("__________ do Place Order ___________"); // TEST $.go(_apiUrl+"def/worxpace/placeOrder",api,function(res,st,jx){ switch(res.code){ case 200: emptyCart(); //$.clog("place Order 200"); // TEST break; case 201: emptyCart(); //$.clog("place Order 201"); // TEST break; case 404: _popWin({ "title": "[ 404 A ] 請求錯誤", "content":"系統顯示錯誤,請洽客服中心", "noCaption":"OK" }); break; case 400: _popWin({ "title":"[ 400 B ] 請求錯誤", "content":"系統顯示錯誤,請洽客服中心", "noCaption":"OK" }); break; case 401: _popWin({ "title":"[ 401 ] E MAIL 錯誤", "content":"您的訂單已經送出,但發送通知電子郵件錯誤,若你 無法在訂單查詢看到你的訂單,請重新下訂一次。", "noCaption":"OK" }); break; case 405: _popWin({ "title":"[ 405 ] E MAIL 錯誤", "content":"您的訂單已經送出,但發送通知電子郵件錯誤,若你 無法在訂單查詢看到你的訂單,請重新下訂一次。", "noCaption":"OK" }); break; default: _popWin({ "title":"[ 000 ] 未定義的錯誤", "content":"系統顯示錯誤,請洽客服中心", "noCaption":"OK" }); break; } // end of switch }); }else{ //若欄位有空白 _popWin({ "title":"有欄位未填", "content":"請填完以下收件資訊", "noCaption":"OK" }); } } function searchOrders(field_data){ var api = _gfApi(); api.query=field_data; api.view = {}; $.go(_apiUrl+"def/worxpace/searchOrders",api,function(res,st,jx){ switch(res.code){ case 200: $("[wx-role='tableContainer'][wx-reusename='tableOrder']").remove(); $("#modal_odlist").modal("show"); for(var i in res.data){ //付款方式 res.data[i].od_pay_way = parseInt(res.data[i].od_pay_way); res.data[i].od_pay_way =_wx_datsrc.payMethod[res.data[i].od_pay_way].pay_method_name; //訂單狀態 res.data[i].od_status = parseInt(res.data[i].od_status); res.data[i].od_status = _wx_datsrc.orderStatus[res.data[i].od_status].od_status_name; //付款方式 res.data[i].od_pay_status = parseInt(res.data[i].od_pay_status); res.data[i].od_pay_status = _wx_datsrc.payStatus[res.data[i].od_pay_status].pay_staus; //$.clog(" res.data[i].od_pay_status : " + res.data[i].od_pay_status); $("#list_order").append($.reuse("tableOrder",res.data[i])); // //$.clog( "取消的訂單: " +_wx_datsrc.orderStatus[3].od_status_name); //FIXIT 訂單狀態 var status = res.data[i].od_status; var payStatus = res.data[i].od_pay_status; if(status == _wx_datsrc.orderStatus[3].od_status_name || status == _wx_datsrc.orderStatus[5].od_status_name){ $("[wx-role='btnRemittance'][wx-for='"+res.data[i].od_code+"']").addClass("hide"); $("[wx-role='btnCancelOrder'][wx-for='"+res.data[i].od_code+"']").addClass("hide"); // //$.clog("取消的訂單: " + res.data[i].od_code); // //$.clog("[wx-role='divRemittance'][wx-for='"+res.data[i].od_code+"']"); } if(status ==_wx_datsrc.orderStatus[1].od_status_name && payStatus ==_wx_datsrc.payStatus[3].pay_staus){ $("[wx-role='btnRemittance'][wx-for='"+res.data[i].od_code+"']").addClass("hide"); } searchOrderDetails(res.data[i].od_sn); } $("[wx-role='cntOrderQty']").text("您的訂單(共 "+res.trecs+" 筆)"); break; case 404: _popWin({ "title":"沒有訂單可供查詢", "content":"您尚未訂購商品,目前沒有訂單。", "noCaption":"OK", }); //$.clog("資料新增失敗");// TEST break; default: _defNotice(res.code,res.response); break; } }); } function searchOrderDetails(odSn){ var api = _gfApi(); api.query={"od_sn":odSn}; api.view = {}; $.go(_apiUrl+"def/worxpace/searchOrderDetails",api,function(res,st,jx){ switch(res.code){ case 200: // FIXIT // $("[wx-role='OrdersDetails'][wx-reusename='tableOrdersDetails'][wx-for='"+res.data[i].od_sn+"'] td").remove(); // $("[wx-reusename='tableOrdersDetails'][wx-for='"+odSn+"'] tr").remove(); for(var i in res.data){ $("[wx-role='orderItem'][wx-for='"+res.data[i].od_sn+"']").append($.reuse("tableOrdersDetails",res.data[i])); } break; case 404: //$.clog("資料新增失敗");//TEST _popWin({ "title":"沒有訂單可供查詢", "content":"您尚未訂購商品,目前沒有訂單。", "noCaption":"OK", }); break; default: _defNotice(res.code,res.response); break; } }); } /*___________________ PAYMENT _________________________*/ function dynamicPlusAYear(){ } function goToPayment(){ } /*__________________ VALIDATION ________________*/ /*-- Luhn --*/ function doLuhnChecking(cardNum){ var sum = 0; var even=cardNum.length % 2; //get even value for(var i=0;i9){ digit-=9; } sum +=digit; } } return (sum%10===0); } function isValidEmailAddress(emailAddress) { var pattern = /^([a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+(\.[a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)*|"((([ \t]*\r\n)?[ \t]+)?([\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*(([ \t]*\r\n)?[ \t]+)?")@(([a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.)+([a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.?$/i; return pattern.test(emailAddress); } function isValidMobile(mobile) { var pattern =/^09[0-9]{6,10}#?[0-9]{1,4}$/; return pattern.test(mobile); } /*__________________ POPUP WINDOWS ________________*/ function _popWin(pwInfo){ $("#modal_default_title").html(pwInfo.title); $("#modal_default_body").html(pwInfo.content); $("#modal_default_cancel").unbind("click"); if (pwInfo.noCaption!=null && pwInfo.noCaption!=""){ $("#modal_default_cancel").html(pwInfo.noCaption); $("#modal_default_cancel").show(); if (pwInfo.noAction!=null) $("#modal_default_cancel").on("click",pwInfo.noAction); }else{ $("#modal_default_cancel").hide(); } $("#modal_default_confirm").unbind("click"); if (pwInfo.yesCaption!=null && pwInfo.yesCaption!=""){ $("#modal_default_confirm").html(pwInfo.yesCaption); $("#modal_default_confirm").show(); if (pwInfo.yesAction!=null) $("#modal_default_confirm").on("click",pwInfo.yesAction); }else{ $("#modal_default_confirm").hide(); } if (typeof(pwInfo.delay)=="undefined"){ $("#modal_default").modal("toggle"); if (pwInfo.popAction!=null){ setTimeout(pwInfo.popAction,200); } }else{ setTimeout(function(popAction){ $("#modal_default").modal("toggle"); },pwInfo.delay); if (pwInfo.popAction!=null){ setTimeout(pwInfo.popAction,pwInfo.delay+200); } } }