// page init jQuery(function(){ initCustomForms(); initAnchors(); initCycleCarousel(); initOpenClose(); initLightbox(); initBackgroundResize(); initValidation(); jQuery('input, textarea').placeholder(); }); // initialize custom form elements function initCustomForms() { jcf.replaceAll(); } // form validation function function initValidation() { var errorClass = 'error'; var successClass = 'success'; var errorFormClass = 'form-error'; var successFormClass = 'form-success'; var regEmail = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; var regPhone = /^([0-9]{2,4}?(\-)*)+$/; jQuery('form.validate-form').each(function() { var form = jQuery(this).attr('novalidate', 'novalidate'); var successFlag = true; var inputs = form.find('input, textarea, select'); // form validation function function validateForm(e) { successFlag = true; inputs.each(checkField); if (form.hasClass('ajax-form')) { e.preventDefault(); if (successFlag){ jQuery.ajax({ type: form.attr('method') || 'POST', url: form.attr('action'), data: 'ajax=1' + form.serialize(), success: function() { form.removeClass(errorFormClass).addClass(successFormClass); form.get(0).reset(); }, error: function() { form.removeClass(successFormClass).addClass(errorFormClass); } }); } } else if (!successFlag) { e.preventDefault(); } } // check field function checkField(i, obj) { var currentObject = jQuery(obj); var currentParent = currentObject.closest('.input-required'); // not empty fields if(currentObject.hasClass('required')) { var defaultValue = (currentObject.prop('placeholder'))? currentObject.prop('placeholder') : currentObject.prop('defaultValue'); setState(currentParent, currentObject, !currentObject.val().length || currentObject.val() === defaultValue); } // correct email fields if(currentObject.hasClass('required-email')) { setState(currentParent, currentObject, !regEmail.test(currentObject.val())); } // correct email fields if(currentObject.hasClass('required-email-confirm')) { var requiredEmail = form.find('.required-email'); setState(currentParent, currentObject, !regEmail.test(currentObject.val()) || currentObject.val() !== requiredEmail.val()); } // correct number fields if(currentObject.hasClass('required-number')) { setState(currentParent, currentObject, !regPhone.test(currentObject.val())); } // something selected if(currentObject.hasClass('required-select')) { setState(currentParent, currentObject, currentObject.get(0).selectedIndex === 0); } // something checked radio if(currentObject.hasClass('required-radio')) { var curName = currentObject.attr('name'); var curRadio = jQuery('[name= "' + curName + '"]'); setState(currentParent, currentObject, !curRadio.is(':checked')); } if(currentObject.hasClass('required-one-radio')) { var curName = currentObject.attr('name'); var curRadio = jQuery('[name= "' + curName + '"]'); var state = ( jQuery('[name= "'+curName+'"]:checked').length > 0 )? false : true; setState(currentParent, currentObject, state); } // something checked checkbox if (currentObject.hasClass('required-checkbox')) { setState(currentParent, currentObject, !currentObject.prop('checked')); } } // set state function setState(hold, field, error) { if (error) { form.addClass(errorFormClass); hold.addClass(errorClass); field.one('focus click',function(){hold.removeClass(errorClass).removeClass(successClass);}); successFlag = false; } else { hold.addClass(successClass); } } // form event handlers form.submit(validateForm); }); } // cycle scroll galleries init function initCycleCarousel() { jQuery('.h-slider').scrollAbsoluteGallery({ mask: '.mask', slider: '.slideset', slides: '.slide', btnPrev: 'a.btn-prev', btnNext: 'a.btn-next', pagerLinks: '.slide-pagination li', stretchSlideToMask: true, pauseOnHover: true, maskAutoSize: true, autoRotation: false, switchTime: 5000, animSpeed: 500 }); jQuery('.v-slider').scrollAbsoluteGallery({ mask: '.mask', slider: '.slideset', slides: '.slide', btnPrev: 'a.btn-prev', btnNext: 'a.btn-next', pagerLinks: '.slide-pagination li', stretchSlideToMask: true, pauseOnHover: true, maskAutoSize: true, vertical: true, autoRotation: false, switchTime: 3000, animSpeed: 500 }); } // open-close init function initOpenClose() { jQuery('#nav').openClose({ activeClass: 'active', hideOnClickOutside: true, opener: '.opener', slider: '.drop', animSpeed: 400, effect: 'slide', onInit: function(self) { // handle layout resize ResponsiveHelper.addRange({ '..767': { on: function() { self.slider.on('click.closeDrop', 'a',function() { self.hideSlide(); }); }, off: function() { self.slider.off('click.closeDrop', 'a'); } } }); } }); } // fancybox modal popup init function initLightbox() { jQuery('a.lightbox-opener').fancybox({ padding: 0, loop: false, helpers: { overlay: { css: { background: 'rgba(0, 0, 0, 0.7)' } } }, afterLoad: function(current, previous) { // handle custom close button in inline modal if (current.href.indexOf('#') === 0) { jQuery(current.href).find('a.close').off('click.fb').on('click.fb', function(e){ e.preventDefault(); jQuery.fancybox.close(); }); } } }); jQuery('#login-opener').fancybox({ padding: 0, autoCenter: false, loop: false, helpers: { overlay: { css: { background: 'rgba(0, 0, 0, 0.7)' } } }, beforeShow: function() { $.fancybox._getPosition = function() { var position = $('#login-opener').offset(); position["left"] = position["left"] - 271; // alert(JSON.stringify(position)); // "top":191.5,"left":1037.75 return position; } }, afterLoad: function(current, previous) { // handle custom close button in inline modal if (current.href.indexOf('#') === 0) { jQuery(current.href).find('a.close').off('click.fb').on('click.fb', function(e){ e.preventDefault(); jQuery.fancybox.close(); }); } } }); } // initialize smooth anchor links function initAnchors() { jQuery('a.anchor').htmlAnchorElement(); var inst = new SmoothScroll({ anchorLinks: '.drop ul .anchor', separator: '/', extraOffset: function() { var totalHeight = 0; jQuery('#header').each(function(){ totalHeight += jQuery(this).outerHeight(); }); return totalHeight; }, activeClasses: 'parent', anchorActiveClass: 'active', sectionActiveClass: '' }); jQuery(window).on('load', function() { setTimeout(function() { if (inst.anchorLinks.filter('[href="' + window.location.pathname + '"]').length) { var link = inst.anchorLinks.filter('[href="' + window.location.pathname + '"]'), targetBlock = inst.getAnchorTarget(link), targetOffset = inst.getTargetOffset(targetBlock); SmoothScroll.scrollTo(targetOffset, { container: inst.container, wheelBehavior: inst.options.wheelBehavior, duration: 600 }); } }, 1); }); } // stretch background to fill blocks function initBackgroundResize() { jQuery('.bg-stretch').each(function() { ImageStretcher.add({ container: this, image: 'img' }); }); } ;(function($) { // Extend the tag with the window.history API // http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#the-history-interface // // // title var pathname = window.location.pathname; function HTMLAnchorElement(options) { this.options = $.extend({ links: null }, options); this.init(); } HTMLAnchorElement.prototype = { init: function() { this.findElements(); this.attachEvents(); }, findElements: function() { this.links = $(this.options.links); }, attachEvents: function() { var self = this; this.clickHandler = function(event){ // open in new tab if (event.ctrlKey || event.metaKey || event.which === 2) { return; } // pushstate if (this.hasAttribute('pushstate')) { //window.history.pushState(JSON.parse(this.getAttribute('state')), this.getAttribute('title'), pathname + this.getAttribute('href')); $(window).trigger('pushstate'); } // replacestate if (this.hasAttribute('replacestate')) { //window.history.replaceState(JSON.parse(this.getAttribute('state')), this.getAttribute('title'), pathname + this.getAttribute('href')); $(window).trigger('replacestate'); } // popstate if (this.hasAttribute('popstate')) { try { var popstateEvent = new PopStateEvent('popstate', { bubbles: false, cancelable: false, state: window.history.state }); if ('dispatchEvent_' in window) { // FireFox with polyfill window.dispatchEvent_(popstateEvent); } else { // normal window.dispatchEvent(popstateEvent); } } catch (error) { // Internet Explorer var fallbackEvent = document.createEvent('CustomEvent'); fallbackEvent.initCustomEvent('popstate', false, false, { state: window.history.state }); window.dispatchEvent(fallbackEvent); } } event.preventDefault(); }; this.links.on('click', this.clickHandler); } }; // jquery plugin $.fn.htmlAnchorElement = function(opt){ return this.each(function(){ $(this).data('HTMLAnchorElement', new HTMLAnchorElement($.extend(opt,{links:this}))); }); }; })(jQuery); /* * Responsive Layout helper */ ResponsiveHelper = (function($){ // init variables var handlers = [], prevWinWidth, win = $(window), nativeMatchMedia = false; // detect match media support if(window.matchMedia) { if(window.Window && window.matchMedia === Window.prototype.matchMedia) { nativeMatchMedia = true; } else if(window.matchMedia.toString().indexOf('native') > -1) { nativeMatchMedia = true; } } // prepare resize handler function resizeHandler() { var winWidth = win.width(); if(winWidth !== prevWinWidth) { prevWinWidth = winWidth; // loop through range groups $.each(handlers, function(index, rangeObject){ // disable current active area if needed $.each(rangeObject.data, function(property, item) { if(item.currentActive && !matchRange(item.range[0], item.range[1])) { item.currentActive = false; if(typeof item.disableCallback === 'function') { item.disableCallback(); } } }); // enable areas that match current width $.each(rangeObject.data, function(property, item) { if(!item.currentActive && matchRange(item.range[0], item.range[1])) { // make callback item.currentActive = true; if(typeof item.enableCallback === 'function') { item.enableCallback(); } } }); }); } } win.bind('load resize orientationchange', resizeHandler); // test range function matchRange(r1, r2) { var mediaQueryString = ''; if(r1 > 0) { mediaQueryString += '(min-width: ' + r1 + 'px)'; } if(r2 < Infinity) { mediaQueryString += (mediaQueryString ? ' and ' : '') + '(max-width: ' + r2 + 'px)'; } return matchQuery(mediaQueryString, r1, r2); } // media query function function matchQuery(query, r1, r2) { if(window.matchMedia && nativeMatchMedia) { return matchMedia(query).matches; } else if(window.styleMedia) { return styleMedia.matchMedium(query); } else if(window.media) { return media.matchMedium(query); } else { return prevWinWidth >= r1 && prevWinWidth <= r2; } } // range parser function parseRange(rangeStr) { var rangeData = rangeStr.split('..'); var x1 = parseInt(rangeData[0], 10) || -Infinity; var x2 = parseInt(rangeData[1], 10) || Infinity; return [x1, x2].sort(function(a, b){ return a - b; }); } // export public functions return { addRange: function(ranges) { // parse data and add items to collection var result = {data:{}}; $.each(ranges, function(property, data){ result.data[property] = { range: parseRange(property), enableCallback: data.on, disableCallback: data.off }; }); handlers.push(result); // call resizeHandler to recalculate all events prevWinWidth = null; resizeHandler(); } }; }(jQuery)); /* * jQuery Cycle Carousel plugin */ ;(function($){ function ScrollAbsoluteGallery(options) { this.options = $.extend({ activeClass: 'active', mask: 'div.slides-mask', slider: '>ul', slides: '>li', btnPrev: '.btn-prev', btnNext: '.btn-next', pagerLinks: 'ul.pager > li', generatePagination: false, pagerList: '