Thank you for visiting London Bridge Smiles. We invite you to read some of our patient testimonials to see what people in Virginia Beach, Virginia, and surrounding areas think about their dental care by Dr. Alan Kessler and Dr. Tiffany Foster-Kessler. To learn more about us, and to make your appointment with our dentists, please contact our office at 757-340-8805.

The requested content cannot be loaded.
Please try again later.

',closeBtn:'',next:'',prev:''},openEffect:"fade",openSpeed:250,openEasing:"swing",openOpacity:!0,openMethod:"zoomIn",closeEffect:"fade",closeSpeed:250,closeEasing:"swing",closeOpacity:!0,closeMethod:"zoomOut",nextEffect:"elastic",nextSpeed:250,nextEasing:"swing",nextMethod:"changeIn",prevEffect:"elastic",prevSpeed:250,prevEasing:"swing",prevMethod:"changeOut",helpers:{overlay:!0,title:!0},onCancel:f.noop,beforeLoad:f.noop,afterLoad:f.noop,beforeShow:f.noop,afterShow:f.noop,beforeChange:f.noop,beforeClose:f.noop,afterClose:f.noop},group:{},opts:{},previous:null,coming:null,current:null,isActive:!1,isOpen:!1,isOpened:!1,wrap:null,skin:null,outer:null,inner:null,player:{timer:null,isActive:!1},ajaxLoad:null,imgPreload:null,transitions:{},helpers:{},open:function(a,d){if(a&&(f.isPlainObject(d)||(d={}),!1!==b.close(!0)))return f.isArray(a)||(a=t(a)?f(a).get():[a]),f.each(a,function(e,c){var k={},g,h,j,m,l;"object"===f.type(c)&&(c.nodeType&&(c=f(c)),t(c)?(k={href:c.data("fancybox-href")||c.attr("href"),title:c.data("fancybox-title")||c.attr("title"),isDom:!0,element:c},f.metadata&&f.extend(!0,k,c.metadata())):k=c);g=d.href||k.href||(q(c)?c:null);h=d.title!==v?d.title:k.title||"";m=(j=d.content||k.content)?"html":d.type||k.type;!m&&k.isDom&&(m=c.data("fancybox-type"),m||(m=(m=c.prop("class").match(/fancybox\.(\w+)/))?m[1]:null));q(g)&&(m||(b.isImage(g)?m="image":b.isSWF(g)?m="swf":"#"===g.charAt(0)?m="inline":q(c)&&(m="html",j=c)),"ajax"===m&&(l=g.split(/\s+/,2),g=l.shift(),l=l.shift()));j||("inline"===m?g?j=f(q(g)?g.replace(/.*(?=#[^\s]+$)/,""):g):k.isDom&&(j=c):"html"===m?j=g:!m&&(!g&&k.isDom)&&(m="inline",j=c));f.extend(k,{href:g,type:m,content:j,title:h,selector:l});a[e]=k}),b.opts=f.extend(!0,{},b.defaults,d),d.keys!==v&&(b.opts.keys=d.keys?f.extend({},b.defaults.keys,d.keys):!1),b.group=a,b._start(b.opts.index)},cancel:function(){var a=b.coming;a&&!1!==b.trigger("onCancel")&&(b.hideLoading(),b.ajaxLoad&&b.ajaxLoad.abort(),b.ajaxLoad=null,b.imgPreload&&(b.imgPreload.onload=b.imgPreload.onerror=null),a.wrap&&a.wrap.stop(!0,!0).trigger("onReset").remove(),b.coming=null,b.current||b._afterZoomOut(a))},close:function(a){b.cancel();!1!==b.trigger("beforeClose")&&(b.unbindEvents(),b.isActive&&(!b.isOpen||!0===a?(f(".fancybox-wrap").stop(!0).trigger("onReset").remove(),b._afterZoomOut()):(b.isOpen=b.isOpened=!1,b.isClosing=!0,f(".fancybox-item, .fancybox-nav").remove(),b.wrap.stop(!0,!0).removeClass("fancybox-opened"),b.transitions[b.current.closeMethod]())))},play:function(a){var d=function(){clearTimeout(b.player.timer)},e=function(){d();b.current&&b.player.isActive&&(b.player.timer=setTimeout(b.next,b.current.playSpeed))},c=function(){d();p.unbind(".player");b.player.isActive=!1;b.trigger("onPlayEnd")};if(!0===a||!b.player.isActive&&!1!==a){if(b.current&&(b.current.loop||b.current.index=c.index?"next":"prev"],b.router=e||"jumpto",c.loop&&(0>a&&(a=c.group.length+a%c.group.length),a%=c.group.length),c.group[a]!==v&&(b.cancel(),b._start(a)))},reposition:function(a,d){var e=b.current,c=e?e.wrap:null,k;c&&(k=b._getPosition(d),a&&"scroll"===a.type?(delete k.position,c.stop(!0,!0).animate(k,200)):(c.css(k),e.pos=f.extend({},e.dim,k)))},update:function(a){var d=a&&a.type,e=!d||"orientationchange"===d;e&&(clearTimeout(B),B=null);b.isOpen&&!B&&(B=setTimeout(function(){var c=b.current;c&&!b.isClosing&&(b.wrap.removeClass("fancybox-tmp"),(e||"load"===d||"resize"===d&&c.autoResize)&&b._setDimension(),"scroll"===d&&c.canShrink||b.reposition(a),b.trigger("onUpdate"),B=null)},e&&!s?0:300))},toggle:function(a){b.isOpen&&(b.current.fitToView="boolean"===f.type(a)?a:!b.current.fitToView,s&&(b.wrap.removeAttr("style").addClass("fancybox-tmp"),b.trigger("onUpdate")),b.update())},hideLoading:function(){p.unbind(".loading");f("#fancybox-loading").remove()},showLoading:function(){var a,d;b.hideLoading();a=f('
').click(b.cancel).appendTo("body");p.bind("keydown.loading",function(a){if(27===(a.which||a.keyCode))a.preventDefault(),b.cancel()});b.defaults.fixed||(d=b.getViewport(),a.css({position:"absolute",top:0.5*d.h+d.y,left:0.5*d.w+d.x}))},getViewport:function(){var a=b.current&&b.current.locked||!1,d={x:n.scrollLeft(),y:n.scrollTop()};a?(d.w=a[0].clientWidth,d.h=a[0].clientHeight):(d.w=s&&r.innerWidth?r.innerWidth:n.width(),d.h=s&&r.innerHeight?r.innerHeight:n.height());return d},unbindEvents:function(){b.wrap&&t(b.wrap)&&b.wrap.unbind(".fb");p.unbind(".fb");n.unbind(".fb")},bindEvents:function(){var a=b.current,d;a&&(n.bind("orientationchange.fb"+(s?"":" resize.fb")+(a.autoCenter&&!a.locked?" scroll.fb":""),b.update),(d=a.keys)&&p.bind("keydown.fb",function(e){var c=e.which||e.keyCode,k=e.target||e.srcElement;if(27===c&&b.coming)return!1;!e.ctrlKey&&(!e.altKey&&!e.shiftKey&&!e.metaKey&&(!k||!k.type&&!f(k).is("[contenteditable]")))&&f.each(d,function(d,k){if(1h[0].clientWidth||h[0].clientHeight&&h[0].scrollHeight>h[0].clientHeight),h=f(h).parent();if(0!==c&&!j&&1g||0>k)b.next(0>g?"up":"right");d.preventDefault()}}))},trigger:function(a,d){var e,c=d||b.coming||b.current;if(c){f.isFunction(c[a])&&(e=c[a].apply(c,Array.prototype.slice.call(arguments,1)));if(!1===e)return!1;c.helpers&&f.each(c.helpers,function(d,e){if(e&&b.helpers[d]&&f.isFunction(b.helpers[d][a]))b.helpers[d][a](f.extend(!0,{},b.helpers[d].defaults,e),c)});p.trigger(a)}},isImage:function(a){return q(a)&&a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i)},isSWF:function(a){return q(a)&&a.match(/\.(swf)((\?|#).*)?$/i)},_start:function(a){var d={},e,c;a=l(a);e=b.group[a]||null;if(!e)return!1;d=f.extend(!0,{},b.opts,e);e=d.margin;c=d.padding;"number"===f.type(e)&&(d.margin=[e,e,e,e]);"number"===f.type(c)&&(d.padding=[c,c,c,c]);d.modal&&f.extend(!0,d,{closeBtn:!1,closeClick:!1,nextClick:!1,arrows:!1,mouseWheel:!1,keys:null,helpers:{overlay:{closeClick:!1}}});d.autoSize&&(d.autoWidth=d.autoHeight=!0);"auto"===d.width&&(d.autoWidth=!0);"auto"===d.height&&(d.autoHeight=!0);d.group=b.group;d.index=a;b.coming=d;if(!1===b.trigger("beforeLoad"))b.coming=null;else{c=d.type;e=d.href;if(!c)return b.coming=null,b.current&&b.router&&"jumpto"!==b.router?(b.current.index=a,b[b.router](b.direction)):!1;b.isActive=!0;if("image"===c||"swf"===c)d.autoHeight=d.autoWidth=!1,d.scrolling="visible";"image"===c&&(d.aspectRatio=!0);"iframe"===c&&s&&(d.scrolling="scroll");d.wrap=f(d.tpl.wrap).addClass("fancybox-"+(s?"mobile":"desktop")+" fancybox-type-"+c+" fancybox-tmp "+d.wrapCSS).appendTo(d.parent||"body");f.extend(d,{skin:f(".fancybox-skin",d.wrap),outer:f(".fancybox-outer",d.wrap),inner:f(".fancybox-inner",d.wrap)});f.each(["Top","Right","Bottom","Left"],function(a,b){d.skin.css("padding"+b,w(d.padding[a]))});b.trigger("onReady");if("inline"===c||"html"===c){if(!d.content||!d.content.length)return b._error("content")}else if(!e)return b._error("href");"image"===c?b._loadImage():"ajax"===c?b._loadAjax():"iframe"===c?b._loadIframe():b._afterLoad()}},_error:function(a){f.extend(b.coming,{type:"html",autoWidth:!0,autoHeight:!0,minWidth:0,minHeight:0,scrolling:"no",hasError:a,content:b.coming.tpl.error});b._afterLoad()},_loadImage:function(){var a=b.imgPreload=new Image;a.onload=function(){this.onload=this.onerror=null;b.coming.width=this.width/b.opts.pixelRatio;b.coming.height=this.height/b.opts.pixelRatio;b._afterLoad()};a.onerror=function(){this.onload=this.onerror=null;b._error("image")};a.src=b.coming.href;!0!==a.complete&&b.showLoading()},_loadAjax:function(){var a=b.coming;b.showLoading();b.ajaxLoad=f.ajax(f.extend({},a.ajax,{url:a.href,error:function(a,e){b.coming&&"abort"!==e?b._error("ajax",a):b.hideLoading()},success:function(d,e){"success"===e&&(a.content=d,b._afterLoad())}}))},_loadIframe:function(){var a=b.coming,d=f(a.tpl.iframe.replace(/\{rnd\}/g,(new Date).getTime())).attr("scrolling",s?"auto":a.iframe.scrolling).attr("src",a.href);f(a.wrap).bind("onReset",function(){try{f(this).find("iframe").hide().attr("src","//about:blank").end().empty()}catch(a){}});a.iframe.preload&&(b.showLoading(),d.one("load",function(){f(this).data("ready",1);s||f(this).bind("load.fb",b.update);f(this).parents(".fancybox-wrap").width("100%").removeClass("fancybox-tmp").show();b._afterLoad()}));a.content=d.appendTo(a.inner);a.iframe.preload||b._afterLoad()},_preloadImages:function(){var a=b.group,d=b.current,e=a.length,c=d.preload?Math.min(d.preload,e-1):0,f,g;for(g=1;g<=c;g+=1)f=a[(d.index+g)%e],"image"===f.type&&f.href&&((new Image).src=f.href)},_afterLoad:function(){var a=b.coming,d=b.current,e,c,k,g,h;b.hideLoading();if(a&&!1!==b.isActive)if(!1===b.trigger("afterLoad",a,d))a.wrap.stop(!0).trigger("onReset").remove(),b.coming=null;else{d&&(b.trigger("beforeChange",d),d.wrap.stop(!0).removeClass("fancybox-opened").find(".fancybox-item, .fancybox-nav").remove());b.unbindEvents();e=a.content;c=a.type;k=a.scrolling;f.extend(b,{wrap:a.wrap,skin:a.skin,outer:a.outer,inner:a.inner,current:a,previous:d});g=a.href;switch(c){case "inline":case "ajax":case "html":a.selector?e=f("
").html(e).find(a.selector):t(e)&&(e.data("fancybox-placeholder")||e.data("fancybox-placeholder",f('
').insertAfter(e).hide()),e=e.show().detach(),a.wrap.bind("onReset",function(){f(this).find(e).length&&e.hide().replaceAll(e.data("fancybox-placeholder")).data("fancybox-placeholder",!1)}));break;case "image":e=a.tpl.image.replace("{href}",g);break;case "swf":e='',h="",f.each(a.swf,function(a,b){e+='';h+=" "+a+'="'+b+'"'}),e+='"}(!t(e)||!e.parent().is(a.inner))&&a.inner.append(e);b.trigger("beforeShow");a.inner.css("overflow","yes"===k?"scroll":"no"===k?"hidden":k);b._setDimension();b.reposition();b.isOpen=!1;b.coming=null;b.bindEvents();if(b.isOpened){if(d.prevMethod)b.transitions[d.prevMethod]()}else f(".fancybox-wrap").not(a.wrap).stop(!0).trigger("onReset").remove();b.transitions[b.isOpened?a.nextMethod:a.openMethod]();b._preloadImages()}},_setDimension:function(){var a=b.getViewport(),d=0,e=!1,c=!1,e=b.wrap,k=b.skin,g=b.inner,h=b.current,c=h.width,j=h.height,m=h.minWidth,u=h.minHeight,n=h.maxWidth,p=h.maxHeight,s=h.scrolling,q=h.scrollOutside?h.scrollbarWidth:0,x=h.margin,y=l(x[1]+x[3]),r=l(x[0]+x[2]),v,z,t,C,A,F,B,D,H;e.add(k).add(g).width("auto").height("auto").removeClass("fancybox-tmp");x=l(k.outerWidth(!0)-k.width());v=l(k.outerHeight(!0)-k.height());z=y+x;t=r+v;C=E(c)?(a.w-z)*l(c)/100:c;A=E(j)?(a.h-t)*l(j)/100:j;if("iframe"===h.type){if(H=h.content,h.autoHeight&&1===H.data("ready"))try{H[0].contentWindow.document.location&&(g.width(C).height(9999),F=H.contents().find("body"),q&&F.css("overflow-x","hidden"),A=F.outerHeight(!0))}catch(G){}}else if(h.autoWidth||h.autoHeight)g.addClass("fancybox-tmp"),h.autoWidth||g.width(C),h.autoHeight||g.height(A),h.autoWidth&&(C=g.width()),h.autoHeight&&(A=g.height()),g.removeClass("fancybox-tmp");c=l(C);j=l(A);D=C/A;m=l(E(m)?l(m,"w")-z:m);n=l(E(n)?l(n,"w")-z:n);u=l(E(u)?l(u,"h")-t:u);p=l(E(p)?l(p,"h")-t:p);F=n;B=p;h.fitToView&&(n=Math.min(a.w-z,n),p=Math.min(a.h-t,p));z=a.w-y;r=a.h-r;h.aspectRatio?(c>n&&(c=n,j=l(c/D)),j>p&&(j=p,c=l(j*D)),cz||y>r)&&(c>m&&j>u)&&!(19n&&(c=n,j=l(c/D)),g.width(c).height(j),e.width(c+x),a=e.width(),y=e.height();else c=Math.max(m,Math.min(c,c-(a-z))),j=Math.max(u,Math.min(j,j-(y-r)));q&&("auto"===s&&jz||y>r)&&c>m&&j>u;c=h.aspectRatio?cu&&j
').appendTo(b.coming?b.coming.parent:a.parent);this.fixed=!1;a.fixed&&b.defaults.fixed&&(this.overlay.addClass("fancybox-overlay-fixed"),this.fixed=!0)},open:function(a){var d=this;a=f.extend({},this.defaults,a);this.overlay?this.overlay.unbind(".overlay").width("auto").height("auto"):this.create(a);this.fixed||(n.bind("resize.overlay",f.proxy(this.update,this)),this.update());a.closeClick&&this.overlay.bind("click.overlay",function(a){if(f(a.target).hasClass("fancybox-overlay"))return b.isActive?b.close():d.close(),!1});this.overlay.css(a.css).show()},close:function(){var a,b;n.unbind("resize.overlay");this.el.hasClass("fancybox-lock")&&(f(".fancybox-margin").removeClass("fancybox-margin"),a=n.scrollTop(),b=n.scrollLeft(),this.el.removeClass("fancybox-lock"),n.scrollTop(a).scrollLeft(b));f(".fancybox-overlay").remove().hide();f.extend(this,{overlay:null,fixed:!1})},update:function(){var a="100%",b;this.overlay.width(a).height("100%");I?(b=Math.max(G.documentElement.offsetWidth,G.body.offsetWidth),p.width()>b&&(a=p.width())):p.width()>n.width()&&(a=p.width());this.overlay.width(a).height(p.height())},onReady:function(a,b){var e=this.overlay;f(".fancybox-overlay").stop(!0,!0);e||this.create(a);a.locked&&(this.fixed&&b.fixed)&&(e||(this.margin=p.height()>n.height()?f("html").css("margin-right").replace("px",""):!1),b.locked=this.overlay.append(b.wrap),b.fixed=!1);!0===a.showEarly&&this.beforeShow.apply(this,arguments)},beforeShow:function(a,b){var e,c;b.locked&&(!1!==this.margin&&(f("*").filter(function(){return"fixed"===f(this).css("position")&&!f(this).hasClass("fancybox-overlay")&&!f(this).hasClass("fancybox-wrap")}).addClass("fancybox-margin"),this.el.addClass("fancybox-margin")),e=n.scrollTop(),c=n.scrollLeft(),this.el.addClass("fancybox-lock"),n.scrollTop(e).scrollLeft(c));this.open(a)},onUpdate:function(){this.fixed||this.update()},afterClose:function(a){this.overlay&&!b.coming&&this.overlay.fadeOut(a.speedOut,f.proxy(this.close,this))}};b.helpers.title={defaults:{type:"float",position:"bottom"},beforeShow:function(a){var d=b.current,e=d.title,c=a.type;f.isFunction(e)&&(e=e.call(d.element,d));if(q(e)&&""!==f.trim(e)){d=f('
'+e+"
");switch(c){case "inside":c=b.skin;break;case "outside":c=b.wrap;break;case "over":c=b.inner;break;default:c=b.skin,d.appendTo("body"),I&&d.width(d.width()),d.wrapInner(''),b.current.margin[2]+=Math.abs(l(d.css("margin-bottom")))}d["top"===a.position?"prependTo":"appendTo"](c)}}};f.fn.fancybox=function(a){var d,e=f(this),c=this.selector||"",k=function(g){var h=f(this).blur(),j=d,k,l;!g.ctrlKey&&(!g.altKey&&!g.shiftKey&&!g.metaKey)&&!h.is(".fancybox-wrap")&&(k=a.groupAttr||"data-fancybox-group",l=h.attr(k),l||(k="rel",l=h.get(0)[k]),l&&(""!==l&&"nofollow"!==l)&&(h=c.length?f(c):e,h=h.filter("["+k+'="'+l+'"]'),j=h.index(this)),a.index=j,!1!==b.open(h,a)&&g.preventDefault())};a=a||{};d=a.index||0;!c||!1===a.live?e.unbind("click.fb-start").bind("click.fb-start",k):p.undelegate(c,"click.fb-start").delegate(c+":not('.fancybox-item, .fancybox-nav')","click.fb-start",k);this.filter("[data-fancybox-start=1]").trigger("click");return this};p.ready(function(){var a,d;f.scrollbarWidth===v&&(f.scrollbarWidth=function(){var a=f('
').appendTo("body"),b=a.children(),b=b.innerWidth()-b.height(99).innerWidth();a.remove();return b});if(f.support.fixedPosition===v){a=f.support;d=f('
').appendTo("body");var e=20===d[0].offsetTop||15===d[0].offsetTop;d.remove();a.fixedPosition=e}f.extend(b.defaults,{scrollbarWidth:f.scrollbarWidth(),fixed:f.support.fixedPosition,parent:f("body")});a=f(r).width();J.addClass("fancybox-lock-test");d=f(r).width();J.removeClass("fancybox-lock-test");f("").appendTo("head")})})(window,document,jQuery);(function(d){function e(a){var b=a||window.event,c=[].slice.call(arguments,1),f=0,e=0,g=0,a=d.event.fix(b);a.type="mousewheel";b.wheelDelta&&(f=b.wheelDelta/120);b.detail&&(f=-b.detail/3);g=f;b.axis!==void 0&&b.axis===b.HORIZONTAL_AXIS&&(g=0,e=-1*f);b.wheelDeltaY!==void 0&&(g=b.wheelDeltaY/120);b.wheelDeltaX!==void 0&&(e=-1*b.wheelDeltaX/120);c.unshift(a,f,e,g);return(d.event.dispatch||d.event.handle).apply(this,c)}var c=["DOMMouseScroll","mousewheel"];if(d.event.fixHooks)for(var h=c.length;h;)d.event.fixHooks[c[--h]]=d.event.mouseHooks;d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=c.length;a;)this.addEventListener(c[--a],e,false);else this.onmousewheel=e},teardown:function(){if(this.removeEventListener)for(var a=c.length;a;)this.removeEventListener(c[--a],e,false);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);(function ($) { "use strict"; var F = $.fancybox, format = function( url, rez, params ) { params = params || ''; if ( $.type( params ) === "object" ) { params = $.param(params, true); } $.each(rez, function(key, value) { url = url.replace( '$' + key, value || '' ); }); if (params.length) { url += ( url.indexOf('?') > 0 ? '&' : '?' ) + params; } return url; }; F.helpers.media = { defaults : { youtube : { matcher : /(youtube\.com|youtu\.be|youtube-nocookie\.com)\/(watch\?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*)).*/i, params : { autoplay : 1, autohide : 1, fs : 1, rel : 0, hd : 1, wmode : 'opaque', enablejsapi : 1 }, type : 'iframe', url : '//www.youtube.com/embed/$3' }, vimeo : { matcher : /(?:vimeo(?:pro)?.com)\/(?:[^\d]+)?(\d+)(?:.*)/, params : { autoplay : 1, hd : 1, show_title : 1, show_byline : 1, show_portrait : 0, fullscreen : 1 }, type : 'iframe', url : '//player.vimeo.com/video/$1' }, metacafe : { matcher : /metacafe.com\/(?:watch|fplayer)\/([\w\-]{1,10})/, params : { autoPlay : 'yes' }, type : 'swf', url : function( rez, params, obj ) { obj.swf.flashVars = 'playerVars=' + $.param( params, true ); return '//www.metacafe.com/fplayer/' + rez[1] + '/.swf'; } }, dailymotion : { matcher : /dailymotion.com\/video\/(.*)\/?(.*)/, params : { additionalInfos : 0, autoStart : 1 }, type : 'swf', url : '//www.dailymotion.com/swf/video/$1' }, twitvid : { matcher : /twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i, params : { autoplay : 0 }, type : 'iframe', url : '//www.twitvid.com/embed.php?guid=$1' }, twitpic : { matcher : /twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i, type : 'image', url : '//twitpic.com/show/full/$1/' }, instagram : { matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, type : 'image', url : '//$1/p/$2/media/?size=l' }, google_maps : { matcher : /maps\.google\.([a-z]{2,3}(\.[a-z]{2})?)\/(\?ll=|maps\?)(.*)/i, type : 'iframe', url : function( rez ) { return '//maps.google.' + rez[1] + '/' + rez[3] + '' + rez[4] + '&output=' + (rez[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed'); } } }, beforeLoad : function(opts, obj) { var url = obj.href || '', type = false, what, item, rez, params; for (what in opts) { if (opts.hasOwnProperty(what)) { item = opts[ what ]; rez = url.match( item.matcher ); if (rez) { type = item.type; params = $.extend(true, {}, item.params, obj[ what ] || ($.isPlainObject(opts[ what ]) ? opts[ what ].params : null)); url = $.type( item.url ) === "function" ? item.url.call( this, rez, params, obj ) : format( item.url, rez, params ); break; } } } if (type) { obj.href = url; obj.type = type; obj.autoHeight = false; } } };}(jQuery)); var bpApp = { extendObject: function(sourceObj, targetObj) { if(typeof sourceObj === 'object' && typeof targetObj === 'object') { for(var property in sourceObj) { if(sourceObj.hasOwnProperty(property) && typeof targetObj[property] === 'undefined') { targetObj[property] = sourceObj[property]; } } return targetObj; } return false; }, extendClass: function(sourceClass, targetClass) { var source = (typeof sourceClass === 'function')? sourceClass.prototype : sourceClass, target = (typeof targetClass === 'function')? targetClass.prototype : targetClass; if(typeof source === 'object' && typeof target === 'object') { var obj = this.createObject(source); this.extendObject(source, obj); for(var prop in target) { obj[prop] = target[prop]; } return obj; } return false; }, createObject: function(object) { if(typeof Object.create !== 'function') { var obj = function(){}; obj.prototype = object; return new obj(); } else { return Object.create(object); } }, createCallBack: function(obj, method, argArray) { if(typeof method === 'function') { argArray = argArray || []; return function() { return method.apply(obj, argArray); }; } else { return false; } }}; bpApp.htmlBuilder = function(){}; bpApp.htmlBuilder.prototype = { constructor: bpApp.htmlBuilder, create: function(nodeName, attrObject, container, prepend) { var filterProperty = function(prop) { switch(prop) { case 'class': prop = 'className'; break; } return prop; }; var removePrefix = function(prop) { if(typeof prop !== 'undefined') { if(prop.substring(0, 2) === 'on') { prop = prop.substring(2); } } return prop; }; var obj = document.createElement(nodeName); if(typeof attrObject === 'object') { for(var prop in attrObject) { var propName = filterProperty(prop), attrPropValue = attrObject[prop]; if(prop === 'innerHTML') { if(typeof attrPropValue !== 'undefined' && attrPropValue !== '') { var pattern = /<[a-z][\s\S]*>/i; if(pattern.test(attrPropValue)) { obj.innerHTML = attrPropValue; } else { obj.textContent = attrPropValue; } } } else if(prop.substring(0, 5) === 'data-') { jQuery(obj).data(prop, attrObject[prop]); } else { if(typeof attrObject[prop] !== 'undefined' && attrObject[prop] != '') { if(typeof attrObject[prop] === 'function') { propName = removePrefix(propName); jQuery(obj).on(propName, attrObject[prop]); } else { obj[propName] = attrObject[prop]; } } } } } try { if(prepend == true) { this.prepend(container, obj); } else { this.append(container, obj); } } catch(e) { console.log(obj); } return obj; }, append: function(parent, child) { if(typeof parent === "undefined") { parent = document.body; } else if(typeof parent === 'string') { parent = document.getElementById(parent); } if(typeof parent === 'object') { parent.appendChild(child); } return this; }, prepend: function(parent, child) { if(typeof parent === "undefined") { parent = document.body; } else if(typeof parent === 'string') { parent = document.getElementById(parent); } if(typeof parent === 'object') { parent.insertBefore(child, parent.firstChild); } return this; }, createObject: function(object, id, tmpClass, text, container, prepend) { var attr = { id: id, 'className': tmpClass, innerHTML: text }; return this.create(object, attr, container, prepend); }, createButton: function(type,id,tmpClass,text,callBackFn,container,prepend) { var attr = { id: id, 'className': tmpClass, innerHTML: text }; if(typeof callBackFn === 'function') { attr.onclick = callBackFn; } return this.create(type, attr, container, prepend); }, createLink: function(type,id,tmpClass,text,url,container,prepend) { var attr = { id: id, 'className': tmpClass, innerHTML: text }; if(url !== null) { attr.href = url; } return this.create(type, attr, container, prepend); }, createIframe: function(id, className, src, container, prepend) { var attr = { id: id, 'className': className }; if(typeof src !== 'undefined') { attr.src = src; } attr.width = '100%'; attr.height = '100%'; attr.frameBorder = "0"; return this.create('iframe', attr, container, prepend); }, createImage: function(id, tmpClass, src, alt, container, prepend) { var attr = { id: id, 'className': tmpClass }; if(typeof alt !== 'undefined') { attr.alt = alt; } if(typeof src !== 'undefined') { attr.src = src; } return this.create('img', attr, container, prepend); } }; var removeClassAndHide = function(obj, animationClass){ obj.style.display = 'none'; removeAnimationClass(obj, animationClass); }; var removeAnimationClass = function(obj, animationClass){ jQuery(obj).removeClass(animationClass); bpApp.animate.animating.remove(obj); }; bpApp.animate = { animating: { objects: [], add: function(object, className, timer) { this.stopPreviousAnimations(object); this.addObject(object, className, timer); }, addObject: function(object, className, timer) { if(object) { var animation = { object: object, className: className, timer: timer }; this.objects.push(animation); } }, remove: function(object) { var objectIndex = this.removeObject(object); }, removeObject: function(object, removeClass) { if(object) { var animating = this.checkAnimating(object); if(animating !== false) { var animations = animating; for(var i = 0, maxLength = animations.length; i < maxLength; i++) { var animation = animations[i]; this.stopTimer(animation); if(removeClass) { jQuery(animation.object).removeClass(animation.className); } var indexNumber = jQuery.inArray(animation, this.objects); if(indexNumber >= 0) { this.objects.splice(indexNumber, 1); } } } } }, stopTimer: function(animation) { if(animation) { var timer = animation.timer; window.clearTimeout(timer); } }, checkAnimating: function(obj) { var animationArray = []; for(var i = 0, maxLength = this.objects.length; i < maxLength; i++) { var animation = this.objects[i]; if(animation.object === obj) { animationArray.push(animation); } } return (animationArray.length >= 1)? animationArray : false; }, stopPreviousAnimations: function(obj) { this.removeObject(obj, 1); }, reset: function() { this.objects = []; } }, setupSelectingObject: function(object) { return (typeof object === 'string')? document.getElementById(object) : object; }, hide: function(object, animationClass, duration) { var obj = this.setupSelectingObject(object); jQuery(obj).addClass(animationClass); var callBack = bpApp.createCallBack(null, removeClassAndHide, [obj, animationClass]); var timer = window.setTimeout(callBack, duration); this.animating.add(obj, animationClass, timer); }, show: function(object, animationClass, duration) { var obj = this.setupSelectingObject(object); jQuery(obj).addClass(animationClass); obj.style.display = 'block'; var callBack = bpApp.createCallBack(null, removeAnimationClass, [obj, animationClass]); var timer = window.setTimeout(callBack, duration); this.animating.add(obj, animationClass, timer); }, set: function(object, animationClass, duration) { var obj = this.setupSelectingObject(object); jQuery(obj).addClass(animationClass); var callBack = bpApp.createCallBack(null, removeAnimationClass, [obj, animationClass]); var timer = window.setTimeout(callBack, duration); this.animating.add(obj, animationClass, timer); } }; bpApp.navigation = function(scrollContainer, container){ var navigation = bpApp.navigation; this.number = (typeof navigation.number === 'undefined')? navigation.number = 0 : (++navigation.number); this.id = 'navigation_panel_' + this.number; this.scrollContainer = scrollContainer; this.container = container; }; bpApp.navigation.prototype = bpApp.extendClass( bpApp.htmlBuilder, { constructor: bpApp.navigation, setup: function() { this.setupCurrentPage(); this.setupNav(); this.groups.selectPrimaryGroup(); }, setupGroups: function(optionsArray) { var self = this; this.groups = { lastSelectedGroup: null, options: [], createPanel: function() { var buttonBack = self.createButton('button', self.id + '_button_back', 'bttn back', '', '', 'main-nav-container'); }, addGroup: function(level, parent) { var container = self.scrollContainer, style = (level === 0)? 'primary' : 'sub-menu', number = (this.options.length); var groupPanel = self.createObject('div', self.id + '_nav_' + number + level, 'group-nav-container', '', self.scrollContainer); var navContainer = self.createObject('nav', self.id + '_nav_container', 'main-nav-container', '', groupPanel); var ul = self.createObject('ul', self.id + '_nav_ul_' + number + level, 'dropdown-menu ' + style, '', navContainer); var group = { level: level, parent: parent, element: groupPanel, list: ul, options: [], selected: false }; this.options.push(group); return group; }, reset: function() { this.lastSelectedGroup = null; this.options = []; this.optionNumber = 0; }, createGroup: function(optionsArray, level, parent) { level = level || 0; var group = this.addGroup(level, parent); var selected = false; if(typeof optionsArray !== 'undefined') { for(var i = 0, maxLength = optionsArray.length; i < maxLength; i++) { var element = optionsArray[i]; if(element) { var childOptions = element.querySelectorAll('#' + element.id + ' > ul > li'); var option = { element: element, number: this.optionNumber++, selected: 'no', pages: childOptions.length }; var childSelected = false; if(childOptions.length) { var data = this.createGroup(childOptions, (level + 1), group); childSelected = data.selected; group.options = childOptions; } option.child = (data)? data.group : null; var li = this.addOption(option, group.list, childSelected); if(selected !== true && option.selected === 'yes') { selected = true; } } } } return { group: group, selected: selected }; }, setup: function(optionsArray) { this.createPanel(); this.createGroup(optionsArray); }, createCallBack: function(group) { return bpApp.createCallBack(this, this.selectGroup, [group]); }, selectGroup: function(group) { if(group && typeof group === 'object') { if(group.selected === false) { group.selected = true; this.selectGroupPanel(group); this.updateBackButton(group); this.lastSelectedGroup = group; } } }, selectPrimaryGroup: function() { var groups = this.options; if(groups.length) { this.selectGroup(groups[0]); } }, getAnimationClass: function(lastNum, currentNum) { var animation = { selecting: 'pullRightIn', removing: 'pullLeft' }; if(lastNum === null) { animation.removing = 'no-change'; animation.selecting = 'no-change'; } else if(currentNum > lastNum) { animation.removing = 'pullLeft'; animation.selecting = 'pullRightIn'; } else if(currentNum < lastNum) { animation.removing = 'pullRight'; animation.selecting = 'pullLeftIn'; } return animation; }, selectGroupPanel: function(group) { var groups = this.options; var groupNumber = group.level; var lastOption = this.lastSelectedGroup, lastGroupNumber = (lastOption && typeof lastOption !== 'undefined')? lastOption.level: null, animations = this.getAnimationClass(lastGroupNumber, groupNumber); for(var i = 0, maxLength = groups.length; i < maxLength; i++) { var option = groups[i], panel = option.element; if(panel && group.element) { if(panel === group.element) { panel.style.zIndex = 5; var animationClass = animations.selecting; bpApp.animate.show(panel, animationClass, 800); } else { if(option === lastOption) { panel.style.zIndex = 4; var animationClass = animations.removing; bpApp.animate.hide(panel, animationClass, 1000); } else { panel.style.zIndex = 2; bpApp.animate.hide(panel, 'none', 0); } option.selected = false; } } } }, updateBackButton: function(group) { var button = document.getElementById(self.id + '_button_back'); if(group && typeof group.parent !== 'undefined') { button.onclick = bpApp.createCallBack(this, this.selectGroup, [group.parent]); button.style.visibility = 'visible'; } else { button.style.visibility = 'hidden'; } }, optionNumber: 0, addOption: function(option, container, childSelected) { container.appendChild(option.element); option.selected = (childSelected === true)? 'yes' : self.checkSelection(option); return this.addNavOption(option, container); }, addNavOption: function(option, container) { var element = option.element; if(option.selected === 'yes') { jQuery(element).addClass('selected'); } if(option.pages && option.child) { var a = element.querySelector('a'); if(a) { var callBack = this.createCallBack(option.child); a.onclick = function(e) { e.preventDefault(); callBack(); }; } } return option; } }; this.groups.setup(optionsArray); }, setupNav: function() { var currentPage = this.getCurrentPage(); var options = document.querySelectorAll('#' + this.scrollContainer + ' nav > ul > li'); this.setupGroups(options); }, checkSelection: function(option) { var currentPage = this.currentPage; currentPage = currentPage.split('&')[0]; var url = (typeof option.url === 'string')? option.url.replace('/', '') : null; if(url) { if(currentPage === url) { return 'yes'; } else if(!currentPage && url == '') { return 'yes'; } else if(currentPage === 'blog-post' && url === 'blog') { return 'yes'; } else { return 'no'; } } }, getCurrentPage: function() { var path = window.location.pathname; var pattern = /\//g; var pageSlashCount = path.match(pattern); if(pageSlashCount.length > 1) { var start = path.indexOf("/") + 1; var length = path.indexOf("/", 2) + 1; var end = length - start; var tmpLocation = path.substring(start, end); } else { var tmpLocation = path.substring(path.lastIndexOf("/") + 1); } return tmpLocation.replace("/", ""); }, setupCurrentPage: function() { this.currentPage = this.getCurrentPage(); }, getOptionStyle: function(tmpOption) { var optionStyle = (tmpOption.selected === 'yes')? 'nav-option selected' : 'nav-option'; return optionStyle; }, resetContainer: function() { var container = document.getElementById(this.container); if(container) { container.innerHTML = ''; } }});bpApp.slideShow = function(container, defaultPathUrl, setAsBg, onNumber) { this.number = (typeof bpApp.slideShow.number === 'undefined')? bpApp.slideShow.number = 0 : (++bpApp.slideShow.number); this.id = 'bp_spotlight_' + this.number; this.defaultPathUrl = (defaultPathUrl)? defaultPathUrl : '/slideshow/'; this.setAsBg = (setAsBg)? setAsBg : false; this.animationMode = 'fade'; this.lastSelectedOption = null; this.onNumber = typeof onNumber !== 'undefined' ? onNumber: null; this.optionsArray = []; this.timer = null; this.container = container; }; bpApp.slideShow.prototype = bpApp.extendClass(bpApp.htmlBuilder, { constructor: bpApp.slideShow, addKeyboardSupport: function() { var self = this; jQuery(document).on('keydown', function(e){ self.keyPress(e); }); }, keyPress: function(e) { var keyCode = e.keyCode; switch(keyCode) { case 37: this.selectPreviousOption(); break; case 39: this.selectNextOption(); break; } }, addOption: function(option) { var number = this.optionsArray.length; option.optionNumber = number; option.nameId = this.id + '_option_number_' + number; option.crumbId = this.id + '_crumb_number_' + number; option.selected = 'no'; this.optionsArray.push(option); this.createCrumb(option); var panel = this.createOptionPanel(option,this.container); }, resetContainer: function() { var container = document.getElementById(this.container); container.innerHTML = ''; }, setup: function(optionsArray) { this.resetContainer(); this.setupControlPanel(); this.setupOptions(optionsArray); this.addKeyboardSupport(); }, setupControlPanel: function() { var self = this; var button = this.createButton('a', '', 'arrow arrow_left', '', function(){ self.selectPreviousOption(); }, this.container); button = this.createButton('a', '', 'arrow arrow_right', '', function(){ self.selectNextOption(); }, this.container); var numberContainer = this.createObject('div', this.id + '_crumb_container', 'number_crumb_container', '', this.container); var slideTab = this.createObject('div', this.id + '_slide_tab', 'slideTab', '', numberContainer); }, selectPrimaryOption: function() { if(typeof this.onNumber !== 'undefined') { this.selectOptionByNumber(this.onNumber); } else { this.selectNewPanel(); } }, setupOptions: function(optionsArray) { var maxLength = optionsArray.length; if(maxLength > 0) { var tmpNumber = 0; for(var i = 0; i < maxLength; i++) { var tmpOption = optionsArray[i]; this.addOption(tmpOption); } } this.selectPrimaryOption(); }, createOptionPanel: function(tmpOption, container) { if(tmpOption && tmpOption.url) { container = this.createLink('a','','','',tmpOption.url,container); } var spotlightContainer = this.createObject('div', tmpOption.nameId, 'splash_container', '', container); spotlightContainer.onmouseover = bpApp.createCallBack(this, this.stopTimer); spotlightContainer.onmouseout = bpApp.createCallBack(this, this.startTimer); spotlightContainer.style.display = 'none'; var imageURL = tmpOption.image; if(this.setAsBg == true) { if(imageURL) { spotlightContainer.style.backgroundImage = 'url(' + wpThemeUrl + this.defaultPathUrl + imageURL + ')'; } } else { if(imageURL) { var imageContainer = this.createObject('div','','image_container','',spotlightContainer); var image = this.createImage('','',wpThemeUrl + this.defaultPathUrl + imageURL,tmpOption.alt,imageContainer); } } var articleContainer = this.createObject('article', '', 'content_container ' + tmpOption.className, '', spotlightContainer); var animation = this.getAnimation(); var sectionContainer = this.createObject('section', '', 'spotlight dark ' + animation, '', articleContainer); var h2 = this.createObject('h2', '', 'title_text blue', tmpOption.title, sectionContainer); var text = this.createObject('div', '', 'light', tmpOption.content, sectionContainer); }, getAnimation: function() { var animations = ['pullLeftIn', 'pullRightIn']; var animationNumber = Math.round(Math.random() * (animations.length - 1)); return animations[animationNumber]; }, createCrumb: function(tmpOption) { var self = this; var crumbContainer = this.id + '_crumb_container'; var optionClass = this.getCrumbClass(tmpOption); var option = this.createButton('div', tmpOption.crumbId, optionClass, tmpOption.crumbContent, function(){ self.selectOption(tmpOption); }, crumbContainer); }, getCrumbClass: function(tmpOption) { return (tmpOption.selected === 'yes')? 'option selected' : 'option'; }, selectNewPanel: function() { if(this.onNumber < (this.optionsArray.length - 1) && this.onNumber != null) { this.onNumber++; } else { this.onNumber = 0; } this.selectOptionByNumber(this.onNumber); }, getPanelClass: function(lastNum, currentNum) { var animation = { selecting: 'same', removing: '' }; var mode = this.animationMode || 'fade'; if(mode === 'left_right') { if(currentNum > lastNum) { animation.removing = 'pullLeft'; animation.selecting = 'pullRightIn'; } else if(currentNum < lastNum) { animation.removing = 'pullRight'; animation.selecting = 'pullLeftIn'; } } else { animation.removing = 'fadeOut'; animation.selecting = 'fadeIn'; } return animation; }, getPanelAnimations: function() { var selection = this.getSelectedOption(); var panelNumber = selection.optionNumber; var lastPanelNumber = (typeof this.lastSelectedOption !== 'undefined')? jQuery.inArray(this.lastSelectedOption, this.optionsArray): 0; return this.getPanelClass(lastPanelNumber, panelNumber); }, selectPanel: function(tmpOption) { var animations = this.getPanelAnimations(); for(var i = 0, maxLength = this.optionsArray.length; i < maxLength; i++) { var option = this.optionsArray[i], nameId = option.nameId, panel = document.getElementById(nameId); if(panel) { if(tmpOption.nameId === nameId) { panel.style.zIndex = 2; panel.style.position = (this.setAsBg === true)? 'absolute' : 'relative'; bpApp.animate.show(panel, animations.selecting, 1000); } else { if(this.lastSelectedOption && this.lastSelectedOption.nameId === nameId) { panel.style.zIndex = 1; panel.style.position = 'absolute'; panel.style.top = '0px'; bpApp.animate.hide(panel, animations.removing, 1000); } } } var crumbId = option.crumbId; if(typeof crumbId !== 'undefined') { var crumbClass = this.getCrumbClass(option), crumb = document.getElementById(crumbId); if(crumb) { crumb.className = crumbClass; } } } }, getNextOption: function() { var lastSelectedOption = (this.lastSelectedOption !== null)? this.lastSelectedOption.optionNumber : 0; var nextOptionNumber = ++lastSelectedOption; var index = (nextOptionNumber < this.optionsArray.length)? nextOptionNumber : 0; return this.optionsArray[index]; }, selectNextOption: function() { var nextOption = this.getNextOption(); if(nextOption) { this.selectOption(nextOption); } }, getPreviousOption: function() { var lastSelectedOption = (this.lastSelectedOption !== null)? this.lastSelectedOption.optionNumber : 0; var previousOptionNumber = --lastSelectedOption; var index = (previousOptionNumber >= 0)? previousOptionNumber : (this.optionsArray.length - 1); return this.optionsArray[index]; }, selectPreviousOption: function() { var previousOption = this.getPreviousOption(); if(previousOption) { this.selectOption(previousOption); } }, setLastSelectedOption: function(option) { this.lastSelectedOption = option; }, unselectOption: function(tmpOption) { for(var j = 0, maxLength = this.optionsArray.length; j < maxLength; j++) { var option = this.optionsArray[j]; if(option !== tmpOption) { if(option.selected === 'yes') { option.selected = 'no'; } } } }, moveSlideTab: function(e) { var offset = jQuery(e).position(); var slideTab = jQuery('#' + this.id + '_slide_tab').css('left', offset.left + 'px'); }, selectOption: function(tmpOption) { this.stopTimer(); var object = document.getElementById(tmpOption.nameId); var slideTab = document.getElementById(tmpOption.crumbId); if(slideTab) { this.moveSlideTab(slideTab); } if(tmpOption.selected === 'no') { tmpOption.selected = 'yes'; this.onNumber = jQuery.inArray(tmpOption, this.optionsArray); } else { tmpOption.selected = 'no'; } this.unselectOption(tmpOption); this.selectPanel(tmpOption); this.setLastSelectedOption(tmpOption); this.startTimer(); }, selectOptionByNumber: function(index) { var option = this.optionsArray[index]; if(option) { this.selectOption(option); } }, getSelectedOption: function() { for(var j = 0, maxLength = this.optionsArray.length; j < maxLength; j++) { var option = this.optionsArray[j]; if(option.selected === 'yes') { return option; } } return false; }, duration: 7000, startTimer: function() { var self = this; this.stopTimer(); this.timer = window.setTimeout(function(){ self.selectNewPanel(); }, this.duration); }, stopTimer: function() { window.clearTimeout(this.timer); }}); var spotlightPanel = bpApp.slideShow; bpApp.lazyAnimator = function(attrName, cacheElements) { this.attrName = (typeof attrName === 'string')? attrName : 'data-animate'; this.cacheElements = cacheElements === true? true : false; this.elements = []; this.setup(); }; bpApp.lazyAnimator.prototype = { constructor: bpApp.lazyAnimator, setup: function() { this.setupEvents(); this.update(); return this; }, update: function() { this.elements = this.getElements(); this.checkScroll(); return this; }, removeElement: function(element) { var index = jQuery.inArray(element, this.elements); if(index > -1) { this.elements.splice(index, 1); } return this; }, getElements: function() { var elements; try { elements = document.querySelectorAll('[' + this.attrName + ']:not(.animated)'); } catch(e) {} if(elements) { return Array.prototype.slice.call(elements); } return []; }, checkScroll: function() { var optionsArray = (this.cacheElements === true)? this.elements : this.getElements(); if(optionsArray.length) { var viewPortTop = jQuery(document).scrollTop(); var viewPortBottom = jQuery(window).height() + viewPortTop; for(var i = 0, maxLength = optionsArray.length; i < maxLength; i++) { var element = optionsArray[i]; if(element) { var ele = jQuery(element); var optionDelay = ele.data('delay'); var delay = optionDelay !== null? optionDelay : 20; var position = ele.offset(); var optionTop = position.top + delay; var optionBottom = position.top + ele.height(); if(optionTop < viewPortBottom && optionTop >= viewPortTop) { this.animate(element); } else if(optionBottom >= viewPortTop && optionBottom <= viewPortBottom) { this.animate(element); } } } } return this; }, animate: function(element) { var ele = jQuery(element); var animation = ele.attr(this.attrName); animation = animation || 'pullUp'; ele.addClass(animation); ele.addClass('animated'); this.removeElement(element); return this; }, setupEvents: function() { var ele = jQuery(window); var self = this; var callBack = function() { self.checkScroll(); }; this.addEvents = function() { ele.on('scroll', callBack); }; this.removeEvents = function() { ele.off('scroll', callBack); }; this.addEvents(); return this; } }; bpApp.scrollHeader = function(header, miniHeaderClass, distance) { this.header = (typeof header === 'string')? document.getElementById(header) : header; this.miniClassName = miniHeaderClass; this.headerMinified = false; this.distance = (typeof distance !== 'undefined')? distance : 300; this.setup(); }; bpApp.scrollHeader.prototype = { constructor: bpApp.scrollHeader, setup: function() { var header = this.header; if(!header) { return false; } this.checkScroll(); this.addScroll(); }, addScroll: function() { var child = this; var tmpFunction = function(){ child.checkScroll(); }; jQuery(window).on('scroll', tmpFunction); jQuery(window).on('resize', tmpFunction); }, checkScroll: function() { var wind = jQuery(window); var scrollTop = wind.scrollTop(), documentHeight = (jQuery(document).height() - wind.height()); if(scrollTop >= this.distance) { if(this.headerMinified === false) { jQuery(this.header).addClass(this.miniClassName); this.headerMinified = true; } } else { if(this.headerMinified === true) { this.headerMinified = false; jQuery(this.header).removeClass(this.miniClassName); } } }, scrollToTop: function() { window.scrollTo(window.scrollX, 0); }}; bpApp.videoPanel = function(video, callbackFunction, container){ this.number = (typeof bpApp.videoPanel.number === 'undefined')? bpApp.videoPanel.number = 0 : (++bpApp.videoPanel.number); this.id = 'video_panel_' + this.number; this.video = video; this.callbackFunction = callbackFunction; this.container = container; }; bpApp.videoPanel.prototype = bpApp.extendClass( bpApp.htmlBuilder, { constructor: bpApp.videoPanel, remove: function() { var panel = document.getElementById(this.id); if(panel) { panel.parentNode.removeChild(panel); } panel = document.getElementById(this.id + '_shadow'); if(panel) { panel.parentNode.removeChild(panel); } }, createPanel: function() { var panel = this.createObject('div', this.id, 'panel video-panel slideIn', '', this.container); var title = this.createObject('div', this.id + '_title_container', 'title-container', '', this.id); var titleLabel = this.createObject('h1', '', 'title title-text left dark', this.video.title, title); var container = this.createObject('div', '', 'body-container', '', this.id); var self = this; window.setTimeout(function(){ self.createIframe(self.id + '_iframe', '', self.video.source, container); }, 500); var buttons = this.createObject('div', this.id + '_button_container', 'button-container', '', this.id); var button1 = this.createButton('button', this.id + '_button_1', 'bttn bttn-decline', 'Close', function(){ self.decline(); }, buttons); }, setup: function() { this.createPanel(); }, decline: function() { this.display(); }, display: function() { this.toggleDisplay(); }, createShadow: function() { var self = this; var backdrop = this.createButton('div', this.id + '_shadow','panel-shadow video-shadow fadeIn','', function(){ self.decline(); }, document.body); this.createButton('button', '', 'bttn top close', '', '', backdrop); }, toggleMode: null, toggleDisplay: function() { var obj = document.getElementById(this.id); var display = obj.style.display; if(!display || display === 'none') { obj.style.display = 'block'; this.toggleMode = 'block'; this.createShadow(); } else { obj.style.display = 'none'; this.toggleMode = 'none'; this.remove(); } } }); bpApp.localData = { storage: null, setup: function() { this.supported = this.checkSupport(); if(this.supported === true) { this.storage = window.localStorage; } }, supported: false, checkSupport: function() { if(typeof window.Storage !== "undefined" && window.localStorage) { return true; } return false; }, get: function(key) { if(this.supported === true) { var value = this.storage.getItem(key); if(typeof value !== 'undefined') { return JSON.parse(value); } } return null; }, set: function(key, value) { if(this.supported === true) { value = JSON.stringify(value); this.storage.setItem(key, value); } }, clear: function() { if(this.supported === true) { this.storage.clear(); } }}; bpApp.formValidator = { errorClass: 'error_val', acceptedClass: 'success_val', isValidEmail: function(email) { var regExp = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return regExp.test(email); }, isValidPhone: function(phone) { var pattern = /[^0-9]/g; phone = phone.toString().replace(pattern, ''); if(!isNaN(phone)) { if(phone.substr(0, 1) === '1') { phone = phone.substring(1); } if(phone.length == 10 && phone.substr(0, 3) !== '555') { return true; } } return false; }, isValidDate: function(date) { if(typeof date !== 'undefined') { var result = new Date(date).toDateString(); if(result != 'Invalid Date') { return true; } } return false; }, isRadioChecked: function(groupName) { if(typeof groupName !== 'undefined') { var radios = document.getElementsByName(groupName); if(radios && radios.length) { for(var i = 0, maxLength = radios.length; i < maxLength; i++) { var radio = radios[i]; if(radio.type === 'radio' && radio.checked) { return true; } } } } return false; }, isValidField: function(val) { if(typeof val !== 'undefined' && val != '') { return true; } return false; }, validateForm: function(form) { var self = this; var errors = { number: 0, message: '' }; var updateError = function(field) { var upperCaseWords = function(str) { var pattern = /\w\S*/g; return str.replace(pattern, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); }; var fieldName = field.attr('name') || field.attr('id'); if(fieldName) { var pattern = /[^a-zA-Z1-9]/g; fieldName = fieldName.replace(pattern, ' '); fieldName = upperCaseWords(fieldName); } errors.number++; errors.message += fieldName + " is empty or invalid.
"; }; if(typeof form == 'object') { var previousRadios = []; jQuery(form).find('input.val, select.val, textarea.val').each(function(i) { var field = jQuery(this); var node = field[0]; var nodeName = node.nodeName.toLowerCase(); if(nodeName === 'input' && field.attr('type') === 'radio') { var groupName = field[0].name; if(jQuery.inArray(groupName, previousRadios) == '-1') { previousRadios.push(groupName); var validField = self.isRadioChecked(groupName); if(validField == false) { updateError(field); } } } else { var validField = self.validateField(field); if(validField == false) { updateError(field); } } }); } return errors; }, validateField: function(field) { var self = this; var showValidateStyle = function(field, isValid) { if(isValid == true) { field.removeClass(self.errorClass); field.addClass(self.acceptedClass); return true; } else { field.addClass(self.errorClass); field.removeClass(self.acceptedClass); return false; } }; var returnValue = false; var field = jQuery(field); if(field) { var val = field.val(); var placeholder = field.attr('placeholder') || field.attr('alt'), type = field.attr('type'); if(field.attr('type') === 'checkbox') { var validField = field.is(':checked'); returnValue = showValidateStyle(field, validField); } else if(!self.isValidField(val) || val == placeholder) { returnValue = showValidateStyle(field, false); } else if(field.hasClass('field_email') || type === 'email') { var validField = self.isValidEmail(val); returnValue = showValidateStyle(field, validField); } else if(field.hasClass('field_phone') || type === 'tel') { var validField = self.isValidPhone(val); returnValue = showValidateStyle(field, validField); } else if(field.hasClass('field_date') || type === 'date') { var validField = self.isValidDate(val); returnValue = showValidateStyle(field, validField); } else { returnValue = showValidateStyle(field, true); } } return returnValue; }, resetForm: function(form) { if(form && typeof form === 'object') { var elements = form.elements; if(elements) { for(var i = 0, maxLength = elements.length; i < maxLength; i++) { var element = elements[i]; this.removeStyles(element); } } } }, removeStyles: function(field) { var field = jQuery(field); if(field) { field.removeClass(this.errorClass); field.removeClass(this.acceptedClass); } } }; var bpMain = { setupAppDefault: function() { this.setupMinifyNavigation(); this.setupFancyBox(); this.setupServicesIframe(); this.setupAutoScroll(); this.addVideoPanels(); this.newStickyFooter(); this.setupPeekThrough(); this.setupNavEvents(); this.setupGoogleMaps(); this.modalFormReset(); this.formCheckBoxYes(); }, enableSlideShow: function(type) { type = type || 'modern'; switch(type) { case 'nivo': this.setupNivoSlider(); break; case 'modern': this.setupSlideshow1(); break; case 'inner': this.setupSlideshow2(); break; case 'reviews': this.setupSlideshow3(); break; } }, setupSlideshow1: function() { var optionsArray = [ { title: '', content: '', className: '', image: 'newlocation.jpg', alt: '', url: '', crumbContent: '' }, { title: '', content: '', className: '', image: '8.jpg', alt: '', url: '', crumbContent: '' }, { title: '', content: '', className: '', image: '1.jpg', alt: '', url: '', crumbContent: '' }, { title: '', content: '', className: '', image: '4.jpg', alt: '', url: '', crumbContent: '' } ]; var startNumber = Math.round(Math.random() * (optionsArray.length - 1)); var spotlight = new bpApp.slideShow('slides', '/images/', true, 0); spotlight.duration = 7000; spotlight.setup(optionsArray); }, setupSlideshow2: function() { var optionsArray = [ { title: '', content: '', className: '', image: 'internal1.jpg', alt: '', url: '', crumbContent: '' }, { title: '', content: '', className: '', image: 'internal2.jpg', alt: '', url: '', crumbContent: '' } ]; var startNumber = Math.round(Math.random() * (optionsArray.length - 1)); var spotlight = new bpApp.slideShow('slides', '/images/', true, startNumber); spotlight.duration = 7000; spotlight.setup(optionsArray); }, setupSlideshow3: function() { var optionsArray = [ { title: '', content: 'This is where rotating reviews can go. Three to five lines will be fine. The reviews will auto rotate every few seconds or so. This is where rotating reviews can go. Three to five lines will be fine. The reviews will auto rotate every few seconds or so. This is where rotating reviews can go. Three to five lines will be fine.”

- Example Patient

', className: '', image: '', alt: '', url: '', crumbContent: '' }, { title: '', content: 'This is where rotating reviews can go. Three to five lines will be fine. The reviews will auto rotate every few seconds or so. This is where rotating reviews can go. Three to five lines will be fine. The reviews will auto rotate every few seconds or so. This is where rotating reviews can go. Three to five lines will be fine.”

- Example Patient

', className: '', image: '', alt: '', url: '', crumbContent: '' }, { title: '', content: 'This is where rotating reviews can go. Three to five lines will be fine. The reviews will auto rotate every few seconds or so. This is where rotating reviews can go. Three to five lines will be fine. The reviews will auto rotate every few seconds or so. This is where rotating reviews can go. Three to five lines will be fine.”

- Example Patient

', className: '', image: '', alt: '', url: '', crumbContent: '' } ]; var startNumber = Math.round(Math.random() * (optionsArray.length - 1)); var spotlight = new bpApp.slideShow('reviews', '', false, startNumber); spotlight.duration = 7000; spotlight.setup(optionsArray); }, setupSlideshow4: function() { var optionsArray = [ { title: '', content: '', className: '', image: 'teeth1.png', alt: '', url: '', crumbContent: '' }, { title: '', content: '', className: '', image: 'teeth2.png', alt: '', url: '', crumbContent: '' }, { title: '', content: '', className: '', image: 'teeth3.png', alt: '', url: '', crumbContent: '' }, { title: '', content: '', className: '', image: 'teeth4.png', alt: '', url: '', crumbContent: '' }, { title: '', content: '', className: '', image: 'teeth5.png', alt: '', url: '', crumbContent: '' }, { title: '', content: '', className: '', image: 'teeth6.png', alt: '', url: '', crumbContent: '' }, { title: '', content: '', className: '', image: 'teeth7.png', alt: '', url: '', crumbContent: '' }, { title: '', content: '', className: '', image: 'teeth8.png', alt: '', url: '', crumbContent: '' } ]; var startNumber = Math.round(Math.random() * (optionsArray.length - 1)); var spotlight = new bpApp.slideShow('smiles', '/images/smile-gallery/', false, startNumber); spotlight.duration = 5000; spotlight.setup(optionsArray); }, setupSlideshow5: function() { var optionsArray = [ { title: '', content: '', className: '', image: 'teeth1.png', alt: '', url: '', crumbContent: '' } ]; var startNumber = Math.round(Math.random() * (optionsArray.length - 1)); var spotlight = new bpApp.slideShow('smiles', '/images/smile-gallery/', false, startNumber); spotlight.duration = 5000; spotlight.setup(optionsArray); }, addVideoPanels: function(attrName) { attrName = attrName || 'data-video-src'; var self = this; var elements = jQuery('[' + attrName + ']').each(function(index, element) { element = jQuery(element); var src = element.attr('data-video-src'); if(src) { var title = element.attr('data-title'); element.on('click', function() { self.viewVideo(title, src); }); } }); }, viewVideo: function(title, src) { var vid = { title: title, source: src }; var panel = new bpApp.videoPanel(vid, '', document.body); panel.setup(); panel.display(); }, setupFancyBox: function() { jQuery(".pics").fancybox(); jQuery(".videos").fancybox({ fitToView : false, width : '100%', height : '100%', autoSize : false, closeClick : false, openEffect : 'none', closeEffect : 'none' }); }, setupMinifyNavigation: function() { var scroller = new bpApp.scrollHeader('navarea', 'sticky', 400); }, setupAutoScroll: function() { var exceptions = ['myModal']; var pattern = /^\//; jQuery('a[href*="#"]:not([href="#"])').click(function() { if (location.pathname.replace(pattern,'') === this.pathname.replace(pattern,'') && location.hostname === this.hostname) { var hash = this.hash.slice(1), index = jQuery.inArray(hash, exceptions); if(index === -1) { var target = jQuery(this.hash); target = target.length ? target : jQuery('[id=' + hash +']'); if (target.length) { jQuery('html,body').animate({ scrollTop: target.offset().top }, 800); return false; } } } }); }, setupServicesIframe: function() { var IframeLoader = function(id) { this.id = id; this.element = null; this.document = null; }; IframeLoader.prototype = { constructor: IframeLoader, setup: function() { this.element = document.getElementById(this.id); if(this.element) { this.addEvents(); } }, getDocument: function() { var ifrm = this.element; if(this.document === null && ifrm) { this.document = ifrm.contentDocument? ifrm.contentDocument : ifrm.contentWindow.document; } return this.document; }, setHeight: function() { var getHeight = function(doc) { var body = doc.body, html = doc.documentElement; var height = Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight ); return height; }; var ifrm = this.element; var doc = this.getDocument(); if(doc) { ifrm.style.visibility = 'hidden'; ifrm.style.height = getHeight(doc) + "px"; ifrm.style.visibility = 'visible'; } window.setTimeout(function() { ifrm.style.height = getHeight(doc) + "px"; }, 120); }, resetHeight: function() { var ifrm = this.element; ifrm.style.height = 'auto'; }, addEvents: function() { var self = this; jQuery(this.element).on('load', function() { self.setHeight(); }); jQuery(window).on('resize', function() { self.resetHeight(); self.setHeight(); }); } }; var iframeLoader = new IframeLoader('servicesIframe'); iframeLoader.setup(); }, newStickyFooter: function () { jQuery(function($) { var windowHeight = $(window).height(); var bodyHeight = $('body').height(); if (bodyHeight <= windowHeight) { var missHeight = windowHeight - bodyHeight; var contentHeight = missHeight + $('#main').height(); $('#main').css('min-height', contentHeight); } }); }, setupGoogleMaps: function(attrName) { var setupMaps = function() { attrName = attrName || 'data-map-src'; var elements = jQuery('iframe[' + attrName + ']').each(function(index, element) { element = jQuery(element); var src = element.attr(attrName); if(src) { element.addClass('fadeIn'); element.attr('src', src); } }); }; window.setTimeout(setupMaps, 5000); }, setupCoolMap: function() { var button = jQuery('.clickMe'), mapBox = jQuery('#mapBox'); mapBox.css('pointer-events','none'); button.click(function() { mapBox.css('pointer-events','visible'); button.hide(); }); mapBox.mouseleave(function() { mapBox.css('pointer-events','none'); button.show(); }); }, modalFormReset: function() { jQuery('body').click(function() { if (!jQuery('.modal').hasClass('in')) { jQuery('.modal input').removeClass('error_val'); jQuery('.modal textarea').removeClass('error_val'); jQuery('.modal input').removeClass('success_val'); jQuery('.modal textarea').removeClass('success_val'); document.getElementById("custom_form2").reset(); } }); }, formCheckBoxYes: function() { jQuery("input.toggle").val("No"); jQuery('input.toggle').on('change', function(){ if ( jQuery(this).is(':checked') ) { jQuery("input.toggle").val('Yes'); } else{ jQuery("input.toggle").val("No"); } }); }, setupPeekThrough: function() { jQuery('section[data-type="background"]').each(function(){ var $bgobj = jQuery(this); jQuery(window).scroll(function() { var yPos = -(jQuery(window).scrollTop() / $bgobj.data('speed')); var coords = '50% '+ yPos + 'px'; $bgobj.css({ backgroundPosition: coords }); }); }); }, setupNavEvents: function() { var self = this; var button = jQuery('#main-nav-toggle'); button.on('click', function(){ self.toggleNav(); }); }, setupCountdown: function() { var appNav = new bpApp.navigation('nav-scroll-container', 'main-nav-container'); appNav.setup(); var countDownDate = new Date("Oct 1, 2018 00:00").getTime(); var x = setInterval(function() { var now = new Date().getTime(); var distance = countDownDate - now; var days = Math.floor(distance / (1000 * 60 * 60 * 24)); var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); var seconds = Math.floor((distance % (1000 * 60 )) / (1000)); document.getElementById("countDown").innerHTML = days + "d " + hours + "h " + minutes + "m " + seconds + "s "; if (distance < 0) { clearInterval(x); document.getElementById("countDown").innerHTML = "WE ARE NOW OPEN!"; } }, 1000); }, navHidden: true, toggleNav: function() { var header = jQuery('.top-banner-row'), button = jQuery('#main-nav-toggle'), nav = jQuery('#main-nav-container'), footBar = jQuery('.bottom-bar'), address = jQuery('.bottom-bar.inner'); if(this.navHidden === true) { this.navHidden = false; header.addClass('opened nav-d'); nav.addClass('open'); button.addClass('nav-close'); footBar.addClass('nav-d'); if(jQuery(window).width() < 767) { address.css({'bottom': '60px', 'position': 'fixed'}); } else { address.css('position', 'fixed'); } appNav.groups.selectPrimaryGroup(); } else { this.navHidden = true; header.removeClass('opened nav-d'); nav.removeClass('open'); button.removeClass('nav-close'); footBar.removeClass('nav-d'); address.css({'position': 'relative', 'bottom': '0px'}); } }}; var appNav = new bpApp.navigation('nav-scroll-container', 'main-nav-container'); appNav.setup(); jQuery(function($) { if(wpPageID === '2') { bpMain.enableSlideShow(); bpMain.setupCoolMap(); bpMain.setupCountdown(); } else if(wpPageID === '215') { bpMain.setupSlideshow4(); bpMain.enableSlideShow('inner'); } else if(wpPageID === '113') { bpMain.setupSlideshow4(); bpMain.enableSlideShow('inner'); } else { bpMain.enableSlideShow('inner'); } var lazyAnimator = new bpApp.lazyAnimator(); bpMain.setupAppDefault(); });