/* Minification failed. Returning unminified contents.
(1834,47-48): run-time error JS1195: Expected expression: >
(1834,59-60): run-time error JS1004: Expected ';': )
(1844,6-7): run-time error JS1195: Expected expression: )
(1849,24-25): run-time error JS1004: Expected ';': {
(1873,52-53): run-time error JS1195: Expected expression: >
(1873,139-140): run-time error JS1004: Expected ';': )
(1895,52-53): run-time error JS1195: Expected expression: >
(1895,143-144): run-time error JS1004: Expected ';': )
(2026,52-53): run-time error JS1195: Expected expression: >
(2026,139-140): run-time error JS1004: Expected ';': )
(2060,52-53): run-time error JS1195: Expected expression: >
(2060,143-144): run-time error JS1004: Expected ';': )
(2210,38-39): run-time error JS1195: Expected expression: )
(2210,41-42): run-time error JS1195: Expected expression: >
(2212,30-31): run-time error JS1195: Expected expression: )
(2215,21-22): run-time error JS1002: Syntax error: }
(2223,17-18): run-time error JS1004: Expected ';': :
(2225,29-30): run-time error JS1197: Too many errors. The file might not be a JavaScript file: ,
(2214,25-37): run-time error JS1018: 'return' statement outside of function: return false
(1967,9-21): run-time error JS1018: 'return' statement outside of function: return false
(1923,9-21): run-time error JS1018: 'return' statement outside of function: return false
(1919,9-21): run-time error JS1018: 'return' statement outside of function: return false
 */
/*!
 * Validator v0.11.9 for Bootstrap 3, by @1000hz
 * Copyright 2017 Cina Saffary
 * Licensed under http://opensource.org/licenses/MIT
 *
 * https://github.com/1000hz/bootstrap-validator
 */

+function(a){"use strict";function b(b){return b.is('[type="checkbox"]')?b.prop("checked"):b.is('[type="radio"]')?!!a('[name="'+b.attr("name")+'"]:checked').length:b.is("select[multiple]")?(b.val()||[]).length:b.val()}function c(b){return this.each(function(){var c=a(this),e=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b),f=c.data("bs.validator");(f||"destroy"!=b)&&(f||c.data("bs.validator",f=new d(this,e)),"string"==typeof b&&f[b]())})}var d=function(c,e){this.options=e,this.validators=a.extend({},d.VALIDATORS,e.custom),this.$element=a(c),this.$btn=a('button[type="submit"], input[type="submit"]').filter('[form="'+this.$element.attr("id")+'"]').add(this.$element.find('input[type="submit"], button[type="submit"]')),this.update(),this.$element.on("input.bs.validator change.bs.validator focusout.bs.validator",a.proxy(this.onInput,this)),this.$element.on("submit.bs.validator",a.proxy(this.onSubmit,this)),this.$element.on("reset.bs.validator",a.proxy(this.reset,this)),this.$element.find("[data-match]").each(function(){var c=a(this),d=c.attr("data-match");a(d).on("input.bs.validator",function(){b(c)&&c.trigger("input.bs.validator")})}),this.$inputs.filter(function(){return b(a(this))&&!a(this).closest(".has-error").length}).trigger("focusout"),this.$element.attr("novalidate",!0)};d.VERSION="0.11.9",d.INPUT_SELECTOR=':input:not([type="hidden"], [type="submit"], [type="reset"], button)',d.FOCUS_OFFSET=20,d.DEFAULTS={delay:500,html:!1,disable:!0,focus:!0,custom:{},errors:{match:"Does not match",minlength:"Not long enough"},feedback:{success:"glyphicon-ok",error:"glyphicon-remove"}},d.VALIDATORS={"native":function(a){var b=a[0];return b.checkValidity?!b.checkValidity()&&!b.validity.valid&&(b.validationMessage||"error!"):void 0},match:function(b){var c=b.attr("data-match");return b.val()!==a(c).val()&&d.DEFAULTS.errors.match},minlength:function(a){var b=a.attr("data-minlength");return a.val().length<b&&d.DEFAULTS.errors.minlength}},d.prototype.update=function(){var b=this;return this.$inputs=this.$element.find(d.INPUT_SELECTOR).add(this.$element.find('[data-validate="true"]')).not(this.$element.find('[data-validate="false"]').each(function(){b.clearErrors(a(this))})),this.toggleSubmit(),this},d.prototype.onInput=function(b){var c=this,d=a(b.target),e="focusout"!==b.type;this.$inputs.is(d)&&this.validateInput(d,e).done(function(){c.toggleSubmit()})},d.prototype.validateInput=function(c,d){var e=(b(c),c.data("bs.validator.errors"));c.is('[type="radio"]')&&(c=this.$element.find('input[name="'+c.attr("name")+'"]'));var f=a.Event("validate.bs.validator",{relatedTarget:c[0]});if(this.$element.trigger(f),!f.isDefaultPrevented()){var g=this;return this.runValidators(c).done(function(b){c.data("bs.validator.errors",b),b.length?d?g.defer(c,g.showErrors):g.showErrors(c):g.clearErrors(c),e&&b.toString()===e.toString()||(f=b.length?a.Event("invalid.bs.validator",{relatedTarget:c[0],detail:b}):a.Event("valid.bs.validator",{relatedTarget:c[0],detail:e}),g.$element.trigger(f)),g.toggleSubmit(),g.$element.trigger(a.Event("validated.bs.validator",{relatedTarget:c[0]}))})}},d.prototype.runValidators=function(c){function d(a){return c.attr("data-"+a+"-error")}function e(){var a=c[0].validity;return a.typeMismatch?c.attr("data-type-error"):a.patternMismatch?c.attr("data-pattern-error"):a.stepMismatch?c.attr("data-step-error"):a.rangeOverflow?c.attr("data-max-error"):a.rangeUnderflow?c.attr("data-min-error"):a.valueMissing?c.attr("data-required-error"):null}function f(){return c.attr("data-error")}function g(a){return d(a)||e()||f()}var h=[],i=a.Deferred();return c.data("bs.validator.deferred")&&c.data("bs.validator.deferred").reject(),c.data("bs.validator.deferred",i),a.each(this.validators,a.proxy(function(a,d){var e=null;!b(c)&&!c.attr("required")||void 0===c.attr("data-"+a)&&"native"!=a||!(e=d.call(this,c))||(e=g(a)||e,!~h.indexOf(e)&&h.push(e))},this)),!h.length&&b(c)&&c.attr("data-remote")?this.defer(c,function(){var d={};d[c.attr("name")]=b(c),a.get(c.attr("data-remote"),d).fail(function(a,b,c){h.push(g("remote")||c)}).always(function(){i.resolve(h)})}):i.resolve(h),i.promise()},d.prototype.validate=function(){var b=this;return a.when(this.$inputs.map(function(){return b.validateInput(a(this),!1)})).then(function(){b.toggleSubmit(),b.focusError()}),this},d.prototype.focusError=function(){if(this.options.focus){var b=this.$element.find(".has-error:first :input");0!==b.length&&(a("html, body").animate({scrollTop:b.offset().top-d.FOCUS_OFFSET},250),b.focus())}},d.prototype.showErrors=function(b){var c=this.options.html?"html":"text",d=b.data("bs.validator.errors"),e=b.closest(".form-group"),f=e.find(".help-block.with-errors"),g=e.find(".form-control-feedback");d.length&&(d=a("<ul/>").addClass("list-unstyled").append(a.map(d,function(b){return a("<li/>")[c](b)})),void 0===f.data("bs.validator.originalContent")&&f.data("bs.validator.originalContent",f.html()),f.empty().append(d),e.addClass("has-error has-danger"),e.hasClass("has-feedback")&&g.removeClass(this.options.feedback.success)&&g.addClass(this.options.feedback.error)&&e.removeClass("has-success"))},d.prototype.clearErrors=function(a){var c=a.closest(".form-group"),d=c.find(".help-block.with-errors"),e=c.find(".form-control-feedback");d.html(d.data("bs.validator.originalContent")),c.removeClass("has-error has-danger has-success"),c.hasClass("has-feedback")&&e.removeClass(this.options.feedback.error)&&e.removeClass(this.options.feedback.success)&&b(a)&&e.addClass(this.options.feedback.success)&&c.addClass("has-success")},d.prototype.hasErrors=function(){function b(){return!!(a(this).data("bs.validator.errors")||[]).length}return!!this.$inputs.filter(b).length},d.prototype.isIncomplete=function(){function c(){var c=b(a(this));return!("string"==typeof c?a.trim(c):c)}return!!this.$inputs.filter("[required]").filter(c).length},d.prototype.onSubmit=function(a){this.validate(),(this.isIncomplete()||this.hasErrors())&&a.preventDefault()},d.prototype.toggleSubmit=function(){this.options.disable&&this.$btn.toggleClass("disabled",this.isIncomplete()||this.hasErrors())},d.prototype.defer=function(b,c){return c=a.proxy(c,this,b),this.options.delay?(window.clearTimeout(b.data("bs.validator.timeout")),void b.data("bs.validator.timeout",window.setTimeout(c,this.options.delay))):c()},d.prototype.reset=function(){return this.$element.find(".form-control-feedback").removeClass(this.options.feedback.error).removeClass(this.options.feedback.success),this.$inputs.removeData(["bs.validator.errors","bs.validator.deferred"]).each(function(){var b=a(this),c=b.data("bs.validator.timeout");window.clearTimeout(c)&&b.removeData("bs.validator.timeout")}),this.$element.find(".help-block.with-errors").each(function(){var b=a(this),c=b.data("bs.validator.originalContent");b.removeData("bs.validator.originalContent").html(c)}),this.$btn.removeClass("disabled"),this.$element.find(".has-error, .has-danger, .has-success").removeClass("has-error has-danger has-success"),this},d.prototype.destroy=function(){return this.reset(),this.$element.removeAttr("novalidate").removeData("bs.validator").off(".bs.validator"),this.$inputs.off(".bs.validator"),this.options=null,this.validators=null,this.$element=null,this.$btn=null,this.$inputs=null,this};var e=a.fn.validator;a.fn.validator=c,a.fn.validator.Constructor=d,a.fn.validator.noConflict=function(){return a.fn.validator=e,this},a(window).on("load",function(){a('form[data-toggle="validator"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery);;
/*! 
 * SmartWizard v4.1.7
 * jQuery Wizard Plugin
 * http://www.techlaboratory.net/smartwizard
 *
 * Created by Dipu Raj
 * http://dipuraj.me
 *
 * Licensed under the terms of the MIT License
 * https://github.com/techlab/SmartWizard/blob/master/LICENSE
 */
(function(d,c,a,f){var e={selected:0,keyNavigation:true,autoAdjustHeight:true,cycleSteps:false,backButtonSupport:true,useURLhash:true,showStepURLhash:true,lang:{next:"Next",previous:"Previous"},toolbarSettings:{toolbarPosition:"bottom",toolbarButtonPosition:"right",showNextButton:true,showPreviousButton:true,toolbarExtraButtons:[]},anchorSettings:{anchorClickable:true,enableAllAnchors:false,markDoneStep:true,markAllPreviousStepsAsDone:true,removeDoneStepOnNavigateBack:false,enableAnchorOnDoneStep:true},contentURL:null,contentCache:true,ajaxSettings:{},disabledSteps:[],errorSteps:[],hiddenSteps:[],theme:"default",transitionEffect:"none",transitionSpeed:"400"};function b(h,g){this.options=d.extend(true,{},e,g);this.main=d(h);this.nav=this.main.children("ul");this.steps=d("li > a",this.nav);this.container=this.main.children("div");this.pages=this.container.children("div");this.current_index=null;this.init()}d.extend(b.prototype,{init:function(){this._setElements();this._setToolbar();this._setEvents();var g=this.options.selected;if(this.options.useURLhash){var h=c.location.hash;if(h&&h.length>0){var j=d("a[href*='"+h+"']",this.nav);if(j.length>0){var i=this.steps.index(j);g=(i>=0)?i:g}}}if(g>0&&this.options.anchorSettings.markDoneStep&&this.options.anchorSettings.markAllPreviousStepsAsDone){this.steps.eq(g).parent("li").prevAll().addClass("done")}this._showStep(g)},_setElements:function(){this.main.addClass("sw-main sw-theme-"+this.options.theme);this.nav.addClass("nav nav-tabs step-anchor");if(this.options.anchorSettings.enableAllAnchors!==false&&this.options.anchorSettings.anchorClickable!==false){this.steps.parent("li").addClass("clickable")}this.container.addClass("sw-container tab-content");this.pages.addClass("step-content");var g=this;if(this.options.disabledSteps&&this.options.disabledSteps.length>0){d.each(this.options.disabledSteps,function(h,j){g.steps.eq(j).parent("li").addClass("disabled")})}if(this.options.errorSteps&&this.options.errorSteps.length>0){d.each(this.options.errorSteps,function(h,j){g.steps.eq(j).parent("li").addClass("danger")})}if(this.options.hiddenSteps&&this.options.hiddenSteps.length>0){d.each(this.options.hiddenSteps,function(h,j){g.steps.eq(j).parent("li").addClass("hidden")})}return true},_setToolbar:function(){if(this.options.toolbarSettings.toolbarPosition==="none"){return true}var i=(this.options.toolbarSettings.showNextButton!==false)?d("<button></button>").text(this.options.lang.next).addClass("btn btn-primary sw-btn-next").attr("type","button"):null;var h=(this.options.toolbarSettings.showPreviousButton!==false)?d("<button></button>").text(this.options.lang.previous).addClass("btn btn-primary sw-btn-prev").attr("type","button"):null;var l=d("<div></div>").addClass("btn-group navbar-btn sw-btn-group pull-"+this.options.toolbarSettings.toolbarButtonPosition).attr("role","group").append(h,i);var k=null;if(this.options.toolbarSettings.toolbarExtraButtons&&this.options.toolbarSettings.toolbarExtraButtons.length>0){k=d("<div></div>").addClass("btn-group navbar-btn sw-btn-group-extra pull-"+this.options.toolbarSettings.toolbarButtonPosition).attr("role","group");d.each(this.options.toolbarSettings.toolbarExtraButtons,function(m,o){k.append(o.clone(true))})}switch(this.options.toolbarSettings.toolbarPosition){case"top":var j=d("<nav></nav>").addClass("navbar btn-toolbar sw-toolbar sw-toolbar-top");j.append(l);if(this.options.toolbarSettings.toolbarButtonPosition==="left"){j.append(k)}else{j.prepend(k)}this.container.before(j);break;case"bottom":var g=d("<nav></nav>").addClass("navbar btn-toolbar sw-toolbar sw-toolbar-bottom");g.append(l);if(this.options.toolbarSettings.toolbarButtonPosition==="left"){g.append(k)}else{g.prepend(k)}this.container.after(g);break;case"both":var j=d("<nav></nav>").addClass("navbar btn-toolbar sw-toolbar sw-toolbar-top");j.append(l);if(this.options.toolbarSettings.toolbarButtonPosition==="left"){j.append(k)}else{j.prepend(k)}this.container.before(j);var g=d("<nav></nav>").addClass("navbar btn-toolbar sw-toolbar sw-toolbar-bottom");g.append(l.clone(true));if(this.options.toolbarSettings.toolbarButtonPosition==="left"){g.append(k.clone(true))}else{g.prepend(k.clone(true))}this.container.after(g);break;default:var g=d("<nav></nav>").addClass("navbar btn-toolbar sw-toolbar sw-toolbar-bottom");g.append(l);if(this.options.toolbarSettings.toolbarButtonPosition==="left"){g.append(k)}else{g.prepend(k)}this.container.after(g);break}return true},_setEvents:function(){var g=this;d(this.steps).on("click",function(i){i.preventDefault();if(g.options.anchorSettings.anchorClickable===false){return true}var h=g.steps.index(this);if(g.options.anchorSettings.enableAnchorOnDoneStep===false&&g.steps.eq(h).parent("li").hasClass("done")){return true}if(h!==g.current_index){if(g.options.anchorSettings.enableAllAnchors!==false&&g.options.anchorSettings.anchorClickable!==false){g._showStep(h)}else{if(g.steps.eq(h).parent("li").hasClass("done")){g._showStep(h)}}}});d(".sw-btn-next",this.main).on("click",function(h){h.preventDefault();if(g.steps.index(this)!==g.current_index){g._showNext()}});d(".sw-btn-prev",this.main).on("click",function(h){h.preventDefault();if(g.steps.index(this)!==g.current_index){g._showPrevious()}});if(this.options.keyNavigation){d(a).keyup(function(h){g._keyNav(h)})}if(this.options.backButtonSupport){d(c).on("hashchange",function(h){if(!g.options.useURLhash){return true}if(c.location.hash){var i=d("a[href*='"+c.location.hash+"']",g.nav);if(i&&i.length>0){h.preventDefault();g._showStep(g.steps.index(i))}}})}return true},_showNext:function(){var g=this.current_index+1;for(var h=g;h<this.steps.length;h++){if(!this.steps.eq(h).parent("li").hasClass("disabled")&&!this.steps.eq(h).parent("li").hasClass("hidden")){g=h;break}}if(this.steps.length<=g){if(!this.options.cycleSteps){return false}g=0}this._showStep(g);return true},_showPrevious:function(){var g=this.current_index-1;for(var h=g;h>=0;h--){if(!this.steps.eq(h).parent("li").hasClass("disabled")&&!this.steps.eq(h).parent("li").hasClass("hidden")){g=h;break}}if(0>g){if(!this.options.cycleSteps){return false}g=this.steps.length-1}this._showStep(g);return true},_showStep:function(g){if(!this.steps.eq(g)){return false}if(g==this.current_index){return false}if(this.steps.eq(g).parent("li").hasClass("disabled")||this.steps.eq(g).parent("li").hasClass("hidden")){return false}this._loadStepContent(g);return true},_loadStepContent:function(h){var i=this;var g=this.steps.eq(this.current_index);var j="";var n=this.steps.eq(h);var m=(n.data("content-url")&&n.data("content-url").length>0)?n.data("content-url"):this.options.contentURL;if(this.current_index!==null&&this.current_index!==h){j=(this.current_index<h)?"forward":"backward"}if(this.current_index!==null&&this._triggerEvent("leaveStep",[g,this.current_index,j])===false){return false}if(m&&m.length>0&&(!n.data("has-content")||!this.options.contentCache)){var l=(n.length>0)?d(n.attr("href"),this.main):null;var k=d.extend(true,{},{url:m,type:"POST",data:({step_number:h}),dataType:"text",beforeSend:function(){n.parent("li").addClass("loading")},error:function(q,o,p){n.parent("li").removeClass("loading");d.error(p)},success:function(o){if(o&&o.length>0){n.data("has-content",true);l.html(o)}n.parent("li").removeClass("loading");i._transitPage(h)}},this.options.ajaxSettings);d.ajax(k)}else{this._transitPage(h)}return true},_transitPage:function(h){var i=this;var g=this.steps.eq(this.current_index);var l=(g.length>0)?d(g.attr("href"),this.main):null;var k=this.steps.eq(h);var n=(k.length>0)?d(k.attr("href"),this.main):null;var j="";if(this.current_index!==null&&this.current_index!==h){j=(this.current_index<h)?"forward":"backward"}var m="middle";if(h===0){m="first"}else{if(h===(this.steps.length-1)){m="final"}}this.options.transitionEffect=this.options.transitionEffect.toLowerCase();this.pages.finish();if(this.options.transitionEffect==="slide"){if(l&&l.length>0){l.slideUp("fast",this.options.transitionEasing,function(){n.slideDown(i.options.transitionSpeed,i.options.transitionEasing)})}else{n.slideDown(this.options.transitionSpeed,this.options.transitionEasing)}}else{if(this.options.transitionEffect==="fade"){if(l&&l.length>0){l.fadeOut("fast",this.options.transitionEasing,function(){n.fadeIn("fast",i.options.transitionEasing,function(){d(this).show()})})}else{n.fadeIn(this.options.transitionSpeed,this.options.transitionEasing,function(){d(this).show()})}}else{if(l&&l.length>0){l.hide()}n.show()}}this._setURLHash(k.attr("href"));this._setAnchor(h);this._setButtons(h);this._fixHeight(h);this.current_index=h;this._triggerEvent("showStep",[k,this.current_index,j,m]);return true},_setAnchor:function(g){this.steps.eq(this.current_index).parent("li").removeClass("active danger loading");if(this.options.anchorSettings.markDoneStep!==false&&this.current_index!==null){this.steps.eq(this.current_index).parent("li").addClass("done");if(this.options.anchorSettings.removeDoneStepOnNavigateBack!==false){this.steps.eq(g).parent("li").nextAll().removeClass("done")}}this.steps.eq(g).parent("li").removeClass("done danger loading").addClass("active");return true},_setButtons:function(g){if(!this.options.cycleSteps){if(0>=g){d(".sw-btn-prev",this.main).addClass("disabled")}else{d(".sw-btn-prev",this.main).removeClass("disabled")}if((this.steps.length-1)<=g){d(".sw-btn-next",this.main).addClass("disabled")}else{d(".sw-btn-next",this.main).removeClass("disabled")}}return true},_keyNav:function(h){var g=this;switch(h.which){case 37:g._showPrevious();h.preventDefault();break;case 39:g._showNext();h.preventDefault();break;default:return}},_fixHeight:function(g){if(this.options.autoAdjustHeight){var h=(this.steps.eq(g).length>0)?d(this.steps.eq(g).attr("href"),this.main):null;this.container.finish().animate({height:h.outerHeight()},this.options.transitionSpeed,function(){})}return true},_triggerEvent:function(g,i){var h=d.Event(g);this.main.trigger(h,i);if(h.isDefaultPrevented()){return false}return h.result},_setURLHash:function(g){if(this.options.showStepURLhash&&c.location.hash!==g){c.location.hash=g}},theme:function(g){if(this.options.theme===g){return false}this.main.removeClass("sw-theme-"+this.options.theme);this.options.theme=g;this.main.addClass("sw-theme-"+this.options.theme);this._triggerEvent("themeChanged",[this.options.theme])},next:function(){this._showNext()},prev:function(){this._showPrevious()},reset:function(){if(this._triggerEvent("beginReset")===false){return false}this.container.stop(true);this.pages.stop(true);this.pages.hide();this.current_index=null;this._setURLHash(this.steps.eq(this.options.selected).attr("href"));d(".sw-toolbar",this.main).remove();this.steps.removeClass();this.steps.parents("li").removeClass();this.steps.data("has-content",false);this.init();this._triggerEvent("endReset")},stepState:function(i,j){var h=this;i=d.isArray(i)?i:[i];var g=d.grep(this.steps,function(l,k){return(d.inArray(k,i)!==-1&&k!==h.current_index)});if(g&&g.length>0){switch(j){case"disable":d(g).parents("li").addClass("disabled");break;case"enable":d(g).parents("li").removeClass("disabled");break;case"hide":d(g).parents("li").addClass("hidden");break;case"show":d(g).parents("li").removeClass("hidden");break}}}});d.fn.smartWizard=function(i){var h=arguments;var g;if(i===f||typeof i==="object"){return this.each(function(){if(!d.data(this,"smartWizard")){d.data(this,"smartWizard",new b(this,i))}})}else{if(typeof i==="string"&&i[0]!=="_"&&i!=="init"){g=d.data(this[0],"smartWizard");if(i==="destroy"){d.data(this,"smartWizard",null)}if(g instanceof b&&typeof g[i]==="function"){return g[i].apply(g,Array.prototype.slice.call(h,1))}else{return this}}}}})(jQuery,window,document);;
/*!
 * Knockout JavaScript library v3.4.2
 * (c) The Knockout.js team - http://knockoutjs.com/
 * License: MIT (http://www.opensource.org/licenses/mit-license.php)
 */

(function() {(function(n){var x=this||(0,eval)("this"),t=x.document,M=x.navigator,u=x.jQuery,H=x.JSON;(function(n){"function"===typeof define&&define.amd?define(["exports","require"],n):"object"===typeof exports&&"object"===typeof module?n(module.exports||exports):n(x.ko={})})(function(N,O){function J(a,c){return null===a||typeof a in R?a===c:!1}function S(b,c){var d;return function(){d||(d=a.a.setTimeout(function(){d=n;b()},c))}}function T(b,c){var d;return function(){clearTimeout(d);d=a.a.setTimeout(b,c)}}function U(a,
c){c&&c!==E?"beforeChange"===c?this.Ob(a):this.Ja(a,c):this.Pb(a)}function V(a,c){null!==c&&c.k&&c.k()}function W(a,c){var d=this.Mc,e=d[s];e.T||(this.ob&&this.Oa[c]?(d.Sb(c,a,this.Oa[c]),this.Oa[c]=null,--this.ob):e.s[c]||d.Sb(c,a,e.t?{$:a}:d.yc(a)),a.Ha&&a.Hc())}function K(b,c,d,e){a.d[b]={init:function(b,g,h,l,m){var k,r;a.m(function(){var q=g(),p=a.a.c(q),p=!d!==!p,A=!r;if(A||c||p!==k)A&&a.xa.Ca()&&(r=a.a.wa(a.f.childNodes(b),!0)),p?(A||a.f.fa(b,a.a.wa(r)),a.hb(e?e(m,q):m,b)):a.f.za(b),k=p},null,
{i:b});return{controlsDescendantBindings:!0}}};a.h.va[b]=!1;a.f.aa[b]=!0}var a="undefined"!==typeof N?N:{};a.b=function(b,c){for(var d=b.split("."),e=a,f=0;f<d.length-1;f++)e=e[d[f]];e[d[d.length-1]]=c};a.H=function(a,c,d){a[c]=d};a.version="3.4.2";a.b("version",a.version);a.options={deferUpdates:!1,useOnlyNativeEvents:!1};a.a=function(){function b(a,b){for(var c in a)a.hasOwnProperty(c)&&b(c,a[c])}function c(a,b){if(b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function d(a,b){a.__proto__=
b;return a}function e(b,c,d,e){var m=b[c].match(r)||[];a.a.r(d.match(r),function(b){a.a.ra(m,b,e)});b[c]=m.join(" ")}var f={__proto__:[]}instanceof Array,g="function"===typeof Symbol,h={},l={};h[M&&/Firefox\/2/i.test(M.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];h.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");b(h,function(a,b){if(b.length)for(var c=0,d=b.length;c<d;c++)l[b[c]]=a});var m={propertychange:!0},k=
t&&function(){for(var a=3,b=t.createElement("div"),c=b.getElementsByTagName("i");b.innerHTML="\x3c!--[if gt IE "+ ++a+"]><i></i><![endif]--\x3e",c[0];);return 4<a?a:n}(),r=/\S+/g;return{gc:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],r:function(a,b){for(var c=0,d=a.length;c<d;c++)b(a[c],c)},o:function(a,b){if("function"==typeof Array.prototype.indexOf)return Array.prototype.indexOf.call(a,b);for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},Vb:function(a,b,c){for(var d=
0,e=a.length;d<e;d++)if(b.call(c,a[d],d))return a[d];return null},Na:function(b,c){var d=a.a.o(b,c);0<d?b.splice(d,1):0===d&&b.shift()},Wb:function(b){b=b||[];for(var c=[],d=0,e=b.length;d<e;d++)0>a.a.o(c,b[d])&&c.push(b[d]);return c},ib:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)c.push(b(a[d],d));return c},Ma:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)b(a[d],d)&&c.push(a[d]);return c},ta:function(a,b){if(b instanceof Array)a.push.apply(a,b);else for(var c=0,d=b.length;c<
d;c++)a.push(b[c]);return a},ra:function(b,c,d){var e=a.a.o(a.a.Bb(b),c);0>e?d&&b.push(c):d||b.splice(e,1)},la:f,extend:c,$a:d,ab:f?d:c,D:b,Ea:function(a,b){if(!a)return a;var c={},d;for(d in a)a.hasOwnProperty(d)&&(c[d]=b(a[d],d,a));return c},rb:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},nc:function(b){b=a.a.W(b);for(var c=(b[0]&&b[0].ownerDocument||t).createElement("div"),d=0,e=b.length;d<e;d++)c.appendChild(a.ba(b[d]));return c},wa:function(b,c){for(var d=0,e=b.length,m=[];d<e;d++){var k=
b[d].cloneNode(!0);m.push(c?a.ba(k):k)}return m},fa:function(b,c){a.a.rb(b);if(c)for(var d=0,e=c.length;d<e;d++)b.appendChild(c[d])},uc:function(b,c){var d=b.nodeType?[b]:b;if(0<d.length){for(var e=d[0],m=e.parentNode,k=0,f=c.length;k<f;k++)m.insertBefore(c[k],e);k=0;for(f=d.length;k<f;k++)a.removeNode(d[k])}},Ba:function(a,b){if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==b;)a.length--;if(1<a.length){var c=
a[0],d=a[a.length-1];for(a.length=0;c!==d;)a.push(c),c=c.nextSibling;a.push(d)}}return a},wc:function(a,b){7>k?a.setAttribute("selected",b):a.selected=b},cb:function(a){return null===a||a===n?"":a.trim?a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},sd:function(a,b){a=a||"";return b.length>a.length?!1:a.substring(0,b.length)===b},Rc:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(3===a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==
(b.compareDocumentPosition(a)&16);for(;a&&a!=b;)a=a.parentNode;return!!a},qb:function(b){return a.a.Rc(b,b.ownerDocument.documentElement)},Tb:function(b){return!!a.a.Vb(b,a.a.qb)},A:function(a){return a&&a.tagName&&a.tagName.toLowerCase()},Zb:function(b){return a.onError?function(){try{return b.apply(this,arguments)}catch(c){throw a.onError&&a.onError(c),c;}}:b},setTimeout:function(b,c){return setTimeout(a.a.Zb(b),c)},dc:function(b){setTimeout(function(){a.onError&&a.onError(b);throw b;},0)},q:function(b,
c,d){var e=a.a.Zb(d);d=k&&m[c];if(a.options.useOnlyNativeEvents||d||!u)if(d||"function"!=typeof b.addEventListener)if("undefined"!=typeof b.attachEvent){var f=function(a){e.call(b,a)},l="on"+c;b.attachEvent(l,f);a.a.G.qa(b,function(){b.detachEvent(l,f)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else b.addEventListener(c,e,!1);else u(b).bind(c,e)},Fa:function(b,c){if(!b||!b.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var d;"input"===
a.a.A(b)&&b.type&&"click"==c.toLowerCase()?(d=b.type,d="checkbox"==d||"radio"==d):d=!1;if(a.options.useOnlyNativeEvents||!u||d)if("function"==typeof t.createEvent)if("function"==typeof b.dispatchEvent)d=t.createEvent(l[c]||"HTMLEvents"),d.initEvent(c,!0,!0,x,0,0,0,0,0,!1,!1,!1,!1,0,b),b.dispatchEvent(d);else throw Error("The supplied element doesn't support dispatchEvent");else if(d&&b.click)b.click();else if("undefined"!=typeof b.fireEvent)b.fireEvent("on"+c);else throw Error("Browser doesn't support triggering events");
else u(b).trigger(c)},c:function(b){return a.I(b)?b():b},Bb:function(b){return a.I(b)?b.p():b},fb:function(b,c,d){var k;c&&("object"===typeof b.classList?(k=b.classList[d?"add":"remove"],a.a.r(c.match(r),function(a){k.call(b.classList,a)})):"string"===typeof b.className.baseVal?e(b.className,"baseVal",c,d):e(b,"className",c,d))},bb:function(b,c){var d=a.a.c(c);if(null===d||d===n)d="";var e=a.f.firstChild(b);!e||3!=e.nodeType||a.f.nextSibling(e)?a.f.fa(b,[b.ownerDocument.createTextNode(d)]):e.data=
d;a.a.Wc(b)},vc:function(a,b){a.name=b;if(7>=k)try{a.mergeAttributes(t.createElement("<input name='"+a.name+"'/>"),!1)}catch(c){}},Wc:function(a){9<=k&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},Sc:function(a){if(k){var b=a.style.width;a.style.width=0;a.style.width=b}},nd:function(b,c){b=a.a.c(b);c=a.a.c(c);for(var d=[],e=b;e<=c;e++)d.push(e);return d},W:function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push(a[c]);return b},bc:function(a){return g?Symbol(a):a},xd:6===k,
yd:7===k,C:k,ic:function(b,c){for(var d=a.a.W(b.getElementsByTagName("input")).concat(a.a.W(b.getElementsByTagName("textarea"))),e="string"==typeof c?function(a){return a.name===c}:function(a){return c.test(a.name)},k=[],m=d.length-1;0<=m;m--)e(d[m])&&k.push(d[m]);return k},kd:function(b){return"string"==typeof b&&(b=a.a.cb(b))?H&&H.parse?H.parse(b):(new Function("return "+b))():null},Gb:function(b,c,d){if(!H||!H.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
return H.stringify(a.a.c(b),c,d)},ld:function(c,d,e){e=e||{};var k=e.params||{},m=e.includeFields||this.gc,f=c;if("object"==typeof c&&"form"===a.a.A(c))for(var f=c.action,l=m.length-1;0<=l;l--)for(var g=a.a.ic(c,m[l]),h=g.length-1;0<=h;h--)k[g[h].name]=g[h].value;d=a.a.c(d);var r=t.createElement("form");r.style.display="none";r.action=f;r.method="post";for(var n in d)c=t.createElement("input"),c.type="hidden",c.name=n,c.value=a.a.Gb(a.a.c(d[n])),r.appendChild(c);b(k,function(a,b){var c=t.createElement("input");
c.type="hidden";c.name=a;c.value=b;r.appendChild(c)});t.body.appendChild(r);e.submitter?e.submitter(r):r.submit();setTimeout(function(){r.parentNode.removeChild(r)},0)}}}();a.b("utils",a.a);a.b("utils.arrayForEach",a.a.r);a.b("utils.arrayFirst",a.a.Vb);a.b("utils.arrayFilter",a.a.Ma);a.b("utils.arrayGetDistinctValues",a.a.Wb);a.b("utils.arrayIndexOf",a.a.o);a.b("utils.arrayMap",a.a.ib);a.b("utils.arrayPushAll",a.a.ta);a.b("utils.arrayRemoveItem",a.a.Na);a.b("utils.extend",a.a.extend);a.b("utils.fieldsIncludedWithJsonPost",
a.a.gc);a.b("utils.getFormFields",a.a.ic);a.b("utils.peekObservable",a.a.Bb);a.b("utils.postJson",a.a.ld);a.b("utils.parseJson",a.a.kd);a.b("utils.registerEventHandler",a.a.q);a.b("utils.stringifyJson",a.a.Gb);a.b("utils.range",a.a.nd);a.b("utils.toggleDomNodeCssClass",a.a.fb);a.b("utils.triggerEvent",a.a.Fa);a.b("utils.unwrapObservable",a.a.c);a.b("utils.objectForEach",a.a.D);a.b("utils.addOrRemoveItem",a.a.ra);a.b("utils.setTextContent",a.a.bb);a.b("unwrap",a.a.c);Function.prototype.bind||(Function.prototype.bind=
function(a){var c=this;if(1===arguments.length)return function(){return c.apply(a,arguments)};var d=Array.prototype.slice.call(arguments,1);return function(){var e=d.slice(0);e.push.apply(e,arguments);return c.apply(a,e)}});a.a.e=new function(){function a(b,g){var h=b[d];if(!h||"null"===h||!e[h]){if(!g)return n;h=b[d]="ko"+c++;e[h]={}}return e[h]}var c=0,d="__ko__"+(new Date).getTime(),e={};return{get:function(c,d){var e=a(c,!1);return e===n?n:e[d]},set:function(c,d,e){if(e!==n||a(c,!1)!==n)a(c,!0)[d]=
e},clear:function(a){var b=a[d];return b?(delete e[b],a[d]=null,!0):!1},J:function(){return c++ +d}}};a.b("utils.domData",a.a.e);a.b("utils.domData.clear",a.a.e.clear);a.a.G=new function(){function b(b,c){var e=a.a.e.get(b,d);e===n&&c&&(e=[],a.a.e.set(b,d,e));return e}function c(d){var e=b(d,!1);if(e)for(var e=e.slice(0),l=0;l<e.length;l++)e[l](d);a.a.e.clear(d);a.a.G.cleanExternalData(d);if(f[d.nodeType])for(e=d.firstChild;d=e;)e=d.nextSibling,8===d.nodeType&&c(d)}var d=a.a.e.J(),e={1:!0,8:!0,9:!0},
f={1:!0,9:!0};return{qa:function(a,c){if("function"!=typeof c)throw Error("Callback must be a function");b(a,!0).push(c)},tc:function(c,e){var f=b(c,!1);f&&(a.a.Na(f,e),0==f.length&&a.a.e.set(c,d,n))},ba:function(b){if(e[b.nodeType]&&(c(b),f[b.nodeType])){var d=[];a.a.ta(d,b.getElementsByTagName("*"));for(var l=0,m=d.length;l<m;l++)c(d[l])}return b},removeNode:function(b){a.ba(b);b.parentNode&&b.parentNode.removeChild(b)},cleanExternalData:function(a){u&&"function"==typeof u.cleanData&&u.cleanData([a])}}};
a.ba=a.a.G.ba;a.removeNode=a.a.G.removeNode;a.b("cleanNode",a.ba);a.b("removeNode",a.removeNode);a.b("utils.domNodeDisposal",a.a.G);a.b("utils.domNodeDisposal.addDisposeCallback",a.a.G.qa);a.b("utils.domNodeDisposal.removeDisposeCallback",a.a.G.tc);(function(){var b=[0,"",""],c=[1,"<table>","</table>"],d=[3,"<table><tbody><tr>","</tr></tbody></table>"],e=[1,"<select multiple='multiple'>","</select>"],f={thead:c,tbody:c,tfoot:c,tr:[2,"<table><tbody>","</tbody></table>"],td:d,th:d,option:e,optgroup:e},
g=8>=a.a.C;a.a.na=function(c,d){var e;if(u)if(u.parseHTML)e=u.parseHTML(c,d)||[];else{if((e=u.clean([c],d))&&e[0]){for(var k=e[0];k.parentNode&&11!==k.parentNode.nodeType;)k=k.parentNode;k.parentNode&&k.parentNode.removeChild(k)}}else{(e=d)||(e=t);var k=e.parentWindow||e.defaultView||x,r=a.a.cb(c).toLowerCase(),q=e.createElement("div"),p;p=(r=r.match(/^<([a-z]+)[ >]/))&&f[r[1]]||b;r=p[0];p="ignored<div>"+p[1]+c+p[2]+"</div>";"function"==typeof k.innerShiv?q.appendChild(k.innerShiv(p)):(g&&e.appendChild(q),
q.innerHTML=p,g&&q.parentNode.removeChild(q));for(;r--;)q=q.lastChild;e=a.a.W(q.lastChild.childNodes)}return e};a.a.Eb=function(b,c){a.a.rb(b);c=a.a.c(c);if(null!==c&&c!==n)if("string"!=typeof c&&(c=c.toString()),u)u(b).html(c);else for(var d=a.a.na(c,b.ownerDocument),e=0;e<d.length;e++)b.appendChild(d[e])}})();a.b("utils.parseHtmlFragment",a.a.na);a.b("utils.setHtml",a.a.Eb);a.N=function(){function b(c,e){if(c)if(8==c.nodeType){var f=a.N.pc(c.nodeValue);null!=f&&e.push({Qc:c,hd:f})}else if(1==c.nodeType)for(var f=
0,g=c.childNodes,h=g.length;f<h;f++)b(g[f],e)}var c={};return{yb:function(a){if("function"!=typeof a)throw Error("You can only pass a function to ko.memoization.memoize()");var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);c[b]=a;return"\x3c!--[ko_memo:"+b+"]--\x3e"},Bc:function(a,b){var f=c[a];if(f===n)throw Error("Couldn't find any memo with ID "+a+". Perhaps it's already been unmemoized.");try{return f.apply(null,b||[]),
!0}finally{delete c[a]}},Cc:function(c,e){var f=[];b(c,f);for(var g=0,h=f.length;g<h;g++){var l=f[g].Qc,m=[l];e&&a.a.ta(m,e);a.N.Bc(f[g].hd,m);l.nodeValue="";l.parentNode&&l.parentNode.removeChild(l)}},pc:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:null}}}();a.b("memoization",a.N);a.b("memoization.memoize",a.N.yb);a.b("memoization.unmemoize",a.N.Bc);a.b("memoization.parseMemoText",a.N.pc);a.b("memoization.unmemoizeDomNodeAndDescendants",a.N.Cc);a.Z=function(){function b(){if(e)for(var b=
e,c=0,m;g<e;)if(m=d[g++]){if(g>b){if(5E3<=++c){g=e;a.a.dc(Error("'Too much recursion' after processing "+c+" task groups."));break}b=e}try{m()}catch(k){a.a.dc(k)}}}function c(){b();g=e=d.length=0}var d=[],e=0,f=1,g=0;return{scheduler:x.MutationObserver?function(a){var b=t.createElement("div");(new MutationObserver(a)).observe(b,{attributes:!0});return function(){b.classList.toggle("foo")}}(c):t&&"onreadystatechange"in t.createElement("script")?function(a){var b=t.createElement("script");b.onreadystatechange=
function(){b.onreadystatechange=null;t.documentElement.removeChild(b);b=null;a()};t.documentElement.appendChild(b)}:function(a){setTimeout(a,0)},Za:function(b){e||a.Z.scheduler(c);d[e++]=b;return f++},cancel:function(a){a-=f-e;a>=g&&a<e&&(d[a]=null)},resetForTesting:function(){var a=e-g;g=e=d.length=0;return a},rd:b}}();a.b("tasks",a.Z);a.b("tasks.schedule",a.Z.Za);a.b("tasks.runEarly",a.Z.rd);a.Aa={throttle:function(b,c){b.throttleEvaluation=c;var d=null;return a.B({read:b,write:function(e){clearTimeout(d);
d=a.a.setTimeout(function(){b(e)},c)}})},rateLimit:function(a,c){var d,e,f;"number"==typeof c?d=c:(d=c.timeout,e=c.method);a.gb=!1;f="notifyWhenChangesStop"==e?T:S;a.Wa(function(a){return f(a,d)})},deferred:function(b,c){if(!0!==c)throw Error("The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.");b.gb||(b.gb=!0,b.Wa(function(c){var e,f=!1;return function(){if(!f){a.Z.cancel(e);e=a.Z.Za(c);try{f=!0,b.notifySubscribers(n,"dirty")}finally{f=
!1}}}}))},notify:function(a,c){a.equalityComparer="always"==c?null:J}};var R={undefined:1,"boolean":1,number:1,string:1};a.b("extenders",a.Aa);a.zc=function(b,c,d){this.$=b;this.jb=c;this.Pc=d;this.T=!1;a.H(this,"dispose",this.k)};a.zc.prototype.k=function(){this.T=!0;this.Pc()};a.K=function(){a.a.ab(this,D);D.ub(this)};var E="change",D={ub:function(a){a.F={change:[]};a.Qb=1},Y:function(b,c,d){var e=this;d=d||E;var f=new a.zc(e,c?b.bind(c):b,function(){a.a.Na(e.F[d],f);e.Ka&&e.Ka(d)});e.ua&&e.ua(d);
e.F[d]||(e.F[d]=[]);e.F[d].push(f);return f},notifySubscribers:function(b,c){c=c||E;c===E&&this.Kb();if(this.Ra(c)){var d=c===E&&this.Fc||this.F[c].slice(0);try{a.l.Xb();for(var e=0,f;f=d[e];++e)f.T||f.jb(b)}finally{a.l.end()}}},Pa:function(){return this.Qb},Zc:function(a){return this.Pa()!==a},Kb:function(){++this.Qb},Wa:function(b){var c=this,d=a.I(c),e,f,g,h;c.Ja||(c.Ja=c.notifySubscribers,c.notifySubscribers=U);var l=b(function(){c.Ha=!1;d&&h===c&&(h=c.Mb?c.Mb():c());var a=f||c.Ua(g,h);f=e=!1;
a&&c.Ja(g=h)});c.Pb=function(a){c.Fc=c.F[E].slice(0);c.Ha=e=!0;h=a;l()};c.Ob=function(a){e||(g=a,c.Ja(a,"beforeChange"))};c.Hc=function(){c.Ua(g,c.p(!0))&&(f=!0)}},Ra:function(a){return this.F[a]&&this.F[a].length},Xc:function(b){if(b)return this.F[b]&&this.F[b].length||0;var c=0;a.a.D(this.F,function(a,b){"dirty"!==a&&(c+=b.length)});return c},Ua:function(a,c){return!this.equalityComparer||!this.equalityComparer(a,c)},extend:function(b){var c=this;b&&a.a.D(b,function(b,e){var f=a.Aa[b];"function"==
typeof f&&(c=f(c,e)||c)});return c}};a.H(D,"subscribe",D.Y);a.H(D,"extend",D.extend);a.H(D,"getSubscriptionsCount",D.Xc);a.a.la&&a.a.$a(D,Function.prototype);a.K.fn=D;a.lc=function(a){return null!=a&&"function"==typeof a.Y&&"function"==typeof a.notifySubscribers};a.b("subscribable",a.K);a.b("isSubscribable",a.lc);a.xa=a.l=function(){function b(a){d.push(e);e=a}function c(){e=d.pop()}var d=[],e,f=0;return{Xb:b,end:c,sc:function(b){if(e){if(!a.lc(b))throw Error("Only subscribable things can act as dependencies");
e.jb.call(e.Lc,b,b.Gc||(b.Gc=++f))}},w:function(a,d,e){try{return b(),a.apply(d,e||[])}finally{c()}},Ca:function(){if(e)return e.m.Ca()},Va:function(){if(e)return e.Va}}}();a.b("computedContext",a.xa);a.b("computedContext.getDependenciesCount",a.xa.Ca);a.b("computedContext.isInitial",a.xa.Va);a.b("ignoreDependencies",a.wd=a.l.w);var F=a.a.bc("_latestValue");a.O=function(b){function c(){if(0<arguments.length)return c.Ua(c[F],arguments[0])&&(c.ia(),c[F]=arguments[0],c.ha()),this;a.l.sc(c);return c[F]}
c[F]=b;a.a.la||a.a.extend(c,a.K.fn);a.K.fn.ub(c);a.a.ab(c,B);a.options.deferUpdates&&a.Aa.deferred(c,!0);return c};var B={equalityComparer:J,p:function(){return this[F]},ha:function(){this.notifySubscribers(this[F])},ia:function(){this.notifySubscribers(this[F],"beforeChange")}};a.a.la&&a.a.$a(B,a.K.fn);var I=a.O.md="__ko_proto__";B[I]=a.O;a.Qa=function(b,c){return null===b||b===n||b[I]===n?!1:b[I]===c?!0:a.Qa(b[I],c)};a.I=function(b){return a.Qa(b,a.O)};a.Da=function(b){return"function"==typeof b&&
b[I]===a.O||"function"==typeof b&&b[I]===a.B&&b.$c?!0:!1};a.b("observable",a.O);a.b("isObservable",a.I);a.b("isWriteableObservable",a.Da);a.b("isWritableObservable",a.Da);a.b("observable.fn",B);a.H(B,"peek",B.p);a.H(B,"valueHasMutated",B.ha);a.H(B,"valueWillMutate",B.ia);a.ma=function(b){b=b||[];if("object"!=typeof b||!("length"in b))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");b=a.O(b);a.a.ab(b,a.ma.fn);return b.extend({trackArrayChanges:!0})};
a.ma.fn={remove:function(b){for(var c=this.p(),d=[],e="function"!=typeof b||a.I(b)?function(a){return a===b}:b,f=0;f<c.length;f++){var g=c[f];e(g)&&(0===d.length&&this.ia(),d.push(g),c.splice(f,1),f--)}d.length&&this.ha();return d},removeAll:function(b){if(b===n){var c=this.p(),d=c.slice(0);this.ia();c.splice(0,c.length);this.ha();return d}return b?this.remove(function(c){return 0<=a.a.o(b,c)}):[]},destroy:function(b){var c=this.p(),d="function"!=typeof b||a.I(b)?function(a){return a===b}:b;this.ia();
for(var e=c.length-1;0<=e;e--)d(c[e])&&(c[e]._destroy=!0);this.ha()},destroyAll:function(b){return b===n?this.destroy(function(){return!0}):b?this.destroy(function(c){return 0<=a.a.o(b,c)}):[]},indexOf:function(b){var c=this();return a.a.o(c,b)},replace:function(a,c){var d=this.indexOf(a);0<=d&&(this.ia(),this.p()[d]=c,this.ha())}};a.a.la&&a.a.$a(a.ma.fn,a.O.fn);a.a.r("pop push reverse shift sort splice unshift".split(" "),function(b){a.ma.fn[b]=function(){var a=this.p();this.ia();this.Yb(a,b,arguments);
var d=a[b].apply(a,arguments);this.ha();return d===a?this:d}});a.a.r(["slice"],function(b){a.ma.fn[b]=function(){var a=this();return a[b].apply(a,arguments)}});a.b("observableArray",a.ma);a.Aa.trackArrayChanges=function(b,c){function d(){if(!e){e=!0;l=b.notifySubscribers;b.notifySubscribers=function(a,b){b&&b!==E||++h;return l.apply(this,arguments)};var c=[].concat(b.p()||[]);f=null;g=b.Y(function(d){d=[].concat(d||[]);if(b.Ra("arrayChange")){var e;if(!f||1<h)f=a.a.lb(c,d,b.kb);e=f}c=d;f=null;h=0;
e&&e.length&&b.notifySubscribers(e,"arrayChange")})}}b.kb={};c&&"object"==typeof c&&a.a.extend(b.kb,c);b.kb.sparse=!0;if(!b.Yb){var e=!1,f=null,g,h=0,l,m=b.ua,k=b.Ka;b.ua=function(a){m&&m.call(b,a);"arrayChange"===a&&d()};b.Ka=function(a){k&&k.call(b,a);"arrayChange"!==a||b.Ra("arrayChange")||(l&&(b.notifySubscribers=l,l=n),g.k(),e=!1)};b.Yb=function(b,c,d){function k(a,b,c){return m[m.length]={status:a,value:b,index:c}}if(e&&!h){var m=[],l=b.length,g=d.length,G=0;switch(c){case "push":G=l;case "unshift":for(c=
0;c<g;c++)k("added",d[c],G+c);break;case "pop":G=l-1;case "shift":l&&k("deleted",b[G],G);break;case "splice":c=Math.min(Math.max(0,0>d[0]?l+d[0]:d[0]),l);for(var l=1===g?l:Math.min(c+(d[1]||0),l),g=c+g-2,G=Math.max(l,g),n=[],s=[],w=2;c<G;++c,++w)c<l&&s.push(k("deleted",b[c],c)),c<g&&n.push(k("added",d[w],c));a.a.hc(s,n);break;default:return}f=m}}}};var s=a.a.bc("_state");a.m=a.B=function(b,c,d){function e(){if(0<arguments.length){if("function"===typeof f)f.apply(g.sb,arguments);else throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");
return this}a.l.sc(e);(g.V||g.t&&e.Sa())&&e.U();return g.M}"object"===typeof b?d=b:(d=d||{},b&&(d.read=b));if("function"!=typeof d.read)throw Error("Pass a function that returns the value of the ko.computed");var f=d.write,g={M:n,da:!0,V:!0,Ta:!1,Hb:!1,T:!1,Ya:!1,t:!1,od:d.read,sb:c||d.owner,i:d.disposeWhenNodeIsRemoved||d.i||null,ya:d.disposeWhen||d.ya,pb:null,s:{},L:0,fc:null};e[s]=g;e.$c="function"===typeof f;a.a.la||a.a.extend(e,a.K.fn);a.K.fn.ub(e);a.a.ab(e,z);d.pure?(g.Ya=!0,g.t=!0,a.a.extend(e,
Y)):d.deferEvaluation&&a.a.extend(e,Z);a.options.deferUpdates&&a.Aa.deferred(e,!0);g.i&&(g.Hb=!0,g.i.nodeType||(g.i=null));g.t||d.deferEvaluation||e.U();g.i&&e.ca()&&a.a.G.qa(g.i,g.pb=function(){e.k()});return e};var z={equalityComparer:J,Ca:function(){return this[s].L},Sb:function(a,c,d){if(this[s].Ya&&c===this)throw Error("A 'pure' computed must not be called recursively");this[s].s[a]=d;d.Ia=this[s].L++;d.pa=c.Pa()},Sa:function(){var a,c,d=this[s].s;for(a in d)if(d.hasOwnProperty(a)&&(c=d[a],this.oa&&
c.$.Ha||c.$.Zc(c.pa)))return!0},gd:function(){this.oa&&!this[s].Ta&&this.oa(!1)},ca:function(){var a=this[s];return a.V||0<a.L},qd:function(){this.Ha?this[s].V&&(this[s].da=!0):this.ec()},yc:function(a){if(a.gb&&!this[s].i){var c=a.Y(this.gd,this,"dirty"),d=a.Y(this.qd,this);return{$:a,k:function(){c.k();d.k()}}}return a.Y(this.ec,this)},ec:function(){var b=this,c=b.throttleEvaluation;c&&0<=c?(clearTimeout(this[s].fc),this[s].fc=a.a.setTimeout(function(){b.U(!0)},c)):b.oa?b.oa(!0):b.U(!0)},U:function(b){var c=
this[s],d=c.ya,e=!1;if(!c.Ta&&!c.T){if(c.i&&!a.a.qb(c.i)||d&&d()){if(!c.Hb){this.k();return}}else c.Hb=!1;c.Ta=!0;try{e=this.Vc(b)}finally{c.Ta=!1}c.L||this.k();return e}},Vc:function(b){var c=this[s],d=!1,e=c.Ya?n:!c.L,f={Mc:this,Oa:c.s,ob:c.L};a.l.Xb({Lc:f,jb:W,m:this,Va:e});c.s={};c.L=0;f=this.Uc(c,f);this.Ua(c.M,f)&&(c.t||this.notifySubscribers(c.M,"beforeChange"),c.M=f,c.t?this.Kb():b&&this.notifySubscribers(c.M),d=!0);e&&this.notifySubscribers(c.M,"awake");return d},Uc:function(b,c){try{var d=
b.od;return b.sb?d.call(b.sb):d()}finally{a.l.end(),c.ob&&!b.t&&a.a.D(c.Oa,V),b.da=b.V=!1}},p:function(a){var c=this[s];(c.V&&(a||!c.L)||c.t&&this.Sa())&&this.U();return c.M},Wa:function(b){a.K.fn.Wa.call(this,b);this.Mb=function(){this[s].da?this.U():this[s].V=!1;return this[s].M};this.oa=function(a){this.Ob(this[s].M);this[s].V=!0;a&&(this[s].da=!0);this.Pb(this)}},k:function(){var b=this[s];!b.t&&b.s&&a.a.D(b.s,function(a,b){b.k&&b.k()});b.i&&b.pb&&a.a.G.tc(b.i,b.pb);b.s=null;b.L=0;b.T=!0;b.da=
!1;b.V=!1;b.t=!1;b.i=null}},Y={ua:function(b){var c=this,d=c[s];if(!d.T&&d.t&&"change"==b){d.t=!1;if(d.da||c.Sa())d.s=null,d.L=0,c.U()&&c.Kb();else{var e=[];a.a.D(d.s,function(a,b){e[b.Ia]=a});a.a.r(e,function(a,b){var e=d.s[a],l=c.yc(e.$);l.Ia=b;l.pa=e.pa;d.s[a]=l})}d.T||c.notifySubscribers(d.M,"awake")}},Ka:function(b){var c=this[s];c.T||"change"!=b||this.Ra("change")||(a.a.D(c.s,function(a,b){b.k&&(c.s[a]={$:b.$,Ia:b.Ia,pa:b.pa},b.k())}),c.t=!0,this.notifySubscribers(n,"asleep"))},Pa:function(){var b=
this[s];b.t&&(b.da||this.Sa())&&this.U();return a.K.fn.Pa.call(this)}},Z={ua:function(a){"change"!=a&&"beforeChange"!=a||this.p()}};a.a.la&&a.a.$a(z,a.K.fn);var P=a.O.md;a.m[P]=a.O;z[P]=a.m;a.bd=function(b){return a.Qa(b,a.m)};a.cd=function(b){return a.Qa(b,a.m)&&b[s]&&b[s].Ya};a.b("computed",a.m);a.b("dependentObservable",a.m);a.b("isComputed",a.bd);a.b("isPureComputed",a.cd);a.b("computed.fn",z);a.H(z,"peek",z.p);a.H(z,"dispose",z.k);a.H(z,"isActive",z.ca);a.H(z,"getDependenciesCount",z.Ca);a.rc=
function(b,c){if("function"===typeof b)return a.m(b,c,{pure:!0});b=a.a.extend({},b);b.pure=!0;return a.m(b,c)};a.b("pureComputed",a.rc);(function(){function b(a,f,g){g=g||new d;a=f(a);if("object"!=typeof a||null===a||a===n||a instanceof RegExp||a instanceof Date||a instanceof String||a instanceof Number||a instanceof Boolean)return a;var h=a instanceof Array?[]:{};g.save(a,h);c(a,function(c){var d=f(a[c]);switch(typeof d){case "boolean":case "number":case "string":case "function":h[c]=d;break;case "object":case "undefined":var k=
g.get(d);h[c]=k!==n?k:b(d,f,g)}});return h}function c(a,b){if(a instanceof Array){for(var c=0;c<a.length;c++)b(c);"function"==typeof a.toJSON&&b("toJSON")}else for(c in a)b(c)}function d(){this.keys=[];this.Lb=[]}a.Ac=function(c){if(0==arguments.length)throw Error("When calling ko.toJS, pass the object you want to convert.");return b(c,function(b){for(var c=0;a.I(b)&&10>c;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.Ac(b);return a.a.Gb(b,c,d)};d.prototype={save:function(b,c){var d=a.a.o(this.keys,
b);0<=d?this.Lb[d]=c:(this.keys.push(b),this.Lb.push(c))},get:function(b){b=a.a.o(this.keys,b);return 0<=b?this.Lb[b]:n}}})();a.b("toJS",a.Ac);a.b("toJSON",a.toJSON);(function(){a.j={u:function(b){switch(a.a.A(b)){case "option":return!0===b.__ko__hasDomDataOptionValue__?a.a.e.get(b,a.d.options.zb):7>=a.a.C?b.getAttributeNode("value")&&b.getAttributeNode("value").specified?b.value:b.text:b.value;case "select":return 0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex]):n;default:return b.value}},ja:function(b,
c,d){switch(a.a.A(b)){case "option":switch(typeof c){case "string":a.a.e.set(b,a.d.options.zb,n);"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__;b.value=c;break;default:a.a.e.set(b,a.d.options.zb,c),b.__ko__hasDomDataOptionValue__=!0,b.value="number"===typeof c?c:""}break;case "select":if(""===c||null===c)c=n;for(var e=-1,f=0,g=b.options.length,h;f<g;++f)if(h=a.j.u(b.options[f]),h==c||""==h&&c===n){e=f;break}if(d||0<=e||c===n&&1<b.size)b.selectedIndex=e;break;default:if(null===
c||c===n)c="";b.value=c}}}})();a.b("selectExtensions",a.j);a.b("selectExtensions.readValue",a.j.u);a.b("selectExtensions.writeValue",a.j.ja);a.h=function(){function b(b){b=a.a.cb(b);123===b.charCodeAt(0)&&(b=b.slice(1,-1));var c=[],d=b.match(e),r,h=[],p=0;if(d){d.push(",");for(var A=0,y;y=d[A];++A){var v=y.charCodeAt(0);if(44===v){if(0>=p){c.push(r&&h.length?{key:r,value:h.join("")}:{unknown:r||h.join("")});r=p=0;h=[];continue}}else if(58===v){if(!p&&!r&&1===h.length){r=h.pop();continue}}else 47===
v&&A&&1<y.length?(v=d[A-1].match(f))&&!g[v[0]]&&(b=b.substr(b.indexOf(y)+1),d=b.match(e),d.push(","),A=-1,y="/"):40===v||123===v||91===v?++p:41===v||125===v||93===v?--p:r||h.length||34!==v&&39!==v||(y=y.slice(1,-1));h.push(y)}}return c}var c=["true","false","null","undefined"],d=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,e=RegExp("\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|/(?:[^/\\\\]|\\\\.)*/w*|[^\\s:,/][^,\"'{}()/:[\\]]*[^\\s,\"'{}()/:[\\]]|[^\\s]","g"),f=/[\])"'A-Za-z0-9_$]+$/,
g={"in":1,"return":1,"typeof":1},h={};return{va:[],ga:h,Ab:b,Xa:function(e,m){function k(b,e){var m;if(!A){var l=a.getBindingHandler(b);if(l&&l.preprocess&&!(e=l.preprocess(e,b,k)))return;if(l=h[b])m=e,0<=a.a.o(c,m)?m=!1:(l=m.match(d),m=null===l?!1:l[1]?"Object("+l[1]+")"+l[2]:m),l=m;l&&g.push("'"+b+"':function(_z){"+m+"=_z}")}p&&(e="function(){return "+e+" }");f.push("'"+b+"':"+e)}m=m||{};var f=[],g=[],p=m.valueAccessors,A=m.bindingParams,y="string"===typeof e?b(e):e;a.a.r(y,function(a){k(a.key||
a.unknown,a.value)});g.length&&k("_ko_property_writers","{"+g.join(",")+" }");return f.join(",")},fd:function(a,b){for(var c=0;c<a.length;c++)if(a[c].key==b)return!0;return!1},Ga:function(b,c,d,e,f){if(b&&a.I(b))!a.Da(b)||f&&b.p()===e||b(e);else if((b=c.get("_ko_property_writers"))&&b[d])b[d](e)}}}();a.b("expressionRewriting",a.h);a.b("expressionRewriting.bindingRewriteValidators",a.h.va);a.b("expressionRewriting.parseObjectLiteral",a.h.Ab);a.b("expressionRewriting.preProcessBindings",a.h.Xa);a.b("expressionRewriting._twoWayBindings",
a.h.ga);a.b("jsonExpressionRewriting",a.h);a.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",a.h.Xa);(function(){function b(a){return 8==a.nodeType&&g.test(f?a.text:a.nodeValue)}function c(a){return 8==a.nodeType&&h.test(f?a.text:a.nodeValue)}function d(a,d){for(var e=a,f=1,l=[];e=e.nextSibling;){if(c(e)&&(f--,0===f))return l;l.push(e);b(e)&&f++}if(!d)throw Error("Cannot find closing comment tag to match: "+a.nodeValue);return null}function e(a,b){var c=d(a,b);return c?0<c.length?c[c.length-
1].nextSibling:a.nextSibling:null}var f=t&&"\x3c!--test--\x3e"===t.createComment("test").text,g=f?/^\x3c!--\s*ko(?:\s+([\s\S]+))?\s*--\x3e$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/,h=f?/^\x3c!--\s*\/ko\s*--\x3e$/:/^\s*\/ko\s*$/,l={ul:!0,ol:!0};a.f={aa:{},childNodes:function(a){return b(a)?d(a):a.childNodes},za:function(c){if(b(c)){c=a.f.childNodes(c);for(var d=0,e=c.length;d<e;d++)a.removeNode(c[d])}else a.a.rb(c)},fa:function(c,d){if(b(c)){a.f.za(c);for(var e=c.nextSibling,f=0,l=d.length;f<l;f++)e.parentNode.insertBefore(d[f],
e)}else a.a.fa(c,d)},qc:function(a,c){b(a)?a.parentNode.insertBefore(c,a.nextSibling):a.firstChild?a.insertBefore(c,a.firstChild):a.appendChild(c)},kc:function(c,d,e){e?b(c)?c.parentNode.insertBefore(d,e.nextSibling):e.nextSibling?c.insertBefore(d,e.nextSibling):c.appendChild(d):a.f.qc(c,d)},firstChild:function(a){return b(a)?!a.nextSibling||c(a.nextSibling)?null:a.nextSibling:a.firstChild},nextSibling:function(a){b(a)&&(a=e(a));return a.nextSibling&&c(a.nextSibling)?null:a.nextSibling},Yc:b,vd:function(a){return(a=
(f?a.text:a.nodeValue).match(g))?a[1]:null},oc:function(d){if(l[a.a.A(d)]){var k=d.firstChild;if(k){do if(1===k.nodeType){var f;f=k.firstChild;var g=null;if(f){do if(g)g.push(f);else if(b(f)){var h=e(f,!0);h?f=h:g=[f]}else c(f)&&(g=[f]);while(f=f.nextSibling)}if(f=g)for(g=k.nextSibling,h=0;h<f.length;h++)g?d.insertBefore(f[h],g):d.appendChild(f[h])}while(k=k.nextSibling)}}}}})();a.b("virtualElements",a.f);a.b("virtualElements.allowedBindings",a.f.aa);a.b("virtualElements.emptyNode",a.f.za);a.b("virtualElements.insertAfter",
a.f.kc);a.b("virtualElements.prepend",a.f.qc);a.b("virtualElements.setDomNodeChildren",a.f.fa);(function(){a.S=function(){this.Kc={}};a.a.extend(a.S.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return null!=b.getAttribute("data-bind")||a.g.getComponentNameForNode(b);case 8:return a.f.Yc(b);default:return!1}},getBindings:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b):null;return a.g.Rb(d,b,c,!1)},getBindingAccessors:function(b,c){var d=this.getBindingsString(b,
c),d=d?this.parseBindingsString(d,c,b,{valueAccessors:!0}):null;return a.g.Rb(d,b,c,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind");case 8:return a.f.vd(b);default:return null}},parseBindingsString:function(b,c,d,e){try{var f=this.Kc,g=b+(e&&e.valueAccessors||""),h;if(!(h=f[g])){var l,m="with($context){with($data||{}){return{"+a.h.Xa(b,e)+"}}}";l=new Function("$context","$element",m);h=f[g]=l}return h(c,d)}catch(k){throw k.message="Unable to parse bindings.\nBindings value: "+
b+"\nMessage: "+k.message,k;}}});a.S.instance=new a.S})();a.b("bindingProvider",a.S);(function(){function b(a){return function(){return a}}function c(a){return a()}function d(b){return a.a.Ea(a.l.w(b),function(a,c){return function(){return b()[c]}})}function e(c,e,k){return"function"===typeof c?d(c.bind(null,e,k)):a.a.Ea(c,b)}function f(a,b){return d(this.getBindings.bind(this,a,b))}function g(b,c,d){var e,k=a.f.firstChild(c),f=a.S.instance,m=f.preprocessNode;if(m){for(;e=k;)k=a.f.nextSibling(e),
m.call(f,e);k=a.f.firstChild(c)}for(;e=k;)k=a.f.nextSibling(e),h(b,e,d)}function h(b,c,d){var e=!0,k=1===c.nodeType;k&&a.f.oc(c);if(k&&d||a.S.instance.nodeHasBindings(c))e=m(c,null,b,d).shouldBindDescendants;e&&!r[a.a.A(c)]&&g(b,c,!k)}function l(b){var c=[],d={},e=[];a.a.D(b,function X(k){if(!d[k]){var f=a.getBindingHandler(k);f&&(f.after&&(e.push(k),a.a.r(f.after,function(c){if(b[c]){if(-1!==a.a.o(e,c))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+e.join(", "));
X(c)}}),e.length--),c.push({key:k,jc:f}));d[k]=!0}});return c}function m(b,d,e,k){var m=a.a.e.get(b,q);if(!d){if(m)throw Error("You cannot apply bindings multiple times to the same element.");a.a.e.set(b,q,!0)}!m&&k&&a.xc(b,e);var g;if(d&&"function"!==typeof d)g=d;else{var h=a.S.instance,r=h.getBindingAccessors||f,p=a.B(function(){(g=d?d(e,b):r.call(h,b,e))&&e.Q&&e.Q();return g},null,{i:b});g&&p.ca()||(p=null)}var s;if(g){var t=p?function(a){return function(){return c(p()[a])}}:function(a){return g[a]},
u=function(){return a.a.Ea(p?p():g,c)};u.get=function(a){return g[a]&&c(t(a))};u.has=function(a){return a in g};k=l(g);a.a.r(k,function(c){var d=c.jc.init,k=c.jc.update,f=c.key;if(8===b.nodeType&&!a.f.aa[f])throw Error("The binding '"+f+"' cannot be used with virtual elements");try{"function"==typeof d&&a.l.w(function(){var a=d(b,t(f),u,e.$data,e);if(a&&a.controlsDescendantBindings){if(s!==n)throw Error("Multiple bindings ("+s+" and "+f+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");
s=f}}),"function"==typeof k&&a.B(function(){k(b,t(f),u,e.$data,e)},null,{i:b})}catch(m){throw m.message='Unable to process binding "'+f+": "+g[f]+'"\nMessage: '+m.message,m;}})}return{shouldBindDescendants:s===n}}function k(b){return b&&b instanceof a.R?b:new a.R(b)}a.d={};var r={script:!0,textarea:!0,template:!0};a.getBindingHandler=function(b){return a.d[b]};a.R=function(b,c,d,e,k){function f(){var k=g?b():b,m=a.a.c(k);c?(c.Q&&c.Q(),a.a.extend(l,c),l.Q=r):(l.$parents=[],l.$root=m,l.ko=a);l.$rawData=
k;l.$data=m;d&&(l[d]=m);e&&e(l,c,m);return l.$data}function m(){return h&&!a.a.Tb(h)}var l=this,g="function"==typeof b&&!a.I(b),h,r;k&&k.exportDependencies?f():(r=a.B(f,null,{ya:m,i:!0}),r.ca()&&(l.Q=r,r.equalityComparer=null,h=[],r.Dc=function(b){h.push(b);a.a.G.qa(b,function(b){a.a.Na(h,b);h.length||(r.k(),l.Q=r=n)})}))};a.R.prototype.createChildContext=function(b,c,d,e){return new a.R(b,this,c,function(a,b){a.$parentContext=b;a.$parent=b.$data;a.$parents=(b.$parents||[]).slice(0);a.$parents.unshift(a.$parent);
d&&d(a)},e)};a.R.prototype.extend=function(b){return new a.R(this.Q||this.$data,this,null,function(c,d){c.$rawData=d.$rawData;a.a.extend(c,"function"==typeof b?b():b)})};a.R.prototype.ac=function(a,b){return this.createChildContext(a,b,null,{exportDependencies:!0})};var q=a.a.e.J(),p=a.a.e.J();a.xc=function(b,c){if(2==arguments.length)a.a.e.set(b,p,c),c.Q&&c.Q.Dc(b);else return a.a.e.get(b,p)};a.La=function(b,c,d){1===b.nodeType&&a.f.oc(b);return m(b,c,k(d),!0)};a.Ic=function(b,c,d){d=k(d);return a.La(b,
e(c,d,b),d)};a.hb=function(a,b){1!==b.nodeType&&8!==b.nodeType||g(k(a),b,!0)};a.Ub=function(a,b){!u&&x.jQuery&&(u=x.jQuery);if(b&&1!==b.nodeType&&8!==b.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");b=b||x.document.body;h(k(a),b,!0)};a.nb=function(b){switch(b.nodeType){case 1:case 8:var c=a.xc(b);if(c)return c;if(b.parentNode)return a.nb(b.parentNode)}return n};a.Oc=function(b){return(b=a.nb(b))?b.$data:n};a.b("bindingHandlers",
a.d);a.b("applyBindings",a.Ub);a.b("applyBindingsToDescendants",a.hb);a.b("applyBindingAccessorsToNode",a.La);a.b("applyBindingsToNode",a.Ic);a.b("contextFor",a.nb);a.b("dataFor",a.Oc)})();(function(b){function c(c,e){var m=f.hasOwnProperty(c)?f[c]:b,k;m?m.Y(e):(m=f[c]=new a.K,m.Y(e),d(c,function(b,d){var e=!(!d||!d.synchronous);g[c]={definition:b,dd:e};delete f[c];k||e?m.notifySubscribers(b):a.Z.Za(function(){m.notifySubscribers(b)})}),k=!0)}function d(a,b){e("getConfig",[a],function(c){c?e("loadComponent",
[a,c],function(a){b(a,c)}):b(null,null)})}function e(c,d,f,k){k||(k=a.g.loaders.slice(0));var g=k.shift();if(g){var q=g[c];if(q){var p=!1;if(q.apply(g,d.concat(function(a){p?f(null):null!==a?f(a):e(c,d,f,k)}))!==b&&(p=!0,!g.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.");}else e(c,d,f,k)}else f(null)}var f={},g={};a.g={get:function(d,e){var f=g.hasOwnProperty(d)?g[d]:b;f?f.dd?a.l.w(function(){e(f.definition)}):
a.Z.Za(function(){e(f.definition)}):c(d,e)},$b:function(a){delete g[a]},Nb:e};a.g.loaders=[];a.b("components",a.g);a.b("components.get",a.g.get);a.b("components.clearCachedDefinition",a.g.$b)})();(function(){function b(b,c,d,e){function g(){0===--y&&e(h)}var h={},y=2,v=d.template;d=d.viewModel;v?f(c,v,function(c){a.g.Nb("loadTemplate",[b,c],function(a){h.template=a;g()})}):g();d?f(c,d,function(c){a.g.Nb("loadViewModel",[b,c],function(a){h[l]=a;g()})}):g()}function c(a,b,d){if("function"===typeof b)d(function(a){return new b(a)});
else if("function"===typeof b[l])d(b[l]);else if("instance"in b){var e=b.instance;d(function(){return e})}else"viewModel"in b?c(a,b.viewModel,d):a("Unknown viewModel value: "+b)}function d(b){switch(a.a.A(b)){case "script":return a.a.na(b.text);case "textarea":return a.a.na(b.value);case "template":if(e(b.content))return a.a.wa(b.content.childNodes)}return a.a.wa(b.childNodes)}function e(a){return x.DocumentFragment?a instanceof DocumentFragment:a&&11===a.nodeType}function f(a,b,c){"string"===typeof b.require?
O||x.require?(O||x.require)([b.require],c):a("Uses require, but no AMD loader is present"):c(b)}function g(a){return function(b){throw Error("Component '"+a+"': "+b);}}var h={};a.g.register=function(b,c){if(!c)throw Error("Invalid configuration for "+b);if(a.g.wb(b))throw Error("Component "+b+" is already registered");h[b]=c};a.g.wb=function(a){return h.hasOwnProperty(a)};a.g.ud=function(b){delete h[b];a.g.$b(b)};a.g.cc={getConfig:function(a,b){b(h.hasOwnProperty(a)?h[a]:null)},loadComponent:function(a,
c,d){var e=g(a);f(e,c,function(c){b(a,e,c,d)})},loadTemplate:function(b,c,f){b=g(b);if("string"===typeof c)f(a.a.na(c));else if(c instanceof Array)f(c);else if(e(c))f(a.a.W(c.childNodes));else if(c.element)if(c=c.element,x.HTMLElement?c instanceof HTMLElement:c&&c.tagName&&1===c.nodeType)f(d(c));else if("string"===typeof c){var l=t.getElementById(c);l?f(d(l)):b("Cannot find element with ID "+c)}else b("Unknown element type: "+c);else b("Unknown template value: "+c)},loadViewModel:function(a,b,d){c(g(a),
b,d)}};var l="createViewModel";a.b("components.register",a.g.register);a.b("components.isRegistered",a.g.wb);a.b("components.unregister",a.g.ud);a.b("components.defaultLoader",a.g.cc);a.g.loaders.push(a.g.cc);a.g.Ec=h})();(function(){function b(b,e){var f=b.getAttribute("params");if(f){var f=c.parseBindingsString(f,e,b,{valueAccessors:!0,bindingParams:!0}),f=a.a.Ea(f,function(c){return a.m(c,null,{i:b})}),g=a.a.Ea(f,function(c){var e=c.p();return c.ca()?a.m({read:function(){return a.a.c(c())},write:a.Da(e)&&
function(a){c()(a)},i:b}):e});g.hasOwnProperty("$raw")||(g.$raw=f);return g}return{$raw:{}}}a.g.getComponentNameForNode=function(b){var c=a.a.A(b);if(a.g.wb(c)&&(-1!=c.indexOf("-")||"[object HTMLUnknownElement]"==""+b||8>=a.a.C&&b.tagName===c))return c};a.g.Rb=function(c,e,f,g){if(1===e.nodeType){var h=a.g.getComponentNameForNode(e);if(h){c=c||{};if(c.component)throw Error('Cannot use the "component" binding on a custom element matching a component');var l={name:h,params:b(e,f)};c.component=g?function(){return l}:
l}}return c};var c=new a.S;9>a.a.C&&(a.g.register=function(a){return function(b){t.createElement(b);return a.apply(this,arguments)}}(a.g.register),t.createDocumentFragment=function(b){return function(){var c=b(),f=a.g.Ec,g;for(g in f)f.hasOwnProperty(g)&&c.createElement(g);return c}}(t.createDocumentFragment))})();(function(b){function c(b,c,d){c=c.template;if(!c)throw Error("Component '"+b+"' has no template");b=a.a.wa(c);a.f.fa(d,b)}function d(a,b,c,d){var e=a.createViewModel;return e?e.call(a,
d,{element:b,templateNodes:c}):d}var e=0;a.d.component={init:function(f,g,h,l,m){function k(){var a=r&&r.dispose;"function"===typeof a&&a.call(r);q=r=null}var r,q,p=a.a.W(a.f.childNodes(f));a.a.G.qa(f,k);a.m(function(){var l=a.a.c(g()),h,v;"string"===typeof l?h=l:(h=a.a.c(l.name),v=a.a.c(l.params));if(!h)throw Error("No component name specified");var n=q=++e;a.g.get(h,function(e){if(q===n){k();if(!e)throw Error("Unknown component '"+h+"'");c(h,e,f);var l=d(e,f,p,v);e=m.createChildContext(l,b,function(a){a.$component=
l;a.$componentTemplateNodes=p});r=l;a.hb(e,f)}})},null,{i:f});return{controlsDescendantBindings:!0}}};a.f.aa.component=!0})();var Q={"class":"className","for":"htmlFor"};a.d.attr={update:function(b,c){var d=a.a.c(c())||{};a.a.D(d,function(c,d){d=a.a.c(d);var g=!1===d||null===d||d===n;g&&b.removeAttribute(c);8>=a.a.C&&c in Q?(c=Q[c],g?b.removeAttribute(c):b[c]=d):g||b.setAttribute(c,d.toString());"name"===c&&a.a.vc(b,g?"":d.toString())})}};(function(){a.d.checked={after:["value","attr"],init:function(b,
c,d){function e(){var e=b.checked,f=p?g():e;if(!a.xa.Va()&&(!l||e)){var h=a.l.w(c);if(k){var m=r?h.p():h;q!==f?(e&&(a.a.ra(m,f,!0),a.a.ra(m,q,!1)),q=f):a.a.ra(m,f,e);r&&a.Da(h)&&h(m)}else a.h.Ga(h,d,"checked",f,!0)}}function f(){var d=a.a.c(c());b.checked=k?0<=a.a.o(d,g()):h?d:g()===d}var g=a.rc(function(){return d.has("checkedValue")?a.a.c(d.get("checkedValue")):d.has("value")?a.a.c(d.get("value")):b.value}),h="checkbox"==b.type,l="radio"==b.type;if(h||l){var m=c(),k=h&&a.a.c(m)instanceof Array,
r=!(k&&m.push&&m.splice),q=k?g():n,p=l||k;l&&!b.name&&a.d.uniqueName.init(b,function(){return!0});a.m(e,null,{i:b});a.a.q(b,"click",e);a.m(f,null,{i:b});m=n}}};a.h.ga.checked=!0;a.d.checkedValue={update:function(b,c){b.value=a.a.c(c())}}})();a.d.css={update:function(b,c){var d=a.a.c(c());null!==d&&"object"==typeof d?a.a.D(d,function(c,d){d=a.a.c(d);a.a.fb(b,c,d)}):(d=a.a.cb(String(d||"")),a.a.fb(b,b.__ko__cssValue,!1),b.__ko__cssValue=d,a.a.fb(b,d,!0))}};a.d.enable={update:function(b,c){var d=a.a.c(c());
d&&b.disabled?b.removeAttribute("disabled"):d||b.disabled||(b.disabled=!0)}};a.d.disable={update:function(b,c){a.d.enable.update(b,function(){return!a.a.c(c())})}};a.d.event={init:function(b,c,d,e,f){var g=c()||{};a.a.D(g,function(g){"string"==typeof g&&a.a.q(b,g,function(b){var m,k=c()[g];if(k){try{var r=a.a.W(arguments);e=f.$data;r.unshift(e);m=k.apply(e,r)}finally{!0!==m&&(b.preventDefault?b.preventDefault():b.returnValue=!1)}!1===d.get(g+"Bubble")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};
a.d.foreach={mc:function(b){return function(){var c=b(),d=a.a.Bb(c);if(!d||"number"==typeof d.length)return{foreach:c,templateEngine:a.X.vb};a.a.c(c);return{foreach:d.data,as:d.as,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.X.vb}}},init:function(b,c){return a.d.template.init(b,a.d.foreach.mc(c))},update:function(b,c,d,e,f){return a.d.template.update(b,a.d.foreach.mc(c),
d,e,f)}};a.h.va.foreach=!1;a.f.aa.foreach=!0;a.d.hasfocus={init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var f=b.ownerDocument;if("activeElement"in f){var g;try{g=f.activeElement}catch(k){g=f.body}e=g===b}f=c();a.h.Ga(f,d,"hasfocus",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var f=e.bind(null,!0),g=e.bind(null,!1);a.a.q(b,"focus",f);a.a.q(b,"focusin",f);a.a.q(b,"blur",g);a.a.q(b,"focusout",g)},update:function(b,c){var d=!!a.a.c(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===
d||(d?b.focus():b.blur(),!d&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),a.l.w(a.a.Fa,null,[b,d?"focusin":"focusout"]))}};a.h.ga.hasfocus=!0;a.d.hasFocus=a.d.hasfocus;a.h.ga.hasFocus=!0;a.d.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Eb(b,c())}};K("if");K("ifnot",!1,!0);K("with",!0,!1,function(a,c){return a.ac(c)});var L={};a.d.options={init:function(b){if("select"!==a.a.A(b))throw Error("options binding applies only to SELECT elements");for(;0<
b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,c,d){function e(){return a.a.Ma(b.options,function(a){return a.selected})}function f(a,b,c){var d=typeof b;return"function"==d?b(a):"string"==d?a[b]:c}function g(c,e){if(A&&k)a.j.ja(b,a.a.c(d.get("value")),!0);else if(p.length){var f=0<=a.a.o(p,a.j.u(e[0]));a.a.wc(e[0],f);A&&!f&&a.l.w(a.a.Fa,null,[b,"change"])}}var h=b.multiple,l=0!=b.length&&h?b.scrollTop:null,m=a.a.c(c()),k=d.get("valueAllowUnset")&&d.has("value"),r=
d.get("optionsIncludeDestroyed");c={};var q,p=[];k||(h?p=a.a.ib(e(),a.j.u):0<=b.selectedIndex&&p.push(a.j.u(b.options[b.selectedIndex])));m&&("undefined"==typeof m.length&&(m=[m]),q=a.a.Ma(m,function(b){return r||b===n||null===b||!a.a.c(b._destroy)}),d.has("optionsCaption")&&(m=a.a.c(d.get("optionsCaption")),null!==m&&m!==n&&q.unshift(L)));var A=!1;c.beforeRemove=function(a){b.removeChild(a)};m=g;d.has("optionsAfterRender")&&"function"==typeof d.get("optionsAfterRender")&&(m=function(b,c){g(0,c);
a.l.w(d.get("optionsAfterRender"),null,[c[0],b!==L?b:n])});a.a.Db(b,q,function(c,e,g){g.length&&(p=!k&&g[0].selected?[a.j.u(g[0])]:[],A=!0);e=b.ownerDocument.createElement("option");c===L?(a.a.bb(e,d.get("optionsCaption")),a.j.ja(e,n)):(g=f(c,d.get("optionsValue"),c),a.j.ja(e,a.a.c(g)),c=f(c,d.get("optionsText"),g),a.a.bb(e,c));return[e]},c,m);a.l.w(function(){k?a.j.ja(b,a.a.c(d.get("value")),!0):(h?p.length&&e().length<p.length:p.length&&0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex])!==p[0]:
p.length||0<=b.selectedIndex)&&a.a.Fa(b,"change")});a.a.Sc(b);l&&20<Math.abs(l-b.scrollTop)&&(b.scrollTop=l)}};a.d.options.zb=a.a.e.J();a.d.selectedOptions={after:["options","foreach"],init:function(b,c,d){a.a.q(b,"change",function(){var e=c(),f=[];a.a.r(b.getElementsByTagName("option"),function(b){b.selected&&f.push(a.j.u(b))});a.h.Ga(e,d,"selectedOptions",f)})},update:function(b,c){if("select"!=a.a.A(b))throw Error("values binding applies only to SELECT elements");var d=a.a.c(c()),e=b.scrollTop;
d&&"number"==typeof d.length&&a.a.r(b.getElementsByTagName("option"),function(b){var c=0<=a.a.o(d,a.j.u(b));b.selected!=c&&a.a.wc(b,c)});b.scrollTop=e}};a.h.ga.selectedOptions=!0;a.d.style={update:function(b,c){var d=a.a.c(c()||{});a.a.D(d,function(c,d){d=a.a.c(d);if(null===d||d===n||!1===d)d="";b.style[c]=d})}};a.d.submit={init:function(b,c,d,e,f){if("function"!=typeof c())throw Error("The value for a submit binding must be a function");a.a.q(b,"submit",function(a){var d,e=c();try{d=e.call(f.$data,
b)}finally{!0!==d&&(a.preventDefault?a.preventDefault():a.returnValue=!1)}})}};a.d.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.bb(b,c())}};a.f.aa.text=!0;(function(){if(x&&x.navigator)var b=function(a){if(a)return parseFloat(a[1])},c=x.opera&&x.opera.version&&parseInt(x.opera.version()),d=x.navigator.userAgent,e=b(d.match(/^(?:(?!chrome).)*version\/([^ ]*) safari/i)),f=b(d.match(/Firefox\/([^ ]*)/));if(10>a.a.C)var g=a.a.e.J(),h=a.a.e.J(),l=function(b){var c=
this.activeElement;(c=c&&a.a.e.get(c,h))&&c(b)},m=function(b,c){var d=b.ownerDocument;a.a.e.get(d,g)||(a.a.e.set(d,g,!0),a.a.q(d,"selectionchange",l));a.a.e.set(b,h,c)};a.d.textInput={init:function(b,d,g){function l(c,d){a.a.q(b,c,d)}function h(){var c=a.a.c(d());if(null===c||c===n)c="";u!==n&&c===u?a.a.setTimeout(h,4):b.value!==c&&(s=c,b.value=c)}function y(){t||(u=b.value,t=a.a.setTimeout(v,4))}function v(){clearTimeout(t);u=t=n;var c=b.value;s!==c&&(s=c,a.h.Ga(d(),g,"textInput",c))}var s=b.value,
t,u,x=9==a.a.C?y:v;10>a.a.C?(l("propertychange",function(a){"value"===a.propertyName&&x(a)}),8==a.a.C&&(l("keyup",v),l("keydown",v)),8<=a.a.C&&(m(b,x),l("dragend",y))):(l("input",v),5>e&&"textarea"===a.a.A(b)?(l("keydown",y),l("paste",y),l("cut",y)):11>c?l("keydown",y):4>f&&(l("DOMAutoComplete",v),l("dragdrop",v),l("drop",v)));l("change",v);a.m(h,null,{i:b})}};a.h.ga.textInput=!0;a.d.textinput={preprocess:function(a,b,c){c("textInput",a)}}})();a.d.uniqueName={init:function(b,c){if(c()){var d="ko_unique_"+
++a.d.uniqueName.Nc;a.a.vc(b,d)}}};a.d.uniqueName.Nc=0;a.d.value={after:["options","foreach"],init:function(b,c,d){if("input"!=b.tagName.toLowerCase()||"checkbox"!=b.type&&"radio"!=b.type){var e=["change"],f=d.get("valueUpdate"),g=!1,h=null;f&&("string"==typeof f&&(f=[f]),a.a.ta(e,f),e=a.a.Wb(e));var l=function(){h=null;g=!1;var e=c(),f=a.j.u(b);a.h.Ga(e,d,"value",f)};!a.a.C||"input"!=b.tagName.toLowerCase()||"text"!=b.type||"off"==b.autocomplete||b.form&&"off"==b.form.autocomplete||-1!=a.a.o(e,"propertychange")||
(a.a.q(b,"propertychange",function(){g=!0}),a.a.q(b,"focus",function(){g=!1}),a.a.q(b,"blur",function(){g&&l()}));a.a.r(e,function(c){var d=l;a.a.sd(c,"after")&&(d=function(){h=a.j.u(b);a.a.setTimeout(l,0)},c=c.substring(5));a.a.q(b,c,d)});var m=function(){var e=a.a.c(c()),f=a.j.u(b);if(null!==h&&e===h)a.a.setTimeout(m,0);else if(e!==f)if("select"===a.a.A(b)){var g=d.get("valueAllowUnset"),f=function(){a.j.ja(b,e,g)};f();g||e===a.j.u(b)?a.a.setTimeout(f,0):a.l.w(a.a.Fa,null,[b,"change"])}else a.j.ja(b,
e)};a.m(m,null,{i:b})}else a.La(b,{checkedValue:c})},update:function(){}};a.h.ga.value=!0;a.d.visible={update:function(b,c){var d=a.a.c(c()),e="none"!=b.style.display;d&&!e?b.style.display="":!d&&e&&(b.style.display="none")}};(function(b){a.d[b]={init:function(c,d,e,f,g){return a.d.event.init.call(this,c,function(){var a={};a[b]=d();return a},e,f,g)}}})("click");a.P=function(){};a.P.prototype.renderTemplateSource=function(){throw Error("Override renderTemplateSource");};a.P.prototype.createJavaScriptEvaluatorBlock=
function(){throw Error("Override createJavaScriptEvaluatorBlock");};a.P.prototype.makeTemplateSource=function(b,c){if("string"==typeof b){c=c||t;var d=c.getElementById(b);if(!d)throw Error("Cannot find template with ID "+b);return new a.v.n(d)}if(1==b.nodeType||8==b.nodeType)return new a.v.sa(b);throw Error("Unknown template type: "+b);};a.P.prototype.renderTemplate=function(a,c,d,e){a=this.makeTemplateSource(a,e);return this.renderTemplateSource(a,c,d,e)};a.P.prototype.isTemplateRewritten=function(a,
c){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(a,c).data("isRewritten")};a.P.prototype.rewriteTemplate=function(a,c,d){a=this.makeTemplateSource(a,d);c=c(a.text());a.text(c);a.data("isRewritten",!0)};a.b("templateEngine",a.P);a.Ib=function(){function b(b,c,d,h){b=a.h.Ab(b);for(var l=a.h.va,m=0;m<b.length;m++){var k=b[m].key;if(l.hasOwnProperty(k)){var r=l[k];if("function"===typeof r){if(k=r(b[m].value))throw Error(k);}else if(!r)throw Error("This template engine does not support the '"+
k+"' binding within its templates");}}d="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+a.h.Xa(b,{valueAccessors:!0})+" } })()},'"+d.toLowerCase()+"')";return h.createJavaScriptEvaluatorBlock(d)+c}var c=/(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi,d=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{Tc:function(b,c,d){c.isTemplateRewritten(b,d)||c.rewriteTemplate(b,function(b){return a.Ib.jd(b,
c)},d)},jd:function(a,f){return a.replace(c,function(a,c,d,e,k){return b(k,c,d,f)}).replace(d,function(a,c){return b(c,"\x3c!-- ko --\x3e","#comment",f)})},Jc:function(b,c){return a.N.yb(function(d,h){var l=d.nextSibling;l&&l.nodeName.toLowerCase()===c&&a.La(l,b,h)})}}}();a.b("__tr_ambtns",a.Ib.Jc);(function(){a.v={};a.v.n=function(b){if(this.n=b){var c=a.a.A(b);this.eb="script"===c?1:"textarea"===c?2:"template"==c&&b.content&&11===b.content.nodeType?3:4}};a.v.n.prototype.text=function(){var b=1===
this.eb?"text":2===this.eb?"value":"innerHTML";if(0==arguments.length)return this.n[b];var c=arguments[0];"innerHTML"===b?a.a.Eb(this.n,c):this.n[b]=c};var b=a.a.e.J()+"_";a.v.n.prototype.data=function(c){if(1===arguments.length)return a.a.e.get(this.n,b+c);a.a.e.set(this.n,b+c,arguments[1])};var c=a.a.e.J();a.v.n.prototype.nodes=function(){var b=this.n;if(0==arguments.length)return(a.a.e.get(b,c)||{}).mb||(3===this.eb?b.content:4===this.eb?b:n);a.a.e.set(b,c,{mb:arguments[0]})};a.v.sa=function(a){this.n=
a};a.v.sa.prototype=new a.v.n;a.v.sa.prototype.text=function(){if(0==arguments.length){var b=a.a.e.get(this.n,c)||{};b.Jb===n&&b.mb&&(b.Jb=b.mb.innerHTML);return b.Jb}a.a.e.set(this.n,c,{Jb:arguments[0]})};a.b("templateSources",a.v);a.b("templateSources.domElement",a.v.n);a.b("templateSources.anonymousTemplate",a.v.sa)})();(function(){function b(b,c,d){var e;for(c=a.f.nextSibling(c);b&&(e=b)!==c;)b=a.f.nextSibling(e),d(e,b)}function c(c,d){if(c.length){var e=c[0],f=c[c.length-1],g=e.parentNode,h=
a.S.instance,n=h.preprocessNode;if(n){b(e,f,function(a,b){var c=a.previousSibling,d=n.call(h,a);d&&(a===e&&(e=d[0]||b),a===f&&(f=d[d.length-1]||c))});c.length=0;if(!e)return;e===f?c.push(e):(c.push(e,f),a.a.Ba(c,g))}b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.Ub(d,b)});b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.N.Cc(b,[d])});a.a.Ba(c,g)}}function d(a){return a.nodeType?a:0<a.length?a[0]:null}function e(b,e,f,h,q){q=q||{};var p=(b&&d(b)||f||{}).ownerDocument,n=q.templateEngine||g;
a.Ib.Tc(f,n,p);f=n.renderTemplate(f,h,q,p);if("number"!=typeof f.length||0<f.length&&"number"!=typeof f[0].nodeType)throw Error("Template engine must return an array of DOM nodes");p=!1;switch(e){case "replaceChildren":a.f.fa(b,f);p=!0;break;case "replaceNode":a.a.uc(b,f);p=!0;break;case "ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+e);}p&&(c(f,h),q.afterRender&&a.l.w(q.afterRender,null,[f,h.$data]));return f}function f(b,c,d){return a.I(b)?b():"function"===typeof b?b(c,d):b}
var g;a.Fb=function(b){if(b!=n&&!(b instanceof a.P))throw Error("templateEngine must inherit from ko.templateEngine");g=b};a.Cb=function(b,c,k,h,q){k=k||{};if((k.templateEngine||g)==n)throw Error("Set a template engine before calling renderTemplate");q=q||"replaceChildren";if(h){var p=d(h);return a.B(function(){var g=c&&c instanceof a.R?c:new a.R(c,null,null,null,{exportDependencies:!0}),n=f(b,g.$data,g),g=e(h,q,n,g,k);"replaceNode"==q&&(h=g,p=d(h))},null,{ya:function(){return!p||!a.a.qb(p)},i:p&&
"replaceNode"==q?p.parentNode:p})}return a.N.yb(function(d){a.Cb(b,c,k,d,"replaceNode")})};a.pd=function(b,d,g,h,q){function p(a,b){c(b,t);g.afterRender&&g.afterRender(b,a);t=null}function s(a,c){t=q.createChildContext(a,g.as,function(a){a.$index=c});var d=f(b,a,t);return e(null,"ignoreTargetNode",d,t,g)}var t;return a.B(function(){var b=a.a.c(d)||[];"undefined"==typeof b.length&&(b=[b]);b=a.a.Ma(b,function(b){return g.includeDestroyed||b===n||null===b||!a.a.c(b._destroy)});a.l.w(a.a.Db,null,[h,b,
s,g,p])},null,{i:h})};var h=a.a.e.J();a.d.template={init:function(b,c){var d=a.a.c(c());if("string"==typeof d||d.name)a.f.za(b);else{if("nodes"in d){if(d=d.nodes||[],a.I(d))throw Error('The "nodes" option must be a plain, non-observable array.');}else d=a.f.childNodes(b);d=a.a.nc(d);(new a.v.sa(b)).nodes(d)}return{controlsDescendantBindings:!0}},update:function(b,c,d,e,f){var g=c();c=a.a.c(g);d=!0;e=null;"string"==typeof c?c={}:(g=c.name,"if"in c&&(d=a.a.c(c["if"])),d&&"ifnot"in c&&(d=!a.a.c(c.ifnot)));
"foreach"in c?e=a.pd(g||b,d&&c.foreach||[],c,b,f):d?(f="data"in c?f.ac(c.data,c.as):f,e=a.Cb(g||b,f,c,b)):a.f.za(b);f=e;(c=a.a.e.get(b,h))&&"function"==typeof c.k&&c.k();a.a.e.set(b,h,f&&f.ca()?f:n)}};a.h.va.template=function(b){b=a.h.Ab(b);return 1==b.length&&b[0].unknown||a.h.fd(b,"name")?null:"This template engine does not support anonymous templates nested within its templates"};a.f.aa.template=!0})();a.b("setTemplateEngine",a.Fb);a.b("renderTemplate",a.Cb);a.a.hc=function(a,c,d){if(a.length&&
c.length){var e,f,g,h,l;for(e=f=0;(!d||e<d)&&(h=a[f]);++f){for(g=0;l=c[g];++g)if(h.value===l.value){h.moved=l.index;l.moved=h.index;c.splice(g,1);e=g=0;break}e+=g}}};a.a.lb=function(){function b(b,d,e,f,g){var h=Math.min,l=Math.max,m=[],k,n=b.length,q,p=d.length,s=p-n||1,t=n+p+1,v,u,x;for(k=0;k<=n;k++)for(u=v,m.push(v=[]),x=h(p,k+s),q=l(0,k-1);q<=x;q++)v[q]=q?k?b[k-1]===d[q-1]?u[q-1]:h(u[q]||t,v[q-1]||t)+1:q+1:k+1;h=[];l=[];s=[];k=n;for(q=p;k||q;)p=m[k][q]-1,q&&p===m[k][q-1]?l.push(h[h.length]={status:e,
value:d[--q],index:q}):k&&p===m[k-1][q]?s.push(h[h.length]={status:f,value:b[--k],index:k}):(--q,--k,g.sparse||h.push({status:"retained",value:d[q]}));a.a.hc(s,l,!g.dontLimitMoves&&10*n);return h.reverse()}return function(a,d,e){e="boolean"===typeof e?{dontLimitMoves:e}:e||{};a=a||[];d=d||[];return a.length<d.length?b(a,d,"added","deleted",e):b(d,a,"deleted","added",e)}}();a.b("utils.compareArrays",a.a.lb);(function(){function b(b,c,d,h,l){var m=[],k=a.B(function(){var k=c(d,l,a.a.Ba(m,b))||[];0<
m.length&&(a.a.uc(m,k),h&&a.l.w(h,null,[d,k,l]));m.length=0;a.a.ta(m,k)},null,{i:b,ya:function(){return!a.a.Tb(m)}});return{ea:m,B:k.ca()?k:n}}var c=a.a.e.J(),d=a.a.e.J();a.a.Db=function(e,f,g,h,l){function m(b,c){w=q[c];u!==c&&(D[b]=w);w.tb(u++);a.a.Ba(w.ea,e);t.push(w);z.push(w)}function k(b,c){if(b)for(var d=0,e=c.length;d<e;d++)c[d]&&a.a.r(c[d].ea,function(a){b(a,d,c[d].ka)})}f=f||[];h=h||{};var r=a.a.e.get(e,c)===n,q=a.a.e.get(e,c)||[],p=a.a.ib(q,function(a){return a.ka}),s=a.a.lb(p,f,h.dontLimitMoves),
t=[],v=0,u=0,x=[],z=[];f=[];for(var D=[],p=[],w,C=0,B,E;B=s[C];C++)switch(E=B.moved,B.status){case "deleted":E===n&&(w=q[v],w.B&&(w.B.k(),w.B=n),a.a.Ba(w.ea,e).length&&(h.beforeRemove&&(t.push(w),z.push(w),w.ka===d?w=null:f[C]=w),w&&x.push.apply(x,w.ea)));v++;break;case "retained":m(C,v++);break;case "added":E!==n?m(C,E):(w={ka:B.value,tb:a.O(u++)},t.push(w),z.push(w),r||(p[C]=w))}a.a.e.set(e,c,t);k(h.beforeMove,D);a.a.r(x,h.beforeRemove?a.ba:a.removeNode);for(var C=0,r=a.f.firstChild(e),F;w=z[C];C++){w.ea||
a.a.extend(w,b(e,g,w.ka,l,w.tb));for(v=0;s=w.ea[v];r=s.nextSibling,F=s,v++)s!==r&&a.f.kc(e,s,F);!w.ad&&l&&(l(w.ka,w.ea,w.tb),w.ad=!0)}k(h.beforeRemove,f);for(C=0;C<f.length;++C)f[C]&&(f[C].ka=d);k(h.afterMove,D);k(h.afterAdd,p)}})();a.b("utils.setDomNodeChildrenFromArrayMapping",a.a.Db);a.X=function(){this.allowTemplateRewriting=!1};a.X.prototype=new a.P;a.X.prototype.renderTemplateSource=function(b,c,d,e){if(c=(9>a.a.C?0:b.nodes)?b.nodes():null)return a.a.W(c.cloneNode(!0).childNodes);b=b.text();
return a.a.na(b,e)};a.X.vb=new a.X;a.Fb(a.X.vb);a.b("nativeTemplateEngine",a.X);(function(){a.xb=function(){var a=this.ed=function(){if(!u||!u.tmpl)return 0;try{if(0<=u.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,e,f,g){g=g||t;f=f||{};if(2>a)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var h=b.data("precompiled");h||(h=b.text()||"",h=u.template(null,"{{ko_with $item.koBindingContext}}"+
h+"{{/ko_with}}"),b.data("precompiled",h));b=[e.$data];e=u.extend({koBindingContext:e},f.templateOptions);e=u.tmpl(h,b,e);e.appendTo(g.createElement("div"));u.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){t.write("<script type='text/html' id='"+a+"'>"+b+"\x3c/script>")};0<a&&(u.tmpl.tag.ko_code={open:"__.push($1 || '');"},u.tmpl.tag.ko_with={open:"with($1) {",close:"} "})};a.xb.prototype=
new a.P;var b=new a.xb;0<b.ed&&a.Fb(b);a.b("jqueryTmplTemplateEngine",a.xb)})()})})();})();
;
if ("undefined" == typeof jQuery) throw Error("jQuery plugins need to be before this file");
$.Helpers = {};
$.Helpers.options = {colors: {
        red: '#F44336',
        pink: '#E91E63',
        purple: '#9C27B0',
        deepPurple: '#673AB7',
        indigo: '#3F51B5',
        blue: '#2196F3',
        lightBlue: '#03A9F4',
        cyan: '#00BCD4',
        teal: '#009688',
        green: '#124E88',
        lightGreen: '#8BC34A',
        lime: '#CDDC39',
        yellow: '#ffe821',
        amber: '#FFC107',
        orange: '#FF9800',
        deepOrange: '#FF5722',
        brown: '#795548',
        grey: '#9E9E9E',
        blueGrey: '#607D8B',
        black: '#000000',
        white: '#ffffff'
    }
}
var edge = 'Microsoft Edge', ie10 = 'Internet Explorer 10', ie11 = 'Internet Explorer 11', opera = 'Opera', firefox = 'Mozilla Firefox', chrome = 'Google Chrome', safari = 'Safari';
$.Helpers.browser = {
    activate: function () {
        var _this = this;
        var className = _this.getClassName();
        if (className !== '') $('html').addClass(_this.getClassName());
    },
    getBrowser: function () {
        var userAgent = navigator.userAgent.toLowerCase();
        if (/edge/i.test(userAgent)) {return edge;} else if (/rv:11/i.test(userAgent)) {return ie11;} else if (/msie 10/i.test(userAgent)) {return ie10;} else if (/opr/i.test(userAgent)) {return opera;} else if (/chrome/i.test(userAgent)) {return chrome;} else if (/firefox/i.test(userAgent)) {return firefox;} else if (!!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/)){return safari;}
        return undefined;
    },
    getClassName: function () {
        var e = this.getBrowser();
        if(e === edge){return 'edge';}else if(e === ie11){return 'ie11';}else if(e === ie10){return 'ie10';}else if(e === opera) {return 'opera';}else if(e === chrome){return 'chrome';}else if(e === firefox){return 'firefox';}else if(e === safari){return 'safari';}else{return '';}
    }
}

$.Helpers.formatValue = function (value, format) {
    if(!value || value == ""){return value;}
    if(format == "number"){return Number((value + "" || "0").replace(/[^\d\.\-]/g, ""));
    }else if (format == "currency"){return ($.Helpers.formatValue(value, "number") + '').replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1.");
    }else if (format == "tel"){return value.replace(/[^\d\.\-\(\)]/g, "");
    }else if (format == "percent") {
        var percent = $.Helpers.formatValue(value, "number");
        if (percent > 100) {percent = 100;}else if(percent < 0){percent = 0;}
        return percent + "%";
    }else if(format == "boolean") {return Boolean(value);
    }else {return value;}
}
$.Helpers.replace = function (text, oldText, newText) {
    var re = new RegExp(oldText, "g");
    return text.replace(re, newText);
}
$.Helpers.serializeDataObject = function (selector) {
    var returnObject = {};
    $(selector).each(function (i, v) {
        $this = $(this);
        var key, value;
        if ($.inArray($this.prop("tagName"), ["SPAN", "P"]) != -1) {
            key = $this.attr('id') || $this.attr('name') || $this.attr('okey');
            attrValue = $this.attr("value");
            if (attrValue) {
                value = attrValue
            } else {
                value = $this.text();
            }
        } else {
            if ($this.attr('type') === 'checkbox') {
                value = Boolean($this.is(':checked'));
                key = $this.attr('okey');
            } else if ($this.attr('type') === 'radio') {
                if ($this.prop('checked') == true) {
                    value = $this.val();
                    key = $this.attr('okey');
                }
            } else if ($this.hasClass('date-mask')) {
                value = moment($this.val(), "DD/MM/YYYY").format("YYYY-MM-DD");
                key = $this.attr('okey');
            } else {
                key = $this.attr('okey');
                value = $this.val();
            }
        }
        value = $.Helpers.formatValue($.trim(value), $this.attr("format_type"));
        if (key != undefined) {
            returnObject[key] = value;
        }
    });
    return returnObject;
}
$.Helpers.serializeDataArray = function (parent_selector, elem_selector) {
    var return_array_object = [];
    var lengthArrayDetail = $(parent_selector).length;
    $(parent_selector).each(function (i_parent, v_parent) {
        $parent = $(this);
        var obj = $.Helpers.serializeDataObject($parent.find(elem_selector));
        return_array_object.push(obj);
        if(i_parent == lengthArrayDetail - 1){if(return_array_object[i_parent]){}else{}}
    });
    return return_array_object;
}
$.Helpers.setDataObject = function (parent_selector, elem_selector, DataCustomer, idx) {
    $(parent_selector).each(function (i_parent, v_parent) {
        if (i_parent == idx) {
            $parent = $(this);
            var selector = $parent.find(elem_selector);
            $(selector).each(function (i, v) {
                $this = $(this);
                var key;
                key = $this.attr('okey');
                if (key == "FullNm" && DataCustomer["FullNm"] != undefined) {
                    $this.val(DataCustomer["FullNm"]);
                    $this.parent(".form-group").addClass("is-focused");
                } else if (key == "PhoneNo" && DataCustomer["PhoneNo"] != undefined) {
                    $this.val(DataCustomer["PhoneNo"]);
                    $this.parent(".form-group").addClass("is-focused");
                } else if (key == "Email" && DataCustomer["Email"] != undefined) {
                    $this.val(DataCustomer["Email"]);
                    $this.parent(".form-group").addClass("is-focused");
                } else if (key == "Voucher" && DataCustomer["Voucher"] != undefined) {
                    $this.val(DataCustomer["Voucher"]);
                    $this.parent(".form-group").addClass("is-focused");
                } else if (key == "TicketTypeId" && DataCustomer["TicketTypeId"] != undefined) {
                    $this.val(DataCustomer["TicketTypeId"]);
                    $this.parent(".form-group").addClass("is-focused");

                    //gan gia tri cho select 
                    var $ticketInfo = $this.parents('.ticket');
                    $this.val(DataCustomer["TicketTypeId"]).trigger('change');
                   // $ticketInfo.find('select[okey="TicketTypeId"]').val(DataCustomer["TicketTypeId"]).trigger('change');

                } else if (key == "IDNo" && DataCustomer["IDNo"] != undefined) {
                    $this.val(DataCustomer["IDNo"]);
                    $this.parent(".form-group").addClass("is-focused");
                } else if (key == "POB" && DataCustomer["POB"] != undefined) {
                    $this.val(DataCustomer["POB"]);
                    $this.parent(".form-group").addClass("is-focused");
                } else if (key == "DOB" && DataCustomer["DOB"] != undefined) {
                    $this.val(DataCustomer["DOB"]);
                    $this.parent(".form-group").addClass("is-focused");
                } else if (key == "NationId" && DataCustomer["NationId"] != undefined) {
                    $this.val(DataCustomer["NationId"]);
                    $this.parent(".form-group").addClass("is-focused");
                } else if (key == "SeatId" && DataCustomer["SeatId"] != undefined) {
                    $this.val(DataCustomer["SeatId"]);
                } else if (key == "SeatIdBack" && DataCustomer["SeatIdBack"] != undefined) {
                    $this.val(DataCustomer["SeatIdBack"]);
                } else if (key == "PositionId" && DataCustomer["PositionId"] != undefined) {
                    $this.val(DataCustomer["PositionId"]);
                } else if (key == "PositionIdBack" && DataCustomer["PositionIdBack"] != undefined) {
                    $this.val(DataCustomer["PositionIdBack"]);
                } else if (key == "SeatNm" && DataCustomer["SeatNm"] != undefined) {
                    $this.val(DataCustomer["SeatNm"]);
                } else if (key == "SeatNmBack" && DataCustomer["SeatNmBack"] != undefined) {
                    $this.val(DataCustomer["SeatNmBack"]);
                }
                else if (key == "TicketClass" && DataCustomer["TicketClass"] != undefined) {
                    $this.val(DataCustomer["TicketClass"]);
                }
                else if (key == "TicketClassBack" && DataCustomer["TicketClassBack"] != undefined) {
                    $this.val(DataCustomer["TicketClassBack"]);
                }
                //lam phan gia cho hanh khach
                else if (key == "TicketPriceId" && DataCustomer["TicketPriceId"] != undefined) {
                    $this.val(DataCustomer["TicketPriceId"]);
                } else if (key == "PriceWithVAT" && DataCustomer["PriceWithVAT"] != undefined) {
                    $this.val(DataCustomer["PriceWithVAT"]);
                }
                else if (key == "PriceWithVATReturn" && DataCustomer["PriceWithVATReturn"] != undefined) {
                    $this.val(DataCustomer["PriceWithVATReturn"]);
                } else if (key == "TicketPriceIdBack" && DataCustomer["TicketPriceIdBack"] != undefined) {
                    $this.val(DataCustomer["TicketPriceIdBack"]);
                } else if (key == "HasApplyPromotionSpecial" && DataCustomer["HasApplyPromotionSpecial"] != undefined) {
                    $this.val(DataCustomer["HasApplyPromotionSpecial"]);
                } else if (key == "HasApplyPromotionSpecialReturn" && DataCustomer["HasApplyPromotionSpecialReturn"] != undefined) {
                    $this.val(DataCustomer["HasApplyPromotionSpecialReturn"]);
                }
                else if (key == "IsRender" && DataCustomer["IsRender"] != undefined) {
                    //$this.val(DataCustomer["IsRender"]);
                    if (DataCustomer["IsRender"] == false) {
                        $this.prop('checked', false);
                    } else {
                        $this.prop('checked', true);
                    }
                } else if (key == "IsRenderBack" && DataCustomer["IsRenderBack"] != undefined) {
                    //$this.val(DataCustomer["IsRenderBack"]);
                    if (DataCustomer["IsRenderBack"] == false) {
                        $this.prop('checked', false);
                    } else {
                        $this.prop('checked', true);
                    }
                }
            });
        }
    });
    return false;
}
$(function () {setTimeout(function () { $('.page-loader-wrapper').fadeOut(); }, 50);});

;
var listSelectedSeats = [];
var listSelectedSeatsReturn = [];
var NoOfSeats = 0;
var seatList = [];
var ResultData = [];
var ReturnDate = undefined;
var ReturnDate2 = undefined;
var $boatLayoutContainer = $("#boat-layout-container-wrapper");
var $boatLayoutContainerReturn = $("#boat-layout-container-return-wrapper");
var NEXT_PASSENGER_CHANGE_SEAT = 0;
var changeIndexDepart = NEXT_PASSENGER_CHANGE_SEAT;
var changeIndexReturn = NEXT_PASSENGER_CHANGE_SEAT;
var isRendered = false;
var isRenderedReturn = false;
var DataSeatForPassenger = {
    SeatId: 0,
    PositionId: 0,
    SeatNm: '',
    //TicketClass: ''
};
var DataSeatBackForPassenger = {
    SeatIdBack: 0,
    PositionIdBack: 0,
    SeatNmBack: '',
    //TicketClassBack: ''
};
window.BoatLayout = (function () {
    // private properties
    // url to get layout data of boat
    var _get_layout_url = booking_url.GetLayoutUrl;
    // main variable store all reference
    var _layout = {};
    // main layout of template
    var _layout_template =
        '<div class="boat-layout-container col-sm-12">\
                <div class="panel panel-primary">\
                    <div class="panel-heading">\
                        <div class="panel-title">\
                            <div class="row">\
                                <div class="col-md-2">\
                                    <span>\
                                        <a id="boat-layout-name" data-toggle="collapse" href="#collapse-boat-layout{layout_id}" style="color:white;font-size:12px;">\
                                            <i class="fa fa-chevron-down"></i>\
                                            '+ JsResource.SeatMap + '\
                                        </a>\
                                    </span>\
                                </div>\
                            <div class="title-boat col-md-10">\
                                <div class="mr-3">\
                                    <span class="btn seat-default btnnote"></span> <span class=" font-12" >' + JsResource.EmptySeat + '</span>\
                                </div>\
                                <div class="mr-3">\
                                    <span class="btn seat-booked btnnote"></span> <span class=" font-12">' + JsResource.BookedSeat+ '</span>\
                                </div>\
                                <div class="mr-3">\
                                    <span class="btn seat-selecting btnnote"></span><span class=" font-12">' + JsResource.SelectingSeat+ '</span>\
                                </div>\
                                <div class="mr-3">\
                                    <span class="btn seat-held btnnote"></span> <span class=" font-12">' + JsResource.HoldingSeat+ '</span>\
                                </div>\
                                <div class="mr-3">\
                                    <span class="btn seat-bussiness btnnote"></span> <span class=" font-12">' + JsResource.SeatBussiness+ '</span>\
                                </div>\
                        </div>\
                            </div>\
                        </div>\
                    </div>\
                    <div id="collapse-boat-layout{layout_id}" class="panel-collapse ">\
                        <ul class="nav nav-tabs floor-container" role="tablist">\
                        </ul>\
                        <div class="tab-content layout-container">\
                        </div>\
                    </div>\
                </div>\
            </div>';

    //<div class="col-sm-2">\
    //    <span class="btn seat-default btnnote"></span> <span>&nbsp; ' + JsResource.EmptySeat + '</span>\
    //</div>\
    //<div class="col-sm-2">\
    //    <span class="btn seat-booked btnnote"></span> <span>&nbsp; ' + JsResource.BookedSeat + '</span>\
    //</div>\
    //<div class="col-sm-2">\
    //    <span class="btn seat-selecting btnnote"></span> <span>&nbsp; ' + JsResource.SelectingSeat + '</span>\
    //</div>\
    //<div class="col-sm-2">\
    //    <span class="btn seat-held btnnote"></span> <span>&nbsp; ' + JsResource.HoldingSeat + '</span>\
    //</div>\
    //<div class="col-sm-2">\
    //    <span class="btn seat-vip btnnote"></span> <span>&nbsp; ' + JsResource.VipSeat + '</span>\
    //</div>\
    // end private properties
    // private function
    //Auto get seats when moving from STEP 3 to STEP 4
    function autoGetSeats(voyage, voyageReturn) {
        var numReserve = parseInt(voyage['NoOfPassenger']);
        var noOfRemain = parseInt(voyage['NoOfRemain']);
        if (numReserve <= 0) {
            return;
        }
        if (numReserve > noOfRemain) {
            toastr["error"](JsResource.OverQuantitySeat + noOfRemain);
            swal.close();
            return false;
        }
        if (voyageReturn != null) {
            var numReserveReturn = parseInt(voyageReturn['NoOfPassenger']);
            var noOfRemainReturn = parseInt(voyageReturn['NoOfRemain']);
            var VoyageReturnId = voyageReturn['VoyageId'];
            var DepartDateReturn = voyageReturn['DepartDate'];
            var ScheduleReturnId = voyageReturn['ScheduleId'];
            if (numReserveReturn <= 0) {
                return;
            }
            if (voyageReturn != null && numReserveReturn > noOfRemainReturn) {
                toastr["error"](JsResource.OverQuantitySeatReturn + noOfRemain);
                swal.close();
                return false;
            }
        }

        var totalTicket = numReserve;

        getSeatsEmpty(voyage['VoyageId'], VoyageReturnId, voyage['ScheduleId'], ScheduleReturnId, voyage['DepartDate'], DepartDateReturn, numReserve);

    }

    //Get empty seats from db then select seats
    function getSeatsEmpty(VoyageId, VoyageReturnId, ScheduleId, ScheduleReturnId, DepartDate, DepartDateReturn, NoOfPassenger) {
        NoOfSeats = NoOfPassenger;
        changeIndexDepart = NEXT_PASSENGER_CHANGE_SEAT;
        changeIndexReturn = NEXT_PASSENGER_CHANGE_SEAT;
        var lstData = [];
        var lstDataReturn = [];

        $('#tblSeatInfo').bootstrapTable({
            data: ResultData
        });

        if (VoyageReturnId) {
            $('#tblSeatInfo').bootstrapTable('showColumn', 'SeatNmBack');
        } else {
            $('#tblSeatInfo').bootstrapTable('hideColumn', 'SeatNmBack');
        }

        var getSeatsDepart = $.get($('#UrlStorage').data("urlgetseatsempty"), { voyageId: VoyageId, departDate: DepartDate, scheduleId: ScheduleId }, function (response) {
            lstData = response.data;
            if (NoOfPassenger > lstData.length) {
                toastr["error"](JsResource.OverQuantitySeat + lstData.length);
                return false;
            }
        }, 'json');

        var getSeatsReturn = null;
        if (VoyageReturnId) {
            getSeatsReturn = $.get($('#UrlStorage').data("urlgetseatsempty"), { voyageId: VoyageReturnId, departDate: DepartDateReturn, scheduleId: ScheduleReturnId }, function (responseReturn) {
                lstDataReturn = responseReturn.data;
                if (NoOfPassenger > lstDataReturn.length) {
                    toastr["error"](JsResource.OverQuantitySeatReturn + lstDataReturn.length);
                    return false;
                }
            }, 'json');
        }

        var deferreds = [];
        deferreds.push(getSeatsDepart);
        if (VoyageReturnId != null) {
            deferreds.push(getSeatsReturn);
        }
 
        $.when.apply($, deferreds).done(function () {
            swal.close();
            var isNotEnoughSeat = false;
            var isNotEnoughSeatBack = false;
            var idx = 0;
            $.each(ResultData, function (i, seat) {
                if (seat.IsRender == "false") {
                    //var sd = lstData.filter(s => s.TicketClass == seat.TicketClass);
                    //if (sd.length != 0) {
                    //    $.each(sd, function (j, obj) {
                    //        var $seatInBoat = undefined;
                    //        $seatInBoat = $boatLayoutContainer.find(".seat." + obj.SeatNm);
                    //        if (!$seatInBoat.hasClass('seat-held') && seat.TicketClass == obj.TicketClass) {
                    //            seat.PositionId = obj.PositionId;
                    //            seat.SeatNm = obj.SeatNm;
                    //            seat.IsVIP = obj.TicketClass == "ECO" ? false : true;
                    //            seat.SeatId = obj.SeatId;
                    //            seat.TicketClass = obj.TicketClass;
                    //            seat.IsRender = true;

                    //            DataSeatForPassenger = [];
                    //            DataSeatForPassenger["SeatId"] = obj.SeatId;
                    //            DataSeatForPassenger["PositionId"] = obj.PositionId;
                    //            DataSeatForPassenger["SeatNm"] = obj.SeatNm;
                    //            DataSeatForPassenger["TicketClass"] = obj.TicketClass;
                    //            DataSeatForPassenger["IsRender"] = true;
                    //            $.Helpers.setDataObject(".info-ticket .ticket", '[otype="odetail"]', DataSeatForPassenger, i);

                    //            $seatInBoat.addClass("selected seat-selecting");
                    //            $seatInBoat.data("IsSelected", true);
                    //            idx = lstData.findIndex(i => i.PositionId == obj.PositionId);
                    //            lstData.splice(idx, 1);
                    //            try {
                    //                window.sendSignal(BookingInfo["VoyageId"], BookingInfo["ScheduleId"], seat.PositionId, '#boat-layout-container-wrapper', true);
                    //            } catch (err) {//start signR if not start
                    //                $.connection.hub.start().done(function () {
                    //                    window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                    //                        return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                    //                    }
                    //                    voyageCenter.server.chooseSeat(BookingInfo["VoyageId"], BookingInfo["ScheduleId"], seat.PositionId, '#boat-layout-container-wrapper', true);
                    //                });
                    //            }
                    //            return false;
                    //        }
                    //    });
                    //} else {
                        isNotEnoughSeat = true;
                        DataSeatForPassenger = [];
                        DataSeatForPassenger["SeatId"] = null;
                        DataSeatForPassenger["PositionId"] = null;
                        DataSeatForPassenger["SeatNm"] = null;
                        DataSeatForPassenger["IsRender"] = false;
                        $.Helpers.setDataObject(".info-ticket .ticket", '[otype="odetail"]', DataSeatForPassenger, i);
                        ResultData[i].SeatId = null;
                        ResultData[i].PositionId = null;
                        ResultData[i].SeatNm = null;
                    //}
                }
            });
            $('#tblSeatInfo').bootstrapTable("load", ResultData);

            if (VoyageReturnId != null) {
                $.each(ResultData, function (i, seat) {
                    if (seat.IsRenderBack == "false") {
                        //var sr = lstDataReturn.filter(s => s.TicketClass == seat.TicketClassBack);
                        //if (sr.length != 0) {
                        //    $.each(sr, function (k, obj2) {
                        //        var $seatInBoat = undefined;
                        //        $seatInBoat = $boatLayoutContainerReturn.find(".seat." + obj2.SeatNm);
                        //        if (!$seatInBoat.hasClass('seat-held') && seat.TicketClassBack == obj2.TicketClass) {
                        //            seat.PositionIdBack = obj2.PositionId;
                        //            seat.SeatNmBack = obj2.SeatNm;
                        //            seat.IsVIPBack = obj2.TicketClass == "ECO" ? false : true;
                        //            seat.SeatIdBack = obj2.SeatId;
                        //            seat.TicketClassBack = obj2.TicketClass;
                        //            seat.IsRenderBack = true;

                        //            DataSeatBackForPassenger = [];
                        //            DataSeatBackForPassenger["SeatIdBack"] = obj2.SeatId;
                        //            DataSeatBackForPassenger["PositionIdBack"] = obj2.PositionId;
                        //            DataSeatBackForPassenger["SeatNmBack"] = obj2.SeatNm;
                        //            DataSeatBackForPassenger["TicketClassBack"] = obj2.TicketClass;
                        //            DataSeatBackForPassenger["IsRenderBack"] = true;
                        //            $.Helpers.setDataObject(".info-ticket .ticket", '[otype="odetail"]', DataSeatBackForPassenger, i);


                        //            $seatInBoat.addClass("selected seat-selecting");
                        //            $seatInBoat.data("IsSelected", true);

                        //            idx = lstDataReturn.findIndex(i => i.PositionId == obj2.PositionId);
                        //            lstDataReturn.splice(idx, 1);
                        //            try {
                        //                window.sendSignal(BookingInfoBack["VoyageId"], BookingInfoBack["ScheduleId"], seat.PositionIdBack, '#boat-layout-container-return-wrapper', true);
                        //            } catch (err) {//start signR if not start
                        //                $.connection.hub.start().done(function () {
                        //                    window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                        //                        return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                        //                    }
                        //                    voyageCenter.server.chooseSeat(BookingInfoBack["VoyageId"], BookingInfoBack["ScheduleId"], seat.PositionIdBack, '#boat-layout-container-return-wrapper', true);
                        //                });
                        //            }

                        //            return false;
                        //        }
                        //    });
                        //} else {
                            isNotEnoughSeatBack = true;
                            DataSeatBackForPassenger = [];
                            DataSeatBackForPassenger["SeatIdBack"] = null;
                            DataSeatBackForPassenger["PositionIdBack"] = null;
                            DataSeatBackForPassenger["SeatNmBack"] = null;
                            DataSeatBackForPassenger["IsRenderBack"] = false;
                            $.Helpers.setDataObject(".info-ticket .ticket", '[otype="odetail"]', DataSeatBackForPassenger, i);
                            ResultData[i].SeatIdBack = null;
                            ResultData[i].PositionIdBack = null;
                            ResultData[i].SeatNmBack = null;
                        //}
                    }
                });
                $('#tblSeatInfo').bootstrapTable("load", ResultData);
            }
            if (isNotEnoughSeatBack && isNotEnoughSeat) {
                swal({
                    type: 'warning',
                    title: JsResource.WarningNotEnough
                }).catch(swal.noop);
            } else if (isNotEnoughSeat) {
                swal({
                    type: 'warning',
                    title: JsResource.WarningNotEnoughDepart
                }).catch(swal.noop);
            } else if (isNotEnoughSeatBack)  {
                swal({
                    type: 'warning',
                    title: JsResource.WarningNotEnoughReturn
                }).catch(swal.noop);
            }
            
        });
  
        //Get empty seats for depart trip
    }

    function _showLoader(isShow) {
        if (isShow == false) {
            console.log('hide loader');
        }
        else {
            console.log('show loader');
        }
    }

    // call url to get data and render each floor
    function renderBoatLayout(bookingList) {
        var deferreds = [];
        $.each(bookingList, function (i, options) {
            if (!options.isRendered) {
                var id = options.id;
                var suffix = id.replace(/#/g, "-");
                var voyage = options.voyage;

                _layout[id] = {
                    selecting: {}
                };

                deferreds.push($.ajax({
                    url: _get_layout_url,
                    type: "GET",
                    data: { voyageId: voyage.VoyageId, scheduleId: voyage.ScheduleId },
                    dataType: "json",
                    cache: false,
                    success: function (data) {
                        if (data.status == true) {
                            //isRendered = true;
                            //if (i == 1) {
                            //  isRenderedReturn = true;
                            //}

                            //options.isRendered = true;

                            var first_floor = [];
                            var second_floor = [];
                            var third_floor = [];
                            if (data.data != null) {
                                $.each(data.data, function (index, obj) {
                                    if (obj.IsUpStair === 0) {
                                        first_floor.push(obj);
                                    } else if (obj.IsUpStair === 1) {
                                        second_floor.push(obj);
                                    } else {
                                        third_floor.push(obj);
                                    }
                                });
                                var $layout_template = $(_layout_template.replace(/{layout_id}/g, suffix));
                                $(id).append($layout_template);
                                var $floor_container = $layout_template.find('.floor-container');
                                var $layout_container = $layout_template.find('.layout-container');

                                $layout_template.find('#boat-layout-name').html('<i class="fa fa-chevron-down"></i> ' + JsResource.BoatGo);
                                if (options.voyage.IsReturn == true) {
                                    $layout_template.find('#boat-layout-name').html('<i class="fa fa-chevron-down"></i> ' + JsResource.BoatReturn);
                                }



                                if (first_floor.length > 0) {
                                    var floor_id = suffix;
                                    $floor_container.append('<li role="presentation" class="active"><a href="#first-floor' + floor_id + '" role="tab" data-toggle="tab">' + JsResource.Downstair + '</a></li>');
                                    $layout_container.append('<div role="tabpanel" class="tab-pane table-responsive active" id="first-floor' + floor_id + '"></div>');
                                    try {
                                        voyageCenter.server.loadSelectedList(voyage.ScheduleId).done(function (seatsSelected) {
                                            renderFloor({ elem: '#first-floor' + floor_id, data: first_floor, layout: options, seatsSelected: seatsSelected });
                                        });
                                    } catch (err) {//start signR if not start
                                        $.connection.hub.start().done(function () {
                                            window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                                                return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                                            }
                                            voyageCenter.server.loadSelectedList(voyage.ScheduleId).done(function (seatsSelected) {
                                                renderFloor({ elem: '#first-floor' + floor_id, data: first_floor, layout: options, seatsSelected: seatsSelected });
                                            });
                                        });
                                    }
                                }

                                if (second_floor.length > 0) {
                                    var floor_id = suffix;
                                    $floor_container.append('<li role="presentation"><a href="#second-floor' + floor_id + '" role="tab" data-toggle="tab">' + JsResource.Upstair + '</a></li>');
                                    $layout_container.append('<div role="tabpanel" class="tab-pane table-responsive" id="second-floor' + floor_id + '"></div>');
                                    try {
                                        voyageCenter.server.loadSelectedList(voyage.ScheduleId).done(function (seatsSelected) {
                                            renderFloor({ elem: '#second-floor' + floor_id, data: second_floor, layout: options, seatsSelected: seatsSelected });
                                        });
                                    } catch (err) {
                                        $.connection.hub.start().done(function () {
                                            window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                                                return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                                            }
                                            voyageCenter.server.loadSelectedList(voyage.ScheduleId).done(function (seatsSelected) {
                                                renderFloor({ elem: '#second-floor' + floor_id, data: second_floor, layout: options, seatsSelected: seatsSelected });
                                            });
                                        });
                                    }
                                }

                                if (third_floor.length > 0) {
                                    var floor_id = suffix;
                                    $floor_container.append('<li role="presentation"><a href="#third-floor' + floor_id + '" role="tab" data-toggle="tab">' + JsResource.Floor2 + '</a></li>');
                                    $layout_container.append('<div role="tabpanel" class="tab-pane table-responsive" id="third-floor' + floor_id + '"></div>');
                                    try {
                                        voyageCenter.server.loadSelectedList(voyage.ScheduleId).done(function (seatsSelected) {
                                            renderFloor({ elem: '#third-floor' + floor_id, data: third_floor, layout: options, seatsSelected: seatsSelected });
                                        });
                                    } catch (err) {
                                        $.connection.hub.start().done(function () {
                                            window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                                                return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                                            }
                                            voyageCenter.server.loadSelectedList(voyage.ScheduleId).done(function (seatsSelected) {
                                                renderFloor({ elem: '#third-floor' + floor_id, data: third_floor, layout: options, seatsSelected: seatsSelected });
                                            });
                                        });
                                    }
                                }

                                $layout_container = null;
                                $floor_container = null;
                                $layout_template = null;
                            }
                        }

                    }
                }));
            }
        });
        //$.when.apply($, deferreds).then(function () {
        //    if (ReturnDate) {
        //        autoGetSeats(BookingInfo, BookingInfoBack);
        //    } else {
        //        autoGetSeats(BookingInfo, null);
        //    }
        //});

    }

    // render floor of boat
    function renderFloor(options) {
        // options receive: { elem: $DownStair, data: DownStair, voyage: voyage }
        var $elem = $(options.elem);
        var data = options.data;
        var layout = options.layout;
        var seatsSelected = options.seatsSelected;
        var $Table = $("<table/>", {});
        $Table.appendTo($elem);
        var $TBody = $("<tbody/>", {});
        $TBody.appendTo($Table);
        var $Row = null;

        var currentRow = -1;
        $.each(data, function (index, obj) {
            if (obj.Row != currentRow) {
                $Row = null;

                $Row = $("<tr/>", {});
                $Row.appendTo($TBody);
                currentRow = currentRow + 1;
            }

            //var $td = $("<td/>", {
            //    class: obj.IsSeat ? 'seat-container' :'seat-container readonly',
            //    colspan: obj.ColSpan
            //});
            var cls = 'seat-container';
            if (obj.IsRotate == true) {
                cls = 'seat-container rotate';
            }
            if (obj.IsSeat == false) {
                cls += ' readonly';
            }
            var $td;
            if (obj.RowSpan != 0) {
                $td = $("<td/>", {
                    
                    class: cls,
                    rowspan: obj.RowSpan,
                    colspan: obj.ColSpan
                });
            } else {
                $td = $("<td/>", {
                     
                    class: cls,
                    colspan: obj.ColSpan
                });
            }

            $td.appendTo($Row);
            var isHeld = $.inArray(obj.PositionId, seatsSelected) !== -1;
            var isThuongGia = obj.TicketClass == "VIP" ? " seat-bussiness" : "";
            var $span = $("<span/>", {
                class: 
                    (obj.IsSeat == true ? ("btn seat-default seat " + obj.SeatNm) : "lobby disabled") +
                    (obj.IsBooked == true ? " seat-booked disabled" : "") +
                    (obj.IsPublished == true ? " seat-booked disabled" : "") +
                    (obj.IsVIP == true ? " seat-vip" + isThuongGia : "") +
                    (obj.IsHeld == true ? " seat-held disabled" : "") +
                    (isHeld ? " seat-held disabled" : ""),
                text: obj.SeatNm
            }).data("seat", obj)
                .data("loading-text", '<i class="fa fa-spinner fa-spin"></i>')
                .attr("positionId", obj.PositionId)
                .attr("voyageId", layout.voyage.VoyageId)
                .attr("scheduleId", layout.voyage.ScheduleId)
                .attr("voyageIdRelated", obj.VoyageIdRelated)
                .attr("scheduleIdRelated", obj.ScheduleIdRelated) 
                .attr("isvip", obj.IsVIP);
            $span.on("click", function () {
                lstSelected = $('#tblSeatInfo').bootstrapTable('getSelections');
                if (lstSelected.length == 0) {
                    swal({
                        type: 'warning',
                        text: JsResource.SelectedWarning
                    });
                    return false;
                }
                var $this = $(this);
                if ($this.hasClass('seat-held') || $this.hasClass('seat-booked')) {
                    return false;
                }
                var is_selected = $this.data('IsSelected');
                var layout_id = layout.id;

                if (is_selected == true) {
                    $this.trigger('UnselectSeat');
                }
                else {
                    $this.trigger('SelectSeat');

                }
            });
            var NoSelected ;
            // create SelectSeat event handler for seat
            $span.on("SelectSeat", function (event) {
                var $this = $(this);
                var is_selected = $this.data('IsSelected');
                var layout_id = layout.id;

                if (is_selected != true) {
                    $this.data('IsSelected', true);
                    $this.addClass('selected seat-selecting');
                    var idx = 0;
                    var valSelect = $('#tblSeatInfo').bootstrapTable('getSelections');
                    var dataSelect = null;
                    if (null != valSelect && valSelect != undefined) {
                        dataSelect = valSelect[0];
                    } else {
                        return false;
                    }
                    NoSelected = dataSelect.No;
                    $.each(ResultData, function (i, seat) {
                        if (layout_id === "#boat-layout-container-return-wrapper") {//CHIEU VE
                            if (null != dataSelect && dataSelect.SeatIdBack == seat.SeatIdBack && seat.No === NoSelected) {
                                $(layout_id).find('.seat[positionid="' + seat.PositionIdBack + '"]').removeClass('selected seat-selecting').data('IsSelected', layout_id, false);
                                try {
                                    window.sendSignal($this.attr('voyageid'), $this.attr('scheduleid'), seat.PositionIdBack, layout_id, false);
                                } catch (err) {//start signR if not start
                                    $.connection.hub.start().done(function () {
                                        window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                                            return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                                        }
                                        voyageCenter.server.chooseSeat($this.attr('voyageid'), $this.attr('scheduleid'), seat.PositionIdBack, layout_id, false);
                                    });
                                }


                                seat.PositionIdBack = obj.PositionId;
                                seat.SeatNmBack = obj.SeatNm;
                                seat.IsVIPBack = obj.IsVIP;
                                seat.SeatIdBack = obj.SeatId;
                                seat.TicketClassBack = obj.TicketClass;
                                seat.IsRenderBack = true;
                                //set data
                                DataSeatBackForPassenger["SeatIdBack"] = obj.SeatId;
                                DataSeatBackForPassenger["PositionIdBack"] = obj.PositionId;
                                DataSeatBackForPassenger["SeatNmBack"] = obj.SeatNm;
                                DataSeatBackForPassenger["TicketClassBack"] = obj.TicketClass;
                                DataSeatBackForPassenger["IsRenderBack"] = true;
                                $.Helpers.setDataObject(".info-ticket .ticket", '[otype="odetail"]', DataSeatBackForPassenger, i);
                                try {
                                    window.sendSignal($this.attr('voyageid'), $this.attr('scheduleid'), seat.PositionIdBack, layout_id, true);
                                } catch (err) {//start signR if not start
                                    $.connection.hub.start().done(function () {
                                        window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                                            return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                                        }
                                        voyageCenter.server.chooseSeat($this.attr('voyageid'), $this.attr('scheduleid'), seat.PositionIdBack, layout_id, true);
                                    });
                                }

                                return false;
                            }
                        }
                        if (layout_id === "#boat-layout-container-wrapper") {//CHIEU DI
                            if (null != dataSelect && dataSelect.SeatId == seat.SeatId && seat.No === NoSelected) {
                                //Unselect seat before
                                $(layout_id).find('.seat[positionid="' + seat.PositionId + '"]').removeClass('selected seat-selecting').data('IsSelected', layout_id, false);
                                try {
                                    window.sendSignal($this.attr('voyageid'), $this.attr('scheduleid'), seat.PositionId, layout_id, false);
                                } catch (err) {//start signR if not start
                                    $.connection.hub.start().done(function () {
                                        window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                                            return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                                        }
                                        voyageCenter.server.chooseSeat($this.attr('voyageid'), $this.attr('scheduleid'), seat.PositionId, layout_id, false);
                                    });
                                }

                                

                                seat.PositionId = obj.PositionId;
                                seat.SeatNm = obj.SeatNm;
                                seat.IsVIP = obj.IsVIP;
                                seat.SeatId = obj.SeatId;
                                seat.TicketClass = obj.TicketClass;
                                seat.IsRender = true;
                                //set data
                                DataSeatForPassenger["SeatId"] = obj.SeatId;
                                DataSeatForPassenger["PositionId"] = obj.PositionId;
                                DataSeatForPassenger["SeatNm"] = obj.SeatNm;
                                DataSeatForPassenger["TicketClass"] = obj.TicketClass;
                                DataSeatForPassenger["IsRender"] = true;
                                $.Helpers.setDataObject(".info-ticket .ticket", '[otype="odetail"]', DataSeatForPassenger, i);
                                try {
                                    window.sendSignal($this.attr('voyageid'), $this.attr('scheduleid'), seat.PositionId, layout_id, true);
                                } catch (err) {//start signR if not start
                                    $.connection.hub.start().done(function () {
                                        window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                                            return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                                        }
                                        voyageCenter.server.chooseSeat($this.attr('voyageid'), $this.attr('scheduleid'), seat.PositionId, layout_id, true);
                                    });
                                }
                                return false;
                            }
                        }

                    });
                    onCalculatorForPassType(false);
                    $('#tblSeatInfo').bootstrapTable("load", ResultData); 
                     // $('input[name=btSelectItem]').attr('checked', false); 
                    $("#tblSeatInfo").bootstrapTable("checkBy", { field: "No", values: [NoSelected] });


                    _layout[layout_id].selecting[obj.PositionId] = {};
                    _layout[layout_id].selecting[obj.PositionId].data = obj;
                    _layout[layout_id].selecting[obj.PositionId].elem = $this;

                    // call user defined onSelectSeat if available
                    if (layout.onSelectSeat != null) {
                        layout.onSelectSeat(obj);
                    }

                }
                 
                //var $tableAB = $('#tblSeatInfo');
                //var $rows = $tableAB.bootstrapTable('getData');
                // Tìm dòng có No bằng 5 
                //$.each($rows, function (i, row) { 
                //    var $row = $tableAB.find('tr[data-index="' + i + '"]');
                //    if (row.No === NoSelected) {
                //        $row.addClass('selected');
                //        $row.attr('checked', true);
                //    } else {
                //        $row.removeClass('selected');
                //        $row.attr('checked', false);
                //    }
                //}); 
                    //end

            });

            // create UnselectSeat event handler for seat
            $span.on("UnselectSeat", function (event) {
                var $this = $(this);
                var is_selected = $this.data('IsSelected');
                var layout_id = layout.id;

                if (is_selected == true) {
                    $this.data('IsSelected', false);
                    $this.removeClass('selected seat-selecting');
                    var valSelect = $('#tblSeatInfo').bootstrapTable('getSelections');
                    NoSelected = dataSelect.No;
                    if (layout_id === "#boat-layout-container-return-wrapper") {
                        $.each(ResultData, function (i, seat) {
                            if (seat.PositionIdBack == obj.PositionId) {
                                try {
                                    window.sendSignal($this.attr('voyageid'), $this.attr('scheduleid'), seat.PositionIdBack, layout_id, false);
                                } catch (err) {//start signR if not start
                                    $.connection.hub.start().done(function () {
                                        window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                                            return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                                        }
                                        voyageCenter.server.chooseSeat($this.attr('voyageid'), $this.attr('scheduleid'), seat.PositionIdBack, layout_id, false);
                                    });
                                }

                                seat.PositionIdBack = null;
                                seat.SeatNmBack = null;
                                seat.IsVIPBack = null;
                                seat.SeatIdBack = null;
                                seat.TicketPriceIdBack = null;
                                seat.PriceWithVATReturn = null
                                //seat.TicketPriceId_PriceAdult_Back = null;
                                //seat.TicketPriceId_PriceChild_Back = null;
                                changeIndexReturn = NEXT_PASSENGER_CHANGE_SEAT;
                            }

                        });
                    }
                    else {
                        $.each(ResultData, function (i, seat) {
                            if (seat.PositionId == obj.PositionId) {
                                try {
                                    window.sendSignal($this.attr('voyageid'), $this.attr('scheduleid'), seat.PositionId, layout_id, false);
                                } catch (err) {//start signR if not start
                                    $.connection.hub.start().done(function () {
                                        window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                                            return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                                        }
                                        voyageCenter.server.chooseSeat($this.attr('voyageid'), $this.attr('scheduleid'), seat.PositionId, layout_id, false);
                                    });
                                }

                                seat.PositionId = null;
                                seat.SeatNm = null;
                                seat.IsVIP = null;
                                seat.SeatId = null;
                                seat.TicketPriceId = null;
                                seat.PriceWithVAT = null

                                //seat.TicketPriceId_PriceAdult = null;
                                //seat.TicketPriceId_PriceChild = null;
                                changeIndexDepart = NEXT_PASSENGER_CHANGE_SEAT;
                            }
                        });
                    }

                    $('#tblSeatInfo').bootstrapTable("load", ResultData);
                    $("#tblSeatInfo").bootstrapTable("checkBy", { field: "No", values: [NoSelected] });
                    // call user defined onUnselectSeat if available
                    if (layout.onUnselectSeat != null) {
                        layout.onUnselectSeat(obj);
                    }
                }
            });

            // create Change seat event handler for seat (when select seat more then NoOfPassenger)
            $span.on("ChangeSeat", function (event, positionId) {
                var layout_id = layout.id;
                $(layout_id).find('.seat[positionid="' + positionId + '"]').removeClass('selected seat-selecting').data('IsSelected', layout_id, false);
            });

            $span.appendTo($td);

            $span = null;
            $td = null;
        });

        $Row = null;
        $TBody = null;
        $Table = null;

    }

    // remove rendered layout and all reference of layout
    function removeBoatLayout(elem, isRender) {
        resetChosenSeat(elem);
        if (!elem) {
            return;
        }
        $(elem).html('');
    }

    // remove selected seat
    function unselectSeat(positionId, IsReturn) {
        var $seat = undefined;
        if (IsReturn) {
            $seat = $('#boat-layout-container-return-wrapper .boat-layout-container .seat-container').find('.seat[positionId="' + positionId + '"]');

            if ($seat) {
                $seat.removeClass('selected seat-selecting');
                $seat.data("IsSelected", false);
                $seat.button('reset');
                try {
                    window.sendSignal($seat.attr("voyageId"), $seat.attr("scheduleId"), positionId, '#boat-layout-container-return-wrapper', false);
                } catch (err) {//start signR if not start
                    $.connection.hub.start().done(function () {
                        window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                            return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                        }
                        voyageCenter.server.chooseSeat($seat.attr("voyageId"), $seat.attr("scheduleId"), positionId, '#boat-layout-container-return-wrapper', false);
                    });
                }

            }
        } else {
            $seat = $('#boat-layout-container-wrapper .boat-layout-container .seat-container').find('.seat[positionId="' + positionId + '"]');

            if ($seat) {
                $seat.removeClass('selected seat-selecting');
                $seat.data("IsSelected", false);
                $seat.button('reset');
                try {
                    window.sendSignal($seat.attr("voyageId"), $seat.attr("scheduleId"), positionId, '#boat-layout-container-wrapper', false);
                } catch (err) {//start signR if not start
                    $.connection.hub.start().done(function () {
                        window.sendSignal = function (voyageId, scheduleId, positionId, layoutId, selected) {
                            return voyageCenter.server.chooseSeat(voyageId, scheduleId, positionId, layoutId, selected);
                        }
                        voyageCenter.server.chooseSeat($seat.attr("voyageId"), $seat.attr("scheduleId"), positionId, '#boat-layout-container-wrapper', false);
                    });
                }


                var seat_data = $seat.data('seat');
            }
        }
    }
    // end private function
    return {
        RemoveBoatLayout: function (elem, isRender) {
            removeBoatLayout(elem, isRender);
        },
        RenderBoatLayout: function (options) {
            renderBoatLayout(options);
        },
        UnselectSeat: function (positionId, IsReturn) {
            unselectSeat(positionId, IsReturn);
        }, 
        AutoGetSeats: function (voyage, voyageReturn) {
            autoGetSeats(voyage, voyageReturn);
        }
        //Muon bo auto ghet seat 
    };
}());

;
var boat = window.BoatLayout;
var $passengerInfo = $(".passenger-info");
var bookingList = [];
var voyageInfo = undefined;
var voyageInfoReturn = undefined;
var RouteIdBack = undefined;
var IsRoundTrip = false;
var DepartDate = null;
var displayDepartDate = null;
var displayReturnDate = null;
//var Fare = null;
//var FareBack = null;
var idxPassType = 0;
var RouteId = 0;
var CurrentDate = new Date();
var currentDateGot = false;
var minutesTimeOut = new Date();
const MINUTES_TIME_OUT = 15; // Số phút trong thời gian quy định phải thanh toán
//Danh sách hành khách dùng cho select
var passTogetherOptions = [];
//Danh sách hành khách
var lstPassTogether = [];

var ticketTypeIdFree = 4;

var BookingInfo = {
    RouteNm: '',
    NoOfPassenger: '0',
    VoyageId: '0',
    ScheduleId: '0',
    BoatNm: '',
    Harbor: '',
    DepartTime: null,
    DepartDate: '',
    ReturnDate: '',
    Time: null,
    KeepTime: '15m',
    NoOfRemain: '0',
    Voucher:'',
    ruleMaxOfPassenger: 15
};

var BookingInfoBack = {
    RouteNm: '',
    NoOfPassenger: '0',
    VoyageId: '0',
    ScheduleId: '0',
    BoatNm: '',
    Harbor: '',
    DepartTime: null,
    DepartDate: '',
    ReturnDate: '',
    Time: null,
    KeepTime: '15m',
    NoOfRemain: '0',
    Voucher: '',
    ruleMaxOfPassenger: 15
}

var DataCustomer = {
    FullNm: '',
    PhoneNo: '',
    Email: '',
    Voucher:''
};
var ResourceArr = {
    Required: Resources.Required,
    PleaseSelectRoute: Resources.PleaseSelectRoute,
    NumberOfTrainPassengers: Resources.NumberOfTrainPassengers,
    NumberOfTrainPassengers1: Resources.NumberOfTrainPassengers1,
    SelectOption: Resources.SelectOption,
    Warning: Resources.Warning,
    WarningText: Resources.WarningText,
    Waiting: Resources.Waiting,
    Include: Resources.Include,
    AdultTickets: Resources.AdultTickets,
    ChildTicket: Resources.ChildrenTicket,
    SeniorTickets: Resources.SeniorTickets,
    VeMoi: Resources.VeMoi,
    Finish: Resources.Finish,
    PleaseCheckInfomation: Resources.PleaseCheckInfomation,
    Next: Resources.Next,
    Previous: Resources.Previous,
    NotEnoughRoom: Resources.NotEnoughRoom,
    PleaseSelectTime: Resources.PleaseSelectTime,
    Error: Resources.Error,
    ErrorYOB: Resources.ErrorYOB,
    CannotBuyChild: Resources.CannotBuyChild,
    CannotBuyAdult: Resources.CannotBuyAdult,
    Duplicate: Resources.Duplicate,
    GoWith: Resources.GoWith,
    RawYOB: Resources.RawYOB,
    YOB: Resources.YOB,
    InvalidYOB: Resources.InvalidYOB,
    InvalidDOB: Resources.RawDOB,
    DepartTimeInSameDay: Resources.DepartTimeInSameDay
}

var RANGE_AGE_TYPE_TICKET = {
    3: {
        min: 63,
        max: 250
    },
    2: {
        min: 1,
        max: 11
    },
    1: {
        min: 12,
        max: 62
    }
};
var RANGE_AGE_TYPE_TICKET_FOREIGN = { 
    2: {
        min: 1,
        max: 11
    },
    1: {
        min: 12,
        max: 250
    }
};

var LIST_ID_NO = [];
var MAX_AGE_NO_ID_NO = 11;
var DEFAUT_ID_NO = "TE";
var MAX_AGE = 250;
var MIN_AGE = 1;
var CURRENT_YEAR = new Date().getFullYear();

//  var in SystemConfig
var TimeOutRange = 0;   // TimeOut for Booking Ticket (minutes)
var HourDifferRoundTrip = 0;

var myEnum = {
    VeNguoiLon: 1,
    VeTreEm: 2,  
    VeNguoiCaoTuoi: 4
};

var myEnumStepBooking = {
    StepChooseBoat: 0,
    StepBookerInfo: 1,
    StepPassenger: 2,
    StepBoatLayout: 3,
    StepPayment: 4
};


var nationIdEnum = {
    VietNam: 1,
    Lao: 2,
    Campuchia: 3
}

//Regular expression to check date format dd/mm/yyyy
var dateTemplate = /(^(((0[1-9]|1[0-9]|2[0-8])[\/](0[1-9]|1[012]))|((29|30|31)[\/](0[13578]|1[02]))|((29|30)[\/](0[4,6,9]|11)))[\/](19|[2-9][0-9])\d\d$)|(^29[\/]02[\/](19|[2-9][0-9])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)/;
var TicketTemplate = $('.ticket-template').clone().removeClass('hidden ticket-template')[0].outerHTML;

//  clear all data when search again
function clearAll() {
    $('#boat-info').bootstrapTable('removeAll');
    $('#boat-info-return').bootstrapTable('removeAll');
    $('#frmBookingWizard').smartWizard("reset");
    $('.info-ticket').text('');
    $('.RouteName').text('');
    $('.BoatName').text('');
    $('.BoatHarbor').text('');
    $('.BoatTime').text('');
    $('.BoatDate').text('');
    $('.QuantityPassenger').text('').trigger('change');
    $('.RouteNameBack').text('');
    $('.BoatNameBack').text('');
    $('.BoatHarborBack').text('');
    $('.BoatTimeBack').text('');
    $('.BoatDateBack').text('');
    $('.TotalDepart').text('0 ' + JsResource.VNĐ);
    $('.TotalReturn').text('0 ' + JsResource.VNĐ);
    $('.TotalDepartFeeHarbor').text('0 ' + JsResource.VNĐ);
    $('.TotalReturnFeeHarbor').text('0 ' + JsResource.VNĐ);

    $('.Special3Day').text('0 ' + JsResource.VNĐ);
    $('.Special1Day').text('0 ' + JsResource.VNĐ);
    $('.Special3DayBack').text('0 ' + JsResource.VNĐ);
    $('.Special1DayBack').text('0 ' + JsResource.VNĐ);

    $('.TotalValue').text('0 ' + JsResource.VNĐ);
    $('#TotalValueFn').text('');
    $('#TotalValueFnFeeHarbor').text('');
    $('#boat-layout-container-return-wrapper').html('');
    
}
//config system rule: max passenger for booking
function getSystemConfig() {
    if (SYSTEM_CONFIG_URL) {
        $.ajax({
            type: "GET",
            url: SYSTEM_CONFIG_URL,
            data: null,
            dataType: "json",
            success: function (lstData) {
                $.each(lstData.data, function (i, obj) {
                    if (obj.KeyConfig == 'MaxNoOfPassengerOnline') {
                        if (BookingInfo[obj.KeyConfig] == undefined) {
                            BookingInfo[obj.KeyConfig] = {ruleMaxOfPassenger: 15}
                        }
                        if (BookingInfoBack[obj.KeyConfig] == undefined) {
                            BookingInfoBack[obj.KeyConfig] = {ruleMaxOfPassenger: 15}
                        }
                        BookingInfo["ruleMaxOfPassenger"] = parseInt(obj.ValueConfig);
                        BookingInfoBack["ruleMaxOfPassenger"] = parseInt(obj.ValueConfig);
                        findRedirectedOrder(); //automatic search if redirected from Home page search
                    }
                    //  Get Time limited for Booking  ( minutes)
                    if (obj.KeyConfig == 'TimeOutRange') {
                        TimeOutRange = obj.ValueConfig;
                        $('.show-bookermemercard').text(TimeOutRange);
                    }
                    //  Get Time difference between Go And Back Trip  ( hours)
                    if (obj.KeyConfig == 'HourDifferRoundTrip') {
                        HourDifferRoundTrip = obj.ValueConfig;
                    }
                });
            },
            error: function (jqXHR, textStatus, errorThrown) {
                swal({
                    type: "error",
                    title: Resources.RequestErrorMessage,
                    text: "",
                    allowOutsideClick: false,
                    confirmButtonText: "Reload"
                }).then(function () {
                    location.reload();
                });
            }
        });
    }

}

var maxPassenger = BookingInfo["ruleMaxOfPassenger"];
var sourceListPassenger, destListPassenger;
var title = ResourceArr["Required"];
//danh sách ghế trống của tàu lúc đi và về
var departBookingPrice = [];
var returnBookingPrice = [];
var resultForVoucher = [];
//get passenger for user: to register user.

//Search Boat--------------
function loadWizardData() {
    isRendered = false;
    isRenderedReturn = false;
    seatList = [];
    bookingList = [];
    resultForVoucher = [];
    currentDateGot = false;   // refresh Counting TimeOut when search 
    LIST_ID_NO = [];//  clear data in LIST_ID_NO of previous booking session
    //swalProcessing();
    //set tamp
    destListPassenger = [];
    destListPassenger = sourceListPassenger;
    RouteId = $('#slRoute').val(); // chon tuyen
    BookingInfo["RouteNm"] = $("#slRoute option:selected").text();
    BookingInfo["NoOfPassenger"] = $('#NoOfPassenger').val();
    BookingInfo["RouteId"] = RouteId;
    BookingInfo["Abbrev"] = $("#slRoute option:selected").attr("name");
    var mess = ResourceArr["PleaseSelectRoute"];
    if (!RouteId || RouteId == -1) {
        swal(title, mess, "error");
        return;
    }

    DepartDate = $('#dpDepartDate').data('DateTimePicker').date().format('YYYY-MM-DD'); //chon thoi gian di
    ReturnDate = undefined;
    ReturnDate2 = undefined;
    IsRoundTrip = false;
    RouteIdBack = undefined;

    //if ($('#RoundTrip').is(':checked')) {
    if ($('#RoundTrip').hasClass('active')) {

        ReturnDate = $('#dpReturnDate').data('DateTimePicker').date().format('YYYY-MM-DD'); //chon thoi gian ve
        ReturnDate2 = ReturnDate;
        $('#dpReturnDate2').val($('#dpReturnDate').data('DateTimePicker').date().format('DD/MM/YYYY'));

        if (ReturnDate < DepartDate) {
            toastr["error"](JsResource.ReturnDateErr);
            //swal.close();
            $('#dpDepartDate').focus();
            return false;
        }
        //$(".divDeapartTrip").removeClass("col-sm-12 col-xs-12");
        //$(".divDeapartTrip").addClass("col-sm-6 col-xs-6");
        $(".info-return").removeClass('hidden');
        $('#frmReturn').removeClass('hidden');
        $('#tblReturnWrapper').removeClass('hidden');
    } else {
        //$(".divDeapartTrip").addClass("col-sm-12 col-xs-12");
        //$(".divDeapartTrip").removeClass("col-sm-6 col-xs-6");
        $(".info-return").addClass('hidden');
        $('#frmReturn').addClass('hidden');
        $('#tblReturnWrapper').addClass('hidden');
    }


    displayDepartDate = $('#dpDepartDate').data('DateTimePicker').date().format('DD/MM/YYYY');
    displayReturnDate = $('#dpReturnDate').data('DateTimePicker').date().format('DD/MM/YYYY');

    BookingInfo["DepartDate"] = DepartDate;
    if (ReturnDate) {
        BookingInfo["ReturnDate"] = ReturnDate;
        BookingInfoBack["DepartDate"] = ReturnDate;
    }

    maxPassenger = BookingInfo["ruleMaxOfPassenger"];
    if (BookingInfo["NoOfPassenger"] == "" || (BookingInfo["NoOfPassenger"] || 0) <= 0 || BookingInfo["NoOfPassenger"] > maxPassenger) {
        $('#NoOfPassenger').parent().addClass("error focused");
        $('#NoOfPassenger').val(maxPassenger);
        mess = ResourceArr["NumberOfTrainPassengers"] + " " + maxPassenger + " " + ResourceArr["NumberOfTrainPassengers1"];
        swal(title, mess, "error");
        return;
    } else {
        $('#NoOfPassenger').parent().removeClass("error");
    }

    clearAll();
    //get Data into table Boat
    $.ajax({
        type: "GET",
        url: $('#UrlStorage').data('urlsearchvoyage'),
        data: { RouteId: RouteId, DepartDate: DepartDate, NoOfPassenger: BookingInfo["NoOfPassenger"] },
        contentType: 'application/json; charset=utf-8',
        success: function (result) {
            $('#boat-info').bootstrapTable('load', result);
            //$(".sw-container.tab-content").attr("style", "min-height: 350px!important");
            //swal.close();
            //get ticket price
            getTicketPriceList(BookingInfo["RouteId"], 1, BookingInfo["DepartDate"], BookingInfo["DepartTime"], BookingInfo["NoOfPassenger"]).then(function (data) {
                departBookingPrice = data;
            });
            if (result.length > 0) {
                $('html, body').animate({
                    scrollTop: $('#boat-info').offset().top - 130
                }, 1000);
                
            }
            //$("#boat-info").get(0).scrollIntoView({ behavior: 'smooth', block: 'center' });
        },
        error: function (data) {
            //swal.close();
        }
    });
    //get Data into table Boat Return
    if (ReturnDate) {
        $.ajax({
            type: "GET",
            url: $('#UrlStorage').data('urlsearchvoyagetripback'),
            data: { RouteIdTripGo: RouteId, DepartDateBack: ReturnDate, NoOfPassenger: BookingInfo["NoOfPassenger"] },
            contentType: 'application/json; charset=utf-8',
            success: function (result) {
                if (result.length > 0) {
                    getTicketPriceList(BookingInfoBack["RouteId"], 1, BookingInfoBack["DepartDate"], BookingInfo["DepartTime"], BookingInfo["NoOfPassenger"]).then(function (data) {
                        returnBookingPrice = data;
                    });
                    RouteIdBack = result[0].RouteId;
                    BookingInfoBack["RouteNm"] = result[0].RouteNm;
                    BookingInfoBack["NoOfPassenger"] = $('#NoOfPassenger').val();
                    BookingInfoBack["RouteId"] = RouteIdBack;
                    //BookingInfo["Abbrev"] = $("#slRoute option:selected").attr("name");
                }

                $('#boat-info-return').bootstrapTable('load', result);
                //swal.close();
                //$(".sw-container.tab-content").attr("style", "min-height: 350px!important");
            },
            error: function (data) {
                //swal.close();
            }
        });
    }

    //var  url = "GetBoats?" + $.param({ RouteId: RouteId, DepartDate: DepartDate, NoOfPassenger: BookingInfo["NoOfPassenger"] });
    //get TicketType
    $.ajax({
        type: "GET",
        url: $('#UrlStorage').data('urlgettickettype'),
        contentType: 'application/json; charset=utf-8',
        success: function (result) {
            $.each(result, function (i, item) {
                //item.Label = item.Label == "Vé người lớn" ? Resources.TicketAdult : Resources.TicketChildren;
                switch (item.Label) {
                    case "Vé người lớn":
                        item.Label = Resources.TicketAdult;
                        break;
                    case "Vé trẻ em":
                        item.Label = Resources.TicketChildren;
                        break;
                    case "Vé người cao tuổi":
                        item.Label = Resources.SeniorTickets;
                }

                $('select[okey=TicketTypeId]').append($('<option>', {
                    value: item.TicketTypeId,
                    text: item.Label
                }));
            });
        },
        error: function (data) { }
    });


    var $infoTicket = $('.info-ticket');
    for (var i = 0; i < BookingInfo["NoOfPassenger"]; i++) {
        //$infoTicket.append(TicketTemplate.replace('{OrderNumber}', i + 1));
        $infoTicket.append(TicketTemplate.replace(/{OrderNumber}/g, i + 1));
    }
    setTimeout(initialInfoTicketControl, 1000);

    //set data-index for ticket
    $("div.info-ticket > div.ticket").each(function (index) {
        $(this).attr('data-index', index);
    });
    //add PassengerOfUser to 
    var initialising = true;
}

function searchVoyageTripBack() {
    //swalProcessing();
    $('#boat-info-return').bootstrapTable('removeAll');
    ReturnDate2 = undefined;
    ReturnDate2 = $('#dpReturnDate2').data('DateTimePicker').date().format('YYYY-MM-DD'); //chon thoi gian ve

    if (ReturnDate2 < DepartDate) {
        //swal.close();
        toastr["error"](JsResource.ReturnDateErr);
        $('#dpReturnDate2').focus();
        return false;
    }

    displayReturnDate = $('#dpReturnDate2').data('DateTimePicker').date().format('DD/MM/YYYY');
    $.ajax({
        type: "GET",
        url: $('#UrlStorage').data('urlsearchvoyagetripback'),
        data: { RouteIdTripGo: RouteId, DepartDateBack: ReturnDate2, NoOfPassenger: BookingInfo["NoOfPassenger"] },
        contentType: 'application/json; charset=utf-8',
        success: function (result) {
            //swal.close();
            if (result.length > 0) {
                RouteIdBack = result[0].RouteId;
                BookingInfoBack["DepartDate"] = ReturnDate2;
                BookingInfoBack["RouteNm"] = result[0].RouteNm;
                BookingInfoBack["NoOfPassenger"] = $('#NoOfPassenger').val();
                BookingInfoBack["RouteId"] = RouteIdBack;
                //BookingInfo["Abbrev"] = $("#slRoute option:selected").attr("name");
            }
            $('#boat-info-return').bootstrapTable('load', result);
            //$(".sw-container.tab-content").attr("style", "min-height: 350px!important");
        },
        error: function (data) {
            //swal.close();
        }
    });
}

function initialInfoTicketControl() { 
    var $infoTicket = $('.info-ticket');
    var Mess = ResourceArr["SelectOption"];
    var SelectOptions = {
        placeholder: Mess,
        allowClear: false
    };
    $infoTicket.find('[okey="NationId"]').select2(SelectOptions);
    $infoTicket.find('[okey="TicketClassBack"]').select2();
    $infoTicket.find('[okey="TicketClass"]').select2();
    $infoTicket.find('[okey="TicketTypeId"]').select2();

    $infoTicket.find('[okey="TicketTypeId"]').on("change", function () {
        var ticketIndex = $(this).closest('.ticket').data('index');

        //select:
        onCalculatorForPassType(false);
        if (idxPassType == BookingInfo["NoOfPassenger"]) {
            var Warn = ResourceArr["Warning"];
            var Mess = ResourceArr["WarningText"];
            swal(Warn, Mess, "error");
        }

          
       //  * Khóa lại do ko dùng kiểm tra này nữa
      /*   var ticketTypeId = $(this).val();
         var nationId = $('div.ticket[data-index="' + ticketIndex + '"]').find('[okey="NationId"]').val();
     
        //Nguoi cao tuoi chi duoc chon quoc tich VN
        if (ticketTypeId == myEnum.VeNguoiCaoTuoi && nationId != nationIdEnum.VietNam) { //ticketTypeId = 3 : nguoi cao tuoi; nationId = 1 : quoc tich Viet Nam
           swal(ResourceArr["Warning"], JsResource.NationIdError, "error");
           $('div.ticket[data-index="' + ticketIndex + '"]').find('[okey="NationId"]').val(nationIdEnum.VietNam).trigger('change');
         }
          */
    });
    $infoTicket.find('[okey="YOB"]').on("change", function () {
        onCalculatorForPassType(false);
    });

    $infoTicket.find('[okey="TicketClass"]').on("change", function () {
        onCalculatorForPassType(false);
        //isRendered = false;
        var index = $(this).closest('.ticket').data('index');
        //When TicketClass was change, delete the old seat store in ResultData and send to Hub
        ResultData = [];
        ResultData = $.Helpers.serializeDataArray(".info-ticket .ticket", '[otype="odetail"]');

        try {
            boat.UnselectSeat(ResultData[index].PositionId, false);
            ResultData[index].PositionId = null;
            ResultData[index].SeatId = null;
            ResultData[index].SeatNm = null;
        } catch (e) {}
        
        var change = new Object();
        change["IsRender"] = false;
        change["PositionId"] = null;
        change["SeatId"] = null;
        change["SeatNm"] = null;
        $.Helpers.setDataObject(".info-ticket .ticket", '[otype="odetail"]', change, index);
    });
    $infoTicket.find('[okey="TicketClassBack"]').on("change", function () {
        onCalculatorForPassType(false);
        //isRenderedReturn = false;
        var index = $(this).closest('.ticket').data('index');
        ResultData = [];
        ResultData = $.Helpers.serializeDataArray(".info-ticket .ticket", '[otype="odetail"]');

        try {
            boat.UnselectSeat(ResultData[index].PositionIdBack, true);
            ResultData[index].PositionIdBack = null;
            ResultData[index].SeatIdBack = null;
            ResultData[index].SeatNmBack = null;
        } catch (e) { }

        var change = new Object();
        change["IsRenderBack"] = false;
        change["PositionIdBack"] = null;
        change["SeatIdBack"] = null;
        change["SeatNmBack"] = null;

        $.Helpers.setDataObject(".info-ticket .ticket", '[otype="odetail"]', change, index);
    });

  
   //  * Khóa lại do ko dùng kiểm tra này nữa
   //Only able to choose VN if tickettype = nguoi cao tuoi / nguoi khuyet tat
    $infoTicket.find('[okey="NationId"]').on("change", function () {
       /*--do ko thong bao ma la nguoi nuoc ngoai mac dinh ve nguoi lon neu cao tuoi
     var ticketIndex = $(this).closest('.ticket').data('index');
     var ticketTypeId = $('div.ticket[data-index="' + ticketIndex + '"]').find('[okey="TicketTypeId"]').val();
     var nationId = $(this).val();

       if (ticketTypeId == myEnum.VeNguoiCaoTuoi && nationId != nationIdEnum.VietNam) { //ticketTypeId = 3 : nguoi cao tuoi; nationId = 1 : quoc tich Viet
       swal(ResourceArr["Warning"], JsResource.NationIdError, "error");
       $('div.ticket[data-index="' + ticketIndex + '"]').find('[okey="NationId"]').val(nationIdEnum.VietNam).trigger('change');
     }
     */ 

        var ticketIndex = $(this).closest('.ticket').data('index');
        var $ticketType = $('div.ticket[data-index="' + ticketIndex + '"]').find('[okey="TicketTypeId"]').val();
        var $inputYOB = $('div.ticket[data-index="' + ticketIndex + '"]').find('[okey="YOB"]').val();
        var $nationId = $(this).val();

        if ($inputYOB.length <= 0) {
            toastr.error(Resources.RawDOB);
            $(this).val('');
            $(this).trigger('change');
            $(this).parent().addClass('has-error');
            return false;
        } else {
            $(this).parent().removeClass('has-error');
        }

        var validTicketType = changeTypeTicketByYOB($inputYOB, $ticketType, $nationId);

        if (validTicketType !== false && validTicketType !== true) {

            $('select[okey="TicketTypeId"] > option').each(function () {
                if (this.value == validTicketType) {
                    $infoTicket.find('select[okey="TicketTypeId"]').val(this.value).trigger('change');
                }
            });

        } else if (validTicketType === true) {
            $(this).parent().removeClass('has-error');
        } else {
            toastr.error(Resources.InvalidYOB);
            $(this).val('');
            $(this).trigger('change');
            $(this).parent().addClass('has-error');
        }
        onCalculatorForPassType(false);
   });
   

    $infoTicket.find('[okey="FullNm"]').selectize({
        delimiter: ',',
        persist: false,
        createOnBlur: true,
        valueField: 'name',
        labelField: 'name',
        searchField: ['name', 'name'],
        create: function (input) {
            input = input.toUpperCase();
            return {
                name: input,
                id: 0
            }
        },
        options: passTogetherOptions,
        render: {
            item: function (data) {
                return "<div data-value='" + data.name + "' data-id='" + data.id + "' class='item' okey='selected'>" + data.name + " </div>";
            }
        },
    }).on("change", function () {
        var $infoDiv = $(this).closest('.ticket');
        var id = $infoDiv.find("[okey='selected']").data("id");
        curPassInfo = lstPassTogether.find(x => x.Id == id);
        if (curPassInfo) {
            $infoDiv.find('[okey = "IdNo"]').val(curPassInfo.PassIdNo);
            $infoDiv.find('[okey = "POB"]').val(curPassInfo.PassPOB);
            //$infoDiv.find('[okey = "YOB"]').val(moment(curPassInfo.PassDOB, "YYYY-MM-DD").format("DD/MM/YYYY")).trigger("focusout");
            $infoDiv.find('[okey = "YOB"]').val(curPassInfo.PassDOB).trigger("focusout");
            $infoDiv.find('[okey = "NationId"]').val(curPassInfo.PassNationId).trigger("change");
            $infoDiv.find('[okey = "PhoneNo"]').val(curPassInfo.PassPhone);
            $infoDiv.find('[okey = "Email"]').val(curPassInfo.PassEmail);
        }
    })

}

// STEP 4 => PAYMENT
function createOrder() {
    swalProcessing();
    var Wait = ResourceArr["Waiting"];
    var order_data = {};
    var listOrderDetail = [];
    var orderDetail_data_return = [];

    if (ReturnDate) {
        IsRoundTrip = true;
    }
    order_data[0] = $.Helpers.serializeDataObject('#frmBookingWizard [otype="oorder"]');
    if (ReturnDate) {
        order_data[1] = $.Helpers.serializeDataObject('#frmBookingWizard [otype="oorder"]');
    }
    var orderDetail_data = ResultData;
    var total = 0;
    var totalDepart = 0;
    var totalReturn = 0;
    var totalDepartFeeHarbor = 0;
    var totalReturnFeeHarbor = 0;

    for (var i = 0; i < orderDetail_data.length; i++) {
        var ticketTypeId = orderDetail_data[i]["TicketTypeId"];

        var tempPrice = departBookingPrice.find(p => p.TicketClass == orderDetail_data[i]["TicketClass"] && p.TicketTypeId == ticketTypeId);
        var priceWithVATSource = tempPrice.PriceWithVAT;
        var hasPro = false;
        var codePromotionSpecial = "";
        if (tempPrice.QuantityApplyPromotionSpecial != 0 && (tempPrice.QuantityApplyPromotionSpecial - (i + 1) >= 0) && isApplyPricePromotion) //so luong ve duoc huong khuyen mai
        {
            priceWithVATSource = tempPrice.PriceSpecial;
            hasPro = true;
            codePromotionSpecial = tempPrice.CodePromotionSpecial;
        }
        orderDetail_data[i]["PriceWithVAT"] = priceWithVATSource;
        orderDetail_data[i]["TicketPriceId"] = tempPrice.TicketPriceId;
        orderDetail_data[i]["HasApplyPromotionSpecial"] = hasPro;
        orderDetail_data[i]["CodePromotionSpecial"] = codePromotionSpecial;

        totalDepart += $.Helpers.formatValue(orderDetail_data[i]["PriceWithVAT"], 'number');
        if (routeApplyFeeHarbor.includes("," + RouteId + ",")) {
            totalDepartFeeHarbor += enum_FEEHARBORAMT;
        }

        if (ReturnDate) {
            ticketTypeId = orderDetail_data[i]["TicketTypeIdBack"];
            tempPrice = returnBookingPrice.find(p => p.TicketClass == orderDetail_data[i]["TicketClassBack"] && p.TicketTypeId == ticketTypeId);
            var priceWithVATSource = tempPrice.PriceWithVAT;
            hasPro = false;
            if (tempPrice.QuantityApplyPromotionSpecial != 0 && (tempPrice.QuantityApplyPromotionSpecial - (i + 1) >= 0) && isApplyPricePromotion) //so luong ve duoc huong khuyen mai
            {
                priceWithVATSource = tempPrice.PriceSpecial;
                hasPro = true;
                codePromotionSpecial = tempPrice.CodePromotionSpecial;
            }

            orderDetail_data[i]["PriceWithVATReturn"] = priceWithVATSource;
            orderDetail_data[i]["TicketPriceIdBack"] = tempPrice.TicketPriceId;
            orderDetail_data[i]["HasApplyPromotionSpecialReturn"] = hasPro;
            orderDetail_data[i]["CodePromotionSpecialReturn"] = codePromotionSpecial;

            totalReturn += $.Helpers.formatValue(orderDetail_data[i]["PriceWithVATReturn"], 'number');
            if (routeApplyFeeHarbor.includes("," + RouteId + ",")) {
                totalReturnFeeHarbor += enum_FEEHARBORAMT;
            }
        }
    }
    total = $.Helpers.formatValue(totalDepart, 'number') + $.Helpers.formatValue(totalReturn, 'number') + totalDepartFeeHarbor + totalReturnFeeHarbor;
    if (ReturnDate && totalReturn <= 0) {
        swal(title, JsResource.TotalIsZero, "error");
        return false;
    }
    if (totalDepart <= 0 && (BookingInfo["Voucher"] === '' || BookingInfo["Voucher"] ===null) ) {
        swal(title, JsResource.TotalIsZero, "error");
        return false;
    }
    listOrderDetail.push(orderDetail_data);

    if (ReturnDate) {
        orderDetail_data_return = JSON.parse(JSON.stringify(ResultData));
        for (var i = 0; i < orderDetail_data_return.length; i++) {
            orderDetail_data_return[i].PositionId = orderDetail_data_return[i].PositionIdBack;
            orderDetail_data_return[i].IsVIP = orderDetail_data_return[i].IsVIPBack;
            orderDetail_data_return[i].TicketTypeId = orderDetail_data_return[i].TicketTypeIdBack;
            orderDetail_data_return[i].SeatId = orderDetail_data_return[i].SeatIdBack;
            orderDetail_data_return[i].TicketClass = orderDetail_data_return[i].TicketClassBack;
            orderDetail_data_return[i].TicketPriceId = $.Helpers.formatValue(orderDetail_data_return[i].TicketPriceIdBack, 'number');
            orderDetail_data_return[i].PriceWithVAT = $.Helpers.formatValue(orderDetail_data_return[i].PriceWithVATReturn, 'number');
        }
        listOrderDetail.push(orderDetail_data_return);
    }

    //add Item not exited 
    order_data[0].TotalNumber = BookingInfo["NoOfPassenger"];
    order_data[0].TotalAmount = total;
    order_data[0].BoatId = BookingInfo["BoatId"];
    order_data[0].VoyageId = BookingInfo["VoyageId"];
    order_data[0].ScheduleId = BookingInfo["ScheduleId"];
    order_data[0].PaidAmount = total;
    order_data[0].RouteId = BookingInfo["RouteId"];
    order_data[0].DepartDate = BookingInfo["DepartDate"];
    order_data[0].Voucher = BookingInfo["Voucher"];
    order_data[0].IsBO = 1;
    if (ReturnDate) {
        order_data[0].PaidAmount = totalDepart + totalDepartFeeHarbor;
        order_data[1].TotalNumber = BookingInfo["NoOfPassenger"];
        order_data[1].TotalAmount = total;
        order_data[1].BoatId = BookingInfoBack["BoatId"];
        order_data[1].VoyageId = BookingInfoBack["VoyageId"];
        order_data[1].ScheduleId = BookingInfoBack["ScheduleId"];
        order_data[1].PaidAmount = totalReturn;
        order_data[1].RouteId = BookingInfoBack["RouteId"];
        order_data[1].DepartDate = BookingInfoBack["DepartDate"];
        order_data[1].IsBO = 1;
    }
    //  per Booking Transaction only has 10minutes before TimeOut
    if (GetMinuteOver() > TimeOutRange) {
        swal(title, JsResource.TimeOutTransaction, "error");
        return false;
    }
    $.ajax({
        type: "POST",
        url: $('#UrlStorage').data('urlpaymentticket'),
        data: { order: order_data, lstTicketOrders: listOrderDetail, RouteId: BookingInfo["RouteId"], DepartDate: BookingInfo["DepartDate"], Abbrev: BookingInfo["Abbrev"], DepartTime: BookingInfo["DepartTime"], IsRoundTrip: IsRoundTrip },
        dataType: null,
        success: function (data) {
            if (data.Status == true) {
                //this will redirect us in same window
                document.location.href = data.Data;
            }
            else {
                var Mess = data.Data;
                swal(title, Mess, "error");
            }
        }
    });

}

function onCalculatorForPassType(IsStep5) {
    var orderDetail_data = [];
    //if (IsStep5) {
    //  orderDetail_data = ResultData;
    //} else {
    orderDetail_data = $.Helpers.serializeDataArray("#frmBookingWizard .ticket", '[otype="odetail"]');
    if (ReturnDate) {
        for (var i = 0; i < orderDetail_data.length; i++) {
            orderDetail_data[i]["TicketTypeIdBack"] = orderDetail_data[i]["TicketTypeId"];
        }
    }
    //}

    var total = 0;
    var totalDepart = 0;
    var totalReturn = 0;
    var totalDepartFeeHarbor = 0;
    var totalReturnFeeHarbor = 0;
    var priceSpecial3Day = 0;
    var priceSpecial1Day = 0;
    var priceSpecial3DayBack = 0;
    var priceSpecial1DayBack = 0;
    var priceFlashSale = 0, priceFlashSaleBack=0;

    var ve_nguoi_lon = 0, tre_em = 0, nguoi_cao_tuoi=0, ve_moi=0;
    idxPassType = 0;

    var justPrice = new Object();
    $("#dvKeepseat").show();
    $("#dvSpecial").hide();
    $("#dvNoteSpecial").addClass('hidden');
    for (var i = 0; i < orderDetail_data.length; i++) {

        var ticketTypeId = parseInt(orderDetail_data[i]["TicketTypeId"]);
        if (resultForVoucher.length === 0 && parseInt(ticketTypeId) === ticketTypeIdFree) {//la free and not yet voucher
            ticketTypeId = myEnum.VeNguoiLon;
            justPrice["TicketTypeId"] = ticketTypeId;
        }
        var tempPrice = departBookingPrice.find(p => p.TicketClass == orderDetail_data[i]["TicketClass"] && p.TicketTypeId == ticketTypeId);
        var priceWithVATSource = tempPrice.PriceWithVAT;
        var hasPro = false;

        if (tempPrice.QuantityApplyPromotionSpecial != 0 && (tempPrice.QuantityApplyPromotionSpecial - (i + 1) >= 0) && isApplyPricePromotion) //so luong ve duoc huong khuyen mai
        {
            priceWithVATSource = tempPrice.PriceSpecial;
            priceSpecial1Day = tempPrice.PricePromotionBefore1Day;
            priceSpecial3Day = tempPrice.PricePromotionBefore3Day;
            priceFlashSale = tempPrice.PricePromotionFlashSale;
            hasPro = true;
            $("#dvKeepseat").hide();
            $("#dvSpecial").show();
            $("#dvNoteSpecial").removeClass('hidden');
        }
        orderDetail_data[i]["PriceWithVAT"] = priceWithVATSource;
        orderDetail_data[i]["TicketPriceId"] = tempPrice.TicketPriceId;
        orderDetail_data[i]["HasApplyPromotionSpecial"] = hasPro;

        justPrice["PriceWithVAT"] = orderDetail_data[i]["PriceWithVAT"];
        justPrice["TicketPriceId"] = orderDetail_data[i]["TicketPriceId"];

        try {
            ResultData[i]["PriceWithVAT"] = priceWithVATSource;
            ResultData[i]["TicketPriceId"] = tempPrice.TicketPriceId;
        } catch (err) { }

        totalDepart += $.Helpers.formatValue(orderDetail_data[i]["PriceWithVAT"], 'number');
        if (routeApplyFeeHarbor.includes("," + RouteId + ",")) {
            totalDepartFeeHarbor += enum_FEEHARBORAMT;
        }

        if (ReturnDate) {
            $("#dvSpecialBack").hide();
            tempPrice = returnBookingPrice.find(p => p.TicketClass == orderDetail_data[i]["TicketClassBack"] && p.TicketTypeId == ticketTypeId);
            priceWithVATSource = tempPrice.PriceWithVAT;
             hasPro = false;
            if (tempPrice.QuantityApplyPromotionSpecial != 0 && (tempPrice.QuantityApplyPromotionSpecial - (i + 1) >= 0) && isApplyPricePromotion) { //so luong ve duoc huong khuyen mai
                priceWithVATSource = tempPrice.PriceSpecial;
                priceSpecial1DayBack = tempPrice.PricePromotionBefore1Day;
                priceSpecial3DayBack = tempPrice.PricePromotionBefore3Day;
                priceFlashSaleBack = tempPrice.PricePromotionFlashSale;
                hasPro = true;
                $("#dvKeepseat").hide();
                $("#dvSpecialBack").show();
                $("#dvNoteSpecial").removeClass('hidden');
            }
            orderDetail_data[i]["PriceWithVATReturn"] = priceWithVATSource;
            orderDetail_data[i]["TicketPriceIdBack"] = tempPrice.TicketPriceId;
            orderDetail_data[i]["HasApplyPromotionSpecialReturn"] = hasPro;

            justPrice["PriceWithVATReturn"] = orderDetail_data[i]["PriceWithVATReturn"]
            justPrice["TicketPriceIdBack"] = orderDetail_data[i]["TicketPriceIdBack"]

            try {
                ResultData[i]["PriceWithVATReturn"] = priceWithVATSource;
                ResultData[i]["TicketPriceIdBack"] = tempPrice.TicketPriceId;
            } catch (err) {}

            totalReturn += $.Helpers.formatValue(orderDetail_data[i]["PriceWithVATReturn"], 'number');
            if (routeApplyFeeHarbor.includes("," + RouteId + ",")) {
                totalReturnFeeHarbor += enum_FEEHARBORAMT;
            }

        }

        if (ticketTypeId == myEnum.VeNguoiLon)
            ve_nguoi_lon++;
        else if (ticketTypeId == myEnum.VeTreEm)
            tre_em++;
        else if (ticketTypeId == myEnum.VeNguoiCaoTuoi)
            nguoi_cao_tuoi++;
        else if (ticketTypeId == myEnum.VeMoi)
            ve_moi++;
        //Set the Price value for every detail
        $.Helpers.setDataObject(".info-ticket .ticket", '[otype="odetail"]', justPrice, i);
    }
    total = $.Helpers.formatValue(totalDepart, 'number') + $.Helpers.formatValue(totalReturn, 'number') + totalDepartFeeHarbor + totalReturnFeeHarbor;
    $('.TotalDepart').text($.Helpers.formatValue(totalDepart, 'currency') + ' ' + JsResource.VNĐ);
    $('.TotalReturn').text($.Helpers.formatValue(totalReturn, 'currency') + ' ' + JsResource.VNĐ);
    $('#TotalDepartFn').text($.Helpers.formatValue(totalDepart, 'currency') + ' ' + JsResource.VNĐ);
    $('#TotalReturnFn').text($.Helpers.formatValue(totalReturn, 'currency') + ' ' + JsResource.VNĐ);
    if (hasPro) {
        $('.Special3Day').text($.Helpers.formatValue(priceSpecial3Day, 'currency') + ' ' + JsResource.VNĐ);
        $('.Special1Day').text($.Helpers.formatValue(priceSpecial1Day, 'currency') + ' ' + JsResource.VNĐ);
        $('.Special3DayBack').text($.Helpers.formatValue(priceSpecial3DayBack, 'currency') + ' ' + JsResource.VNĐ);
        $('.Special1DayBack').text($.Helpers.formatValue(priceSpecial1DayBack, 'currency') + ' ' + JsResource.VNĐ);
        $('.FlashSale').text($.Helpers.formatValue(priceFlashSale, 'currency') + ' ' + JsResource.VNĐ);
        $('.FlashSaleBack').text($.Helpers.formatValue(priceFlashSaleBack, 'currency') + ' ' + JsResource.VNĐ);
		if (priceFlashSale != 0) {
            $('#pNoteFlashsale').removeClass("hidden");
        } else {
            $('#pNoteFlashsale').addClass("hidden");
        }
    }

    if (routeApplyFeeHarbor.includes("," + RouteId + ",")) {
        $('.TotalDepartFeeHarbor').text($.Helpers.formatValue(totalDepartFeeHarbor, 'currency') + ' ' + JsResource.VNĐ);
        $('.TotalReturnFeeHarbor').text($.Helpers.formatValue(totalReturnFeeHarbor, 'currency') + ' ' + JsResource.VNĐ);
        $('#TotalDepartFnFeeHarbor').text($.Helpers.formatValue(totalDepartFeeHarbor, 'currency') + ' ' + JsResource.VNĐ);
        $('#TotalReturnFnFeeHarbor').text($.Helpers.formatValue(totalReturnFeeHarbor, 'currency') + ' ' + JsResource.VNĐ);
    } else {
        $('.TotalDepartFeeHarbor').remove();
        $('.TotalReturnFeeHarbor').remove();
        $('#TotalDepartFnFeeHarbor').remove();
        $('#TotalReturnFnFeeHarbor').remove();
    }

    $('#TotalValueFnFeeHarbor').text($.Helpers.formatValue((totalDepartFeeHarbor + totalReturnFeeHarbor), 'currency') + ' ' + JsResource.VNĐ);
    $('.TotalValue').text($.Helpers.formatValue(total, 'currency') + ' ' + JsResource.VNĐ);
    $('#TotalValueFn').text($.Helpers.formatValue(total, 'currency') + ' ' + JsResource.VNĐ);
    $('.QuantityPassenger').text(ResourceArr["Include"] + ": "
        + ((ve_nguoi_lon || 0) <= 0 ? "" : ve_nguoi_lon + " " + ResourceArr["AdultTickets"])
        + ((tre_em || 0) <= 0 ? "" : " " + tre_em + " " + ResourceArr["ChildTicket"])
        + ((ve_moi || 0) <= 0 ? "" : " " + ve_moi + " " + ResourceArr["VeMoi"])
        + ((nguoi_cao_tuoi || 0) <= 0 ? "" : " " + nguoi_cao_tuoi + " " + ResourceArr["SeniorTickets"])
    );

}

function calculateAge(yob) {
    if (yob != null) {
        yob = yob.substring(6, 10);
    }

    var now = new Date();
    var nowYear = now.getFullYear();
    var age = nowYear - yob;

    return age;
};


function initialBooking() {
    $('#dpDepartDate').datetimepicker({
        defaultDate: moment().startOf('day'),
        minDate: moment().startOf('day'),
        format: 'DD/MM/YYYY',
        allowInputToggle: true
    });
    var departDateForReturn = $('#dpDepartDate').val();
    $('#dpReturnDate').datetimepicker({
        //defaultDate: moment().startOf('day'),
        //minDate: moment().startOf('day'),
        defaultDate: moment(departDateForReturn, 'DD/MM/YYYY').format("YYYY-MM-DD"),
        minDate: moment(departDateForReturn, 'DD/MM/YYYY').format("YYYY-MM-DD"),
        format: 'DD/MM/YYYY',
        allowInputToggle: true
    });
    $('#dpReturnDate2').datetimepicker({
        defaultDate: moment().startOf('day'),
        minDate: moment().startOf('day'),
        format: 'DD/MM/YYYY',
        allowInputToggle: true
    });

    var frmBookingWizard = $('#frmBookingWizard');

    // Toolbar extra buttons
    var btnFinish = $('<button></button>')
        .text(ResourceArr["Finish"])
        .addClass('btn btn-primary btn-finish hide')
        .on('click', function () {
            if ($("#Law").prop("checked") == false) {
                return false;
            }
            if (!$(this).hasClass('disabled')) {
                var elmForm = frmBookingWizard;
                if (elmForm) {
                    var elmErr = elmForm.find('.has-error');
                    if (elmErr && elmErr.length > 0) {
                        var Mess = ResourceArr["PleaseCheckInfomation"];
                        swal(title, Mess, "info");
                        return false;
                    } else {
                        var distance = new Date().getTime() - minutesTimeOut;
                        var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
                        if (minutes < MINUTES_TIME_OUT) {
                            createOrder();
                        }
                        else {
                            swal({
                                title: JsResource.TimeOutTransaction,
                                type: "error"
                            }).then(() => {
                                window.location.href = $('#UrlStorage').data('urlbookingpage');
                            })
                        }
                        return false;
                    }
                }
            }
        });

    // Smart Wizard
    frmBookingWizard.smartWizard({
        theme: 'arrows',
        selected: 0,
        useURLhash: false,
        keyNavigation: false,
        showStepURLhash: false,
        autoAdjustHeight: false,
        transitionEffect: 'fade',
        lang: {  // Language variables
            next: ResourceArr["Next"],
            previous: ResourceArr["Previous"],
            finish: ResourceArr["Finish"]
        },
        toolbarSettings: {
            toolbarPosition: 'bottom',
            toolbarExtraButtons: [btnFinish]
        },
        anchorSettings: {
            markDoneStep: true, // add done css
            markAllPreviousStepsAsDone: true, // When a step selected by url hash, all previous steps are marked done
            removeDoneStepOnNavigateBack: true, // While navigate back done step after active step will be cleared
            enableAnchorOnDoneStep: true // Enable/Disable the done steps navigation
        }
    });

    frmBookingWizard.on("leaveStep", function (e, anchorObject, stepNumber, stepDirection) {
        var elmForm = $("#form-step-" + stepNumber);
        // stepDirection === 'forward' :- this condition allows to do the form validation
        // only on forward navigation, that makes easy navigation on backwards still do the validation when going next
        if (stepDirection === 'forward' && elmForm) {
            if (elmForm.data('toggle') == 'validator') {
                elmForm.validator('update');
                elmForm.validator('validate');
                var elmErr = elmForm.find('.has-error');
                if (elmErr && elmErr.length > 0) {
                    return false;
                }
            }
            // STEP 1
            //Bắt đầu bước nhập thông tin người đặt
            if (stepNumber == myEnumStepBooking.StepChooseBoat) {
                if (userId) {
                    $('#CustomerNm').val(accountName);
                    $('#CustomerPhone').val(accountPhone);
                    $('#CustomerEmail').val(accountEmail);
                }

                var valSelect = $('#boat-info').bootstrapTable('getSelections');
                var valSelectReturn = undefined;
                ////    add Responsive for Thong tin chuyen di
                ////$(".divDeapartTrip").addClass("col-sm-12 col-xs-12");
                ////$(".divDeapartTrip").removeClass("col-sm-6 col-xs-6");
                if (valSelect.length != 0) {
                    //kiem tra so hanh khach ko duoc vuot qua so ve con lai
                    if (BookingInfo["NoOfRemain"] < BookingInfo["NoOfPassenger"]) {
                        var Mess = ResourceArr["NotEnoughRoom"];
                        swal(title, Mess, "error");
                        return false;
                    }
                } else {
                    var Mess = ResourceArr["PleaseSelectTime"];
                    swal(title, Mess, "error");
                    return false;
                }
                $('[okey="TicketClassBack"').prop("disabled", true);
                //Neu chon khu hoi
                if (ReturnDate) {
                    $('[okey="TicketClassBack"').prop("disabled", false);
                    valSelectReturn = $('#boat-info-return').bootstrapTable('getSelections');
                    if (valSelectReturn.length != 0) {
                        //save data from selected voyage

                        //  Kiem tra gio tau ve - gio tau di >=  2h trong cung 1 ngay
                        if (BookingInfo["DepartDate"] == BookingInfoBack["DepartDate"]) {
                            if (parseInt(BookingInfoBack["DepartTime"]) - parseInt(BookingInfo["DepartTime"]) < parseInt(HourDifferRoundTrip)) {
                                var Mess = ResourceArr["DepartTimeInSameDay"];
                                swal(title, Mess, "error");
                                return false;
                            }
                        }

                        //kiem tra so hanh khach ko duoc vuot qua so ve con lai
                        if (BookingInfoBack["NoOfRemain"] < BookingInfo["NoOfPassenger"]) {
                            var Mess = ResourceArr["NotEnoughRoom"];
                            swal(title, Mess, "error");
                            return false;
                        }
                    } else {
                        var Mess2 = Resources.PleaseSelectTimeReturn;
                        swal(title, Mess2, "error");
                        return false;
                    }
                }

                //load gia cho nay -> doi sang khi chon tau load luon
                //getTicketPriceList(BookingInfo["RouteId"], BookingInfo["BoatTypeId"], BookingInfo["DepartDate"], BookingInfo["DepartTime"], BookingInfo["NoOfPassenger"]).then(function (data) {
                //    departBookingPrice = data;
                //    onCalculatorForPassType(true);
                //});

                //if (ReturnDate) {
                //    $('#CustomerVoucher').attr('disabled', 'disabled');
                //    getTicketPriceList(BookingInfoBack["RouteId"], BookingInfoBack["BoatTypeId"], BookingInfoBack["DepartDate"], BookingInfoBack["DepartTime"], BookingInfoBack["NoOfPassenger"]).then(function (data) {
                //        returnBookingPrice = data;
                //    });
                //}

                if (ReturnDate) {
                    $('#CustomerVoucher').attr('disabled', 'disabled');
                } else {
                    $('#CustomerVoucher').removeAttr('disabled');
                }
            }
            // STEP 2
            // Thông tin hành khách
            else if (stepNumber == myEnumStepBooking.StepBookerInfo) {
                //reset vemoi
                var justTypeNew = new Object();
                justTypeNew["TicketTypeId"] = ticketTypeIdFree;
                 
                var mySelf = $("#chkMySelf").is(":checked");
                if (mySelf == true) {
                    initialising = true;

                    DataCustomer["FullNm"] = $('#CustomerNm').val();
                    DataCustomer["PhoneNo"] = $('#CustomerPhone').val();
                    DataCustomer["Email"] = $('#CustomerEmail').val();
                    
                    $.Helpers.setDataObject(".info-ticket .ticket", '[otype="odetail"]', DataCustomer, 0);

                    var objFullNm = {
                        name: $('#CustomerNm').val().toUpperCase(),
                        id: 0
                    }
                    var selectize = $('.info-ticket [data-index="0"]').find('[okey="FullNm"]').selectize()[0].selectize;
                    selectize.addOption(objFullNm);
                    selectize.setValue($('#CustomerNm').val().toUpperCase()); 
                }
				let taxcode = $("#Taxcode").val().trim();
                let company = $("#CompanyNm").val().trim();
                    // Kiểm tra độ dài hợp lệ: 10, 12 hoặc 14 ký tự (cho phép có '-')
                    let cleaned = taxcode.replace(/-/g, ""); // bỏ dấu '-'
                    if (taxcode && !(cleaned.length === 10 || cleaned.length === 12 || cleaned.length === 14)) {
                        alert("Mã số thuế chỉ được phép có 10, 12 hoặc 14 ký tự (không tính dấu '-')/Tax codes are only allowed to have 10, 12 or 14 characters (excluding the '-' sign)");
                        $("#Taxcode").focus();
                        return false;
                    }

                    // Nếu mã số thuế có giá trị => bắt buộc nhập tên công ty
                    if (taxcode !== "" && company === "") {
                        alert("Vui lòng nhập tên công ty khi có mã số thuế./Please enter company name when tax code is available.");
                        $("#CompanyNm").focus();
                        return false;
                    }
                $('.info-ticket').find('[okey="FullNm"]').trigger("keyup");
                //   Get now Year and calculate to Adult Year
                var now = new Date();
                var nowYear = now.getFullYear();
                var AdultYear = nowYear - 18;
                var DefaultAge = '01/01/' + AdultYear;

                $('.info-ticket').find('[okey="YOB"]').mask('99/99/9999', {
                    placeholder: '__/__/____'
                });
               
                //NEW: VOUCHER ->1 chieu moi ap dung =>KO DUNG NEN DONG LAI
                //if (ReturnDate === undefined && null != $('#CustomerVoucher').val() && $('#CustomerVoucher').val() != '') {
                //    loadTicketTypeWithVoucher();
                //    getPromotionsWithVoucher($('#CustomerVoucher').val(), $('#CustomerPhone').val() , BookingInfo["DepartDate"], BookingInfo["RouteId"]).then(function (data) {
                //        var proCode = data;
                //        $('#lblMessTicketType').text('(' + Resources.MessHaveFee + ' ' + proCode.NumberOfUse + ' ' + Resources.VeMoi + ')');
                //        BookingInfo["Voucher"] = $('#CustomerVoucher').val();
                //        for (var i = 0; i < BookingInfo["NoOfPassenger"]; i++) {
                //            if (i < proCode.NumberOfUse) {
                //                $.Helpers.setDataObject(".info-ticket .ticket", '[otype="odetail"]', justTypeNew, i);
                //            }
                //        }
                         
                //    }); 
                //} 
                //END VOUCHER 
                //check taxt code
                var Taxcode = $('#Taxcode').val();
                var CompAdd = $('#CompanyAddr').val();
                var CompNm = $('#CompanyNm').val();
                if (Taxcode.length != 0 && Taxcode.length != 12 && Taxcode.length != 10 && Taxcode.length != 14) {
                    toastr["error"](JsResource.TaxCodeValidateFormat);
                    return false;
                }
                if (Taxcode.length == 14 && Taxcode.indexOf('-') != 10) {
                    toastr["error"](JsResource.TaxCodeValidateFormat);
                    return false;
                }
                if (Taxcode.length != 0 && CompNm.length == 0) {
                    toastr["error"](JsResource.TaxCodeValidateComNm);
                    return false;
                }
                if (Taxcode.length != 0 && CompAdd.length == 0) {
                    toastr["error"](JsResource.TaxCodeValidateAddr);
                    return false;
                }
            }
            // STEP 3
            //Tạo hoặc chọn ghế
            else if (stepNumber == myEnumStepBooking.StepPassenger) {
                swalProcessing();
                ResultData = [];
                ResultData = $.Helpers.serializeDataArray(".info-ticket .ticket", '[otype="odetail"]');
                //Param check time before click "Thanh toán" button 
                minutesTimeOut = new Date().getTime();

                //    begin counting time out 
                if (currentDateGot == false) {
                    CurrentDate = new Date();
                    currentDateGot = true;
                }
                var Required = ResourceArr["Required"];

                var ChildTicket = 0;
                var listIDNo = new Array();
                //check YOB and remember chosen seats if moving backward
                for (var i = 0; i < ResultData.length; i++) {

                    if (seatList.length > 0) {
                        ResultData[i].PositionId = seatList[i].PositionId;
                        ResultData[i].SeatNm = seatList[i].SeatNm;
                        ResultData[i].IsVIP = seatList[i].IsVIP;
                        ResultData[i].SeatId = seatList[i].SeatId;
                        ResultData[i].TicketPriceId = seatList[i].TicketPriceId;
                        if (ReturnDate) {
                            ResultData[i].PositionIdBack = seatList[i].PositionIdBack;
                            ResultData[i].SeatNmBack = seatList[i].SeatNmBack;
                            ResultData[i].IsVIPBack = seatList[i].IsVIPBack;
                            ResultData[i].SeatIDBack = seatList[i].SeatIDBack;
                            ResultData[i].TicketPriceIdBack = seatList[i].TicketPriceIdBack;
                        }
                    }

                    if (ResultData[i]["TicketTypeId"] == myEnum.VeTreEm) {
                        var age = calculateAge(ResultData[i]["YOB"]);
                        ChildTicket++;
                        if (age > 11) {
                            var Mess = ResourceArr["CannotBuyChild"];
                            var ageST = ResourceArr["YOB"] + " " + ResultData[i]["YOB"];
                            asyncSwal(Required, ageST + " " + Mess, "error");
                            return false;
                        }
                    } else if (ResultData[i]["TicketTypeId"] != myEnum.VeTreEm && ResultData[i]["TicketTypeId"]!= myEnum.VeMoi) {
                        var age = calculateAge(ResultData[i]["YOB"]);
                        if (age < 12) {
                            var Mess = ResourceArr["CannotBuyAdult"];
                            var ageST = ResourceArr["YOB"] + " " + ResultData[i]["YOB"];
                            asyncSwal(Required, ageST + " " + Mess, "error");
                            return false;
                        }
                    } else {
                        if (age < 0) {
                            var Mess = Resources.Invalid;
                            var ageST = ResourceArr["YOB"] + " " + ResultData[i]["YOB"];
                            asyncSwal(Required, ageST + " " + Mess, "error");
                            return false;
                        }
                    }
                    var found = jQuery.inArray(ResultData[i]["IdNo"], listIDNo);
                    if (found < 0) {
                        listIDNo.push(ResultData[i]["IdNo"]);
                    } else {
                        if (!ResultData[i]["IdNo"].includes("TE")) { //if IdNo is not for child
                            var Mess = ResourceArr["Duplicate"];
                            asyncSwal(Required, Mess, "error");
                            return false;
                        }
                        listIDNo.push(ResultData[i]["IdNo"]);
                    }
                    //parse IsGender from string to bool
                    ResultData[i].IsGender = (ResultData[i].IsGender === 'true');
                }
                if (ChildTicket == ResultData.length) {
                    var Mess = ResourceArr["GoWith"];
                    asyncSwal(Required, Mess, "error");
                    return false;
                }
                if (ReturnDate) {
                    boat.AutoGetSeats(BookingInfo, BookingInfoBack);
                } else {
                    boat.AutoGetSeats(BookingInfo, null);
                }

                if ($('#CustomerNm').val() == '') {
                    $('#CustomerNm').val(ResultData[0]["FullNm"]).trigger('change');
                    $('#CustomerPhone').val(ResultData[0]["PhoneNo"]).trigger('change');
                    $('#CustomerEmail').val(ResultData[0]["Email"]).trigger('change');
                }
                //Set ticket type + ticket price for Depart trip
                for (var i = 0; i < ResultData.length; i++) {
                    //Save original ticket type id
                    ResultData[i]["VoyageId"] = BookingInfo["VoyageId"];
                    ResultData[i]["ScheduleId"] = BookingInfo["ScheduleId"];
                    ResultData[i]["OriginTkTypeId"] = ResultData[i]["TicketTypeId"];
                    var ticketTypeId = ResultData[i]["TicketTypeId"];
                    var resourceNm =  ResourceArr["AdultTickets"];
                    switch (parseInt(ticketTypeId)) {
                        case myEnum.VeNguoiLon:
                            resourceNm = ResourceArr["AdultTickets"];
                            break;
                        case myEnum.VeTreEm:
                            resourceNm = ResourceArr["ChildTicket"];
                            break;
                        case myEnum.VeMoi:
                            resourceNm = ResourceArr["VeMoi"];
                            break;
                        case myEnum.VeNguoiCaoTuoi:
                            resourceNm = ResourceArr["SeniorTickets"];

                    }

                    ResultData[i]["TicketTypeNm"] = resourceNm;
                    ResultData[i]["OriginTkTypeNm"] = resourceNm;
                    ResultData[i]["KeepTime"] = BookingInfo["KeepTime"];
                    ResultData[i]["No"] = i + 1;
                    ResultData[i]["Info"] = (ResultData[i]["IdNo"] + "</br>" +  ResultData[i]["FullNm"]); //moi them vao de lam xuogn dong thong tin
                }

                //Set ticket type + ticket price for Return trip
                if (ReturnDate) {
                    for (var i = 0; i < ResultData.length; i++) {
                        ResultData[i]["VoyageIdBack"] = BookingInfoBack["VoyageId"];
                        ResultData[i]["ScheduleIdBack"] = BookingInfoBack["ScheduleId"];
                        ResultData[i]["TicketTypeIdBack"] = ResultData[i]["TicketTypeId"];
                        //Save original ticket type id
                        ResultData[i]["OriginTkTypeIdBack"] = ResultData[i]["TicketTypeIdBack"];
                        var ticketTypeIdBack = ResultData[i]["TicketTypeIdBack"];
                        var resourceNm = ResourceArr["AdultTickets"];
                        switch (parseInt(ticketTypeId)) {
                            case myEnum.VeNguoiLon:
                                resourceNm = ResourceArr["AdultTickets"];
                                break;
                            case myEnum.VeTreEm:
                                resourceNm = ResourceArr["ChildTicket"];
                                break;
                            case myEnum.VeMoi:
                                resourceNm = ResourceArr["VeMoi"];
                                break;
                            case myEnum.VeNguoiCaoTuoi:
                                resourceNm = ResourceArr["SeniorTickets"];
                        }
                        ResultData[i]["TicketTypeNmBack"] = resourceNm;
                    }
                }

                $('#tblSeatInfo').bootstrapTable("load", ResultData);
                openTabLayoutGo();
            }
            //Kiểm tra và thanh toán
            else if (stepNumber == myEnumStepBooking.StepBoatLayout) {
                //load data into step 5
                $('.show-bookername').text($('#CustomerNm').val());
                $('.show-bookerphone').text($('#CustomerPhone').val());
                $('.show-bookeremail').text($('#CustomerEmail').val());
                $('.show-bookermemercard').text($('#Bookercard').val());
                $('.show-passenger-billing').text($('#CompanyNm').val());
                $('.show-taxcode-billing').text($('#Taxcode').val());
                $('.show-address-billing').text($('#CompanyAddr').val());
                $('.show-passenger-routeNm').text(BookingInfo["RouteNm"]);
                $('.show-passenger-boatnm').text(BookingInfo["BoatNm"]);
                $('.show-passenger-harbor').text(BookingInfo["BoatHarbor"]);
                $('.show-passenger-departdate').text(displayDepartDate); //BookingInfo["DepartDate"]
                $('.show-passenger-departtime').text(BookingInfo["DepartTime"]);

                $(".isRoundTrip").hide();
                if (ReturnDate) {
                    $('.show-passenger-routeNmBack').text(BookingInfoBack["RouteNm"]);
                    $('.show-passenger-boatnmBack').text(BookingInfoBack["BoatNm"]);
                    $('.show-passenger-harborBack').text(BookingInfoBack["BoatHarbor"]);
                    $('.show-passenger-departdateBack').text(displayReturnDate); //BookingInfo["DepartDate"]
                    $('.show-passenger-departtimeBack').text(BookingInfoBack["DepartTime"]);
                    $(".isRoundTrip").show();
                }


                //ResultData = $.Helpers.serializeDataArray(".info-ticket .ticket", '[otype="odetail"]');
                for (var i = 0; i < ResultData.length; i++) {
                    //Save original ticket type id
                    ResultData[i]["VoyageId"] = BookingInfo["VoyageId"];
                    ResultData[i]["ScheduleId"] = BookingInfo["ScheduleId"];
                    ResultData[i]["OriginTkTypeId"] = ResultData[i]["TicketTypeId"];
                    var ticketTypeId = ResultData[i]["TicketTypeId"];
                    var resourceNm = ResourceArr["AdultTickets"];
                    switch (parseInt(ticketTypeId)) {
                        case myEnum.VeNguoiLon:
                            resourceNm = ResourceArr["AdultTickets"];
                            break;
                        case myEnum.VeTreEm:
                            resourceNm = ResourceArr["ChildTicket"];
                            break;
                        case myEnum.VeMoi:
                            resourceNm = ResourceArr["VeMoi"];
                            break;
                        case myEnum.VeNguoiCaoTuoi:
                            resourceNm = ResourceArr["SeniorTickets"];
                    }
                    ResultData[i]["TicketTypeNm"] = resourceNm;
                    ResultData[i]["OriginTkTypeNm"] = resourceNm;
                    ResultData[i]["KeepTime"] = BookingInfo["KeepTime"];
                    ResultData[i]["No"] = i + 1;
                    ResultData[i]["Info"] = (ResultData[i]["IdNo"] + "</br>" + ResultData[i]["FullNm"]); //moi them vao de lam xuogn dong thong tin
                }

                //Set ticket type + ticket price for Return trip
                if (ReturnDate) {
                    for (var i = 0; i < ResultData.length; i++) {
                        ResultData[i]["VoyageIdBack"] = BookingInfoBack["VoyageId"];
                        ResultData[i]["ScheduleIdBack"] = BookingInfoBack["ScheduleId"];
                        ResultData[i]["TicketTypeIdBack"] = ResultData[i]["TicketTypeId"];

                        //Save original ticket type id
                        ResultData[i]["OriginTkTypeIdBack"] = ResultData[i]["TicketTypeIdBack"];
                        var ticketTypeIdBack = ResultData[i]["TicketTypeIdBack"];
                        var resourceNm = ResourceArr["AdultTickets"];
                        switch (parseInt(ticketTypeId)) {
                            case myEnum.VeNguoiLon:
                                resourceNm = ResourceArr["AdultTickets"];
                                break;
                            case myEnum.VeTreEm:
                                resourceNm = ResourceArr["ChildTicket"];
                                break;
                            case myEnum.VeMoi:
                                resourceNm = ResourceArr["VeMoi"];
                                break;
                            case myEnum.VeNguoiCaoTuoi:
                                resourceNm = ResourceArr["SeniorTickets"];
                        }
                        ResultData[i]["TicketTypeNmBack"] = resourceNm;
                    }
                }


                //Change ticket type to VIP if user choose VIP seat during STEP 4
                for (var i = 0; i < ResultData.length; i++) {
                    if (!ResultData[i]['PositionId']) {
                        swal(ResourceArr["Required"], JsResource.PleaseChooseSeat, "warning");
                        return false;
                    }

                    if (ReturnDate && !ResultData[i]['PositionIdBack']) {
                        swal(ResourceArr["Required"], JsResource.PleaseChooseSeat, "warning");
                        return false;
                    }
                    ResultData[i]["TicketTypeId"] = ResultData[i]["OriginTkTypeId"];
                    ResultData[i]["TicketTypeNm"] = ResultData[i]["OriginTkTypeNm"];

                    if (ReturnDate) {
                        ResultData[i]["TicketTypeIdBack"] = ResultData[i]["OriginTkTypeIdBack"];
                        ResultData[i]["TicketTypeNmBack"] = ResultData[i]["OriginTkTypeNm"];
                    }
                    $('#tblSeatInfo').bootstrapTable("load", ResultData);
                }
                onCalculatorForPassType(true);
                $('#show-boat-info').bootstrapTable("load", ResultData);
                if (ReturnDate) {
                    $('#show-roundtrip-info').bootstrapTable("load", ResultData);
                }
            }
        }

        if (stepDirection === 'backward' && stepNumber == myEnumStepBooking.StepBoatLayout) {
            seatList = [];
            $.each(ResultData, function (i, seat) {
                seatList.push(seat);
                seatList[i].PositionId = seat.PositionId;
                seatList[i].SeatNm = seat.SeatNm;
                seatList[i].IsVIP = seat.IsVIP;
                seatList[i].SeatId = seat.SeatId;
                seatList[i].TicketPriceId = seat.TicketPriceId;
                if (ReturnDate) {
                    seatList[i].PositionIdBack = seat.PositionIdBack;
                    seatList[i].SeatNmBack = seat.SeatNmBack;
                    seatList[i].IsVIPBack = seat.IsVIPBack;
                    seatList[i].SeatIdBack = seat.SeatIdBack;
                    seatList[i].TicketPriceIdBack = seat.TicketPriceIdBack;
                }
            });
            ResultData = [];
        } else if (stepDirection === 'backward' && stepNumber == myEnumStepBooking.StepPassenger) {
            resultForVoucher = [];
            $('#lblMessTicketType').text('');
            BookingInfo["Voucher"] = "";
            onCalculatorForPassType();
        }
        return true;
    });

    frmBookingWizard.on("showStep", function (e, anchorObject, stepNumber, stepDirection) {
        // Enable finish button only on last step
        if (stepNumber == myEnumStepBooking.StepPayment) {
            $("#Law").prop('checked', false);   // Clear checkbox last step show
            $('.btn-finish').removeClass('hide');

            $('html, body').animate({
                scrollTop: $('.panel-title').offset().top
            }, 500);

        } else {
            $('.btn-finish').addClass('disabled hide');
        }
    });
}

function resolveAfterSeconds() {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('resolved');
        }, 500);
    });
}

async function asyncSwal(Required, Mess, Type) {
    var result = await resolveAfterSeconds();
    swal(Required, Mess, Type).catch(swal.noop);
}

$(document).ready(function () {
    //$('#boat-info').bootstrapTable({ locale: 'vi-VN' });
    //$('#boat-info-return').bootstrapTable({ locale: 'vi-VN' });
    //var cultureCookie = readCookie('culture');
    //console.log(cultureCookie);
    //if (cultureCookie == 'en') {
    //  $('#boat-info').bootstrapTable({ locale: 'en-US' });
    //  $('#boat-info-return').bootstrapTable({ locale: 'en-US' });
    //}
    $(window).on('beforeunload', function () {
        $(window).scrollTop(0);
    });
    //Lấy danh sách hành khách đi kèm
    getPassTogether();



    $('#slRoute').select2();
    initialBooking();
    getSystemConfig();

    $('#boat-info').on("click-row.bs.table", function ($el, row, field) {
        isRendered = false;
        bookingList = [];
        $boatLayoutContainer.find("span.selected").removeClass('.selected .seat-selecting');
        boat.RemoveBoatLayout('#boat-layout-container-wrapper', isRendered);
        voyageInfo = row;
        voyageInfo.IsReturn = false;

        bookingList.push({ id: "#boat-layout-container-wrapper", voyage: voyageInfo, isRendered: isRendered });
        boat.RenderBoatLayout(bookingList);
    });
    $('#boat-info-return').on("click-row.bs.table", function ($el, row, field) {
        isRenderedReturn = false;
        bookingList = [];
        $boatLayoutContainerReturn.find("span.selected").removeClass('.selected .seat-selecting');
        boat.RemoveBoatLayout('#boat-layout-container-return-wrapper', isRenderedReturn);
        voyageInfoReturn = row;
        voyageInfoReturn.IsReturn = true;

        bookingList.push({ id: "#boat-layout-container-return-wrapper", voyage: voyageInfoReturn, isRendered: isRenderedReturn });
        boat.RenderBoatLayout(bookingList);

    });

    $('#slRoute').on('select2:select select2:close', function (e) {
        $(this).closest('form').find('#dpDepartDate').focus();
    });

    $('#dpDepartDate').on('dp.hide', function () {
        if ($('#RoundTrip').hasClass('active')) {
            $(this).closest('form').find('#dpReturnDate').focus();
        } else {
            $(this).closest('form').find('#NoOfPassenger').focus();

            loadWizardData();
            //$('#dpDepartDate').data('DateTimePicker').toggle('dp.hide');
        }
    });

    $('#dpReturnDate').on('dp.hide', function () {
        $(this).closest('form').find('#NoOfPassenger').focus();

        loadWizardData();
    });

});

async function getTicketPriceList(RouteId, BoatTypeId, DepartDate, DepartTime,NoOfPassenger) {
    var result = [];
    await $.get($('#UrlStorage').data('urlgetticketprice'), { RouteId: RouteId, BoatTypeId: BoatTypeId, DepartDate: DepartDate, DepartTime: DepartTime, NoOfPassenger: NoOfPassenger }, function (data) {
        result = data;
    }, 'json');
    return result;
}

function getUrlParameter(sParam) {
    var sPageURL = decodeURIComponent(window.location.search.substring(1)),
        sURLVariables = sPageURL.split('&'),
        sParameterName,
        i;
    for (i = 0; i < sURLVariables.length; i++) {
        sParameterName = sURLVariables[i].split('=');

        if (sParameterName[0] === sParam) {
            return sParameterName[1] === undefined ? true : sParameterName[1];
        }
    }
};

function ChangeUrl(title, url) {
    if (typeof (history.pushState) != "undefined") {
        var obj = { Title: title, Url: url };
        history.pushState(obj, obj.Title, obj.Url);
    } else {
        alert("Browser does not support HTML5.");
    }
}

//Check if passenger is child
function isChildInfo($inputYOB, $inputTicketType) {
    var isChild = false;
    var valYOB = 0;

    var rangAgeChild = RANGE_AGE_TYPE_TICKET[myEnum.VeTreEm];
    //valYOB = parseInt($inputYOB.val()) || 0;
    if ($inputYOB) {
        valYOB = $inputYOB.substring(6, 10);
    }
    var age = CURRENT_YEAR - valYOB;
    if ($inputTicketType == 2 || age <= rangAgeChild.max) {
        isChild = true;
    }    
    //    if ($inputTicketType.indexOf("trẻ em") != -1 || age <= rangAgeChild.max) {
    //    isChild = true;
    //}
    return isChild;
}

//Validate Id No based on ticket type and YOB
function validateIdNo($ticketInfo) {
    var $ticketType = $ticketInfo.find('select[okey="TicketTypeId"] :selected').val();
    var $inputYOB = $ticketInfo.find('input[okey="YOB"]').val();
    var $inputIdNo = $ticketInfo.find('input[okey="IdNo"]');

    var isChild = isChildInfo($inputYOB, $ticketType);
    var idNo = $inputIdNo.val();
    if (isChild == false && idNo.toUpperCase() == DEFAUT_ID_NO) {
        $inputIdNo.val("");
        if (!$inputIdNo.data('setdefault')) {
            $inputIdNo.focus();
            toastr["error"](JsResource.InvalidIdNo);
        }
        return false;
    }
    //set default id no
    if (isChild == true && idNo == '') {
        $inputIdNo.val(DEFAUT_ID_NO);
        $inputIdNo.data('setdefault', true);
    }
    return true;
}

//check valid YOB based on TicketType
function validateYOBAndTypeTicket($inputYOB, $inputTicketType, $nationId) {
    //Get input YOB and check if empty
    var valYOB = 0;
    //var valYOB = parseInt($inputYOB.val()) || 0;
    if ($inputYOB) {
        valYOB = $inputYOB.substring(6, 10);
    }
    if (valYOB == 0) {
        return true;
    }

    var RANGE_AGE = {};
    //if ($nationId != nationIdEnum.VietNam) {// nationId = 1 : quoc tich Viet Nam
    //    RANGE_AGE = RANGE_AGE_TYPE_TICKET_FOREIGN;
    //} else {
        RANGE_AGE = RANGE_AGE_TYPE_TICKET;
    //}
    //Get and set age range based on chosen ticket type
    var rangeAge = RANGE_AGE[$inputTicketType];
    if (!rangeAge) {
        maxAge = MAX_AGE;
        minAge = MIN_AGE;
    } else {
        var maxAge = rangeAge.max ? rangeAge.max : MAX_AGE;
        var minAge = rangeAge.min ? rangeAge.min : MIN_AGE;
    }

    var valAge = CURRENT_YEAR - valYOB; //calculate current age based on input YOB

    //check valYOB if in valid rangeAge
    if (valAge >= minAge && valAge <= maxAge) {
        return true;
    }
    return false;
}

//change TicketType based on YOB
function changeTypeTicketByYOB($inputYOB, $inputTicketType, $nationId) {
    //Get input YOB and check if empty
    var valYOB = 0;
    //var valYOB = parseInt($inputYOB) ;
    if ($inputYOB) {
        valYOB = $inputYOB.substring(6, 10);
    }
    if (valYOB == 0) {
        return false;
    }

    //Get and set age range based on chosen ticket type
    var RANGE_AGE = {};
    //if ($nationId != nationIdEnum.VietNam) {// nationId = 1 : quoc tich Viet Nam
    //    RANGE_AGE = RANGE_AGE_TYPE_TICKET_FOREIGN;
    //} else {
        RANGE_AGE = RANGE_AGE_TYPE_TICKET;
    //}
    var valAge = CURRENT_YEAR - valYOB; //calculate current age based on input YOB

    var rangeAge = RANGE_AGE[$inputTicketType];
    if (rangeAge === undefined) {
        for (i in RANGE_AGE) {
            if (valAge >= RANGE_AGE[i].min && valAge <= RANGE_AGE[i].max && RANGE_AGE[i].min != 0 && RANGE_AGE[i].max != 0) {
                $inputTicketType = i;
                return $inputTicketType;
            }
        }
    }
    else if (!rangeAge) {
        maxAge = MAX_AGE;
        minAge = MIN_AGE;
    } else {
        var maxAge = rangeAge.max ? rangeAge.max : MAX_AGE;
        var minAge = rangeAge.min ? rangeAge.min : MIN_AGE;
    }

    

    ////check valYOB if in valid rangeAge
    if (valAge >= minAge && valAge <= maxAge) {
        return true;
    }
    else {
        for (i in RANGE_AGE) {
            if (valAge >= RANGE_AGE[i].min && valAge <= RANGE_AGE[i].max && RANGE_AGE[i].min != 0 && RANGE_AGE[i].max != 0) {
                $inputTicketType = i;
                return $inputTicketType;
            }
        }
    }
    //}
    return false;
}

$(document).on('focusin', '.info-ticket input[okey="IdNo"]', function () {
    $(this).data('oldVal', $(this).val());
});

$(document).on('focusout', '.info-ticket input[okey="IdNo"]', function () {
    var $inputIdNo = $(this).val();

    if ($inputIdNo != '') {
        var option = {};
        var $passengerNo = $(this).parents('.ticket').data('index');
        LIST_ID_NO[$passengerNo] = $inputIdNo;
    }
});

$(document).on('change', '.info-ticket input[okey="IdNo"]', function (e) {
    var $ticketInfo = $(this).parents('.ticket');
    var $passengerNo = $ticketInfo.data('index');
    var $inputIdNo = $(this);
    var $ticketType = $ticketInfo.find('select[okey="TicketTypeId"] :selected').text();

    var newIdNo = $inputIdNo.val();
    var oldIdNo = $inputIdNo.data('oldVal');
    if (oldIdNo === undefined) {
        oldIdNo = "";
    }

    $inputIdNo.data('setdefault', false);

    if (newIdNo.toUpperCase() == DEFAUT_ID_NO) {
        validateIdNo($ticketInfo);
        return;
    }

    if (newIdNo != oldIdNo) {
        for (i = 0; i < LIST_ID_NO.length; i++) {
            if ($passengerNo == i) {
                if (newIdNo != LIST_ID_NO[i]) {
                    LIST_ID_NO[i] = newIdNo;
                    $inputIdNo.data('oldVal', newIdNo);
                }
            } else {
                if (newIdNo == LIST_ID_NO[i]) {
                    $inputIdNo.val(oldIdNo);
                    $inputIdNo.focus();
                    var passNoMatched = i + 1;
                    toastr["error"](JsResource.DuplicationIdNoOnline + ' ' + passNoMatched);
                }
            }
        }
    }

    if (!validateIdNo($ticketInfo)) {
        toastr.error(Resources.InvalidIdNo);
        $inputIdNo.val('');
        $inputIdNo.trigger('change');
    }
});

//Validate YOB after changing ticket type
$(document).on('change', '.info-ticket select[okey="TicketTypeId"]', function (e) {
    var $ticketInfo = $(this).parents('.ticket');
    var $inputTicketTypeId = $(this);
    var $inputYOB = $inputTicketTypeId.parents('.ticket').find('[okey="YOB"]').val();
    var $ticketType = $(this).find(':selected').val();
    var $nationId = $inputTicketTypeId.parents('.ticket').find('[okey="NationId"]').val();

    if (!validateYOBAndTypeTicket($inputYOB, $ticketType, $nationId)) {
        toastr.error(Resources.InvalidYOB);
        $inputTicketTypeId.parents('.ticket').find('[okey="YOB"]').val('');
        $inputTicketTypeId.parents('.ticket').find('[okey="YOB"]').trigger('change');
    }
    //check child
    validateIdNo($ticketInfo);
});

//Validate YOB after entering YOB
$(document).on('focusout', '.info-ticket input[okey="YOB"]', function (e) {
    var $ticketInfo = $(this).parents('.ticket');
    var $inputYOB = $(this).val();
    var $ticketType = $ticketInfo.find('select[okey="TicketTypeId"] :selected').val();
    var $nationId = $ticketInfo.find('select[okey="NationId"] :selected').val();
    //var isValidate = dateTemplate.test($inputYOB);
    //console.log(isValidate);

    if ($inputYOB.length <= 0  ) {
        toastr.error(Resources.RawDOB);
        $(this).val('');
        $(this).trigger('change');
        $(this).parent().addClass('has-error');
        return false;
    } else {
        $(this).parent().removeClass('has-error');
    }

    var validTicketType = changeTypeTicketByYOB($inputYOB, $ticketType, $nationId);

    if (validTicketType !== false && validTicketType !== true) {

        $('select[okey="TicketTypeId"] > option').each(function () {
            if (this.value == validTicketType) {
                $ticketInfo.find('select[okey="TicketTypeId"]').val(this.value).trigger('change');
            }
        });

    } else if (validTicketType === true) {
        $(this).parent().removeClass('has-error');
    } else {
        toastr.error(Resources.InvalidYOB);
        $(this).val('');
        $(this).trigger('change');
        $(this).parent().addClass('has-error');
    }
});

//Allow only numeric characters, tab and backspace for phoneno input
//$(document).on('keydown', '#NoOfPassenger, #CustomerPhone, .info-ticket [okey="PhoneNo"]', function (event) {
//  console.log(event.keyCode);
//  if (event.shiftKey) {
//    return false;
//  }
//  return (event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 96 && event.keyCode <= 105) || event.keyCode == 8 || event.keyCode == 9;
//});


$('#Law').change(function () {
    $('.btn-finish').toggleClass('disabled');
})

//Find voyage by data from redirected index page URL
$.urlParam = function (name) {
    var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
    if (results == null) {
        return null;
    }
    else {
        return decodeURI(results[1]) || 0;
    }
}

function findRedirectedOrder() {
    var routeId = $.urlParam('RouteId');
    var departDate = $.urlParam('DepartDate');
    var returnDate = $.urlParam('ArrivalDate');
    var noOfPassenger = $.urlParam('NoOfPassenger');
    var isRoundTrip = $.urlParam('IsRoundTrip');

    var formatDate = moment(departDate).format('DD/MM/YYYY');
    var formatReturnDate = undefined;
    if (returnDate) {
        var formatReturnDate = moment(returnDate).format('DD/MM/YYYY');
        IsRoundTrip = true;
        TripTypeBtnClick($("#RoundTrip"));
        //$('#RoundTrip').click();
    }

    if (routeId != null && departDate != null && noOfPassenger != null) {
        $('#slRoute').val(routeId).trigger('change');
        $('#dpDepartDate').val(formatDate);
        $('#dpDepartDate').data('DateTimePicker').date(formatDate);
        $('#NoOfPassenger').val(noOfPassenger);
        if (returnDate != null) {
            $('#dpReturnDate').val(formatReturnDate);
            $('#dpReturnDate').data('DateTimePicker').date(formatReturnDate);
        }

        $('#btnSearch').click();
    }
}

//Get tickettype for age from CONFIG
if (TICKET_TYPE_CONFIG_URL) {
    $.ajax({
        type: "GET",
        url: TICKET_TYPE_CONFIG_URL,
        data: null,
        dataType: "json",
        success: function (lstData) {
            RANGE_AGE_TYPE_TICKET = {};

            $.each(lstData.data, function (i, obj) {
                if (obj.KeyConfig == 'MIN_AGE') {
                    if (RANGE_AGE_TYPE_TICKET[obj.TicketTypeId] == undefined) {
                        RANGE_AGE_TYPE_TICKET[obj.TicketTypeId] = {
                            min: null,
                            max: null,
                        }
                    }
                    RANGE_AGE_TYPE_TICKET[obj.TicketTypeId].min = parseInt(obj.ValueConfig);

                } else if (obj.KeyConfig == 'MAX_AGE') {
                    if (RANGE_AGE_TYPE_TICKET[obj.TicketTypeId] == undefined) {
                        RANGE_AGE_TYPE_TICKET[obj.TicketTypeId] = {
                            min: null,
                            max: null,
                        }
                    }
                    RANGE_AGE_TYPE_TICKET[obj.TicketTypeId].max = parseInt(obj.ValueConfig);
                }
            });
        },
        error: function (jqXHR, textStatus, errorThrown) {
            swal({
                type: "error",
                title: Resources.RequestErrorMessage,
                text: "",
                allowOutsideClick: false,
                confirmButtonText: "Reload"
            }).then(function () {
                location.reload();
            });
        }
    });
}

function currencyFormatter(value, row) {
    if (value !== undefined && value != null && value != '') {
        return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");  //Change . to ,
    } else if (value===0) {
        return value;
    }
    else {
        return '';
    }
}

function mobileTicketFormmatter(value, row) {
    return `Hành khách: ${row.FullNm}<br>
            Giá vé: ${currencyFormatter(row.PriceWithVAT, row)} <br>
            Loại vé: ${row.TicketTypeNm} <br>
            Số ghế: ${row.SeatNm}<br>
            Điện thoại: ${row.PhoneNo ?  row.PhoneNo : ""}`;
}

function mobileTicketBackFormmatter(value, row) {
    return `Hành khách: ${row.FullNm}<br>
            Giá vé: ${currencyFormatter(row.PriceWithVAT, row)} <br>
            Loại vé: ${row.TicketTypeNmBack} <br>
            Số ghế: ${row.SeatNmBack}<br>
            Điện thoại: ${row.PhoneNo ? row.PhoneNo : ""}`;
}


function decreaseNumber() {
    var x = $('#NoOfPassenger').val();
    if (x <= 1) {
        $('#btnDecrease').prop('disabled', true);
        return false;
    } else if (x == 2) {
        $('#btnDecrease').prop('disabled', true);
        $("#NoOfPassenger").val(--x);
        return false;
    }
    $("#NoOfPassenger").val(--x);
    return false;
}

function increaseNumber() {
    var x = $('#NoOfPassenger').val();
    if (x >= 1) {
        $('#btnDecrease').prop('disabled', false);
    }
    $("#NoOfPassenger").val(++x);
    return false;
}
function TripTypeBtnClick($this) {
    var id = $this.attr('id');
    if (id == 'RoundTrip') {
        $('#returnDateWrapper').removeClass('hidden');
       
    }
    else {
        $('#returnDateWrapper').addClass('hidden');
    }
    if ($this.hasClass('active')) {
        return false;
    } else {
        $this.addClass("active").siblings().removeClass("active");
        //loadWizardData();
    }
}
$(".btnRadio").click(function () {
    var $this = $(this);
    var id = $this.attr('id');
    if (id == 'RoundTrip') {
        $('#returnDateWrapper').removeClass('hidden');
        $('#departDateWrapper').removeClass('col-lg-4');
        $('#departDateWrapper').addClass('col-lg-2');
        var departDateForReturn = $('#dpDepartDate').val();
        $('#dpReturnDate').datetimepicker({
            defaultDate: moment(departDateForReturn, 'DD/MM/YYYY').format("YYYY-MM-DD"),
            minDate: moment(departDateForReturn, 'DD/MM/YYYY').format("YYYY-MM-DD"),
            format: 'DD/MM/YYYY',
            allowInputToggle: true
        });
        $('#dpReturnDate2').datetimepicker({
            defaultDate: moment(departDateForReturn, 'DD/MM/YYYY').format("YYYY-MM-DD"),
            minDate: moment(departDateForReturn, 'DD/MM/YYYY').format("YYYY-MM-DD"),
            format: 'DD/MM/YYYY',
            allowInputToggle: true
        });

    }
    else {
        $('#returnDateWrapper').addClass('hidden');
        $('#departDateWrapper').removeClass('col-lg-2');
        $('#departDateWrapper').addClass('col-lg-4');
    }
    if ($this.hasClass('active')) {
        return false;
    } else {
        $this.addClass("active").siblings().removeClass("active");
        loadWizardData();
    }
})

$(document).on('click', '#boat-layout-name', function () {
    $(this).find('i').toggleClass('fa-chevron-down fa-chevron-up');
});
$(document).on("focusout", 'input[okey="FullNm"]', function () {
    this.value = this.value.toUpperCase();
    //return $(this).val($(this).val().toUpperCase());
})
function GetMinuteOver() {
    var now = new Date();
    var offset = now.getTime() - CurrentDate.getTime(); // lấy độ lệch của 2 mốc thời gian, đơn vị tính là millisecond 
    var totalMinutes = Math.round(offset / 1000 / 60);
    return totalMinutes;
}

//prevent script when user enter special character directly
$(document).on('keyup', 'input[type="text"], input[type="email"]', function () {
    $(this).val(function (index, value) {
        return value.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
    });
});

//prevent script when user paste special character then submit immediately
$(document).on('focusout', 'input[type="text"], input[type="email"]', function () {
    $(this).val(function (index, value) {
        return value.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
    });
});

//  show data to all InfoTrip in step 1,2,3 when Voyage chose
$(document).on('click', '#boat-info tbody tr', function () {
    var valSelect = $('#boat-info').bootstrapTable('getSelections');
    var valSelectReturn = undefined;
    if (valSelect.length != 0) {
        //save data from selected voyage
        BookingInfo["NoOfRemain"] = valSelect[0]['NoOfRemain'];
        BookingInfo["BoatNm"] = valSelect[0]['BoatNm'];
        BookingInfo["BoatId"] = valSelect[0]['BoatId'];
        BookingInfo["DepartTime"] = valSelect[0]['DepartTime'];
        BookingInfo["BoatHarbor"] = valSelect[0]['Harbor'];
        BookingInfo["BoatTypeId"] = valSelect[0]['BoatTypeId'];
        BookingInfo["Time"] = valSelect[0]['Time'];
        BookingInfo["VoyageId"] = valSelect[0]['VoyageId'];
        BookingInfo["ScheduleId"] = valSelect[0]['ScheduleId'];


        $('.RouteName').text(BookingInfo["RouteNm"]);
        $('.BoatName').text(BookingInfo["BoatNm"]);
        $('.BoatHarbor').text(BookingInfo["BoatHarbor"]);
        $('.BoatTime').text(BookingInfo["DepartTime"]);
        $('.BoatDate').text(displayDepartDate);

        getTicketPriceList(BookingInfo["RouteId"], BookingInfo["BoatTypeId"], BookingInfo["DepartDate"], BookingInfo["DepartTime"], BookingInfo["NoOfPassenger"]).then(function (data) {
            departBookingPrice = data;
            onCalculatorForPassType();
        });

        isApplyPricePromotion = true;
        //var defaultValue = $('input[name="optionPrices"]:checked').val();
        //if ($('.note-apply-price-promotion').is(':hidden')) {

        //} else {
        // Reset về giá trị mặc định
        $('input[name="optionPrices"][value="true"]').prop('checked', true);
    //}
       
    }
});

$(document).on('click', '#boat-info-return tbody tr', function () {
    //Neu chon khu hoi
    if (ReturnDate) {
        valSelectReturn = $('#boat-info-return').bootstrapTable('getSelections');
        if (valSelectReturn.length != 0) {
            //save data from selected voyage
            BookingInfoBack["NoOfRemain"] = valSelectReturn[0]['NoOfRemain'];
            BookingInfoBack["BoatNm"] = valSelectReturn[0]['BoatNm'];
            BookingInfoBack["BoatId"] = valSelectReturn[0]['BoatId'];
            BookingInfoBack["DepartTime"] = valSelectReturn[0]['DepartTime'];
            BookingInfoBack["BoatHarbor"] = valSelectReturn[0]['Harbor'];
            BookingInfoBack["BoatTypeId"] = valSelectReturn[0]['BoatTypeId'];
            BookingInfoBack["Time"] = valSelectReturn[0]['Time'];
            BookingInfoBack["VoyageId"] = valSelectReturn[0]['VoyageId'];
            BookingInfoBack["ScheduleId"] = valSelectReturn[0]['ScheduleId'];


            $('.RouteNameBack').text(BookingInfoBack["RouteNm"]);
            $('.BoatNameBack').text(BookingInfoBack["BoatNm"]);
            $('.BoatHarborBack').text(BookingInfoBack["BoatHarbor"]);
            $('.BoatTimeBack').text(BookingInfoBack["DepartTime"]);
            $('.BoatDateBack').text(displayReturnDate);
                
            getTicketPriceList(BookingInfoBack["RouteId"], BookingInfoBack["BoatTypeId"], BookingInfoBack["DepartDate"], BookingInfoBack["DepartTime"], BookingInfoBack["NoOfPassenger"]).then(function (data) {
                returnBookingPrice = data;
                onCalculatorForPassType();
                });

        }
    }
});
//  Validate CustomerPhone length in Step 2
$(document).on('focusout', '#CustomerPhone', function () {
    if ($('#CustomerPhone').val().length < 10 || $('#CustomerPhone').val().length > 15) {
        $("#CustomerPhone").addClass("input-validation-error");
        $("#lblCustomerPhone").addClass("has-danger has-error");
        $("#lblCustomerPhone").parent("div").addClass("has-danger has-error");
    }
    else {
        $("#lblCustomerPhone").removeClass("has-danger has-error");
    }

})

function extraChangeIcon(param) {
    var $i = $(param).find("i");
    if ($(param).find("div").hasClass("in")) {
        $i.removeClass("fa-minus-circle");
        $i.addClass("fa-plus-circle");
    } else {
        $i.addClass("fa-minus-circle");
        $i.removeClass("fa-plus-circle");
    }
}

//Lấy danh sách hành khách đi cùng
function getPassTogether() {
    var logId;
    //if (sessionStorage.LoggedUser) {
    //    logId = JSON.parse(sessionStorage.LoggedUser).CustomerId;
    //} else {
    //    logId = null;
    //}
    logId = userId != null && userId != "" ? userId : null;
    $.ajax({
        url: $("#UrlStorage").data("urlgetpasstogether"),
        typpe: "GET",
        data: { id: logId },
        success: function (data) {
            if (data) {
                lstPassTogether = data;
                passTogetherOptions = $.map(data, function (value, index) {
                    var obj = new Object();
                    obj.name = value.PassNm;
                    obj.id = value.Id;
                    return obj;
                });
            }
        }
    })
}
//check default khi chọn phương thức thanh toán
function checkDefaultDigitalWalet() {
    if ($('#rdMomo').is(':checked') == false) {
        $("#rdMomo").prop("checked", true);
    }
}
function checkDefaultVNpay() {
    if ($('#rdVNPayInland').is(':checked') == false && $('#rdVNPayInternational').is(':checked') == false) {
        $("#rdVNPayInland").prop("checked", true);
    }
}
function checkDefaultOnepay() {
    if ($('#rdOnePayInland').is(':checked') == false && $('#rdOnePayInternational').is(':checked') == false) {
        $("#rdOnePayInland").prop("checked", true);
    }
}
//so do ghe chon chieu di chieuv
function openTabLayoutGo() {
    $("#tabBack").css('display', 'none');  
    $("#tabGo").css('display', 'block');  
    //$("#hrbuttonGo").addClass('boatlayout-tab-button');
    //$("#hrbuttonBack").removeClass('boatlayout-tab-button');
    $("#hrbuttonGo").parent().addClass('active');
    $("#hrbuttonBack").parent().removeClass('active');
}

function openTabLayoutBack() {
    $("#tabGo").css('display', 'none');
    $("#tabBack").css('display', 'block');
    //$("#hrbuttonGo").removeClass('boatlayout-tab-button');
    //$("#hrbuttonBack").addClass('boatlayout-tab-button');
    $("#hrbuttonBack").parent().addClass('active');
    $("#hrbuttonGo").parent().removeClass('active');
}

//NEW: voucher
async function loadTicketTypeWithVoucher() {
    $('select[okey=TicketTypeId]').empty(); 
    $.ajax({
        type: "GET",
        url: $('#UrlStorage').data('urlgettickettypewithfree'),
        contentType: 'application/json; charset=utf-8',
        success: function (result) {
            $.each(result, function (i, item) {
                //item.Label = item.Label == "Vé người lớn" ? Resources.TicketAdult : Resources.TicketChildren;
                switch (item.Label) {
                    case "Vé người lớn":
                        item.Label = Resources.TicketAdult;
                        break;
                    case "Vé trẻ em":
                        item.Label = Resources.TicketChildren;
                        break;
                    case "Vé người cao tuổi":
                        item.Label = Resources.SeniorTickets;
                        break;
                    case "Vé mời":
                        item.Label = Resources.VeMoi;
                }

                $('select[okey=TicketTypeId]').append($('<option>', {
                    value: item.TicketTypeId,
                    text: item.Label
                }));
            });
        },
        error: function (data) { }
    });

}

async function getPromotionsWithVoucher(Voucher, Phone, DepartDate, RouteId) { 
    await $.get($('#UrlStorage').data('urlgetpromotionwithvoucher'), { Voucher: Voucher, Phone: Phone, DepartDate: DepartDate, RouteId: RouteId }, function (data) {
        resultForVoucher = data;
    }, 'json');
    return resultForVoucher;

    //await $.get($('#UrlStorage').data('urlgetpromotionwithvoucher'), { Voucher: Voucher, DepartDate: DepartDate, RouteId: RouteId }, function (data) {
    //    resultForVoucher = data;
    //}.fail(function (jqXHR) {
    //    alert(jqXHR.statusText);
    //}), 'json');
    //return resultForVoucher;
     
}
//END VOUCHER

var isApplyPricePromotion = true;
$('input[name="optionPrices"]').on('change', function () {
    var selectedValue = $('input[name="optionPrices"]:checked').val();
    isApplyPricePromotion = (selectedValue === 'true'); 
    onCalculatorForPassType();
});

$(function () {
    $('#showHelp').popover('show'); // tự động hiển thị khi vào trang

    // hoặc bạn có thể cho ẩn sau 5s
    setTimeout(() => {
        $('#showHelp').popover('hide');
    }, 5000);
});

$('#tblSeatInfo').on('post-body.bs.table', function () {
    const $row = $('#tblSeatInfo tbody tr:first'); // hoặc chọn dòng bạn muốn

    // Làm nổi bật dòng
    $row.css({
        'background-color': '#fff3cd',
        'font-weight': 'bold',
        'border': '2px solid orange'
    });

    // Gắn thuộc tính popover
    $row.attr('data-toggle', 'popover');
    $row.attr('data-placement', 'top');
    $row.attr('data-trigger', 'manual');
    $row.attr('data-content', 'Chọn dòng hành khách khi muốn đổi ghế / Select passenger line when you want to change seats)');

    // Khởi tạo & hiển thị popover
    $row.popover();
    $row.popover('show');

    // Ẩn sau 5 giây
    setTimeout(() => {
        $row.popover('hide');
    }, 5000);
});

// Khi người dùng click chọn dòng
$('#tblSeatInfo').on('click-row.bs.table', function (e, row, $element) {
    // Reset màu tất cả dòng
    $('#tblSeatInfo tbody tr').css('background-color', '');

    // Đặt màu nền vàng nhạt cho dòng được chọn
    $element.css('background-color', '#fff3cd');
});;
