
(function(){var data={language:'en-US',languages:{'en-US':{}},cascades:['en-US']};var cascaded;MooTools.lang=new Events();$extend(MooTools.lang,{setLanguage:function(lang){if(!data.languages[lang])return this;data.language=lang;this.load();this.fireEvent('langChange',lang);return this;},load:function(){var langs=this.cascade(this.getCurrentLanguage());cascaded={};$each(langs,function(set,setName){cascaded[setName]=this.lambda(set);},this);},getCurrentLanguage:function(){return data.language;},addLanguage:function(lang){data.languages[lang]=data.languages[lang]||{};return this;},cascade:function(lang){var cascades=(data.languages[lang]||{}).cascades||[];cascades.combine(data.cascades);cascades.erase(lang).push(lang);var langs=cascades.map(function(lng){return data.languages[lng];},this);return $merge.apply(this,langs);},lambda:function(set){(set||{}).get=function(key,args){return $lambda(set[key]).apply(this,$splat(args));};return set;},get:function(set,key,args){if(cascaded&&cascaded[set])return(key?cascaded[set].get(key,args):cascaded[set]);},set:function(lang,set,members){this.addLanguage(lang);langData=data.languages[lang];if(!langData[set])langData[set]={};$extend(langData[set],members);if(lang==this.getCurrentLanguage()){this.load();this.fireEvent('langChange',lang);}
return this;},list:function(){return Hash.getKeys(data.languages);}});})();


(function(){var Date=this.Date;if(!Date.now)Date.now=$time;Date.Methods={ms:'Milliseconds',year:'FullYear',min:'Minutes',mo:'Month',sec:'Seconds',hr:'Hours'};['Date','Day','FullYear','Hours','Milliseconds','Minutes','Month','Seconds','Time','TimezoneOffset','Week','Timezone','GMTOffset','DayOfYear','LastMonth','LastDayOfMonth','UTCDate','UTCDay','UTCFullYear','AMPM','Ordinal','UTCHours','UTCMilliseconds','UTCMinutes','UTCMonth','UTCSeconds'].each(function(method){Date.Methods[method.toLowerCase()]=method;});var pad=function(n,digits,string){if(digits==1)return n;return n<Math.pow(10,digits-1)?(string||'0')+pad(n,digits-1,string):n;};Date.implement({set:function(prop,value){switch($type(prop)){case'object':for(var p in prop)this.set(p,prop[p]);break;case'string':prop=prop.toLowerCase();var m=Date.Methods;if(m[prop])this['set'+m[prop]](value);}
return this;},get:function(prop){prop=prop.toLowerCase();var m=Date.Methods;if(m[prop])return this['get'+m[prop]]();return null;},clone:function(){return new Date(this.get('time'));},increment:function(interval,times){interval=interval||'day';times=$pick(times,1);switch(interval){case'year':return this.increment('month',times*12);case'month':var d=this.get('date');this.set('date',1).set('mo',this.get('mo')+times);return this.set('date',d.min(this.get('lastdayofmonth')));case'week':return this.increment('day',times*7);case'day':return this.set('date',this.get('date')+times);}
if(!Date.units[interval])throw new Error(interval+' is not a supported interval');return this.set('time',this.get('time')+times*Date.units[interval]());},decrement:function(interval,times){return this.increment(interval,-1*$pick(times,1));},isLeapYear:function(){return Date.isLeapYear(this.get('year'));},clearTime:function(){return this.set({hr:0,min:0,sec:0,ms:0});},diff:function(date,resolution){if($type(date)=='string')date=Date.parse(date);return((date-this)/Date.units[resolution||'day'](3,3)).toInt();},getLastDayOfMonth:function(){return Date.daysInMonth(this.get('mo'),this.get('year'));},getDayOfYear:function(){return(Date.UTC(this.get('year'),this.get('mo'),this.get('date')+1)
-Date.UTC(this.get('year'),0,1))/Date.units.day();},getWeek:function(){return(this.get('dayofyear')/7).ceil();},getOrdinal:function(day){return Date.getMsg('ordinal',day||this.get('date'));},getTimezone:function(){return this.toString().replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/,'$1').replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/,'$1$2$3');},getGMTOffset:function(){var off=this.get('timezoneOffset');return((off>0)?'-':'+')+pad((off.abs()/60).floor(),2)+pad(off%60,2);},setAMPM:function(ampm){ampm=ampm.toUpperCase();var hr=this.get('hr');if(hr>11&&ampm=='AM')return this.decrement('hour',12);else if(hr<12&&ampm=='PM')return this.increment('hour',12);return this;},getAMPM:function(){return(this.get('hr')<12)?'AM':'PM';},parse:function(str){this.set('time',Date.parse(str));return this;},isValid:function(date){return!!(date||this).valueOf();},format:function(f){if(!this.isValid())return'invalid date';f=f||'%x %X';f=formats[f.toLowerCase()]||f;var d=this;return f.replace(/%([a-z%])/gi,function($0,$1){switch($1){case'a':return Date.getMsg('days')[d.get('day')].substr(0,3);case'A':return Date.getMsg('days')[d.get('day')];case'b':return Date.getMsg('months')[d.get('month')].substr(0,3);case'B':return Date.getMsg('months')[d.get('month')];case'c':return d.toString();case'd':return pad(d.get('date'),2);case'e':return pad(d.get('date'),2,' ');case'H':return pad(d.get('hr'),2);case'I':return pad((d.get('hr')%12)||12,2);case'j':return pad(d.get('dayofyear'),3);case'k':return pad(d.get('hr'),2,' ');case'l':return pad((d.get('hr')%12)||12,2,' ');case'L':return pad(d.get('ms'),3);case'm':return pad((d.get('mo')+1),2);case'M':return pad(d.get('min'),2);case'o':return d.get('ordinal');case'p':return Date.getMsg(d.get('ampm'));case's':return Math.round(d/1000);case'S':return pad(d.get('seconds'),2);case'U':return pad(d.get('week'),2);case'w':return d.get('day');case'x':return d.format(Date.getMsg('shortDate'));case'X':return d.format(Date.getMsg('shortTime'));case'y':return d.get('year').toString().substr(2);case'Y':return d.get('year');case'T':return d.get('GMTOffset');case'Z':return d.get('Timezone');}
return $1;});},toISOString:function(){return this.format('iso8601');}});Date.alias('toISOString','toJSON');Date.alias('diff','compare');Date.alias('format','strftime');var formats={db:'%Y-%m-%d %H:%M:%S',compact:'%Y%m%dT%H%M%S',iso8601:'%Y-%m-%dT%H:%M:%S%T',rfc822:'%a, %d %b %Y %H:%M:%S %Z','short':'%d %b %H:%M','long':'%B %d, %Y %H:%M'};var parsePatterns=[];var nativeParse=Date.parse;var parseWord=function(type,word,num){var ret=-1;var translated=Date.getMsg(type+'s');switch($type(word)){case'object':ret=translated[word.get(type)];break;case'number':ret=translated[month-1];if(!ret)throw new Error('Invalid '+type+' index: '+index);break;case'string':var match=translated.filter(function(name){return this.test(name);},new RegExp('^'+word,'i'));if(!match.length)throw new Error('Invalid '+type+' string');if(match.length>1)throw new Error('Ambiguous '+type);ret=match[0];}
return(num)?translated.indexOf(ret):ret;};Date.extend({getMsg:function(key,args){return MooTools.lang.get('Date',key,args);},units:{ms:$lambda(1),second:$lambda(1000),minute:$lambda(60000),hour:$lambda(3600000),day:$lambda(86400000),week:$lambda(608400000),month:function(month,year){var d=new Date;return Date.daysInMonth($pick(month,d.get('mo')),$pick(year,d.get('year')))*86400000;},year:function(year){year=year||new Date().get('year');return Date.isLeapYear(year)?31622400000:31536000000;}},daysInMonth:function(month,year){return[31,Date.isLeapYear(year)?29:28,31,30,31,30,31,31,30,31,30,31][month];},isLeapYear:function(year){return((year%4===0)&&(year%100!==0))||(year%400===0);},parse:function(from){var t=$type(from);if(t=='number')return new Date(from);if(t!='string')return from;from=from.clean();if(!from.length)return null;var parsed;parsePatterns.some(function(pattern){var bits=pattern.re.exec(from);return(bits)?(parsed=pattern.handler(bits)):false;});return parsed||new Date(nativeParse(from));},parseDay:function(day,num){return parseWord('day',day,num);},parseMonth:function(month,num){return parseWord('month',month,num);},parseUTC:function(value){var localDate=new Date(value);var utcSeconds=Date.UTC(localDate.get('year'),localDate.get('mo'),localDate.get('date'),localDate.get('hr'),localDate.get('min'),localDate.get('sec'));return new Date(utcSeconds);},orderIndex:function(unit){return Date.getMsg('dateOrder').indexOf(unit)+1;},defineFormat:function(name,format){formats[name]=format;},defineFormats:function(formats){for(var name in formats)Date.defineFormat(name,formats[name]);},parsePatterns:parsePatterns,defineParser:function(pattern){parsePatterns.push((pattern.re&&pattern.handler)?pattern:build(pattern));},defineParsers:function(){Array.flatten(arguments).each(Date.defineParser);},define2DigitYearStart:function(year){startYear=year%100;startCentury=year-startYear;}});var startCentury=1900;var startYear=70;var regexOf=function(type){return new RegExp('(?:'+Date.getMsg(type).map(function(name){return name.substr(0,3);}).join('|')+')[a-z]*');};var replacers=function(key){switch(key){case'x':return((Date.orderIndex('month')==1)?'%m[.-/]%d':'%d[.-/]%m')+'([.-/]%y)?';case'X':return'%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%T?';}
return null;};var keys={d:/[0-2]?[0-9]|3[01]/,H:/[01]?[0-9]|2[0-3]/,I:/0?[1-9]|1[0-2]/,M:/[0-5]?\d/,s:/\d+/,o:/[a-z]*/,p:/[ap]\.?m\.?/,y:/\d{2}|\d{4}/,Y:/\d{4}/,T:/Z|[+-]\d{2}(?::?\d{2})?/};keys.m=keys.I;keys.S=keys.M;var currentLanguage;var recompile=function(language){currentLanguage=language;keys.a=keys.A=regexOf('days');keys.b=keys.B=regexOf('months');parsePatterns.each(function(pattern,i){if(pattern.format)parsePatterns[i]=build(pattern.format);});};var build=function(format){if(!currentLanguage)return{format:format};var parsed=[];var re=(format.source||format).replace(/%([a-z])/gi,function($0,$1){return replacers($1)||$0;}).replace(/\((?!\?)/g,'(?:').replace(/ (?!\?|\*)/g,',? ').replace(/%([a-z%])/gi,function($0,$1){var p=keys[$1];if(!p)return $1;parsed.push($1);return'('+p.source+')';}).replace(/\[a-z\]/gi,'[a-z\\u00c0-\\uffff]');return{format:format,re:new RegExp('^'+re+'$','i'),handler:function(bits){bits=bits.slice(1).associate(parsed);var date=new Date().clearTime();if('d'in bits)handle.call(date,'d',1);if('m'in bits||'b'in bits||'B'in bits)handle.call(date,'m',1);for(var key in bits)handle.call(date,key,bits[key]);return date;}};};var handle=function(key,value){if(!value)return this;switch(key){case'a':case'A':return this.set('day',Date.parseDay(value,true));case'b':case'B':return this.set('mo',Date.parseMonth(value,true));case'd':return this.set('date',value);case'H':case'I':return this.set('hr',value);case'm':return this.set('mo',value-1);case'M':return this.set('min',value);case'p':return this.set('ampm',value.replace(/\./g,''));case'S':return this.set('sec',value);case's':return this.set('ms',('0.'+value)*1000);case'w':return this.set('day',value);case'Y':return this.set('year',value);case'y':value=+value;if(value<100)value+=startCentury+(value<startYear?100:0);return this.set('year',value);case'T':if(value=='Z')value='+00';var offset=value.match(/([+-])(\d{2}):?(\d{2})?/);offset=(offset[1]+'1')*(offset[2]*60+(+offset[3]||0))+this.getTimezoneOffset();return this.set('time',this-offset*60000);}
return this;};Date.defineParsers('%Y([-./]%m([-./]%d((T| )%X)?)?)?','%Y%m%d(T%H(%M%S?)?)?','%x( %X)?','%d%o( %b( %Y)?)?( %X)?','%b( %d%o)?( %Y)?( %X)?','%Y %b( %d%o( %X)?)?','%o %b %d %X %T %Y');MooTools.lang.addEvent('langChange',function(language){if(MooTools.lang.get('Date'))recompile(language);}).fireEvent('langChange',MooTools.lang.getCurrentLanguage());})();


Date.implement({timeDiffInWords:function(relative_to){return Date.distanceOfTimeInWords(this,relative_to||new Date);},timeDiff:function(to,joiner){if(to==null)to=new Date;var delta=((to-this)/1000).toInt();if(!delta)return'0s';var durations={s:60,m:60,h:24,d:365,y:0};var duration,vals=[];for(var step in durations){if(!delta)break;if((duration=durations[step])){vals.unshift((delta%duration)+step);delta=(delta/duration).toInt();}else{vals.unshift(delta+step);}}
return vals.join(joiner||':');}});Date.alias('timeDiffInWords','timeAgoInWords');Date.extend({distanceOfTimeInWords:function(from,to){return Date.getTimePhrase(((to-from)/1000).toInt());},getTimePhrase:function(delta){var suffix=(delta<0)?'Until':'Ago';if(delta<0)delta*=-1;var units={minute:60,hour:60,day:24,week:7,month:52/12,year:12,eon:Infinity};var msg='lessThanMinute';for(var unit in units){var interval=units[unit];if(delta<1.5*interval){if(delta>0.75*interval)msg=unit;break;}
delta/=interval;msg=unit+'s';}
return Date.getMsg(msg+suffix).substitute({delta:delta.round()});}});Date.defineParsers({re:/^(?:tod|tom|yes)/i,handler:function(bits){var d=new Date().clearTime();switch(bits[0]){case'tom':return d.increment();case'yes':return d.decrement();default:return d;}}},{re:/^(next|last) ([a-z]+)$/i,handler:function(bits){var d=new Date().clearTime();var day=d.getDay();var newDay=Date.parseDay(bits[2],true);var addDays=newDay-day;if(newDay<=day)addDays+=7;if(bits[1]=='last')addDays-=7;return d.set('date',d.getDate()+addDays);}});


MooTools.lang.set('en-US','Date',{months:['January','February','March','April','May','June','July','August','September','October','November','December'],days:['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],dateOrder:['month','date','year'],shortDate:'%m/%d/%Y',shortTime:'%I:%M%p',AM:'AM',PM:'PM',ordinal:function(dayOfMonth){return(dayOfMonth>3&&dayOfMonth<21)?'th':['th','st','nd','rd','th'][Math.min(dayOfMonth%10,4)];},lessThanMinuteAgo:'less than a minute ago',minuteAgo:'about a minute ago',minutesAgo:'{delta} minutes ago',hourAgo:'about an hour ago',hoursAgo:'about {delta} hours ago',dayAgo:'1 day ago',daysAgo:'{delta} days ago',weekAgo:'1 week ago',weeksAgo:'{delta} weeks ago',monthAgo:'1 month ago',monthsAgo:'{delta} months ago',yearAgo:'1 year ago',yearsAgo:'{delta} years ago',lessThanMinuteUntil:'less than a minute from now',minuteUntil:'about a minute from now',minutesUntil:'{delta} minutes from now',hourUntil:'about an hour from now',hoursUntil:'about {delta} hours from now',dayUntil:'1 day from now',daysUntil:'{delta} days from now',weekUntil:'1 week from now',weeksUntil:'{delta} weeks from now',monthUntil:'1 month from now',monthsUntil:'{delta} months from now',yearUntil:'1 year from now',yearsUntil:'{delta} years from now'});


Array.implement({intersect:function(other){var cpy=this.slice();this.each(function(el){if(other.indexOf(el)<0){cpy.splice(cpy.indexOf(el),1);}},this);return cpy;},differentiate:function(other){var src=this.slice();var cmp=other.slice();other.each(function(elem){if(src.indexOf(elem)>-1){src.splice(src.indexOf(elem),1);cmp.splice(cmp.indexOf(elem),1);}},this);return src.combine(cmp);},getRange:function(start,elements){var res=[];var j=0;var upper=start+elements>this.length?this.length:start+elements;if(start>=0){for(var i=start;i<upper;i++){res[j++]=this[i];}}
return res;},invoke:function(methodName){var args=Array.slice(arguments,1),results=[];for(var i=0,j=this.length;i<j;i++){var item=this[i];results.push(item[methodName].apply(item,args));}
return results;},searchBinary:function(value,insert){var h=this.length,l=-1,m;while(h-l>1){if(this[m=h+l>>1]<value){l=m;}else{h=m;}}
return this[h]!=value?insert?h:-1:h;},unique:function(){return[].combine(this);},sum:function(){for(var i=0,sum=0;i<this.length;sum+=this[i++]);return sum;},max:function(){return Math.max.apply({},this)},min:function(){return Math.min.apply({},this)}});


var Group=new Class({initialize:function(){this.instances=Array.flatten(arguments);this.events={};this.checker={};},addEvent:function(type,fn){this.checker[type]=this.checker[type]||{};this.events[type]=this.events[type]||[];if(this.events[type].contains(fn))return false;else this.events[type].push(fn);this.instances.each(function(instance,i){instance.addEvent(type,this.check.bind(this,[type,instance,i]));},this);return this;},check:function(type,instance,i){this.checker[type][i]=true;var every=this.instances.every(function(current,j){return this.checker[type][j]||false;},this);if(!every)return;this.checker[type]={};this.events[type].each(function(event){event.call(this,this.instances,instance);},this);}});


if(typeof(SK)=='undefined')SK={};if(typeof(SK.Util)=='undefined')SK.Util={};SK.Util.Registry=new Class({data:{},initialize:function(data){this.setData(data);},setData:function(data){this.data=$pick(data,{})},set:function(path,value){path=this.validatePath(path);if(path==''){this.data=value;}
var fragments=path.split('.');var obj={};var ref=obj;var len=fragments.length;if(len>0){for(var i=0;i<len-1;i++){ref[fragments[i]]={};ref=ref[fragments[i]];}
ref[fragments[len-1]]=value;this.data=$merge(this.data,obj);}else{this.data=value;}},get:function(path){path=this.validatePath(path);if(path==''){return this.data;}
var fragments=path.split('.');var ref=this.data;var path_exists=true;var i=0;var len=fragments.length;while(path_exists&&i<len){path_exists=path_exists&&(ref[fragments[i]]!==undefined);ref=ref[fragments[i]];i++;}
return ref;},validatePath:function(path){if($type(path)!='string'){path='';}
return path}});


Date.implement({createPeriod:function(to,interval){var result=[];var start=this.getTime();var end=to.getTime();var current=this.clone();result.push(current.clone());while(start<=end){current.increment(interval);start=current.getTime();if(start<=end){result.push(current.clone());}}
return result;},createRange:function(interval,times){return{from:this.clone(),to:this.clone().increment(interval,times)};},isBetween:function(from,to){if(this>from&&this<to){return true;}
return false;},isBefore:function(when){return this<when;},isAfter:function(when){return this>when;},roundTimeToInterval:function(interval){var minutes=this.getMinutes();var hours=this.getHours();if(minutes%interval!=0){minutes=minutes+(interval-minutes%interval);}
hours+=minutes/60;minutes=minutes%60;this.set({hours:hours,minutes:minutes,seconds:0,milliseconds:0});return this;}});


if(typeof(SK)=='undefined')SK={};if(typeof(SK.Appointments)=='undefined')SK.Appointments={};if(typeof(console)=='undefined')console={log:$empty};SK.Appointments.Constants={TIME_SLOT_INTERVAL:30,DATE_FORMAT:"%Y-%m-%d",DAY_FORMAT:"%m-%d",TIME_FORMAT:"time_fmt",SEPARATOR:"-",CALENDAR_FORMAT:"full_date_fmt",LONG_DATE_FORMAT:"long_date_fmt",NO_STAFF_NAME:'Office',NO_SERVICE_NAME:'Custom',STATUSES:{APPROVED:'approved',WAITING_APPROVAL:'waiting-approval',REJECTED:'rejected',COMPLETED:'completed'}}


SK.Appointments.Utils={parseDateList:function(data,format){var valid_data=[];$splat(data).each(function(ary){if($type(ary)=='array'){this.push(ary)}},valid_data);return valid_data.invoke('associate',['from','to']).map(function(range){if(range.to&&range.to!=""){return Date.parse(range.from).createPeriod(Date.parse(range.to),'day').invoke('format',this.format);}
return Date.parse(range.from).format(this.format);}.bind({format:format})).flatten().unique();},timeRange:{decrement:function(ranges,duration,point){var i=0;while($defined(ranges[i])){ranges[i][point].decrement('minute',duration);if(ranges[i].from>=ranges[i].to){ranges.splice(i,1);continue;}
i++;}
return ranges;},exclude:function(ranges,excludes){for(var j=0;j<excludes.length;j++){var exclude_range=excludes[j];var i=0;while($defined(ranges[i])){var range=ranges[i];if((exclude_range.from==range.from&&exclude_range.to==range.to)||(exclude_range.from.isBefore(range.from)&&exclude_range.to.isAfter(range.to))){ranges.splice(i,1);continue;}
if(exclude_range.from.isBetween(range.from,range.to)&&exclude_range.to.isBetween(range.from,range.to)){var new_range={from:exclude_range.to.clone().increment('second'),to:range.to.clone()};range.to=exclude_range.from.clone().decrement('second');i++;ranges.splice(i,0,new_range);}else if(exclude_range.from<=range.from&&exclude_range.to.isBetween(range.from,range.to)){range.from=exclude_range.to.clone().increment('second');}else if(exclude_range.from.isBetween(range.from,range.to)&&exclude_range.to>=range.to){range.to=exclude_range.from.clone().decrement('second');}
i++;}}
return ranges;},merge:function(ranges){var start_offsets=[];var end_offsets=[];var merged=[];for(var i=0;i<ranges.length;i++){start_offsets.push(ranges[i].from.getTime());end_offsets.push(ranges[i].to.getTime());}
while(start_offsets.length>0){var start=Math.min.apply(Math,start_offsets);var index=start_offsets.indexOf(start);var end=end_offsets[index];end_offsets.splice(index,1);start_offsets.splice(index,1);var i=0;while($defined(start_offsets[i])){if(start_offsets[i]<=end){end=Math.max(end_offsets[i],end);end_offsets.splice(i,1);start_offsets.splice(i,1);i=0;}else{i++;}}
merged.push({from:new Date().set('time',start),to:new Date().set('time',end)});}
return merged;},removeBefore:function(ranges){var i=0;while($defined(ranges[i])){ranges[i][point].decrement('minute',duration);if(ranges[i].from>=ranges[i].to){ranges.splice(i,1);continue;}
i++;}
return ranges;},removeAfter:function(){}}}


SK.Appointments.ResourceAvailabilityInterface=new Class({__businessHours:{},__unavailability:{},__availability:{},setResourceAvailabilityBusinessHours:function(businessHours){this.__businessHours=businessHours;},getResourceAvailabilityBusinessHours:function(){return $unlink(this.__businessHours);},setResourceUnavailability:function(data){for(var date in data){var ranges=data[date];this.__unavailability[date]=SK.Appointments.Utils.timeRange.merge(ranges);}},getResourceAvailability:function(date,duration,period){var day=Date.parse(date).format('%a').toLowerCase();var hours=this.__businessHours[day];var availability=[];if(hours.active){availability.push({from:Date.parse(date+' '+hours.from),to:Date.parse(date+' '+hours.to)});var exclude_period=[{from:period.from.clone().decrement('day'),to:period.from.clone()},{from:period.to.clone(),to:period.to.clone().increment('day')}];availability=SK.Appointments.Utils.timeRange.exclude(availability,exclude_period);}
if($defined(this.__unavailability[date])){availability=SK.Appointments.Utils.timeRange.exclude(availability,this.__unavailability[date]);}
return SK.Appointments.Utils.timeRange.decrement(availability,duration,'to');}});


SK.Appointments.StaffMember=new Class({Implements:[Options,SK.Appointments.Constants,SK.Appointments.ResourceAvailabilityInterface],otions:{"id":null,"name":null,"description":null,"vacation":[],"services":[],"notifyemails":[],"availability":{}},initialize:function(options){this.setOptions(options);this.options.vacation=SK.Appointments.Utils.parseDateList(this.options.vacation,this.DATE_FORMAT);this.setResourceAvailabilityBusinessHours(this.options.availability);},getName:function(){return this.options.name;},getId:function(){return this.options.id;},getServices:function(){return this.options.services;},getEmailAddresses:function(){if(this.options.notifyemails==''){return[];}
return this.options.notifyemails.split(/\s?,\s?/);},isOnVacation:function(date){return this.options.vacation.contains(date);}});


SK.Appointments.Display=new Class({Implements:[SK.Appointments.Constants,SK.Appointments.ResourceAvailabilityInterface],properties:{},config:{},placeholder:null,periodStart:null,periodEnd:null,periodYears:[],periodDates:[],period:[],currentDate:null,closedDates:[],currentSlide:'Home',allSlides:['Home','Services','Calendar','Confirm','Complete'],isStaffEnabled:false,availableMembers:[],staffMembers:{},initialize:function(data){this.placeholderId=data.placeholder;this.staffMembers=$H();this.bounds={resetWizard:this.resetWizard.bind(this),confirmAppointment:this.confirmAppointment.bind(this),gotoNextSlide:this.gotoNextSlide.bind(this),gotoPreviousSlide:this.gotoPreviousSlide.bind(this),showWizard:this.showWizard.bind(this),setNextDate:this.setNextDate.bind(this),setPreviousDate:this.setPreviousDate.bind(this),setSelectedService:this.setSelectedService.bind(this),setSelectedStaff:this.setSelectedStaff.bind(this),setSelectedTime:this.setSelectedTime.bind(this)};this.config=new SK.Util.Registry({'App':JSON.decode(data.properties.ApplicationData),'Db':data.configuration.databases});this.elements=new SK.Util.Registry();this.setResourceAvailabilityBusinessHours(this.getWorkweek());this.isStaffEnabled=!!this.config.get('App.StaffEnabled');window.addEvent('domready',this.init.bind(this));},initTemplate:function(){this.placeholder=$(this.placeholderId);this.template=this.placeholder.getNext('form.sk-shapp-form');this.template.inject(this.placeholder);this.template.setStyle('display','');var width=this.placeholder.getWidth();var max_width=parseInt(this.config.get('App.MaximumWidth'));this.placeholder.setStyle('width',Math.min(width,max_width));this.template.getElements('*[identifier*=]').each(function(element){this.set(element.get('identifier'),element);element.removeProperty('identifier');},this.elements);this.placeholder.getParent().addClass('sk-remove-zero-footprint');},initControls:function(){var controls=this.elements.get('Controls');for(var slide in controls){var slide_controls=controls[slide];for(var control_name in slide_controls){var control=slide_controls[control_name];switch(control_name){case"Cancel":case"Reset":control.addEvent('click',this.bounds.resetWizard)
break;case"Confirm":control.addEvent('click',this.bounds.confirmAppointment)
break;case"Next":control.addEvent('click',this.bounds.gotoNextSlide)
break;case"Previous":control.addEvent('click',this.bounds.gotoPreviousSlide)
break;}}}},initEmailTemplates:function(){new SK.API(null,{encoding:SK.Util.getEncoding()}).execute('utils.get_file',{path:'/Apps/Appointments/Scripts/mail_templates.json'},function(success,message,data){this.config.set('MailTemplates',success?JSON.decode(data.content)||{}:{});}.bind(this));},init:function(){this.initTemplate();this.initControls();this.initEmailTemplates();this.createEnvironment();this.elements.get('Button').addEvent('click',this.bounds.showWizard);var button_type=this.config.get('App.ButtonType');var source=this.config.get('App.ButtonSource_url');var source_wrapper=this.elements.get('ButtonIcon');var show_source=(source!=''&&source!='none');switch(button_type){case'standard':case'rounded':this.elements.get('Button').addClass('button sk-shapp-'+button_type);this.elements.get('ButtonCaption').set('html',this.config.get('App.Caption'))
if(show_source){source_wrapper.grab(new Element('img',{src:source}));}else{source_wrapper.destroy();}
break;case'custom':source_wrapper.grab(new Element('img',{src:source}))
break;}
if(!this.isStaffEnabled){this.elements.get('StaffContainer').setStyle('display','none');this.elements.get('CalendarContainer').setStyle('width','100%');}
if(this.config.get("App.ShowRequest")){this.elements.get('ShowRequest').setStyle('display','');this.elements.get('ShowRequestCaption').set('html',this.config.get("App.ShowRequestCaption"))}
this.elements.get('Calendar.Timezone').set('html',this.config.get("App.Timezone"));if(this.config.get('App.ShowBusinessHours')){this.elements.get('BusinessHoursWrapper').setStyle('display','');this.elements.get('BusinessHoursCaption').set('html',this.config.get('App.BusinessHoursCaption'));var today=new Date().format(this.DATE_FORMAT),text,from,to;var business_hours=this.getResourceAvailabilityBusinessHours();for(var day in business_hours){if(business_hours[day].active){from=Date.parse(today+' '+business_hours[day].from);to=Date.parse(today+' '+business_hours[day].to);text=SK.Util.DateTime.format(from,this.TIME_FORMAT)+" - "+
SK.Util.DateTime.format(to,this.TIME_FORMAT);}else{text="Closed";}
this.elements.get('BusinessHours.'+day).set('text',text);}}},createEnvironment:function(){new SK.API(this.config.get('Db.services.token'),{encoding:SK.Util.getEncoding()}).execute('utils.get_env',{},function(success,message,data){if(!this.validateResponse(success,message)){return;}
SK.Singletons.env.set('remote_ip_address',data.remote_addr);SK.Singletons.env.set('geo_location',data.location);}.bind(this));},showButtonProgress:function(){this.elements.get('ButtonHoursContainer').setStyle('display','none');this.elements.get('ButtonProgress').setStyle('display','block');},hideButtonProgress:function(){this.elements.get('ButtonProgress').setStyle('display','none');this.elements.get('ButtonHoursContainer').setStyle('display','');},showWizard:function(){this.showButtonProgress();if(!this.wizardCreated){this.createWizard();}else{this.gotoNextSlide();}
this.wizardCreated=true;},createWizard:function(){this.createPeriod();this.createClosedDates();this.createCalendar();this.getServices();},createPeriod:function(){var lead_time_from=this.config.get('App.LeadTimeFrom').toInt()||0;var lead_time_to=this.config.get('App.LeadTimeTo').toInt()||0;this.periodStart=(new Date()).increment('hour',lead_time_from);this.periodEnd=(new Date().set({hours:23,minutes:59,seconds:59})).increment('day',lead_time_to);this.period=this.periodStart.createPeriod(this.periodEnd,'day');this.periodDates=this.period.invoke('format',this.DATE_FORMAT);var start_year=(new Date()).set('year',this.periodStart.get('year'));var end_year=(new Date()).set('year',this.periodEnd.get('year'));this.periodYears=start_year.createPeriod(end_year,'year').invoke('get','year');},createClosedDates:function(){this.closedDates=SK.Appointments.Utils.parseDateList(this.config.get('App.ClosedDates'),this.DATE_FORMAT);},createCalendar:function(){this.elements.get('Calendar.Previous').addEvent('click',this.bounds.setPreviousDate);this.elements.get('Calendar.Next').addEvent('click',this.bounds.setNextDate);},getServices:function(){new SK.API(this.config.get('Db.services.token'),{encoding:SK.Util.getEncoding()}).execute('db.query.get_filtered_rows',{index_only:0,filter:JSON.encode({"where":[[this.config.get('Db.services.columns.ID.id'),"=",this.config.get('App.selectedRows.services')]]})},this.retrieveServices.bind(this));},getStaffMembers:function(){new SK.API(this.config.get('Db.staff.token'),{encoding:SK.Util.getEncoding()}).execute('db.query.get_filtered_rows',{index_only:0,filter:JSON.encode({"where":[[this.config.get('Db.staff.columns.ID.id'),"=",this.config.get('App.selectedRows.staff')]]})},this.retrieveStaffMembers.bind(this));},getStaffUnavailability:function(){var staff_ids=[""].concat(this.config.get('App.selectedRows.staff'));new SK.API(this.config.get('Db.appointments.token'),{encoding:SK.Util.getEncoding()}).execute('db.query.get_filtered_rows',{index_only:0,filter:JSON.encode({"where":[[this.config.get('Db.appointments.columns.StaffID.id'),"=",staff_ids],[this.config.get('Db.appointments.columns.StartTime.id'),">",[this.periodStart.clone().clearTime().format('db')]],[this.config.get('Db.appointments.columns.StartTime.id'),"<",[this.periodEnd.format('db')]],[this.config.get('Db.appointments.columns.Status.id'),"=",[this.STATUSES.APPROVED,this.STATUSES.WAITING_APPROVAL]]]})},this.retrieveStaffUnavailability.bind(this));},retrieveServices:function(success,message,data){if(!this.validateResponse(success,message)){return;}
var keys={id:this.config.get('Db.services.columns.ID.id'),name:this.config.get('Db.services.columns.Name.id'),duration:this.config.get('Db.services.columns.Duration.id'),description:this.config.get('Db.services.columns.Description.id'),price:this.config.get('Db.services.columns.Price.id')}
var list={};for(var i=0;i<data.rows.length;i++){var row={};for(var key in keys){row[key]=data.rows[i].cells[keys[key]];}
var wrapper=new Element("label",{"class":"sk-shapp-service","events":{"click":function(){this.getElement('input').fireEvent('change').checked=true;}}}).grab(new Element("span",{"class":"sk-shapp-service-radio"}).grab(new Element("input",{"name":"available_services","type":"radio","class":"radio","value":row.id,"events":{change:this.bounds.setSelectedService.pass(row)}}))).grab(new Element("span",{"class":"sk-shapp-service-content"}).grab(new Element('span',{"class":"sk-shapp-service-heading"}).grab(new Element('span',{"class":"sk-shapp-nowrap",html:this.getServiceTitle(row)})).grab(new Element('span',{"class":"heading2 sk-shapp-service-price sk-shapp-nowrap",text:(row.price&&row.price.length>0)?row.price:''}))).grab(new Element('span',{"class":"plain sk-shapp-service-description",text:(row.description&&row.description.length>0)?row.description:''})));list[row.id]=wrapper;}
var service_selector=this.elements.get('ServiceSelector');this.displayList(list,this.config.get('App.selectedRows.services'),service_selector);this.fixOnChangeEventIE(service_selector);service_selector.getElement('input').fireEvent('change').set("checked","checked");if(this.isStaffEnabled){this.getStaffMembers();}else{this.getStaffUnavailability();}},fixOnChangeEventIE:function(wrapper){if(Browser.Engine.trident){wrapper.getElements('input[id*=], input[type=radio]').each(function(element){element.addEvent('click',element.fireEvent.bind(element,["change"]));});}},retrieveStaffMembers:function(success,message,data){if(!this.validateResponse(success,message)){return;}
if(data.rows.length==0){this.gotoSlide('Services');return;}
var keys={};var columns=this.config.get('Db.staff.columns');for(var column in columns){keys[column.toLowerCase()]=columns[column].id}
for(var i=0;i<data.rows.length;i++){var row={};for(var key in keys){row[key]=data.rows[i].cells[keys[key]];}
row.availability=JSON.decode(row.availability);row.services=JSON.decode(row.services)||[];row.vacation=JSON.decode(row.vacation)||[];if($type(row.availability)!='object'){row.availability=this.getResourceAvailabilityBusinessHours();}
this.staffMembers.set(row.id,new SK.Appointments.StaffMember(row));}
this.getStaffUnavailability();},retrieveStaffUnavailability:function(success,message,data){if(!this.validateResponse(success,message)){return;}
var unavailability={};var keys={StaffID:this.config.get('Db.appointments.columns.StaffID.id'),StartTime:this.config.get('Db.appointments.columns.StartTime.id'),EndTime:this.config.get('Db.appointments.columns.EndTime.id')}
for(var i=0;i<data.rows.length;i++){var staff_id=data.rows[i].cells[keys.StaffID];var start_time=data.rows[i].cells[keys.StartTime];var end_time=data.rows[i].cells[keys.EndTime];if(!$defined(unavailability[staff_id])){unavailability[staff_id]={};}
var from=Date.parse(start_time);var to=Date.parse(end_time);var date=from.format(this.DATE_FORMAT);if(!$defined(unavailability[staff_id][date])){unavailability[staff_id][date]=[];}
unavailability[staff_id][date].push({from:from,to:to});}
for(var staff_id in unavailability){var staff_member=this.staffMembers.get(staff_id);if(staff_member){staff_member.setResourceUnavailability(unavailability[staff_id]);}else{this.setResourceUnavailability(unavailability[staff_id]);}}
this.gotoSlide('Services');},displayStaffSelector:function(){var selector=this.elements.get('StaffSelector');selector.empty();this.currentStaff=null;new Element('div').grab(new Element("label",{"class":"plain sk-shapp-member"}).grab(new Element("input",{"checked":true,"name":"staffmembers","type":"radio","class":"radio","value":"","events":{change:this.bounds.setSelectedStaff.pass(false)}})).appendText(' Any staff member')).inject(selector);var list={};this.availableMembers=[];this.staffMembers.each(function(member,id){var services=member.getServices();if(services.length>0&&!services.contains(this.mgr.currentService.id)){return;}
this.mgr.availableMembers.push(member);this.list[id]=new Element('div').grab(new Element("label",{"class":"plain sk-shapp-member"}).grab(new Element("input",{"name":"staffmembers","type":"radio","class":"radio","value":id,"events":{change:this.mgr.bounds.setSelectedStaff.pass(member)}})).appendText(' '+member.getName()));},{mgr:this,list:list});this.displayList(list,this.config.get('App.selectedRows.staff'),selector);this.fixOnChangeEventIE(selector);},displayList:function(elements,order_array,wrapper){for(var i=0;i<order_array.length;i++){if($defined(elements[order_array[i]])){elements[order_array[i]].inject(wrapper);}}},setSelectedService:function(data){this.currentService=$pick(data,{});this.elements.get('SelectedService').set('html',this.getServiceTitle(this.currentService));},getServiceTitle:function(service){return'<span class="heading2 sk-shapp-nowrap sk-shapp-service-title">'+service.name+'</span> <span class="plain sk-shapp-nowrap sk-shapp-service-time">('+String(service.duration).toInt()+' min)</span>';},setSelectedStaff:function(data){this.currentStaff=data;this.showTimeTable();},setSelectedTime:function(datetime){this.currentTime=datetime;},validateResponse:function(success,message){if(!success){this.showErrorMessage(message);}
return success;},showErrorMessage:function(message){alert(message)},getWorkweek:function(){var is_standard=!!this.config.get('App.BusinessHoursTypeStandard');var rest_days=['sat','sun'];var data=this.config.get('App.BusinessHoursDaily');if(is_standard){var from=this.config.get('App.BusinessHoursStandard.from');var to=this.config.get('App.BusinessHoursStandard.to');for(var day in data){data[day].from=from;data[day].to=to;data[day].active=rest_days.contains(day)?0:"true";}}
return data;},resetWizard:function(){this.hideButtonProgress();this.gotoSlide('Home');},confirmAppointment:function(){var data={};data["email"]=this.elements.get("Confirm.Email").get('value');data["name"]=this.elements.get("Confirm.Name").get('value');data["phone"]=this.elements.get("Confirm.Phone").get('value');if(String(data.name).trim()==''){alert('Please enter your name.');this.elements.get("Confirm.Name").focus();return;}
if(/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+$/.test(data.email)==false){alert('Please enter a valid email address.');this.elements.get("Confirm.Email").focus();return;}
this.gotoNextSlide();this.clientData=data;new SK.API(this.config.get('Db.clients.token'),{encoding:SK.Util.getEncoding()}).execute('db.query.get_filtered_rows',{index_only:0,filter:JSON.encode({"where":[[this.config.get('Db.clients.columns.Email.id'),"=",[data.email]]]})},this.retrieveClientData.bind(this));},retrieveClientData:function(success,message,data){if(!this.validateResponse(success,message)){return;}
var is_insert_mode=(data.rows.length==0);var cells={};if(!is_insert_mode){cells=data.rows[0].cells;}
var num=$pick(cells[this.config.get('Db.clients.columns.NumAppointment.id')],"0");cells[this.config.get('Db.clients.columns.Name.id')]=this.clientData.name;cells[this.config.get('Db.clients.columns.Phone.id')]=this.clientData.phone;cells[this.config.get('Db.clients.columns.LastAppointment.id')]=new Date().format('db');cells[this.config.get('Db.clients.columns.NumAppointment.id')]=String(num.toInt()+1);cells[this.config.get('Db.clients.columns.IPaddress.id')]=SK.Singletons.env.get('remote_ip_address');cells[this.config.get('Db.clients.columns.GeoLocation.id')]=JSON.encode(SK.Singletons.env.get('geo_location'));var json_data='';var command='';if(is_insert_mode){cells[this.config.get('Db.clients.columns.Email.id')]=this.clientData.email;cells[this.config.get('Db.clients.columns.RegisterDate.id')]=new Date().format('db');cells[this.config.get('Db.clients.columns.ID.id')]=null;command='db.row.add';json_data=JSON.encode(cells);}else{var cells_data=[];for(var col_id in cells){cells_data.push({"row_id":data.rows[0].row_id,"col_id":col_id,"lock_id":'auto',"value":cells[col_id]});}
command='db.cell.update_multiple';json_data=JSON.encode(cells_data);}
this.saveClient(command,json_data);},saveClient:function(command,json_data){new SK.API(this.config.get('Db.clients.token'),{encoding:SK.Util.getEncoding()}).execute(command,{cells:json_data},function(success,message,data){if(!this.validateResponse(success,message)){return;}
var cells={};if($type(data.cells)=='array'){data.cells.each(function(cell_data){this[cell_data.col_id]=cell_data.value;},cells);}else{cells=data.cells;}
user_id=cells[this.config.get('Db.clients.columns.ID.id')];this.makeAppointment(user_id);}.bind(this));},makeAppointment:function(user_id){var keys={};var columns=this.config.get('Db.appointments.columns');for(var column in columns){keys[column]=columns[column].id}
var current_time=Date.parse(this.currentTime);var service_duration=String(this.currentService.duration).toInt();var data={};data[keys.StaffID]=this.currentStaff?this.currentStaff.getId():'';data[keys.StartTime]=current_time.format('db');data[keys.EndTime]=current_time.increment('minute',service_duration).format('db');data[keys.Status]=(this.config.get('App.RequireConfirmation')?this.STATUSES.WAITING_APPROVAL:this.STATUSES.APPROVED);data[keys.UserID]=user_id;data[keys.ServiceID]=this.currentService.id;if(this.config.get("App.ShowRequest")){data[keys.Comments]=this.elements.get("Confirm.Comments").get('value');}
new SK.API(this.config.get('Db.appointments.token'),{encoding:SK.Util.getEncoding()}).execute('db.row.add',{cells:JSON.encode(data)},function(success,message,data){if(!this.validateResponse(success,message)){return;}
if(this.config.get("App.NotifyForAppointments")){this.notifyForAppointment();}else{this.completeAppointmentRequest();}}.bind(this));},notifyForAppointment:function(){var email_data={};var xhrs=[];var addresses=this.config.get('App.AppointmentEmails').split(/\s?,\s?/);if(this.currentStaff){addresses=addresses.concat(this.currentStaff.getEmailAddresses());}
var date_obj=Date.parse(this.currentTime);var variables={service:this.currentService.name,with_staff:this.currentStaff?' with '+this.currentStaff.getName():'',dateTime:SK.Util.DateTime.format(date_obj,this.CALENDAR_FORMAT)
+' at '+SK.Util.DateTime.format(date_obj,this.TIME_FORMAT),url:window.location.href}
if(this.config.get("App.RequireConfirmation")){email_data=$unlink(this.config.get('MailTemplates.AppointmentRequest'));}else{addresses.push(this.clientData.email);email_data=$unlink(this.config.get('MailTemplates.AppointmentConfirmation'));}
email_data.body=email_data.body.substitute(variables);addresses=addresses.unique();for(var i=0;i<addresses.length;i++){xhrs.push(this.createEmailRequest(email_data,addresses[i]));}
var group=new Group(xhrs);group.addEvent('success',this.completeAppointmentRequest.bind(this,[variables]));for(var i=0;i<xhrs.length;i++){xhrs[i].send();}},createEmailRequest:function(email_data,address){email_data=$merge(email_data,{from:'no-reply@'+location.host,to:address});return new SK.API(this.config.get('Db.appointments.token'),{encoding:SK.Util.getEncoding()}).buildRequest('utils.send_mail',email_data,this.validateResponse.bind(this));},gotoNextSlide:function(){var current=this.allSlides.indexOf(this.currentSlide);var slide=this.allSlides[current+1];switch(slide){case'Services':break;case'Calendar':if(this.isStaffEnabled){this.displayStaffSelector()}
this.setDate(this.periodDates[0]);break;case'Confirm':if(!this.currentTime){alert('Please choose available date and time.');return;}
if(this.isStaffEnabled&&!this.currentStaff){this.chooseStaffMember(this.currentTime);}
var summary=this.createSummary();this.elements.get("Confirm.Summary").set('text',summary);break;case'Complete':this.elements.get('Complete.Message').setStyle('display','none');this.elements.get('Complete.CancelMessage').setStyle('display','none');this.elements.get('Complete.Progress').setStyle('display','block');if(this.config.get('App.RequireConfirmation')){this.elements.get('Complete.MessageForConfirmation').setStyle('display','block');this.elements.get('Complete.SummaryForConfirmation').set('html',this.createSummary());}else{this.elements.get('Complete.MessageComplete').setStyle('display','block');this.elements.get('Complete.SummaryComplete').set('html',this.createSummary());}
break;}
this.gotoSlide(slide);},completeAppointmentRequest:function(){this.elements.get('Complete.Message').setStyle('display','block');this.elements.get('Complete.Progress').setStyle('display','none');var cancelation_time=parseFloat(this.config.get('App.CancelationTime'));if(cancelation_time>0){this.elements.get('Complete.CancelMessage').setStyle('display','block');this.elements.get('Complete.CancelationTime').set('text',cancelation_time);}},createSummary:function(){var summary=this.currentService.name;if(this.currentStaff){summary+=' with '+this.currentStaff.getName();}
var date_obj=Date.parse(this.currentTime);summary+=' on '+SK.Util.DateTime.format(date_obj,this.CALENDAR_FORMAT)
+' at '+SK.Util.DateTime.format(date_obj,this.TIME_FORMAT);return summary;},gotoPreviousSlide:function(){var current=this.allSlides.indexOf(this.currentSlide);this.gotoSlide(this.allSlides[current-1]);},gotoSlide:function(slide){var slides=this.elements.get('Slides');for(var slide_name in slides){slides[slide_name].setStyle('display',slide_name==slide?'':'none');}
this.currentSlide=slide;},setNextDate:function(){if(this.elements.get('Calendar.Next').hasClass('ig-disabled')){return false;}
var current=this.periodDates.indexOf(this.currentDate);this.setDate(this.periodDates[current+1]);return false;},setPreviousDate:function(){if(this.elements.get('Calendar.Previous').hasClass('ig-disabled')){return false;}
var current=this.periodDates.indexOf(this.currentDate);this.setDate(this.periodDates[current-1]);return false;},setDate:function(date){var display_date=SK.Util.DateTime.format(Date.parse(date),this.CALENDAR_FORMAT);this.elements.get('Calendar.Date').set('value',display_date);this.currentDate=date;this.adjustCalendarHandlers();this.showTimeTable();},adjustCalendarHandlers:function(){var prev_handle=this.elements.get('Calendar.Previous');var next_handle=this.elements.get('Calendar.Next');var first_date=this.periodDates[0];var last_date=this.periodDates.getLast();prev_handle[this.currentDate==first_date?'addClass':'removeClass']('ig-disabled');next_handle[this.currentDate==last_date?'addClass':'removeClass']('ig-disabled');},showTimeTable:function(){var time_selector=this.elements.get('TimeSelector');this.currentTime=null;var service_duration=String(this.currentService.duration).toInt()-1;var period={from:this.periodStart,to:this.periodEnd};var availability=[];this.staffAvailability=[];time_selector.empty();if(!this.closedDates.contains(this.currentDate)){availability=this.getResourceAvailability(this.currentDate,service_duration,period);if(this.isStaffEnabled){if(this.currentStaff){if(this.currentStaff.isOnVacation(this.currentDate)){availability=[];}else{availability=this.currentStaff.getResourceAvailability(this.currentDate,service_duration,period);}}else{var ranges=[]
for(var i=0;i<this.availableMembers.length;i++){if(this.availableMembers[i].isOnVacation(this.currentDate)){continue;}
var member_availability=this.availableMembers[i].getResourceAvailability(this.currentDate,service_duration,period);ranges.push(member_availability);this.staffAvailability.push({id:this.availableMembers[i].getId(),availability:member_availability});}
availability=SK.Appointments.Utils.timeRange.merge(ranges.flatten());}}}
var slots_number=0;for(var i=0;i<availability.length;i++){availability[i].from.roundTimeToInterval(this.TIME_SLOT_INTERVAL);availability[i].to.roundTimeToInterval(1);var start=availability[i].from.getTime();var end=availability[i].to.getTime();var date=availability[i].from.clone();var slots_num=1+Math.floor((end-start)/(Date.units.minute()*this.TIME_SLOT_INTERVAL));for(var j=0;j<slots_num;j++){var datetime=date.format('db');if(slots_number==0){this.currentTime=datetime;}
slots_number++;new Element("label",{"class":"plain sk-shapp-timeslot"}).grab(new Element("input",{"checked":(slots_number==1)?true:null,"name":"time_slots","type":"radio","class":"radio","value":datetime,"events":{change:this.bounds.setSelectedTime.pass(datetime)}})).appendText(' '+SK.Util.DateTime.format(date,this.TIME_FORMAT)).inject(time_selector);date.increment('minute',this.TIME_SLOT_INTERVAL);}}
this.fixOnChangeEventIE(time_selector);if(slots_number==0){time_selector.grab(new Element('p',{"class":"sk-shapp-time-no-slots",text:"Sorry, there are no available slots on this date."}));}},chooseStaffMember:function(time){time=Date.parse(time).getTime();for(var i=0;i<this.staffAvailability.length;i++){var staff=this.staffAvailability[i];for(var j=0;j<staff.availability.length;j++){var start=staff.availability[j].from.getTime();var end=staff.availability[j].to.getTime();if(start<=time&&end>=time){this.currentStaff=this.staffMembers.get(staff.id);return;}}};}});


