Effect = {};

Effect.options =
{
	duration: .7, //seconds
	acceleration: 0, // -1 to 1
	repeatCount: 0,
	from: 0,
	to: 1,
	startRGB: [0,0,0],
	endRBG: [255,255,0],
	callback: null,
	play: true
}

//Effect.fade = function(element, duration, accel, startOpac, endOpac, callback, dontPlay)
Effect.fade = function(element, options)
{
	element = $(element);
	options = Object.extend(Object.extend({},Effect.options), options || {});
	
	var anim = new Animation(new Math.Curves.Line([options.from],[options.to]), options.duration, options.acceleration);
	
	anim.onAnimate.subscribe(function(e) 
	{
		Element.setStyle(element, { opacity: e.x });
	});
	
	if (options.callback)
	{
		anim.onEnd.subscribe(function(e) 
		{
			options.callback(element, anim);
		});
	}
	
	if (options.play) { anim.play(true); }
	return anim;
}

//Effect.slide = function(element, duration, accel, startCoords, endCoords, callback, dontPlay)
Effect.slide = function(element, options)
{
	element = $(element);
	options = Object.extend(Object.extend({},Effect.options), options || {});
	
	Element.makePositioned(element);
	
	var anim = new Animation(new Math.Curves.Line(options.from, options.to), 
		options.duration, options.acceleration);
	
	anim.onAnimate.subscribe(function(e) 
	{
		//Logger.debug(e.x + " " + e.y);
		Element.setStyle(element, {left: e.x + 'px', top: e.y + 'px'});
	});
	
	if (options.callback)
	{
		anim.onEnd.subscribe(function(e) 
		{
			options.callback(element, anim);
		});
	}
	
	if (options.play) { anim.play(true); }
	return anim;
}

Effect.colorFade = function(element, options)
{
	element = $(element);
	options = Object.extend(Object.extend({},Effect.options), options || {});
	
	var anim = new Animation(new Math.Curves.Line(options.startRGB, options.endRGB),
		options.duration, options.acceleration);
	
	anim.onAnimate.subscribe(function(e)
	{
		Element.setStyle(element, { backgroundColor: "rgb(" + e.coordsAsInts().join(",") + ")" });
	});
	
	if (options.callback)
	{
		anim.onEnd.subscribe(function(e)
		{
			options.callback(element, anim);
		});
	}
}


//Element.setStyle = function(element, styles) {
//  element = $(element);
//  for(k in style) element.style[k.camelize()] = style[k];
//}

//Element.getOpacity = function(element){  
//  var opacity;
//  if (opacity = Element.getStyle(element, 'opacity'))  
//    return parseFloat(opacity);  
//  if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))  
//    if(opacity[1]) return parseFloat(opacity[1]) / 100;  
//  return 1.0;  
//}

//Element.setOpacity = function(element, value){
//  if (!value) { value = 0; }
//  element= $(element);
//  if (value > 1){
//  	value /= 100;
//	//Logger.debug(value);
//  }
//  if (value == 1){
//    Element.setStyle(element, { opacity: 
//      (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 
//      0.999999 : null });
//    if(/MSIE/.test(navigator.userAgent))  
//      Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});  
//  } else {  
//    if(value < 0.00001) value = 0;  
//    Element.setStyle(element, {opacity: value});
//    if(/MSIE/.test(navigator.userAgent))  
//     Element.setStyle(element, 
//       { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
//                 'alpha(opacity='+value*100+')' });  
//  }   
//}

Object.extend(String.prototype,
{
	hyphenize: function()
	{
		var converted = '';
		for (var i=0, len=this.length; i<len; ++i) 
		{
			if (this.charAt(i) == this.charAt(i).toUpperCase()) 
			{
				converted = converted + '-' + this.charAt(i).toLowerCase();
			} 
			else 
			{
				converted = converted + this.charAt(i);
			}
		}
		return converted;
	}
});

Object.extend(Element,
{
	setStyle: function(element, styles)
	{
		element = $(element);
		for (property in styles)
		{
			property = property.camelize();
			value = styles[property];
			switch (property)
			{
				case "opacity":
					value = (value >= 1) ? 0.999999 : (value < 0.00001) ? 0 : value;
					//if (element.filters)
					if (/MSIE/.test(navigator.userAgent))
					{
						element.style.filter = "alpha(opacity=" + value * 100 + ")";
						
						//if (!element.currentStyle.hasLayout)
						//{
							//element.style.zoom = 1;
						//}
					}
					else
					{
						element.style.opacity = value;
						element.style["-moz-opacity"] = value;
						element.style["khtml-opacity"] = value;
					}
					break;
				default:
					element.style[property] = value;
			}
		}
		//for (k in styles)
		//{
		//	var value    = styles[k];
		//	var property = k.camelize();
		//}
	},

	getStyle: function(element, property)
	{
		var value = null;
		var dv = document.defaultView;
		element = $(element);
		property = property.camelize();
		
		if (property == "opacity" && element.filters)
		{
			value = 1;
			try
			{
				value = el.filters.item("DXImageTransform.Microsoft.Alpha").opacity/100;
			}
			catch(e)
			{
				try
				{
					value = element.filters.item("alpha").opacity/100;
				}
				catch(e)
				{}
			}
		}
		else if (element.style[property])
		{
			value = element.style[property];
		}
		else if (element.currentStyle && element.currentStyle[property])
		{
			value = element.currentStyle[property];
		}
		else if (dv && dv.getComputedStyle)
		{
			property = property.hyphenize();
			if (dv.getComputedStyle(element, "").getPropertyValue(property))
			{
				value = dv.getComputedStyle(element, "").getPropertyValue(property);
			}
		}
		
		return value;
	}
});