;(function(window) {
	window.isMobile = false;

	(function(a,b){if(/(android|bb\d+|meego|ipad|playbook|silk).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))window.isMobile=true})(navigator.userAgent||navigator.vendor||window.opera);
})(window);

;(function($, window, document, undefined) {
	var $win = $(window);
	var $doc = $(document);
	var $body, $intro, $services, $navbar, $wrapper, $navMobile;

	$doc.ready(function() {
		// cache DOM elements
		$body      = $('body');
		$wrapper   = $('.wrapper');
		$intro     = $('.intro');
		$services  = $('.section-services');
		$navbar    = $('.navbar');
		$navMobile = $('.nav-mobile');

		// Slide to section Contact
		$doc.on('click', '.slide-to-section', function(e){
			e.preventDefault();
			var $waypoint = $($(this).attr('href'));

			var navbar_height = $('.navbar').outerHeight();

			$wrapper.animate({
				scrollTop: $wrapper.scrollTop() + $waypoint.offset().top - navbar_height
			}, 1000);

			if( isMobile ){
				var $menu = $(this).closest('.dropdown-menu').clone(),
					$parent = $(this).closest('.dropdown');
				
				$(this).closest('.dropdown-menu').remove();
				
				setTimeout(function() {
					$parent.append($menu);
				}, 100);
			}
		});

		resizeSections();

		$navbar.affix({
			offset: {
				top: 0
			},
			target: '.wrapper'
		});
		updateAffix();

		//Expand Intro image 
		$('.intro-image img').fullscreener();

		// form validation
		var $form = $('.form-contact form');
		var mailValidation = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;

		$('.form-contact form').on('reset', function(){
			$('.form-errors').text('');
			$('input', $form).parent().removeClass('has-error');
		}).on('submit', function (event) {
			
			event.preventDefault();
			$('.form-errors').text('');
			$('.form-success').html('');
			$('.form-contact form .form-row').removeClass('has-error');
			var isValid = true;

			var $first_name = $('input[name="fname"]', $form);
			var $last_name = $('input[name="lname"]', $form);
			var $mail = $('input[name="email"]', $form);

			if ($first_name.val() == '' || $first_name[0].value == $first_name[0].title ){
				$('.form-errors').append('Invalid first name <br/ >');
				isValid = false;
				$first_name.parent().addClass('has-error');
			}

			if ($last_name.val() == '' || $last_name[0].value == $last_name[0].title ){
				$('.form-errors').append('Invalid last name <br/ >');
				isValid = false;
				$last_name.parent().addClass('has-error');
			}

			if ($mail.val() == '' || !mailValidation.test($mail.val()) ){
				$('.form-errors').append('Invalid email');
				isValid = false;
				$mail.parent().addClass('has-error');
			}

			if (isValid){
				$.ajax({
					url: $(this).attr('action'),
					data: $(this). serializeArray(),
					type: 'POST',
					success: function (response) {
						var str = response;

						$('.form-success').html(''+str);

						if (str == 'Your message has been sent.') {
							$form.trigger('reset');
						}

					},
					error: function (err) {
						$('.form-contact form .form-head .form-errors').append(err);	
					}
				}).always(function() {
					scrollToContactForm();
				});
			} else {
				scrollToContactForm();
			}
		});

		function scrollToContactForm() {
			setTimeout(function(){

				$wrapper.animate({scrollTop: $wrapper.scrollTop() + $('#contact-us').position().top - 76});

			}, 200)

			$win.scrollTop(0)
		};

		$('.popup-link').magnificPopup({
			type: 'iframe',
			mainClass: 'mfp-fade',
			removalDelay: 160,
			preloader: false,

			fixedContentPos: false
		});
		
		$(".btn-windows").colorbox({
			maxWidth: 1400,
			maxHeight: '90%',
			width: "90%",
			height: "90%"
		});
		
		$(".btn-helloworld").colorbox({
			maxWidth: 1400,
			maxHeight: '90%',
			width: "90%",
			height: "90%"
		});
		
		$(".btn-gallery").colorbox({
			maxWidth: 1400,
			maxHeight: '90%',
			width: "90%",
			rel: "gallery",
			title: function() {
				var a_name = $(this).attr('data-title');
				var a_desc = $(this).attr('data-description');
				return '<p style="font-size: 1.2em; font-weight: bold;" >' + a_name + '</p> ' + a_desc;
			}
		});

		// Section Download - Buttons Functionality
		if (navigator.appVersion.indexOf("Win")!=-1) {
			$('.btn-windows').addClass('current').parent().find('.btn').not('.btn-windows').css("display", "none");
		};

		if (navigator.appVersion.indexOf("Mac")!=-1) {
			$('.btn-mac').addClass('current').parent().find('.btn').not('.btn-mac').css("display", "none");
		};

		if (navigator.appVersion.indexOf("Linux")!=-1) {
			$('.btn-linux').addClass('current').parent().find('.btn').not('.btn-linux').css("display", "none");
		};

		$('#download-trigger').click(function() {
		    $(".section-download-actions .btn").not('.current').toggle(this.checked);
		});

		// Custom Checkbox Functionality
		// This class will be added to active item
		var checkedClass = 'custom-input-checked';
		var disabledClass = 'custom-input-disabled';
		var inputSelector = '.custom-checkbox input, .custom-radio input';
	 
		$(inputSelector)
	 
		// Add classes to all checked checkboxes
		.each(function() {
			var input = this;
			
			$(input)
				.parent() // go up to the input holder element
				.toggleClass(checkedClass, input.checked);
		})
 
		// Handle the change event
		.on('change', function() {
			var input = this;
 
			// detect if the input is radio
			if(input.type === 'radio') {
				var name = input.name;
 
				// find all the radios with that name, in the same document
				$(input.ownerDocument)
					.find('[name=' + name + ']')
					.each(function() {
 
						var radioInput = this;
 
						$(radioInput)
							.parent() // go up to the input holder element
							.toggleClass(checkedClass, radioInput.checked);
						
					});
			} else {
 
				$(input)
					.parent() // go up to the input holder element
					.toggleClass(checkedClass, input.checked);
			};
		})
		.on('disable', function() {
			var input = this;
			
			input.disabled = true;
			
			$(input)
				.parent() // go up to the input holder element
				.addClass(disabledClass);
		})
		.on('enable', function() {
			var input = this;
 
			input.disabled = false;
 
			$(input)
				.parent() // go up to the input holder element
				.removeClass(disabledClass);
		});


		$('.navbar-toggle').on('click', function() {
			var pos = $body.hasClass('open') ? '0%' : '-70%';

			updateMobileNav();

			$navbar.animate({
				left: pos
			}, 300);

			$wrapper.animate({
				left: pos
			}, 300, function() {
				$body.toggleClass('open');
			})
		});

		$('.nav-mobile a').on('click', function(){
			$wrapper.css('left', '0%');
			$navbar.css('left', '0%');
			$body.removeClass('open');
		});

		$doc.on('touchstart touchmove', function(e) {
			if ($body.hasClass('open')) {
				var $target = $(e.target);

				if (!$target.closest('.nav-mobile').length && !$target.is('.nav-mobile') && !$target.is('.navbar-toggle')) {
					e.preventDefault();
				}
			}
		})

		//Benefit Section Functionality
		$('.benefit-head').on('click', function(e) {
			e.preventDefault();
			var $href = $($(this).data('href'));
			$href.addClass('benefit-entry-visible').siblings().removeClass('benefit-entry-visible');
			$(this).parent().addClass('current').siblings().removeClass('current');
		});
	});
		
	//Benefit Section Functionality
	$win.load(function() {
		if($win.width() < 767 ) {
			$('.benefit-head').on('click', function(e) {
				e.preventDefault();
				$(this).next().addClass('benefit-entry-visible');
				$(this).parent().siblings().find('.benefit-entry').removeClass('benefit-entry-visible');
				$(this).parent().addClass('current').siblings().removeClass('current');
			});
		};
	});

	$win.resize(function() {
		if ($intro) {
			resizeSections();
		} 

		if ($navbar) {
			updateAffix();
		}

		if ($navMobile && !$navMobile.is(':visible')) {
			$wrapper.removeAttr('style');
			$body.removeClass('open');
			$navbar.removeAttr('style');
		}
	});

	$win.scroll(function(e) {
		if ($body.hasClass('open')) {
			updateMobileNav();
		}
	});

	function resizeSections() {
		var winHeight   = $win[0].innerHeight;
		var introHeight = winHeight - $services.outerHeight();
		
		if (winHeight >= 900) {
			$intro.css('min-height', introHeight);
		} else {
			$intro.removeAttr('style');
		}
	};

	function updateAffix() {
		$navbar.data('bs.affix').options.offset.top = $wrapper.scrollTop() + $services.offset().top - 84;
	};

	function updateMobileNav() {
		$body.toggleClass('is-affixed', $navbar.hasClass('affix'));
	};

})(jQuery, window, document);