var site = function(){
	this.getObjectType = function(obj) {
		var toString = Object.prototype.toString,
			obj_type = false;
		switch (toString.call(obj)) {
			case "[object Array]"    :obj_type = 'array';break;
			case "[object Object]"   :obj_type = 'object';break;
			case "[object String]"   :obj_type = 'string';break;
			case "[object Number]"   :obj_type = 'integer';break;
			case "[object Boolean]"  :obj_type = 'boolean';break;
			case "[object Function]" :obj_type = 'function';break;
		}
		return obj_type;
	};

	this.getRequest = function(name) {
		var url_arr, params, value_arr = [], value = false, item, reg, i;
		url_arr = location.search.split('?');
		if (url_arr.length > 1) {
			params = url_arr[1].split('&');
			for (i = 0; i < params.length; i++) {
				item = params[i].split('=');
				reg = /\[.*\]$/g;
				if (item[0].match(reg)) {
					if (name == item[0].replace(reg, '')) value_arr.push(item[1]);
				}
				else {
					if (name == item[0]) value = item[1];
				}
			}
			if (!value && value_arr.length) value = value_arr;
		}
		return value;
	};

	this.testKey = function(e) {
		var getLabel = function(id, type) {
			var name = '', 
				key_arr = {'8':'BackSpase','9':'Tabulate','12':'FormFeed','13':'Enter','19':'PauseBreak','27':'Escape','33':'PageUp','34':'PageDown','35':'End','36':'Home','37':'Left','38':'Up','39':'Right','40':'Down','45':'Insert','46':'Delete','93':'ContextMenu','92':'Windows','112':'F1','113':'F2','114':'F3','115':'F4','116':'F5','117':'F6','118':'F7','119':'F8','120':'F9','121':'F10','122':'F11','123':'F12'};
			switch (type) {
				case "char" :name = String.fromCharCode(id);break;
				case "key"  :name = key_arr[id];break;
			}
			return name;
		};
		var key = (e.keyCode || e.charCode), type,
			type_char = typeof e.keyIdentifier != 'undefined' ? (unescape(e.keyIdentifier.replace('U+', '%u')) == String.fromCharCode(key)) : false;
		if (!this.isFirefox) e.charCode = 0;
		switch (0) {
			case e.keyCode  : {
				switch (true) {
					case (key >= 48 && key <= 57) :type = {'id':key,'name':getLabel(key, 'char'),'type':'digit'};break;
					case ((key >= 33 && key <= 47) || (key >= 58 && key <= 64) || (key >= 91 && key <= 96) || (key >= 123 && key <= 126) || (key == 8470)) :type = {'id':key,'name':getLabel(key, 'char'),'type':'simbol'};break;
					default :type = {'id':key,'name':getLabel(key, 'char'),'type':'char'};
				}
				break;
			}
			case e.charCode : {
				switch (true) {
					case (key >= 112 && key <= 123) :type = {'id':key,'name':getLabel(key, 'key'),'type' : 'function'};break;
					case ((key >= 33 && key <= 40) || (key == 8) || (key == 9) || (key == 12) || (key == 13) || (key == 19) || (key == 27) || (key == 45) || (key == 46) || (key == 92) || (key == 93)) :type = {'id':key,'name':getLabel(key, 'key'),'type':'system'};break;
					default :type = (!this.isFirefox) ? {'id':key,'name':getLabel(key, 'char'),'type': ((key >= 48 && key <= 57) ? 'digit' : 'char')} : null;
				}
				break;
			}
			default : {
				switch (true) {
					case (key >= 112 && key <= 123) :type = {'id':key,'name':getLabel(key, (this.isWebKit && type_char ? 'char' : 'key')),'type':(this.isWebKit && type_char ? 'char' : 'function')};break;
					case ((key >= 33 && key <= 40) || (key == 8) || (key == 9) || (key == 12) || (key == 13) || (key == 19) || (key == 27) || (key == 45) || (key == 46) || (key == 92) || (key == 93)) :type = {'id':key,'name':getLabel(key, (this.isWebKit && type_char ? 'char' : 'key')),'type':(this.isWebKit && type_char ? 'char' : 'system')};break;
					default :type = (!this.isFirefox) ? {'id':key,'name':getLabel(key, 'char'),'type': ((key >= 48 && key <= 57) ? 'digit' : 'char')} : null;
				}
			}
		}
		return type;
	};

	this.addEvent = function(obj, type, fn) {
		if (obj.addEventListener) obj.addEventListener(type, fn, false);
		else if (obj.attachEvent) obj.attachEvent("on" + type, fn );
	};

	this.css = {};
	this.css.addClass = function(obj, name) {
		obj.className = (obj.className + " " + name).replace(/^\s+/, "");
	};
	this.css.checkClass = function(obj, name) {
		return (((" " + obj.className + " ").indexOf(" " + name + " ") != -1) ? true : false);
	};
	this.css.remClass = function(obj, name) {
		obj.className = (" " + obj.className + " ").replace(" " + name + " ", " ").replace(/^\s+/, "").replace(/\s+$/, "");
	};
	this.include = function(src) {
		function js(src) {
			var head = document.getElementsByTagName('head')[0];
			var s_obj = document.createElement("script");
			s_obj.charset = 'utf-8';
			s_obj.type = 'text/javascript';
			s_obj.src = src + "?" + Math.random();
			head.appendChild(s_obj);
		}
		function css(src) {
			var head = document.getElementsByTagName('head')[0];
			var s_obj = document.createElement("link");
			s_obj.rel = 'stylesheet';
			s_obj.type = 'text/css';
			s_obj.href = src;
			head.appendChild(s_obj);
		}
		switch (typeof src) {
			case "object":
				for (var i in src) this.include(src[i]);
				return false;
		}
		if (typeof src != 'string') return false;
		var ext = src.split('.');
		ext = ext[ext.length -1];
		switch (ext) {
			case "js":js(src);break;
			case "css":css(src);break;
			default :return false;
		}
		return true;
	};

	this.generatePassword = function(field, min, max) {
		min *= 1;
		max *= 1;
		var res = '', i,
			chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
			len = (max != '' && max * 1) ? (Math.floor(Math.random() * (max - min + 1)) + min) * 1 : min;
		for (i = 0; i < len; i++) {
			res += chars.substr(Math.floor(Math.random() * chars.length), 1);
		}
		field.value = res;
	};

	this.htmlspecialchars_decode = function(html) {
		return html.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"');
	};

	this.isIE      = (navigator.userAgent.indexOf('MSIE') != -1);
	this.isOpera   = (navigator.appName === "Opera");
	this.isSafari  = ((this.isIE || this.isOpera) ? false : navigator.vendor.indexOf('Apple') != -1);
	this.isChrome  = ((this.isIE || this.isOpera) ? false : navigator.vendor.indexOf('Google') != -1);
	this.isWebKit  = (navigator.userAgent.indexOf('WebKit') != -1);
	this.isFirefox = (navigator.userAgent.indexOf('Firefox') != -1);
	this.isWin     = (navigator.platform.indexOf('Win') != -1);
	this.isMac     = (navigator.platform.indexOf('Mac') != -1);
};

site.instance = null;

/**
 * @return {site}
 */
site.getInstance = function() {
	site.instance = site.instance || new site();
	return site.instance;
};
site.getInstance().include([
	'/js/site/ajax.js',
	'/js/site/forms.js',
	'/js/site/message.js',
	'/js/site/tabs.js',
	'/js/content_scripts.js',
	'/js/AC_OETags.js',
	'/js/umicms_ru.js',
	'/js/custom.js',
	'/js/umipartners.js'
]);
if (!site.getInstance().isWin) {
	site.getInstance().include('/css/editions_fix.css');
}
if (location.pathname.indexOf('buy_now/find_webdevs') != -1) {
	if ((!site.getInstance().isWin) || (navigator.appCodeName == 'Mozilla')) {
		site.getInstance().include('/css/devFilterFix.css');
	}
}

jQuery(document).ready(function(){
	var nav = jQuery('.navigator'),
		oSite = site.getInstance(),
		next, prev, ctrl = false;
	if (nav.length) {
		prev = jQuery('strong', nav[0]).prev();
		next = jQuery('strong', nav[0]).next();
		if (next || prev) {
			jQuery(document).keydown(function(event){
				if (oSite.isOpera && oSite.isMac) {
					if (ctrl === false) {
						ctrl = (event.which == 57392);
					}
					jQuery(document).keyup(function(e){
						if (event.which != 57392) ctrl = false;
					});
				}
				else ctrl = event.ctrlKey;
				if (ctrl) {
					if (prev.length && event.which == 37) {
						location.href = prev[0].href;
					}
					if (next.length && event.which == 39) {
						location.href = next[0].href;
					}
					if (oSite.isOpera) return false;
				}
			});
		}
	}
});

