﻿function llx_fx() {
	var This = this;

	//positioning
	this.setPUPos = function(element, x, y, relativeEl) {
		if (element == element + '') { element = document.getElementById(element) };
		if (relativeEl == relativeEl + '') { relativeEl = document.getElementById(relativeEl) };
		var left = This.getDEPosX(relativeEl) + x + 'px';
		var top = This.getDEPosY(relativeEl) + y + 'px';
		if (element.parentNode!=document.body)document.body.appendChild(element);
		if (element.style.positione != 'absolute') element.style.position = 'absolute';	
		element.style.left = left; 
		element.style.top = top; 
	}

	this.getDEPosX = function(element) { var o = element; var x = 0; while (o.offsetParent) { x += o.offsetLeft; o = o.offsetParent }; return x; }
	this.getDEPosY = function(element) { var o = element; var y = 0; while (o.offsetParent) { y += o.offsetTop; o = o.offsetParent }; return y; }

	//fading
	fadingElements = new Array()
	fadingOpacity = new Array()
	this.fadeIn = function(name, element, startOp, endOp, startInterval) {
		if (startOp == undefined) { startOp = 0 }
		if (endOp == undefined) { endOp = 100 }
		fadingElements[name] = element;
		if (fadingOpacity[name] == undefined) fadingOpacity[name] = startOp;
		function setOpacity() { if (fadingOpacity[name] >= endOp) { return true }; if (element.style.display != 'block') { element.style.display = 'block' }; if (element.filters) { element.filters.alpha.opacity = fadingOpacity[name] } else { element.style.opacity = fadingOpacity[name] / 100 }; fadingOpacity[name] += 5; if (fadingOpacity[name] < endOp) { This.addStep(name, setOpacity, 10); } else { } }
		This.setStep(name, setOpacity, startInterval);
	}
	this.fadeOut = function(name, element, startOp, endOp,startInterval) {
		if (startOp == undefined) { startOp = 0 }
		if (endOp == undefined) { endOp = 100 }
		fadingElements[name] = element;
		if (fadingOpacity[name] == undefined) fadingOpacity[name] = startOp;
		function setOpacity() { if (fadingOpacity[name] <= endOp) { return true }; if (element.style.display != 'block') { element.style.display = 'block' }; if (element.filters) { element.filters.alpha.opacity = fadingOpacity[name] } else { element.style.opacity = fadingOpacity[name] / 100 }; fadingOpacity[name] += -5; if (fadingOpacity[name] > endOp) { This.addStep(name, setOpacity, 10); } else { element.style.display = 'none' } }
		This.setStep(name, setOpacity, startInterval);
	}

	//steps
	this.steps = null
	this.setStep = function(name, method, interval) {
		if (This.steps == null) { This.steps = new Array(); };
		//if (This.steps[name] == undefined) { This.steps[name] = new fxSteps(); }
		This.steps[name] = new fxSteps();
		This.steps[name].addStep( method, interval)
	}
	this.addStep = function(name, method, interval) {
		if (This.steps == null) { This.steps = new Array(); };
		if (This.steps[name] == undefined) { This.steps[name] = new fxSteps(); }
		This.steps[name].addStep(method, interval)
	}
	this.reSet = function(name) {This.steps[name] = new fxSteps();}
	function fxSteps() {
		var methods = new Array();
		var intervals = new Array();

		this.addStep = function(method, interval) {
			methods.push(method);
			intervals.push(interval);
		}

		this.execute = function() {
			if (methods.length == 0) return true;
			intervals[0] += -10;
			if (intervals[0] <= 0) { try { methods[0](); } catch (e) { }; methods.splice(0, 1); intervals.splice(0,1)}
		}


	}

	//exec
	function exec() {
		for (name in This.steps) {
			This.steps[name].execute();
		}
	}
	this.executing = function(name) {
		if (This.steps[name] == undefined) return false;
		if (This.steps[name].steps.length == 0) return false;
		return true;
	}
	
	//init
	if (document.all) {
		window.attachEvent('onload', function() { setInterval(exec, 10); });
	} else { 
		window.addEventListener('load', function() { setInterval(exec, 10); }, true);
	}
	
	
}
