/**
 * Handles all requests to the Permit Manager API.
 * @param {string} method - the method to be called in the API
 * @param {*} params - any parameters the method requires
 * @param {Function} success - callback to use if request completes successfully
 * @param {Function} error - callback to use if request fails
 */
function PMAPI(method, params, success, error) {
	var xhr = new XMLHttpRequest();
	var body = '';

	xhr.open('POST', '/api.cfm?method=' + method, true);

	if (typeof params == 'object') {
		xhr.setRequestHeader('Content-Type', 'application/json');
		body = JSON.stringify(params);
	} else {
		xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		body = params;
	}

	var onError = function(response) {
		console.log(response);
		if (response.errorText === 'Restricted Zone') {
			Swal.fire({
				title: LS('*RestrictedZone'),
				type: 'warning',
				text: LS('*SelectedPermitTypeNotPermitted'),
				confirmButtonColor: '#0072BC',
				showCancelButton: true,
				reverseButtons: true,
				cancelButtonText: LS('*Back')
			}).then(function(result) {
				if (result.dismiss) {
					$('.backward').trigger('click');
				}
			});
		} else {
			if (response.friendlyErrorText) {
				Swal.fire({
					title: LS('*Error'),
					text: response.friendlyErrorText,
					type: 'warning',
					confirmButtonColor:'#0072bc'
				});
			}

			if (error) {
				error(response);
			}
		}
	};

	xhr.onreadystatechange = function() {
		if (xhr.readyState == 4) {
			if (xhr.status == 200) {
				try {
					var response = JSON.parse(xhr.responseText);

					if (!response.errorCode) {
						if (success) {
							success(response);
						}
					} else {
						onError(response);
					}
				} catch(e) {
					onError({
						errorCode: -100,
						errorText: 'PMAPI: Failed to parse response.'
					});
				}
			} else {
				onError({
					errorCode: -xhr.status,
					errorText: 'PMAPI: Server responded with ' + xhr.statusText
				});
			}
		}
	};

	xhr.send(body);

}

function pmDateFormat(date) {
	return moment(date, 'MMMM, DD YYYY HH:mm:ss ZZ').format('MMM DD, YYYY');
}

function pmTimeFormat(date) {
	return moment(date, 'MMMM, DD YYYY HH:mm:ss ZZ').format('hh:mm A');
}

function pmDateTimeFormat(date) {
	return monent(date, 'MMMM, DD YYYY HH:mm:ss ZZ').format('MMM DD, YYYY @ hh:mm A');
}

function callOnce(func, within, timerId){
	window.callOnceTimers = window.callOnceTimers || {};
	if (timerId == null)
			timerId = func;
	var timer = window.callOnceTimers[timerId];
	clearTimeout(timer);
	timer = setTimeout(function() {func()}, within);
	window.callOnceTimers[timerId] = timer;
}

function submitLoginForm() {
	var form = this;

	var $buttons = $('button', this);

	$buttons.prop('disabled', true);

	setTimeout(function() {
		PMAPI('attemptLogin', $(form).serialize(), function(result) {
			if (result.authenticated) {
				PMAPI('recordBrowser', {
					browser: getBrowser(),
				}, function() {
					setCookie('returning', 'true', 999);
				});
				window.location = '/my_permits';
			} else {
				$buttons.prop('disabled', false);
				onLoginFailed(form);
			}
		}, function() {
			$buttons.prop('disabled', false);
		});
	}, 250);

	return false;
}

function onLoginFailed(form) {
	var $form = $(form);

	$('#ForgotPasswordContainer').show(250);

	$form.jrumble({
		x: 16, y: 16, rotation: 5, opacity: 0.75, speed: 25
	}).trigger('startRumble');

	setTimeout(function() {
		$form.trigger('stopRumble');
	}, 250);

	Swal.fire({
		text: LS('*InvalidEmailPasswordCombination'),
		type: 'error'
	});
}

function onMapsLoaded() {
}

function initConfirmAddressMap(addressArray, callback, coordinatesArray, defaultCoordinatesString, canMoveMarker) {
	var $inputs = $('input.coordinates-input');

	var defaultCoordinates = defaultCoordinatesString.split(',');

	var initMap = function() {
		var map = window.confirmAddressMap || new google.maps.Map(document.getElementById('ConfirmAddressMap'), {
			mapTypeId: google.maps.MapTypeId.HYBRID,
			center: new google.maps.LatLng(0, 0),
			zoom: 1
		});

		(function() {
			var bounds = new google.maps.LatLngBounds();

			for (var i in coordinatesArray) {
				bounds.extend(new google.maps.LatLng(coordinatesArray[i][0], coordinatesArray[i][1]));
			}

			if (coordinatesArray.length == 1) {
				var extendPoint1 = new google.maps.LatLng(bounds.getNorthEast().lat() + 0.0005, bounds.getNorthEast().lng() + 0.0005);
				var extendPoint2 = new google.maps.LatLng(bounds.getNorthEast().lat() - 0.0005, bounds.getNorthEast().lng() - 0.0005);
				bounds.extend(extendPoint1);
				bounds.extend(extendPoint2);
			}

			map.fitBounds(bounds);
		})();

		var restrictedOpacity;
		var approvedOpacity;
		var restrictedBorder;
		var approvedBorder;

		PMAPI('getPublicZoneSettings', {}, function(result) {
			restrictedOpacity = result.restricted_opacity;
			approvedOpacity = result.approved_opacity;
			restrictedBorder = result.restricted_border;
			approvedBorder = result.approved_border;
		});

		if (window.overlays) {
			while (window.overlays[0]) {
				window.overlays.pop().setMap(null);
			}
		}

		window.overlays = [];
		PMAPI('getPublicRestrictedZones', {permitTypeID: $('#permitTypeID').val()}, function(result) {
			var numZones = result.zones.length;
			for (var i = 0; i < numZones; i++) {
				var gpoly = new google.maps.Polygon({
					paths: WKBPolygon.fromWKB(result.zones[i], 4).getOuterRing(),
					strokeColor: '#ac2e2e',
					strokeOpacity: 1,
					strokeWeight: restrictedBorder,
					fillColor: '#ac2e2e',
					fillOpacity: restrictedOpacity
				});

				gpoly.setMap(map);
				window.overlays.push(gpoly);
			}
		});

		PMAPI('getApprovedZones', {permitTypeID: $('#permitTypeID').val()}, function(result) {
			var numZones = result.zones.length;
			for (var i = 0; i < numZones; i++) {
				var gpoly = new google.maps.Polygon({
					paths: WKBPolygon.fromWKB(result.zones[i], 4).getOuterRing(),
					strokeColor: '#2eac2e',
					strokeOpacity: 1,
					strokeWeight: approvedBorder,
					fillColor: '#2eac2e',
					fillOpacity: approvedOpacity
				});

				gpoly.setMap(map);
				window.overlays.push(gpoly);
			}
		});

		PMAPI('getApprovedMultiZones', {permitTypeID: $('#permitTypeID').val()}, function(result) {
			var numZones = result.zones.length;
			for (var i = 0; i < numZones; i++) {
				var multiPolygon = WKBMultiPolygon.fromWKB(result.zones[i]);
				for (var j = 0; j < multiPolygon.polygons.length; j++) {
					var gpoly = new google.maps.Polygon({
						paths: multiPolygon.polygons[j].getGmapPaths(),
						strokeColor: '#2eac2e',
						strokeOpacity: 1,
						strokeWeight: approvedBorder,
						fillColor: '#2eac2e',
						fillOpacity: approvedOpacity
					});

					gpoly.setMap(map);
					window.overlays.push(gpoly);
				}
			}
		});

		PMAPI('getDistrictZones', {}, function(result) {
			var numZones = result.zones.length;
			result.zones.forEach(function(zone) {
				var gpoly = new google.maps.Polygon({
					paths: WKBPolygon.fromWKB(zone.zone, 4).getOuterRing(),
					strokeColor: zone.colour ? zone.colour : '#111',
					strokeOpacity: 1,
					strokeWeight: approvedBorder,
					fillColor: zone.colour ? zone.colour : '#111',
					fillOpacity: 0.2,
				});
				gpoly.setMap(map);
				window.overlays.push(gpoly);
			});
		});

		PMAPI('getDistrictMultiZones', {}, function(result) {
			var numZones = result.zones.length;
			for (var i = 0; i < numZones; i++) {
				var multiPolygon = WKBMultiPolygon.fromWKB(result.zones[i].zone);
				for (var j = 0; j < multiPolygon.polygons.length; j++) {
					var gpoly = new google.maps.Polygon({
						paths: multiPolygon.polygons[j].getGmapPaths(),
						strokeColor: result.zones[i].colour ? result.zones[i].colour : '#111',
						strokeOpacity: 0.8,
						strokeWeight: approvedBorder,
						fillColor: result.zones[i].colour ? result.zones[i].colour : '#111',
						fillOpacity: 0.2,
					});

					gpoly.setMap(map);
				}
			}
		});

		window.confirmAddressMap = map;
		initMarkers();
	};

	var initMarkers = function() {
		for (var j in window.confirmAddressMarkers) {
			window.confirmAddressMarkers[j].setMap(null);
			window.confirmAddressMarkers[j] = null;
		}

		window.confirmAddressMarkers = [];

		var colours = [ 'fe7569', '75fe69', '7569fe', '6975fe', 'fe6975', '69fe75' ];
		var $legend = $('#ConfirmAddressMapLegend').empty();

		for (var i in coordinatesArray) {
			var colour = colours[i % colours.length];
			var coords = coordinatesArray[i];

			var $span = $('<span>').append(
				$('<img>').attr('src', 'https://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|' + colour)
			).append('&nbsp;&nbsp;' + addressArray[i].split(',')[0]).appendTo($legend);

			var marker = new google.maps.Marker({
				map: window.confirmAddressMap,
				draggable: !!canMoveMarker,
				animation: google.maps.Animation.BOUNCE,
				// icon: new google.maps.MarkerImage(
				// 	'http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|' + colour,
				// 	new google.maps.Size(21, 34), new google.maps.Point(0, 0), new google.maps.Point(10, 34)
				// ),
				icon: {
					url: 'https://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|' + colour,
					size: null,
					origin: null,
					anchor: null,
					scaledSize: new google.maps.Size(28, 45)
				},
				position: new google.maps.LatLng(coords[0], coords[1])
			});

			marker.$input = $inputs.eq(i);
			marker.addListener('dragend', function(e) {
				this.$input.val(e.latLng.lat() + ', ' + e.latLng.lng());
			});

			window.confirmAddressMarkers.push(marker);
		}
	};

	var numCoordsToInit = 0;
	var numCoordsInited = 0;

	for (var i = 0; i < coordinatesArray.length; i++) {
		if (coordinatesArray[i] == null) {
			numCoordsToInit += 1;

			setTimeout(function(index) {
				var geocoder = new google.maps.Geocoder();

				geocoder.geocode({ address: addressArray[index] }, function(results, status) {
					if (results.length > 0) {
						var loc = results[0].geometry.location;
						coordinatesArray[index] = [ loc.lat(), loc.lng() ];
					} else {
						coordinatesArray[index] = [ parseFloat(defaultCoordinates[0]), parseFloat(defaultCoordinates[1]) ];
					}

					$inputs.eq(index).val(coordinatesArray[index].join(','));
					numCoordsInited += 1;

					if (numCoordsInited == numCoordsToInit) {
						initMap();
					}
				});
			}, 10, i);
		}
	}

	if (numCoordsToInit == 0) {
		initMap();
	}
}

function initAddressMap(addressArray, callback, coordinatesArray, defaultCoordinatesString, canMoveMarker, bypassMap, components) {
	var $inputs = $('input.coordinates-input');

	var defaultCoordinates = defaultCoordinatesString.split(',');

	var initMap = function() {
		var map = window.confirmAddressMap || new google.maps.Map(document.getElementById('ConfirmAddressMap'), {
			mapTypeId: google.maps.MapTypeId.HYBRID,
			center: new google.maps.LatLng(0, 0),
			zoom: 1
		});

		(function() {
			var bounds = new google.maps.LatLngBounds();

			for (var i in coordinatesArray) {
				bounds.extend(new google.maps.LatLng(coordinatesArray[i][0], coordinatesArray[i][1]));
			}

			if (coordinatesArray.length == 1) {
				var extendPoint1 = new google.maps.LatLng(bounds.getNorthEast().lat() + 0.0005, bounds.getNorthEast().lng() + 0.0005);
				var extendPoint2 = new google.maps.LatLng(bounds.getNorthEast().lat() - 0.0005, bounds.getNorthEast().lng() - 0.0005);
				bounds.extend(extendPoint1);
				bounds.extend(extendPoint2);
			}

			map.fitBounds(bounds);
		})();

		var restrictedOpacity;
		var approvedOpacity;
		var restrictedBorder;
		var approvedBorder;

		PMAPI('getPublicZoneSettings', {}, function(result) {
			restrictedOpacity = result.restricted_opacity;
			approvedOpacity = result.approved_opacity;
			restrictedBorder = result.restricted_border;
			approvedBorder = result.approved_border;
		// });
		// Expanded the callback to ensure above variables are loaded first

			if (window.overlays) {
				while (window.overlays[0]) {
					window.overlays.pop().setMap(null);
				}
			}

			window.overlays = [];
			PMAPI('getPublicRestrictedZones', {
				permitTypeID: $('#permitTypeID').length ? $('#permitTypeID').val() : 0
			}, function(result) {
				var numZones = result.zones.length;
				for (var i = 0; i < numZones; i++) {
					var gpoly = new google.maps.Polygon({
						paths: WKBPolygon.fromWKB(result.zones[i], 4).getOuterRing(),
						strokeColor: '#ac2e2e',
						strokeOpacity: 1,
						strokeWeight: restrictedBorder,
						fillColor: '#ac2e2e',
						fillOpacity: restrictedOpacity
					});

					gpoly.setMap(map);
					window.overlays.push(gpoly);
				}
			});

			PMAPI('getApprovedZones', {
				permitTypeID: $('#permitTypeID').length ? $('#permitTypeID').val() : 0,
				vacation: true
			}, function(result) {
				var numZones = result.zones.length;
				for (var i = 0; i < numZones; i++) {
					var gpoly = new google.maps.Polygon({
						paths: WKBPolygon.fromWKB(result.zones[i], 4).getOuterRing(),
						strokeColor: '#2eac2e',
						strokeOpacity: 1,
						strokeWeight: approvedBorder,
						fillColor: '#2eac2e',
						fillOpacity: approvedOpacity
					});

					gpoly.setMap(map);
					window.overlays.push(gpoly);
				}
			});

			window.confirmAddressMap = map;
			initMarkers();
		}); // end of "getPublicZoneSettings"
	};

	var initMarkers = function() {
		for (var j in window.confirmAddressMarkers) {
			window.confirmAddressMarkers[j].setMap(null);
			window.confirmAddressMarkers[j] = null;
		}

		window.confirmAddressMarkers = [];

		for (var i in coordinatesArray) {
			var coords = coordinatesArray[i];
			var marker = new google.maps.Marker({
				map: window.confirmAddressMap,
				draggable: !!canMoveMarker,
				animation: google.maps.Animation.BOUNCE,
				position: new google.maps.LatLng(coords[0], coords[1]),
				title: addressArray[i].split(',')[0]
			});

			marker.$input = $inputs.eq(i);
			marker.addListener('dragend', function(e) {
				this.$input.val(e.latLng.lat() + ', ' + e.latLng.lng());
			});

			window.confirmAddressMarkers.push(marker);
		}
	};

	var numCoordsToInit = 0;
	var numCoordsInited = 0;

	for (var i = 0; i < coordinatesArray.length; i++) {
		if (coordinatesArray[i] == null) {
			numCoordsToInit += 1;

			setTimeout(function(index) {
				var geocoder = new google.maps.Geocoder();

				geocoder.geocode({ address: addressArray[index], componentRestrictions: components }, function(results, status) {
					var partialMatch = false;

					if (results.length > 0) {
						var loc = results[0].geometry.location;
						coordinatesArray[index] = [ loc.lat(), loc.lng() ];

						partialMatch = results[0].partial_match;
					} else {
						coordinatesArray[index] = [ parseFloat(defaultCoordinates[0]), parseFloat(defaultCoordinates[1]) ];
						partialMatch = true;
					}

					$('.coordinates-input').parent().find('.partial-match').val(partialMatch);

					$inputs.eq(index).val(coordinatesArray[index].join(','));
					numCoordsInited += 1;

					if (numCoordsInited == numCoordsToInit) {
						initMap();
					}
				});
			}, 10, i);
		}
	}

	if (numCoordsToInit == 0) {
		initMap();
	}
}

function signInPopup(email, invalidPassword) {
	var title = LS('*AccountAlreadyExists');

	if (invalidPassword) {
		title = LS('*InvalidPassword');
	}

	Swal.fire({
		title: title,
		html: '<form id="createAccountLogin"><p>' + LS('*Email') + '<br /><input type="text" class="form-control" name="email" value="' + email + '" readonly/></p>' +
			'<p>' + LS('*Password') + '<br /><input type="password" class="form-control" name="password" id="createAccountPasswordInput" autofocus /></p></form>',
		showCancelButton: true,
		showDenyButton: true,
		reverseButtons: true,
		cancelButtonText: LS('*Cancel')
		// denyButtonText: LS('*ForgotPassword'),
	}).then(function(result) {
		if (result.value) {
			var $buttons = $('button', this);
			var form = document.getElementById('createAccountLogin');

			$buttons.prop('disabled', true);

			setTimeout(function() {
				PMAPI('attemptLogin', $(form).serialize(), function(result) {
					if (result.authenticated) {
						window.location = '/my_permits';
					} else {
						swal.close();
						signInPopup(email, true);
					}
				});
			}, 250);
		}
	});
}

function setCookie(name,value,days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        expires = "; expires=" + date.toUTCString();
    }
    document.cookie = name + "=" + (value || "")  + expires + "; path=/";
}

function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function eraseCookie(name) {
    document.cookie = name+'=; Max-Age=-99999999;';
}

function getBrowser() {
	var deviceIsMobile = false;

	if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|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|phone)|xda|xiino/i.test(navigator.userAgent) ||
		/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(navigator.userAgent.substr(0,4))) {
		deviceIsMobile = true;
	}

	var ua = navigator.userAgent;
	var tem;
	var M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];

    if (/trident/i.test(M[1])) {
        tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
        return {name:'IE',version:(tem[1] || '')};
	}

    if (M[1]=== 'Chrome') {
        tem = ua.match(/\b(OPR|Edge)\/(\d+)/);
        if(tem != null) return {name:tem[1].replace('OPR', 'Opera'),version:tem[2]};
	}

	M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];

    if ((tem = ua.match(/version\/(\d+)/i))!= null) {
		M.splice(1, 1, tem[1]);
	}

    return {
		name: M[0] + (deviceIsMobile ? ' Mobile' : ''),
		version: M[1],
	};
}

var AlphaEncoder = {
	'encode': function(u8) {
		var encoded = [];

		for (var i = 0; i < u8.length; i++) {
			encoded.push(0x40 | ((u8[i] >> 4) & 0xf));
			encoded.push(0x40 | (u8[i] & 0xf));
		}

		return String.fromCharCode.apply(null, encoded);
	},

	'decode': function(encoded) {
		var u8 = new Uint8Array(encoded.length >> 1);
		var j = 0;

		for (var i = 0; i < u8.length; i++) {
			u8[i] = ((encoded.charCodeAt(j) & 0xf) << 4) | (encoded.charCodeAt(j + 1) & 0xf);
			j += 2;
		}

		return u8;
	}
};

$('#ForgotPasswordContainer > a').on('click', function() {
	PMAPI('getPasswordResetEquation', {}, function(response) {
		Swal.fire({
			title: LS('*ResetPassword'),
			html: '<p>' + LS('*ResetPasswordInstructions') + '</p>' +
				'<div style="font-size:14px">' +
					'<p>' + LS('*Email') + '<br /><input type="text" class="form-control" id="ForgotPasswordEmailInput" /></p>' +
				'</div>',
			showCancelButton: true,
			cancelButtonText: LS('*Cancel'),
			confirmButtonText: LS('*Reset'),
			reverseButtons: true
		}).then(function(result) {
			var email = document.getElementById('ForgotPasswordEmailInput').value;
			if (email) {
				PMAPI('validateEmail', {
					email: email
				}, function(result) {
					if (result.validEmail) {
						PMAPI('sendPasswordResetEmail', {
							email: email,
							equation: [ response.num1, response.num2, /* $('#ForgotPasswordEquationInput').val() */ response.num1 + response.num2 ]
						}, function(response) {
							if (response.errorCode == 0) {
								Swal.fire({
									text: LS('*PleaseCheckEmailForInstructions'),
									type: 'success'
								});
							}
						});
					} else {
						Swal.fire({
							title: LS('*UnknownEmail'),
							text: LS('*EmailNotAttachedToAccount')
						});
					}
				});
			}
		});
	});
});

// Verify that the property code is correct and links to an active owner account with the same company
$('.submit-rental-code').on('click', function() {
	var code = $('#property-code').val().toLowerCase();

	PMAPI('verifyPropertyCode', {
		code: code
	}, function(result) {
		if (result.valid) {
			window.location.href = '/rental?p=' + code;
		} else {
			Swal.fire({
				title: LS('*InvalidCode'),
				text: LS('*ThePropertyCode') + ' ' + code + ' ' + LS('*IsNotValid') + '.'
			});
		}
	});
});

$(document).on('change', 'label.panel > .panel-body > input[type=radio]', function() {
	var $panel = $(this).parent().parent();
	var $div = $panel.parent();

	$div.siblings().find('label.panel.selected').removeClass('selected');
	$panel.addClass('selected');
}).on('click', 'div.panel', function() {
	$('input[type=option]:first', this).click();
}).on('change', '.permit-template', function() {
	var $this = $(this);
	if ($this.hasClass('TIME_PERIOD')) {
		var $start = $('#permit-start');
		var delayedStart = $this.data('restricted-start');
		$('#permit-end').val(moment()
			.add(delayedStart, 'days')
			.add($this.data('expiry-multiplier'), $this.data('expiry-period').toLowerCase())
			.format('MMMM Do, YYYY'));
		if ($this.data('variable-start')) {
			$start.daterangepicker({
				singleDatePicker: true,
				opens: 'right',
				autoApply: true,
				minDate: moment().add(delayedStart, 'days'),
				startDate: moment().add(delayedStart, 'days'),
				locale: {
					format: 'MMMM Do, YYYY'
				}
			}, function(start) {
				$('#permit-end').val(moment(start._d)
					.add($this.data('expiry-multiplier'), $this.data('expiry-period').toLowerCase())
					.format('MMMM Do, YYYY'));
			});

			$start.attr('readonly', false);
		} else {
			if ($('#permit-start').data('daterangepicker') != undefined) {
				$('#permit-start').data('daterangepicker').remove();
			}

			$('#permit-start').val(moment().add(delayedStart, 'days').format('MMMM Do, YYYY')).attr('readonly', true);
		}

		$start.parent().parent().parent().removeClass('hidden');
	} else {
		$('#permit-start').parent().parent().parent().addClass('hidden');
	}
}).on('click', '#create-account-vacation', function(e) {
	e.preventDefault();

	Swal.fire({
		title: LS('*ToGetStartedEnterEmail'),
		html: '<p>' + LS('*Email') + '<br /><input type="text" class="form-control" id="createAccountEmailInput" autofocus /></p>',
		showCancelButton: true,
		cancelButtonText: LS('*Cancel'),
		reverseButtons: true,
	}).then(function(result) {
		if (result.value) {
			var email = document.getElementById('createAccountEmailInput').value;
			if (email) {
				PMAPI('validateEmail', {
					email: email
				}, function(result) {
					if (result.validEmail) {
						// Account Exists, ask for password
						swal.close();
						signInPopup(email);
					} else {
						// Account doesn't exist, store email in cookie
						setCookie('newemail', email, 1);
						Swal.fire({
							title: LS('*CreatePermit'),
							text: LS('*CreatePermitOwnOrVacation'),
							confirmButtonText: LS('*PersonalProperty'),
							showCancelButton: true,
							cancelButtonText: LS('*VacationProperty'),
							showCloseButton: true,
							reverseButtons: true
						}).then(function(result) {
							if (result.value) { // personal property permit
								window.location.href = '/create_account';
							} else if (result.dismiss === 'cancel') { // vacation permit
								window.location.href = '/rental';
							}
						});
					}
				});
			}
		}
	});
}).on('click', '#create-account', function(e) {
	e.preventDefault();

	Swal.fire({
		title: LS('*ToGetStartedEnterEmail'),
		html: '<p>'+ LS('*Email') +'<br /><input type="text" class="form-control" id="createAccountEmailInput" autofocus /></p>',
		showCancelButton: true,
		reverseButtons: true,
		cancelButtonText: LS('*Cancel')
	}).then(function(result) {
		if (result.value) {
			var email = document.getElementById('createAccountEmailInput').value;
			if (email) {
				PMAPI('validateEmail', {
					email: email
				}, function(result) {
					if (result.validEmail) {
						// Account Exists, ask for password
						swal.close();
						signInPopup(email);
					} else {
						// Account doesn't exist, store email in cookie
						setCookie('newemail', email, 1);
						window.location.href = '/create_account';
					}
				});
			}
		}
	});
}).on('keyup', '#createAccountEmailInput', function(event) {
	if (event.keyCode === 13) {
		$(this).closest('.swal2-container').find('.swal2-confirm').trigger('click');
	}
}).on('keyup', '#createAccountPasswordInput', function(event) {
	if (event.keyCode === 13) {
		$(this).closest('.swal2-container').find('.swal2-confirm').trigger('click');
	}
}).ready(function() {
	//Scroll to top
	$(function() {
		$(window).scroll(function() {
			if($(this).scrollTop() != 0) {
				$('#toTop').fadeIn();
			} else {
				$('#toTop').fadeOut();
			}
		});

		$('#toTop').click(function() {
			$('body,html').animate({scrollTop:0},500);
		});

	});

	//Preload
	$(window).load(function() { // makes sure the whole site is loaded
		$('#status').fadeOut(); // will first fade out the loading animation
		$('#preloader').delay(350).fadeOut('slow'); // will fade out the white DIV that covers the website.
		$('body').delay(350).css({'overflow':'visible'});
	});

	//Menu mobile
	$('.btn-responsive-menu').on('click', function() {
		$("#top-nav").slideToggle(400);
	});

	//Acnhor arrow button
	$('a.bt_more').click(function() {
		$('html, body').animate({
			scrollTop: $( $(this).attr('href') ).offset().top
		}, 500);
		return false;
	});

	//Pace holder
	$('input, textarea').placeholder();

	//Background image
	$('.stretchMe').anystretch();

	//On scroll error
	if( window.innerWidth < 500 ) {
		$("button.forward, button.backword").click(function() {
			$("html, body").animate({ scrollTop: 215 }, "slow");
			return false;
		});
	}
	if( window.innerWidth < 340 ) {
		$("button.forward, button.backword").click(function() {
			$("html, body").animate({ scrollTop: 280 }, "slow");
			return false;
		});
	}

	// WIZARD  ===============================================================================
	jQuery(function($) {
		// Basic wizard with validation
		$("#review_container").wizard({
			stepsWrapper: '#wrapped',
			submit: '.submit',
			beforeSelect: function(event, state) {
				/*if ($('input#website').val().length != 0) {
					return false;
				} */
				if (!state.isMovingForward)
					return true;

				var textOptionsValid = true;

				$('input.text-option').each(function() {
					if (this.value.length > 0 && !this.valid) {
						textOptionsValid = false;
					}
				});

				if (!textOptionsValid) return false;

				var inputs = $(this).wizard('state').step.find(':input');

				document.body.scrollTop = 0;

				return !inputs.length || !!inputs.valid();
			}
		}).validate({
			errorPlacement: function(error, element) {
				if ( element.is(':radio') || element.is(':checkbox') ) {
					error.insertbefore( element.next() );
				}

				else {
					error.insertafter( element );
				}
			}
		});

		//  progress bar
		$("#progressbar").progressbar();

		$("#review_container").wizard({
			afterSelect: function( event, state ) {
				$("#progressbar").progressbar("value", state.percentComplete);
				$("#location").text("(" + state.stepsComplete + "/" + state.stepsPossible + ")");
			}
		});
	});
});

// Count To
$('.count').each(function () {
	$(this).prop('Counter',0).animate({
		Counter: $(this).text()
	},{
		duration: 2000,
		easing: 'swing',
		step: function (now) {
			$(this).text(Math.ceil(now));
		}
	});
});

// Testimonial carousel
$('#quote-carousel').carousel({
	pause: true,
	interval: 8000,
});

// TWITTER FEED  ===============================================================================
$('.latest-tweets').each(function(){
	$(this).tweet({
		username: $(this).data('username'),
		join_text: "auto",
		avatar_size: 0,
		count: $(this).data('number'),
		auto_join_text_default: " we said,",
		auto_join_text_ed: " we",
		auto_join_text_ing: " we were",
		auto_join_text_reply: " we replied to",
		auto_join_text_url: "",
		loading_text: " loading tweets...",
		modpath: "./twitter/"
	});
});

$('.latest-tweets').find('ul').addClass('slider');

if ($().bxSlider) {
	var $this = $('.latest-tweets');
	$('.latest-tweets .slider').bxSlider({
		mode: $this.data('mode') != 'undefined' ? $this.data('mode') : "horizontal",
		speed: $this.data('speed') != 'undefined' ? $this.data('speed') : 2000,
		controls: $this.data('controls') != 'undefined' != 'undefined' ? $this.data('controls') : true,
		nextSelector: $this.data('nextselector') != 'undefined' ? $this.data('nextselector') : '',
		prevSelector: $this.data('prevselector') != 'undefined' ? $this.data('prevselector') : '',
		pager: $this.data('pager') != 'undefined' ? $this.data('pager') : true,
		pagerSelector: $this.data('pagerselector') != 'undefined' ? $this.data('pagerselector') : '',
		pagerCustom: $this.data('pagercustom') != 'undefined' ? $this.data('pagercustom') : '',
		auto: $this.data('auto') != 'undefined' ? $this.data('auto') : true,
		autoHover: $this.data('autoHover') != 'undefined' ? $this.data('autoHover') : true,
		adaptiveHeight: $this.data('adaptiveheight') != 'undefined' ? $this.data('adaptiveheight') : true,
		useCSS: $this.data('useCSS') != 'undefined' ? $this.data('useCSS') : false,
		nextText: '<i class="icon-angle-right">',
		prevText: '<i class="icon-angle-left">',
		preloadImages: 'all',
		responsive: true
	});
}
