var d = document;

String.prototype.el = function(par) {
	if (par != null) {
		var doc = (par['elParent'] != null ? par['elParent'] : d);
	}
	;
	return d.getElementById(this);
};
String.prototype.trim = function() {
	return this.replace(/(^[\s\xA0]+|[\s\xA0]+$)/g, '');
};
String.prototype.getCookie = function() {
	var cookie = d.cookie.split(';');
	for (var i = 0; i < cookie.length; i++) {
		var val = cookie[i].trim().split('=');
		if (val[0] == this) {
			return val[1];
		}
		;
	}
	;
	return null;
};
String.prototype.setCookie = function(value) {
	d.cookie = this + '=' + escape(value) +
			'; path=/' +
			'; domain=.' + core.domainCookie;
};
String.prototype.loadScript = function(data) {
	var _script = d.createElement('SCRIPT');
	_script.src = this;
	for (var i in data) _script[i] = data[i];
	d.body.appendChild(_script);
};
String.prototype.getUrl = function(fun, par) {
	var http = null;
	try {
		http = new ActiveXObject('Msxml2.XMLHTTP');
	} catch(e) {
		try {
			http = new ActiveXObject('Microsoft.XMLHTTP');
		} catch(e) {
			if (window.XMLHttpRequest) {
				http = new XMLHttpRequest();
			}
		}
	}
	;
	if (http != null) {
		var url = this;
		http.onreadystatechange = function() {
			if (http.readyState == 4) {
				if (http.status == 200) {
					if (fun !== null) fun(http.responseText);
				}
			}
		};
		if (par === null) {	// GET
			var query = null;
			http.open('GET', url, true);
		} else {	// POST
			var query = core.post(par);
			http.open('POST', url, true);
			http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			http.setRequestHeader("AjaxQuery", "ajax");
			http.setRequestHeader("Content-length", query.length);
		}
		;
		http.send(query);
		return true;
	}
	;
	return false;
};

var core = new function() {
	var self = this;
	this.errors = {
		enabled: false,
		type: alert // alert, console.log
	};
	this.domainCookie;
	this.domain;

	this.phozList;
	this.opacity = {};
	this.opacityD = {def:20};
	this.timer = {};
	this.selectAdd = (navigator.appName == 'Microsoft Internet Explorer' ? -1 : null);

	/**
	 * Создание _POST запроса
	 */
	this.post = function(par, vPar) {
		var query = '';
		for (var i in par) {
			if (typeof par[i] != 'object') {
				query += (vPar == null ? i : vPar + '[' + i + ']') + '=' + encodeURIComponent(par[i]) + '&';
			} else {
				query += self.post(par[i], (vPar == null ? i : vPar + '[' + i + ']'));
			}
			;
		}
		;
		return query;
	};
	/**
	 * Обработчик ошибок
	 */
	this.errorDo = function(e) {
		if (this.errors.enabled !== true) return;
		var toDo = this.errors.type;
		toDo(e.message);
	};
	/**
	 * Преобразование строки в json
	 */
	this.getData = function(data) {
		try {
			eval('data = ' + data);
			return data;
		} catch(e) {
			this.errorDo(e);
		}
		;
		return null;
	};
	/**
	 * Установка капчи
	 */
	this.protect = function() {
		var protect = 'protect'.el();
		if (protect != null) {
			protect.style.background = 'url(' + this.domain + 'protect/?' + Math.random() + ') no-repeat center center';
		}
		;
	};
	/**
	 * Получение банера
	 * @param string zon - id зоны
	 * @param array banners - массив размеров баннеров
	 */
	this.getBanner = function(zon, banners) {
		var width = zon.el().offsetWidth;
		for (var i = 0; i < banners.length; i++) {
			var size = banners[i].split('x');
			if (size[0] <= width) {
				++i;
				break;
			}
			;
		}
		;
		d.write('<script language="JavaScript" src="' + this.domain + 'banner/' + zon + '/' + banners[--i] + '/?' + Math.round() + '"></script>');
	};
	/**
	 * Создание эфекта затухания и появления
	 */
	this.opacity = function(id, ascDesc, fun) {
		self.opacity[id] = parseInt(self.opacity[id]);
		self.opacity[id] = (isNaN(self.opacity[id]) ? 100 : self.opacity[id]);
		var doFun = false;
		if (ascDesc) {
			self.opacity[id] += self.opacityD[id] || self.opacityD.def;
			if (self.opacity[id] >= 100) {
				self.opacity[id] = 100;
				clearInterval(self.timer[id]);
				doFun = true;
			}
			;
		} else {
			self.opacity[id] -= self.opacityD[id] || self.opacityD.def;
			if (self.opacity[id] <= 0) {
				self.opacity[id] = 0;
				clearInterval(self.timer[id]);
				doFun = true;
			}
			;
		}
		;
		id.el().style.opacity = self.opacity[id] / 100;
		if (fun != null && doFun) fun();
	};
	/**
	 * Проверка валидности e-mail
	 */
	this.checkMail = function(mail) {
		return /^\w+([\.-]\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/.test(mail);
	};
	/**
	 * Добавление нового элемента td в существующий table>tr
	 * @param data
	 * data.tr - ссылка на tr
	 * data.data - массив добавляемых объектов
	 * data.inc - инкремент
	 * data.index - индекс начальной td
	 */
	this.addTd = function(data) {
		for (var i in data.data) {
			data.tr.insertCell(data.index);
			if (data.margin != 0) {
				data.marginObj.style.marginLeft = (parseInt(data.marginObj.style.marginLeft, 10) + data.margin) + 'px';
			}
			;
			data.tr.cells[data.index].innerHTML = data.data[i];
			++data.index;
		}
		;
	};
	/**
	 * Scrolling elements
	 */
	this.scrolling = function(scroll) {
		if (scroll.block === true) {
			if (this.timer[scroll.name] && this.timer[scroll.name].end == false) return;
		}
		if (isNaN(parseInt(scroll.obj.style.marginLeft, 10))) {
			scroll.obj.style.marginLeft = '0px';
		}
		if (isNaN(parseInt(scroll.error, 10))) {
			scroll.error = 0;
		}
		this.timer[scroll.name] = {end:false};
		var move = function(scroll) {
			if (!self.timer[scroll.name].margin) {
				self.timer[scroll.name].margin = parseInt(scroll.obj.style.marginLeft, 10);
				self.timer[scroll.name].pWidth = parseInt(scroll.obj.parentNode.offsetWidth, 10);
				self.timer[scroll.name].width = parseInt(scroll.obj.offsetWidth, 10);
				if ((scroll.step > 0 && self.timer[scroll.name].margin >= 0) || (scroll.step < 0 && self.timer[scroll.name].width - Math.abs(self.timer[scroll.name].margin) - scroll.error <= self.timer[scroll.name].pWidth)) {
					if (scroll.cycle === true) {
						scroll.step *= -1;
						scroll.shift = self.timer[scroll.name].width - self.timer[scroll.name].pWidth - scroll.error;
					} else {
						clearInterval(self.timer[scroll.name].interval);
						if (scroll.block === true) self.timer[scroll.name].end = true;
						if (scroll.fun) scroll.fun();
						return;
					}
				}
			}
			scroll.shift -= Math.abs(scroll.step);
			if (scroll.shift < 0) {
				scroll.step += scroll.shift * (scroll.step < 0 ? -1 : 1);
			}
			self.timer[scroll.name].margin += scroll.step;
			scroll.obj.style.marginLeft = self.timer[scroll.name].margin + 'px';
			if (scroll.shift <= 0) {
				clearInterval(self.timer[scroll.name].interval);
				if (scroll.block === true) self.timer[scroll.name].end = true;
				if (scroll.fun) scroll.fun();
				return;
			}
		};
		this.timer[scroll.name].interval = setInterval(function() {
			move(scroll);
		}, scroll.speed);
	};
	/**
	 * Show or hide element
	 */
	this.showHide = function(data) {
		var el = data.el.el();
		if (/(^|\s)hide(\s|$)/.test(el.className)) {
			el.className = el.className.replace(/(^|\s)(hide)(\s|$)/, '$1$3');
			return 'show';
		} else {
			el.className += ' hide';
			return 'hide';
		}
	};
	/**
	 * Возвращает ссылку на росчитанный объект стиля CSSStyleDeclaration
	 */
	this.getStyle = function(el) {
		return (window.getComputedStyle ? getComputedStyle(el, null) : el.currentStyle);
	};
};













