/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * Wicket BrowserInfo Support
 *
 * Populates a special form with the client/browser info
 * and submits it to the server
 */

;(function (undefined) {

	'use strict';

	if (typeof(Wicket) === 'undefined') {
		window.Wicket = {};
	}

	if (typeof(Wicket.BrowserInfo) === 'undefined') {
		window.Wicket.BrowserInfo = {

			/**
			 * Collects the client information
			 *
			 * @returns {Object}
			 */
			collect: function() {
				var info = {};
				info.navigatorAppName = window.navigator.appName;
				info.navigatorAppVersion = window.navigator.appVersion;
				info.navigatorAppCodeName = window.navigator.appCodeName;
				var cookieEnabled = (window.navigator.cookieEnabled);
				if (typeof(window.navigator.cookieEnabled) === "undefined" && !cookieEnabled) {
					document.cookie = "wickettestcookie";
					cookieEnabled = (document.cookie.indexOf("wickettestcookie") !== -1);
				}
				info.navigatorCookieEnabled = cookieEnabled;
				info.navigatorJavaEnabled = window.navigator.javaEnabled() || false;
				info.navigatorLanguage = window.navigator.language ? window.navigator.language : window.navigator.userLanguage;
				info.navigatorPlatform = window.navigator.platform;
				info.navigatorUserAgent = window.navigator.userAgent;
				if (window.screen) {
					info.screenWidth = window.screen.width;
					info.screenHeight = window.screen.height;
					info.screenColorDepth = window.screen.colorDepth;
				}
				if (Intl && typeof(Intl.DateTimeFormat) === 'function' &&
						typeof(Intl.DateTimeFormat().resolvedOptions) === 'function') {
					var jsTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
					info.jsTimeZone = jsTimeZone ? jsTimeZone : null;
				}
				info.utcOffset = (new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0).getTimezoneOffset() / -60);
				info.utcDSTOffset = (new Date(new Date().getFullYear(), 6, 1, 0, 0, 0, 0).getTimezoneOffset() / -60);
				info.browserWidth =  window.innerWidth || document.body.offsetWidth;
				info.browserHeight =  window.innerHeight || document.body.offsetHeight;
				info.hostname =  window.location.hostname;

				if (Wicket.BrowserInfo.collectExtraInfo) {
					Wicket.BrowserInfo.collectExtraInfo(info);
				}

				return info;
			},

			/**
			 * Populates the form elements with the client info
			 *
			 * @param formMarkupId   The markup id of the special form
			 * @returns {HTMLFormElement} The special form
			 */
			populateFields: function(formMarkupId) {
				var postbackForm = document.getElementById(formMarkupId);
				var info = Wicket.BrowserInfo.collect();
				var i;
				for (i in info) {
					var input = document.createElement('input');
					input.type = 'text';
					input.name = i;
					input.value = info[i];
					postbackForm.appendChild(input);
				}

				return postbackForm;
			},

			/**
			 * Populates and submits the special form.
			 *
			 * @param formMarkupId  The markup id of the special form
			 */
			submitForm: function(formMarkupId) {
				var postbackForm = Wicket.BrowserInfo.populateFields(formMarkupId);
				postbackForm.submit();
			}
		};
	}

})();
