function createMethodReference(object, methodName){
	return function(){
		return object[methodName].apply(object, arguments);
	};
}

//Позиция элемента относительно страницы - вариант 1
function getPosition(elem){
	var left = 0;
	var top  = 0;
	while(elem.offsetParent){
		left += elem.offsetLeft;
		top  += elem.offsetTop;
		elem = elem.offsetParent;
	}
	
	left += elem.offsetLeft - (parseInt(elem.style.marginLeft) || 0);
	top  += elem.offsetTop - (parseInt(elem.style.marginTop) || 0);
	
	return {x: left, y: top}
}

//Позиция элемента относительно страницы - вариант 2
function getOffsetRect(elem){
	var box     = elem.getBoundingClientRect();
	var body    = document.body;
	var docElem = document.documentElement;
	
	var scrollTop  = window.pageYoffset || docElem.scrollTop || body.scrollTop;
	var scrollLeft = window.pageXoffset || docElem.scrollLeft || body.scrollLeft;
	var clientTop  = docElem.clientTop || body.clientTop || 0;
	var clientLeft = docElem.clientLeft || body.clientLeft || 0;
	
	var top  = box.top + scrollTop - clientTop - (parseInt(elem.style.marginLeft) || 0);
	var left = box.left + scrollLeft - clientLeft - (parseInt(elem.style.marginTop) || 0);
	
	return {x: Math.round(left), y: Math.round(top)}
}

//Позиция элемента относительно страницы - комбинированный вариант
function getOffset(elem){
	if(elem.getBoundingClientRect){
		return getOffsetRect(elem);
	}else{
		return getPosition(elem);
	}
}

//Позиция курсора мыши относительно страницы
function mouseShowHandler(e){
	e = e||window.event;
	if(e.pageX==null && e.clientX != null){
		var html = document.documentElement;
		var body = document.body;
		e.pageX = e.clientX + (html&&html.scrollLeft||body&&body.scrollLeft||0) - (html.clientLeft||0);
		e.pageY = e.clientY + (html&&html.scrollTop||body&&body.scrollTop||0) - (html.clientTop||0);
	}
	return {x: e.pageX, y: e.pageY};
}

function fixEvent(event){
	event = event||window.event;
	if(event.isFixed){
		return event;
	}
	event.isFixed = true;
	event.preventDefault = event.preventDefault||function(){ event.returnValue = false;}
	event.stopPropagation = event.stopPropagation||function(){ event.cancelBubble = true;}
	
	if(!event.target){
		event.target = event.srcElement;
	}
	
	if(!event.relatedTarget && event.fromElement){
		event.relatedTarget = (event.fromElement == event.target)?event.toElement:event.fromElement;
	}

	if(event.pageX==null && event.clientX != null){
		var ev = mouseShowHandler(event);
		event.pageX = ev.x;
		event.pageY = ev.y;
	}

	if(!event.which && event.button){
		event.which = (event.button&1 ? 1: (event.button&2? 3: (event.button&4? 2: 0)));
	}
	return event;
}


Event = (function(){
	var countFunction = 0;
	var stopEvent = false;
	
	function addEvent(elem, e, func){
		if(document.addEventListener){
			elem.addEventListener(e, func, false);
		}else{
			elem.attachEvent("on" + e, func);
		}
	}
	
	function commandHandler(e){
		masFunc = this.events[e.type];
		for(var i in masFunc){
			masFunc[i].call(this, e);
			if(stopEvent){
				e.stopPropagation();
				e.preventDefault();
				stopEvent = false;
				return false;
			}

		}
	}
	
	return {
		add: function(elem, ev, func){
			if (elem.setInterval && ( elem != window && !elem.frameElement ) ) {
				elem = window;
			}
			
			elem = $(elem);
			if(!elem.events){
				elem.events = Object();
				elem.hendler = function(e){
					commandHandler.call(elem, fixEvent(e));
				}
			}
			if(!elem.events[ev]){
				elem.events[ev] = Array();
				addEvent(elem, ev, elem.hendler);
			}

			if(!func.numberEvent){
				countFunction++;
				func.numberEvent = countFunction;
			}
			elem.events[ev][func.numberEvent] = func;
		},
		remove: function(elem, ev, func){
			delete elem.events[ev][func.numberEvent];
		},
		dispatch: function(){
			if(elem.dispatchEvent){
				var e = document.createEvent("Event");
				e.initEvent(type, true, true);
				elem.dispatchEvent(e);
			}else{
				elem.fireEvent("on" + type);
			}
		},
		stop: function(){
			stopEvent = true;
		}
	}
}());

function $(elem){
	if(typeof(elem) == "string") if(document.getElementById(elem)) return document.getElementById(elem);
	if(typeof(elem) == "object") return elem;
	return null;
}

function Request(url, method, masfunc){
	this.url = url;
	this.method = method || "GET";
	this.masfunc = masfunc;
	this.countInteractive = 0;
	if(window.XMLHttpRequest){
        this.req = new XMLHttpRequest();
    }else if(window.ActiveXObject){
        try{
			this.req = new ActiveXObject("Msxml2.XMLHTTP");
		}catch(e){
			this.req = new ActiveXObject("Microsoft.XMLHTTP");
		}
    }
	
	this.req.onreadystatechange = createMethodReference(this, "processReqChange");
	this.req.open(method, url, true);
}

Request.prototype.processReqChange = function(){
	if(this.masfunc){
		if(this.time){
			this.countInteractive++;
			if(this.masfunc.onProcess) this.masfunc.onProcess.call(window, this.countInteractive);
		}
		this.countInteractive++;
		switch(this.req.readyState){
			case 2:
				if(this.masfunc.onInit) this.masfunc.onInit.call(window);
				break;
			case 3:
				this.countInteractive++;
				var procent = Math.round(this.countInteractive/(this.time + this.countInteractive)*100);
				if(this.masfunc.onProcess) this.masfunc.onProcess.call(window, procent, this.countInteractive);
				break;
			case 4: 
				if(this.req.status == 200){
					if(this.masfunc.onSuccess) this.masfunc.onSuccess.call(window, this.req.responseText, this.req.responseXML);
				}else{
					if(this.masfunc.onError) this.masfunc.onError.call(window, this.req.status);
				}
				clearInterval(this.timeInterval);
				break;
		}
	}
}

Request.prototype.send = function(param, time){
	//this.timeInterval = setInterval(createMethodReference(this, "processReqChange"), 10);
	this.time = time || 50;
	this.countInteractive = 0;
	if(param){
		if(this.method.toUpperCase() == "POST"){
			this.req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		}
		this.req.send(param);
	}else{
		if(window.XMLHttpRequest) {
			this.req.send();
		}else if(window.ActiveXObject){
			this.req.send(null);
		}
	}
}

var Scroll = (function(){
	var scrollLeft = 0;
	var scrollTop = 0;
	var setTop;
	var setLeft;
	var interval;
	var funcScrollEffectTop;
	var timeInterval = 15;
	var thistime = 0;
	var timeSlide;
	function slideInterval(){
		thistime += timeInterval;
		window.scrollTo(setLeft, funcScrollEffectTop.value(thistime));
		var top = funcScrollEffectTop.value(thistime);
		if((thistime >= timeSlide) || (top == setTop)){
			clearInterval(interval);
			window.scrollTo(setLeft, top);
		}
	}
	
	return {
		slide: function(left, top, time){
			if(time) timeSlide = time;
			else timeSlide = 1000;
			thistime = 0;
			setTop = top;
			setLeft = left;
			var html = document.documentElement;
			var body = document.body;
			scrollLeft = (html&&html.scrollLeft||body&&body.scrollLeft||0);
			scrollTop  = (html&&html.scrollTop||body&&body.scrollTop||0);
			
			var topCenter = (top > scrollTop)? scrollTop + (top - scrollTop)*0.8: top + (scrollTop - top)*0.8;
			funcScrollEffectTop = new MathFunc.square(0, scrollTop, 0.5*timeSlide, topCenter, timeSlide, top);
			clearInterval(interval);
			interval = setInterval(slideInterval, timeInterval);
		}
	}
}());

function getOpacity(div, op){
	with(div.style){
		if(op == 1) filter = '';
		else filter = 'alpha(opacity=' + (op*100) + ')';
		mozopacity   = op;
		khtmlopacity = op;
		opacity      = op;
	}
}

var MathFunc = function(){
	function sq2(x1, y1, x2, y2){ //Когда одна точка (0,0)
		var delta = x1*x1*x2 - x1*x2*x2;
		var deltaA = y1*x2 - y2*x1;
		var deltaB = y1*x2*x2 - y2*x1*x1;
		
		this.a = deltaA/delta;
		this.b = deltaB/delta;
	}
	
	sq2.prototype.value = function(value){
		return this.a*value*value + this.b*value;
	}
	
	function sq(x1, y1, x2, y2, x3, y3){
		var delta = x1*x1*x2 + x1*x3*x3 + x2*x2*x3 - x2*x3*x3 - x1*x1*x3 - x1*x2*x2;
		var deltaA = x2*y1 + x3*y2 + x1*y3 - x2*y3 - x3*y1 - x1*y2;
		var deltaB = x1*x1*y2 + x2*x2*y3 + x3*x3*y1 - x3*x3*y2 - x1*x1*y3 - x2*x2*y1;
		var deltaC = x1*x1*x2*y3 + x2*x2*x3*y1 + x3*x3*x1*y2 - x3*x3*x2*y1 - x1*x1*x3*y2 - x2*x2*x1*y3;
		
		this.a = deltaA/delta;
		this.b = deltaB/delta;
		this.c = deltaC/delta;
	}
	
	sq.prototype.value = function(value){
		return this.a*value*value + this.b*value + this.c;
	}
	
	return {
		square2: sq2,
		square: sq
	}
}();


var Process = function(){
	var inContent;
	var contentProcess;
	var process;
	var text;
	var time;
	var timePlus = 20;
	var thisTime = 0;
	var widthContent = 0;
	var proc;
	var timeI;
	function processSlide(){
		thisTime += timePlus;
		proc = Math.round(thisTime*100/(time + thisTime));
		if(!widthContent) widthContent = contentProcess.offsetWidth;
		else{
			setProcess(proc);
		}
	}
	
	function setProcess(proc){
		process.style.width = proc + "%";
		text.innerHTML = proc + "%";
		
		/*var html = document.documentElement;
		var body = document.body;
		inContent.style.top = (html.scrollTop||body.scrollTop||0) + "px";*/
	}
	
	function endProcess(){
		proc += 8;
		if(proc < 100){
			setProcess(proc);
		}else{
			setProcess(100);
			clearInterval(timeI);
			inContent.style.display = "none";
		}
	}
	
	return {
		set: function(inContent_I, contentProcess_I, process_I, text_I){
			/*<div id=inContent>
				<div id=contentProcess>
					<div id=process></div>
				</div>
			  </div>*/
			inContent      = $(inContent_I);
			contentProcess = $(contentProcess_I);
			process        = $(process_I);
			text           = $(text_I);
			inContent.style.display = "none";
		},
		timeStart: function(time_I){
			time = time_I;
			thisTime = 0;
			inContent.style.display = "block";
			clearInterval(timeI);
			timeI = setInterval(processSlide, timePlus);
		},
		end: function(){
			clearInterval(timeI);
			timeI = setInterval(endProcess, timePlus);
		}
	}
}();
