/*
 * 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.
 */
var iSupported = false;

if (navigator.userAgent.match(/webkit/i)) {
    iSupported = true;
} else if (navigator.userAgent.match(/MSIE/i)) {
    var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    iSupported = re.exec(navigator.userAgent) !== null && parseFloat(RegExp.$1) >= 10;
} else if (navigator.userAgent.match(/Firefox/i)) {
	var re = new RegExp("Firefox/([0-9]{1,}[\.0-9]{0,})");
	iSupported = re.exec(navigator.userAgent) !== null && parseFloat(RegExp.$1) >= 18;
}

if (!iSupported) {
    alert("It seems your browser or its version is not supported. This web page is designed to work in webkit-based browsers, latest InternetExplorer and Firefox")
}
