$.fbuilder.controls[ 'fapp' ] = function(){}; $.extend( $.fbuilder.controls[ 'fapp' ].prototype, $.fbuilder.controls[ 'ffields' ].prototype, { title:"Number", ftype:"fapp", services:new Array({name:"Service 1",price:1,capacity:1,duration:60,pb:0,pa:0,ohindex:0}), /*openhours:new Array({type:"all",d:"",h1:8,m1:0,h2:17,m2:0}),new Array({name:"Default",openhours:new Array({type:"all",d:"",h1:8,m1:0,h2:17,m2:0})})*/ openhours:new Array(), allOH:new Array({name:"Default",openhours:new Array({type:"all",d:"",h1:8,m1:0,h2:17,m2:0})}), usedSlots:new Array(), dateFormat:"mm/dd/yy", showDropdown:false, showTotalCost:false, showTotalCostFormat:"$ {0}", showEndTime:false, usedSlotsCheckbox:false, avoidOverlaping:true, emptySelectCheckbox:false, emptySelect:"-- Please select service --", dropdownRange:"-10:+10", working_dates:[true,true,true,true,true,true,true], numberOfMonths:1, maxNumberOfApp:0, firstDay:0, minDate:"0", maxDate:"", defaultDate:"", invalidDates:"", required:true, bSlotsCheckbox: true, bSlots:30, militaryTime:1, cacheArr:new Array(), getD:new Date(), formId:0, getMinDate:"", arr:new Array(), allUsedSlots:new Array(), invalidDatesByService:new Array(), service_selected:0, quantity_selected:1, tz:0, loadOK:false, ignoreUsedSlots:false, initialapp:"", initialID:0, pctByDay:new Array(), htmlUsedSlots:new Array(), extras:0, sub_cost:0, getCompatSlots:function(d) { var data = new Array(); var find = false; for (var i=0;i 0) ind--; return ind; }, show:function() { return '
'+this.userhelp+'
'; }, getSpecialDays:function() { var me = this; var a = new Array(); if (!me.emptySelectCheckbox || (me.emptySelectCheckbox && $(".fieldCalendarService"+me.name+" select option:selected").index() > 0 )) { var ohindex = me.services[me.normalizeSelectIndex($(".fieldCalendarService"+me.name+" select option:selected").index())].ohindex; for (var i=0;i=arr[i].t2) arr[i].t2 += 24 * 60; } me.usedSlots[d] = me.usedSlots[d] || []; if (me.ignoreUsedSlots) var data2 = $.merge(data1.slice(0),[]); else var data2 = $.merge(data1.slice(0),me.usedSlots[d]); for (var i=0;idata[i].t2) data[i].t2 += 24 * 60; for (var i=0;icapacity_service || (data[i].service.length==0 || (data[i].service.length && data[i].service[0]!=me.service_selected))) || (!me.avoidOverlaping && (data[i].quantity+me.quantity_selected>capacity_service && (typeof data[i].serviceindex === 'undefined' || data[i].serviceindex==me.service_selected)) )) { for (var j=0;j arr[j].t1) && (data[i].t1 < arr[j].t2) && (data[i].t2 > arr[j].t1) && (data[i].t2 < arr[j].t2)) { var v1 = {t1:arr[j].t1, t2:data[i].t1, h1:arr[j].h1, h2:data[i].h1, m1:arr[j].m1, m2:data[i].m1}; var v2 = {t1:data[i].t2, t2:arr[j].t2, h1:data[i].h2, h2:arr[j].h2, m1:data[i].m2, m2:arr[j].m2}; arr.splice(j, 1, v1, v2); } else if ((data[i].t1 > arr[j].t1) && (data[i].t1 < arr[j].t2)) { arr[j].t2 = data[i].t1; arr[j].h2 = data[i].h1; arr[j].m2 = data[i].m1; } else if ((data[i].t2 > arr[j].t1) && (data[i].t2 < arr[j].t2)) { arr[j].t1 = data[i].t2; arr[j].h1 = data[i].h2; arr[j].m1 = data[i].m2; } else if ((data[i].t1 <= arr[j].t1) && (data[i].t2 >= arr[j].t2)) { arr.splice(j, 1); } } } } for (var i=0;i=0;i--) { if ($.datepicker.parseDate("yy-mm-dd",arr[i].day).getTime()+arr[i].t2*60*1000 <= currenttime) arr.splice(i, 1 ); else if ($.datepicker.parseDate("yy-mm-dd",arr[i].day).getTime()+arr[i].t1*60*1000 <= currenttime) { var st = arr[i].t1 + me.duration; while ($.datepicker.parseDate("yy-mm-dd",arr[i].day).getTime() + st*60*1000 <= currenttime) st += me.duration; var m1 = st % 60; var h1 = (st - m1)/60; arr[i].t1 = st; arr[i].h1 = h1; arr[i].m1 = m1; } } } for (var i=arr.length-1;i>=0;i--) if (arr[i].t1+me.duration > arr[i].t2 || arr[i].t1 > 24*60) arr.splice(i, 1 ); return arr; }, formattime: function(t,mt)/*mt=2 for database 09:00*/ { if (t<0) t+=(24*60); t = t % (24*60); var h = Math.floor(t/60); var m = t%60; var suffix = ""; if (mt==0) { if (h>12) { h = h-12; suffix = " PM"; } else if (h==12) suffix = " PM"; else suffix = " AM"; } return (((h<10)?((mt==2)?"0":""):"")+h+":"+(m<10?"0":"")+m)+suffix; }, formatString: function(obj,showdate,tz) { var me = this; tz = tz * 60; if (typeof obj.st === 'undefined') obj.st = obj.h1*60+obj.m1*1; if (typeof obj.et === 'undefined') obj.et = obj.h2*60+obj.m2*1; var str = ""; if (showdate) str += $.datepicker.formatDate(me.dateFormat, $.datepicker.parseDate("yy-mm-dd", obj.d))+" "; str += me.formattime(obj.st+tz,me.militaryTime)+(me.showEndTime?("-"+me.formattime(obj.et+tz,me.militaryTime)):""); return str; }, getCurrentSlots: function(arr,d) { var me = this; var duration = me.duration; var html = ""; var htmlSlots = new Array(); var pb = 0; var pa = 0; var capacity_service = me.services[me.service_selected].capacity; if (true) { var compactUsedSlots = me.getCompatSlots(me.htmlUsedSlots[d]) for (var i=0;i=capacity_service && compactUsedSlots[i].serviceindex==me.service_selected) if (compactUsedSlots[i].serviceindex==me.service_selected) { compactUsedSlots[i].st = compactUsedSlots[i].h1 * 60 + compactUsedSlots[i].m1; compactUsedSlots[i].t = $.datepicker.parseDate("yy-mm-dd",compactUsedSlots[i].d).getTime()+compactUsedSlots[i].st*60*1000; compactUsedSlots[i].html = ""; if (compactUsedSlots[i].quantity>=capacity_service) compactUsedSlots[i].html = '
'+me.formatString(compactUsedSlots[i],false,me.tz)+''+((typeof compactUsedSlots[i].e !== 'undefined')?"
"+compactUsedSlots[i].e+"
":"")+'
'; if (me.bSlotsCheckbox && me.usedSlotsCheckbox) htmlSlots[htmlSlots.length] = compactUsedSlots[i]; } } } if ((typeof specialPadding === 'undefined')) { pb = me.pb; pa = me.pa; } for (var i=0;i= et) et += 24 * 60; while (st + duration + me.pa <=et && st<24 * 60) { html = ""; htmlSlots[htmlSlots.length] = {st:st,html:html,t:$.datepicker.parseDate("yy-mm-dd",arr[i].day).getTime()+st*60*1000}; st += me.bduration + pa + pb; } } htmlSlots.sort(function(a, b){ if ((typeof cp_hourbk_cmpublic !== 'undefined') && (a.t == b.t)) { if ((typeof a.quantity !== 'undefined') && (typeof b.quantity === 'undefined')) { b.html = b.html.replace("ahbslotavailabilityP",(capacity_service - a.quantity)); b.quantity = a.quantity; } else if ((typeof b.quantity !== 'undefined') && (typeof a.quantity === 'undefined')) { a.html = a.html.replace("ahbslotavailabilityP",(capacity_service - b.quantity)); a.quantity = b.quantity; } } return a.t - b.t }); return htmlSlots; }, getAvailableSlots: function(d) { var me = this; function setHtmlUsedSlots(d,st,et) { st = st * 60; et = et * 60; var htmlSlots = new Array(); if (me.bSlotsCheckbox && me.usedSlotsCheckbox) { me.cacheArr[d] = me.cacheArr[d] || []; for (var i=0;i=me.cacheArr[d][i].h2*60+me.cacheArr[d][i].m2) htmlSlots[htmlSlots.length] = jQuery.extend({}, me.cacheArr[d][i]); for (var i=0;me.usedSlots[d] && i=me.usedSlots[d][i].h2*60+me.usedSlots[d][i].m2) htmlSlots[htmlSlots.length] = jQuery.extend({}, me.usedSlots[d][i]); } } return htmlSlots; } var day = $.datepicker.parseDate("yy-mm-dd", d); if (this.tz==0) { me.htmlUsedSlots[d] = setHtmlUsedSlots(d,0,24); var arr = this.getAvailablePartialSlots(d,[{h1:0,m1:0,h2:0,m2:0}]); } else if (this.tz > 0) { day.setDate(day.getDate() - 1); var d1 = $.datepicker.formatDate("yy-mm-dd",day); var arr = $.merge(this.getAvailablePartialSlots(d1,[{h1:0,m1:0,h2:24-this.tz,m2:0}]),this.getAvailablePartialSlots(d,[{h1:24-this.tz,m1:0,h2:24,m2:0}])); me.htmlUsedSlots[d] = $.merge(setHtmlUsedSlots(d1,24-this.tz,24), setHtmlUsedSlots(d,0,24-this.tz)); } else { day.setDate(day.getDate() + 1); var d1 = $.datepicker.formatDate("yy-mm-dd",day); var arr = $.merge(this.getAvailablePartialSlots(d,[{h1:0,m1:0,h2:this.tz*-1,m2:0}]),this.getAvailablePartialSlots(d1,[{h1:this.tz*-1,m1:0,h2:24,m2:0}])); me.htmlUsedSlots[d] = $.merge(setHtmlUsedSlots(d1,this.tz*-1,24), setHtmlUsedSlots(d,0,this.tz*-1)); } var c = "s"+me.service_selected+"q"+me.quantity_selected; if (arr.length==0) { me.invalidDatesByService[c] = me.invalidDatesByService[c] || []; if ($.inArray(d, me.invalidDatesByService[c]) == -1) me.invalidDatesByService[c][me.invalidDatesByService[c].length] = d; } return arr; }, after_show:function() { function closeOtherDatepicker(){ $('#ui-datepicker-div').css("display","none"); } setTimeout(closeOtherDatepicker,100); if (typeof cp_hourbk_timezone !== 'undefined') { var gmt = (parseInt(cp_hourbk_timezone)); var local = (new Date().getTimezoneOffset() * -1)/60; this.tz = local - gmt; } var me = this, e = $( '#field' + me.form_identifier + '-' + me.index + ' .fieldCalendar'+me.name ), d = $( '#field' + me.form_identifier + '-' + me.index + ' .fieldCalendarService'+me.name ), str = "", op = ""; e.addClass("notranslate") if (me.openhours.length>0)/*compatible with old version*/ { if (!me.openhours[0].name) { var obj = {name:"Default",openhours:me.openhours.slice(0)}; me.openhours = new Array(); me.openhours[0] = obj; } me.allOH = new Array(); me.allOH = me.openhours.slice(0); me.openhours = new Array(); } var dd = ""; if (me.initialapp!="") { var s = me.initialapp.split(";"); var s2 = ""; for (var i=0;i 0 )) { var arr = me.getAvailableSlots(day); if ($.inArray(day, me.invalidDatesByService["s"+me.service_selected+"q"+me.quantity_selected]) > -1) c.push("nonworking ui-datepicker-unselectable ui-state-disabled notavailslot"); if (typeof cp_hourbk_cmpublic !== 'undefined') { var used = 0; var htmlSlots = me.getCurrentSlots(arr,day); var cclass = c.join(" "); var q = 0; for (var i=0;i 0 ))) return; function getSlots(d) { var data1 = me.cacheArr[d]; var duration = me.duration; me.bduration = me.duration; if (!me.bSlotsCheckbox) me.bduration = me.bSlots*1; var str = ""; var arr = me.getAvailableSlots(d); var nextdateAvailable = $.datepicker.parseDate("yy-mm-dd", d); var c = "s"+me.service_selected+"q"+me.quantity_selected; var s = $( '#field' + me.form_identifier + '-' + me.index + ' .slotsCalendar'+me.name ); var i =0; if ((me.maxNumberOfApp==0 || me.allUsedSlots.length0 ) { e.datepicker("setDate", nextdateAvailable); me.getD = nextdateAvailable; onChangeDateOrService($.datepicker.formatDate("yy-mm-dd", nextdateAvailable)); } else if (me.invalidDatesByService[c].length>=365) { if (me.getMinDate != "" && me.getMinDate.getTime() < me.getD.getTime()) { e.datepicker("setDate", me.getMinDate); me.getD = me.getMinDate; me.invalidDatesByService[c] = new Array(); onChangeDateOrService($.datepicker.formatDate("yy-mm-dd", me.getD)); return; } e.datepicker("setDate", me.getMinDate); s.html("
"+cp_hourbk_nomore_label+"
"); } return; } var htmlSlots = me.getCurrentSlots(arr,d); var capacity_service = me.services[me.service_selected].capacity; for (var i=0;i0) { before = s.find(".slots").attr("d"); } s.html("
"+$.datepicker.formatDate(me.dateFormat, $.datepicker.parseDate("yy-mm-dd", d))+"
"+str+"
"); if (before!="" && before!=d) { s.find(".slots span:first").hide().show(200); } var str1="",str2=""; me.allUsedSlots = me.allUsedSlots || []; me.allUsedSlots.sort(function(a, b){ return ($.datepicker.parseDate("yy-mm-dd", a.d).getTime()+(a.h1*60+a.m1)*60*1000) - ($.datepicker.parseDate("yy-mm-dd", b.d).getTime()+(b.h1*60+b.m1)*60*1000)}); j = 0; var total = 0; for (var i=0;i"+me.formatString(me.allUsedSlots[i],true,me.tz)+""+me.services[me.allUsedSlots[i].serviceindex].name+""+((me.allUsedSlots[i].quantity>1)?"("+me.allUsedSlots[i].quantity+")":"")+"["+(cp_hourbk_cancel_label?cp_hourbk_cancel_label:'cancel')+"]"+(((typeof cp_hourbk_repeat !== 'undefined') && i==0)?showrepeat(me.name):"")+""; str2 += ((str2=="")?"":";")+me.allUsedSlots[i].d+" "+me.formattime(me.allUsedSlots[i].h1*60+me.allUsedSlots[i].m1*1,2)+"/"+me.formattime(me.allUsedSlots[i].h2*60+me.allUsedSlots[i].m2*1,2)+" "+me.allUsedSlots[i].serviceindex+" "+me.allUsedSlots[i].quantity; if (me.allUsedSlots[i].d==d) j++; } me.sub_cost = total; total = me.sub_cost + me.extras; total = total.toFixed(2); if (me.showTotalCost && (str1!="")) str1 += '
'+cp_hourbk_cost_label+' '+me.showTotalCostFormat.replace("{0}", total)+'
'; $( '#field' + me.form_identifier + '-' + me.index + ' .usedSlots'+me.name ).html(str1); $( '#field' + me.form_identifier + '-' + me.index + ' #'+me.name ).val(str2); $( '#field' + me.form_identifier + '-' + me.index + ' #tcost'+me.name ).val(total); $( '#field' + me.form_identifier + '-' + me.index + ' #'+me.name ).change(); try { $( "#fbuilder .slots div a" ).tooltip({ position: { my: "left top+10" }, open: function (event, ui) { $(this).tooltip( "option", "content", $(this).parent().find(".ahbmoreinfo").html() ); }, tooltipClass: "ahbtooltip" }); } catch (e) {} $( '#field' + me.form_identifier + '-' + me.index + ' .slots a').off("click").on("click", function() { if ($(this).parents("fieldset").hasClass("ahbgutenberg_editor")) return false; $( "#field" + me.form_identifier + "-" + me.index + " div.cpefb_error").remove(); if ($(this).parent().hasClass("htmlUsed")) return false; me.allUsedSlots = me.allUsedSlots || []; if (me.maxNumberOfApp==0 || me.allUsedSlots.length -1) { me.invalidDatesByService[c].splice($.inArray(d, me.invalidDatesByService[c]), 1); e.datepicker("setDate", me.getD); } onChangeDateOrService($.datepicker.formatDate('yy-mm-dd', me.getD)); return false; }); } getSlots(d); } if (typeof cpapphourbk_in_admin !== 'undefined') { me.minDate = ""; me.maxDate = ""; } if (!me.loadOK) { me.formId = $(".fieldCalendarService"+me.name).parents("form").find('input[type="hidden"][name$="_id"]').val(); $.ajax( { dataType : 'json', type: "POST", url : document.location.href, cache : true, data : { cp_app_action: 'get_slots', formid: me.formId, initialID: me.initialID, formfield: me.name.replace(me.form_identifier, "") }, success : function( data ){ for (var i=0;i'+me.services[i].name+''; me.services[i].capacity = (parseInt(me.services[i].capacity)>0)?me.services[i].capacity:1; if (capacity'+ str ; var str2 = ""; for (var i=1;i<=me.services[0].capacity;i++) str2 += ''; d.html('

'); me.service_selected = me.normalizeSelectIndex($(".fieldCalendarService"+me.name+" select.ahbfield_service option:selected").index()); me.quantity_selected = parseInt($(".fieldCalendarService"+me.name+" select.ahbfield_quantity option:selected").val()); me.duration = $(".fieldCalendarService"+me.name+" select.ahbfield_service option:selected").val()*1; me.pa = me.services[me.service_selected].pa * 1 || 0; me.pb = me.services[me.service_selected].pb * 1 || 0; $(".fieldCalendarService"+me.name+" select.ahbfield_service").bind("change", function() { me.duration = $(".fieldCalendarService"+me.name+" select.ahbfield_service option:selected").val()*1; me.service_selected = me.normalizeSelectIndex($(".fieldCalendarService"+me.name+" select.ahbfield_service option:selected").index()); me.pa = me.services[me.service_selected].pa * 1 || 0; me.pb = me.services[me.service_selected].pb * 1 || 0; me.cacheOpenHours = new Array(); me.special_days = me.getSpecialDays(); var str2 = ""; for (var i=1;i<=me.services[me.service_selected].capacity;i++) str2 += ''; $(".fieldCalendarService"+me.name+" select.ahbfield_quantity").html(str2); me.quantity_selected = parseInt($(".fieldCalendarService"+me.name+" select.ahbfield_quantity option:selected").val()); $( '#field' + me.form_identifier + '-' + me.index + ' .fieldCalendar'+me.name ).datepicker( "option", "beforeShowDay", renderCalendarCallback ); onChangeDateOrService($.datepicker.formatDate('yy-mm-dd', me.getD)); }); $(".fieldCalendarService"+me.name+" select.ahbfield_quantity").bind("change", function() { me.quantity_selected = parseInt($(".fieldCalendarService"+me.name+" select.ahbfield_quantity option:selected").val()); $( '#field' + me.form_identifier + '-' + me.index + ' .fieldCalendar'+me.name ).datepicker( "option", "beforeShowDay", renderCalendarCallback ); onChangeDateOrService($.datepicker.formatDate('yy-mm-dd', me.getD)); }); $("#"+me.name).bind("change", function() { if ($(this).attr("reload")=="reload") { $(this).attr("reload",""); onChangeDateOrService($.datepicker.formatDate('yy-mm-dd', me.getD)); } }); try{ me.special_days = me.getSpecialDays(); } catch (e) {} var hrs = 0; me.getMinDate = ""; if (me.minDate!=="") { if (me.minDate.indexOf("h")!= -1) { if (me.minDate.indexOf(" ")!= -1) { var a = me.minDate.split(" "); var find = false; for (var i=0;(i -1 ) return false; if (me.working_dates[date.getDay()]==0) return false; return true; } var sum = 0; for (var i=0;i0) { var nextdateAvailable = e.datepicker("getDate"); while (!DisableSpecificDates(nextdateAvailable)) nextdateAvailable.setDate(nextdateAvailable.getDate() + 1); e.datepicker("setDate", nextdateAvailable); me.getD = nextdateAvailable; function ifLoadOk() { if (!me.loadOK) setTimeout(ifLoadOk,100); else { $( '#field' + me.form_identifier + '-' + me.index + ' .fieldCalendar'+me.name ).datepicker( "option", "beforeShowDay", renderCalendarCallback ); onChangeDateOrService($.datepicker.formatDate('yy-mm-dd', me.getD)); $( '#field' + me.form_identifier + '-' + me.index + ' .fieldCalendar'+me.name ).datepicker( "option", "beforeShowDay", renderCalendarCallback ); } } ifLoadOk(); } if (typeof cp_hourbk_preselect !== 'undefined' && cp_hourbk_preselect!="") { cp_hourbk_preselect = cp_hourbk_preselect*1; $(".fieldCalendarService"+me.name+" select.ahbfield_service").children().removeAttr("selected"); if (me.emptySelectCheckbox) $(".fieldCalendarService"+me.name+" select.ahbfield_service").children().eq(cp_hourbk_preselect+1).attr('selected', 'selected').change(); else $(".fieldCalendarService"+me.name+" select.ahbfield_service").children().eq(cp_hourbk_preselect).attr('selected', 'selected').change(); } else if (me.initialapp!="" && dd!="") onChangeDateOrService(dd); getExtras=function() { var f = $( '#field' + me.form_identifier + '-' + me.index ).parents( "form" ); var v = 0; var find = false; var e = f.find(".ahb_service").find(':checked:not(.ignore)'); if( e.length ) { find = true; e.each( function(){ v += this.value*1; }); } e = f.find(".ahb_service_per_slot").find(':checked:not(.ignore)'); me.allUsedSlots = me.allUsedSlots || []; var s = me.allUsedSlots.length; if( e.length ) { find = true; e.each( function(){ v += this.value * s; } ); } e = f.find(".ahb_service_per_quantity_selection").find(':checked:not(.ignore)'); var q = f.find(".sbquantity1").val() * 1 + f.find(".sbquantity2").val() * 1; if( e.length ) { find = true; e.each( function(){ v += this.value * q; } ); } f.find('#'+me.name+'_services').val(v); if (find) { me.extras = v; var total = me.sub_cost + me.extras; total = total.toFixed(2); $( '#field' + me.form_identifier + '-' + me.index ).find(".totalCost .n").html(" " +me.showTotalCostFormat.replace("{0}",total)); $( '#field' + me.form_identifier + '-' + me.index + ' #tcost'+me.name ).val(total); } } $( '#field' + me.form_identifier + '-' + me.index ).parents( "form" ).find(".ahb_service,.ahb_service_per_slot,.ahb_service_per_quantity_selection").on("click", function(){ getExtras(); }); $( '#field' + me.form_identifier + '-' + me.index + ' #'+me.name ).change(function( ) { getExtras(); }); if (typeof cp_hourbk_overlapping_label != "undefined") $.extend($.validator.messages, {avoid_overlapping: $.validator.format(cp_hourbk_overlapping_label)}); if(!('avoid_overlapping' in $.validator.methods)) { function avoid_over_function(value, element){ var validator = this, previous = validator.previousValue( element ); if ( previous.old === value ) { return previous.valid; } previous.old = value; validator.startRequest( element ); var p = element.id.split( '_' ), _index = ( p.length > 1 ) ? '_'+p[ 1 ] : '', me = ( typeof $.fbuilder[ 'forms' ] != 'undefined' && typeof $.fbuilder[ 'forms' ][ _index ] != 'undefined' ) ? $.fbuilder[ 'forms' ][ _index ].getItem( p[ 0 ]+'_'+p[ 1 ] ) : null; if( me != null ) { $.ajax({ dataType : 'json', type: "POST", url : document.location.href, data : { cp_app_action: 'get_slots', formid: me.formId, initialID: me.initialID, formfield: me.name.replace(me.form_identifier, "") }, success: function(data) { var overlapping = false; var find = false; me.ignoreUsedSlots = true; me.cacheArr = new Array(); for (var i=0;i=t2) find = true; } overlapping = !find; } me.ignoreUsedSlots = false; var isValid = !overlapping; if (true === isValid) { var submitted = validator.formSubmitted; validator.prepareElement( element ); validator.formSubmitted = submitted; validator.successList.push( element ); delete validator.invalid[ element.name ]; validator.showErrors(); } else { for (var i=0;i