function SFEffectEngineObject()
{

}

SFEffectEngineObject.prototype.getElementsByAttribute = function (strAttributeName, strAttributeValue)
{
    var arrElements = document.getElementsByTagName('*');
    var arrReturnElements = new Array();
    var oAttributeValue = (typeof strAttributeValue != "undefined")? new RegExp("(^|\\s)" + strAttributeValue + "(\\s|$)") : null;
    var oCurrent;
    var oAttribute;
    for(var i=0; i<arrElements.length; i++){
        oCurrent = arrElements[i];
        oAttribute = oCurrent.getAttribute(strAttributeName);
        if(typeof oAttribute == "string" && oAttribute.length > 0){
            if(typeof strAttributeValue == "undefined" || (oAttributeValue && oAttributeValue.test(oAttribute))){
                arrReturnElements.push(oCurrent);
            }
        }
    }
    return arrReturnElements;
}

SFEffectEngineObject.prototype.findPosX = function(obj)
{
	var curleft = 0;
    if(obj.offsetParent)
    while(1) 
    {
    	curleft += obj.offsetLeft;
        if(!obj.offsetParent)
        	break;
        obj = obj.offsetParent;
    }
    else if(obj.x)
    	curleft += obj.x;
    return curleft;
}

SFEffectEngineObject.prototype.findPosY = function(obj)
{
	var curtop = 0;
	if(obj.offsetParent)
	while(1)
	{
		curtop += obj.offsetTop;
    	if(!obj.offsetParent)
            break;
        obj = obj.offsetParent;
    }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
}


  
SFEffectEngineObject.prototype.getPos = function(el) 
{
	return ({x: this.findPosX(el), y:this.findPosY(el)});
}

SFEffectEngineObject.prototype.addEvent = function(obj, e, func)
{
	if (typeof(func)!="undefined")
	{
		if (window.attachEvent)
			obj.attachEvent('on'+e, func);
		else
			obj.addEventListener(e, func, false);	
	}
}

SFEffectEngineObject.prototype.getPeriod = function(mode)
{
	var s = mode.split(':');
	for (var i=0; i<s.length; i++)
	{
		if ((s[i]=="periodic" || s[i]=="timeout") && s[i+1] && s[i+1]==parseInt(s[i+1]))
			return s[i+1];	
	}
	return null;
}

SFEffectEngineObject.prototype.addEffect = function(obj, mode, func)
{
	if (mode=="load")
		func(obj);
	else if (mode.indexOf('periodic')>-1 || mode.indexOf('timeout')>-1)
	{
		var theObj = function()
		{
			this.func = function(){ };
			this.obj = null;
			var me = this;
			this.run = function()
			{	
				me.func(me.obj);	
			}
		}
		var theFunc = new theObj();
		theFunc.obj = obj;
		theFunc.func = func;
		if (mode.indexOf('periodic')>-1)
			setInterval(theFunc.run,this.getPeriod(mode));
		else setTimeout(theFunc.run, this.getPeriod(mode));
	}	
	else 
	{
		this.addEvent(obj,mode,function()
		{
			if (window.event)
				func(window.event.srcElement);
			else 
			{
				func(this);
			}
		});
	}	
}

SFEffectEngineObject.prototype.execute = function()
{
	var L = sfEffectEngine.getElementsByAttribute('kye_object','*');
	if (!window.kye_objectsArr)
		window.kye_objectsArr = new Array();
	for (var i=0; i<L.length; i++)
	{
		var objectName = L[i].getAttribute('kye_object');
		if (!window.kye_objectsArr[objectName])
			eval('window.kye_objectsArr["'+objectName+'"] = new '+objectName+'();');
		var f = eval('window.kye_objectsArr["'+objectName+'"].applyEffect');
		var mode = eval(L[i].getAttribute('kye_object')).startupMode;
		if (!mode) mode='load';
		sfEffectEngine.addEffect(L[i], mode, f);
	}
}

var sfEffectEngine = new SFEffectEngineObject();
sfEffectEngine.addEvent(window, 'load', sfEffectEngine.execute);