/**
 * Проверяет, является ли устройство touch screen планшетом (iPad, iPhone, android и т.п.).
 */
BrowserDetect.isTouchPad = function()
{
	return ('ontouchstart' in document.documentElement) && window.orientation !== undefined;
};

BrowserDetect.test = function(os, browser, versionMin, versionMax)
{
	if (BrowserDetect.instance == null)
		BrowserDetect.instance = new BrowserDetect();

	return BrowserDetect.instance.test(os, browser, versionMin, versionMax);
};

function BrowserDetect()
{
	this.os = [];
	this.browser = [];
	this.browserVersion = undefined;

	this.detect();
}

BrowserDetect.prototype.detect = function()
{
	this.os = this._searchString(this.dataOs) || undefined;
	this.browser = this._searchString(this.dataBrowser) || undefined;
	this.browserVersion = this._searchVersion(navigator.userAgent)
	                   || this._searchVersion(navigator.appVersion)
	                   || undefined;
};

BrowserDetect.prototype._searchString = function(data)
{
	var findEntries = [];
	for (var i = 0; i < data.length; i++)
	{
		var dataString = data[i].string;
		var dataProp = data[i].prop;
		this.versionSearchString = data[i].versionSearch || data[i].identity;
		if (dataString)
		{
			if (dataString.indexOf(data[i].subString) != -1)
				findEntries.push(data[i].identity);
		}
		else if (dataProp)
			findEntries.push(data[i].identity);
	}

	return findEntries;
};

BrowserDetect.prototype._searchVersion = function(dataString)
{
	var index = dataString.indexOf(this.versionSearchString);
	if (index == -1) return;
	return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
};

BrowserDetect.prototype.test = function(os, browser, versionMin, versionMax)
{
	versionMin = parseFloat(versionMin) || '';
	versionMax = parseFloat(versionMax) || '';

	if (os && !this.testOs(os))
		return false;

	if (browser && !this.testBrowser(browser))
		return false;

	if ((versionMin || versionMax) && !this.testBrowserVersion(versionMin, versionMax))
		return false;

	return true;
};

BrowserDetect.prototype.testOs = function(os)
{
	if (typeof(os) != 'object')
		os = [os];

	for (var i in this.os)
	{
		for (var i2 in os)
		{
			if (this.os[i] == os[i2])
				return true;
		}
	}

	return false;
};

BrowserDetect.prototype.testBrowser = function(browser)
{
	if (typeof(browser) != 'object')
		browser = [browser];

	for (var i in this.browser)
	{
		for (var i2 in browser)
		{
			if (this.browser[i] == browser[i2])
				return true;
		}
	}

	return false;
};

BrowserDetect.prototype.testBrowserVersion = function(min, max)
{
	if (min != '' && this.browserVersion < min)
		return false;

	if (max != '' && this.browserVersion > max)
		return false;

	return true;
};

/// DATA ///
BrowserDetect.prototype.dataOs = [
	{
		string: navigator.platform,
		subString: "Win",
		identity: "win"
	},
	{
		string: navigator.platform,
		subString: "Win",
		identity: "win2"
	},
	{
		string: navigator.userAgent,
		subString: "iPhone",
		identity: "ios"
	},
	{
		string: navigator.userAgent,
		subString: "iPad",
		identity: "ios"
	},
	{
		string: navigator.userAgent,
		subString: "Android",
		identity: "android"
	},
	{
		string: navigator.platform,
		subString: "Mac",
		identity: "mac"
	},
	{
		string: navigator.platform,
		subString: "Linux",
		identity: "linux"
	}
];

BrowserDetect.prototype.dataBrowser = [
	{
		string: navigator.userAgent,
		subString: "Firefox",
		identity: "firefox"
	},
	{
		string: navigator.userAgent,
		subString: "Chrome",
		identity: "chrome"
	},
	{
		string: navigator.vendor,
		subString: "Apple",
		versionSearch: "Version",
		identity: "safari"
	},
	{
		prop: window.opera,
		identity: "opera"
	},
	{
		string: navigator.vendor,
		subString: "KDE",
		identity: "konqueror"
	},
	{
		string: navigator.userAgent,
		subString: "MSIE",
		versionSearch: "MSIE",
		identity: "ie"
	}
];
