//Christopher M Sanchez 2005-2008
//Princeton University
//Department of Computer Science
//DHTML Library
// requires prototype 1.6.2
var csEffects = {
	resize: function (element, width, height)
	{	element = $ (element);
		element.setStyle ({'width':width, 'height':height});
		return element;
	},
	scaleTo: function (element, width, height, framecount, onreturn)
	{	this.interval = 0;
		element = $ (element);
		var wo = element.offsetWidth;//widthorigin
		var ho = element.offsetHeight;//heightorigin
		var wd = element.offsetWidth - width;//widthdirection
		var hd = element.offsetHeight - height;//heightdirection
		var count = 0;
		if (!framecount)
		{	var framecount = 1;
		}
		function scale ()
		{	count++;
			var w = wo + ((count * -wd) / framecount);
			var h = ho + ((count * -hd) / framecount)
			if (element.offsetHeight == height || count >= framecount)
			{	if (count >= framecount)
				{	clearInterval (element.intervals[this.interval]);
					element.intervals[this.interval] = null;
					element.resize (width, height);
					if (onreturn)
					{	this.onreturn ();
					}
					return element;
				}
				else element.resize (w, height);
			}else
			{	element.resize (w, h);
			}
		}
		this.scale = scale;
		if (onreturn)
		{	this.onreturn = onreturn;
		}
		if (element.intervals[this.interval])
		{	clearInterval (element.intervals[this.interval]);
		}
		element.intervals[this.interval] = setInterval (this.scale.bind (this), 15);
		return element;
	},
	move: function (element, left, top)
	{	element = $ (element);
		element.setStyle ({'left': left + 'px', 'top': top + 'px'});
		return element;
	},
	slideTo: function (element, left, top, framecount, onreturn)
	{	this.interval = 1;
		element = $ (element);
		element.relativize ();
		xo = element.positionedOffset ()[0];
		yo = element.positionedOffset ()[1];
		var xd = xo - left;//xdirection
		var yd = yo - top;//ydirection
		var count = 0;
		if (!framecount)
		{	var framecount = 1;
		}
		function slide ()
		{	count++;
			//(x1, y1) = (xorigin, yorigin) + k * (xdirection, ydirection)
			var x = xo + ((count * -xd) / framecount);
			var y = yo + ((count * -yd) / framecount);
			if (element.offsetLeft == left || count >= framecount)
			{	if (element.offsetTop != top)
				{	element.move (left, y);
				}
				if (count >= framecount)
				{	element.move (left, top);
				}
			}else
			{	element.move (x, y);
			}
			if (element.offsetLeft == left && element.offsetTop == top)
			{	clearInterval (element.intervals[this.interval]);
				element.intervals[this.interval] = null;
				if (onreturn)
				{	this.onreturn ();
				}
				return element;
			}
		}
		this.slide = slide;
		if (onreturn)
		{	this.onreturn = onreturn;
		}
		if (element.intervals[this.interval])
		{	clearInterval (element.intervals[this.interval]);
		}
		element.intervals[this.interval] = setInterval (this.slide.bind (this), 15);
		return element;
	},
	moveMargin: function (element, left, top, right, bottom)
	{	element = $ (element);
		if (undefined !== left) element.setStyle ({marginLeft: left});
		if (undefined !== top) element.setStyle ({marginTop: top});
		if (undefined !== right) element.setStyle ({marginRight: right});
		if (undefined !== bottom) element.setStyle ({marginBottom: bottom});
		return element;
	},
	slideMarginTo: function (element, left, top, framecount, onreturn)
	{	this.interval = 2;
		var interval = this.interval;
		element = $ (element);
		element.relativize ();
		xo = parseInt (element.getStyle ('margin-left'));
		yo = parseInt (element.getStyle ('margin-top'));
		var xd = xo - left;//xdirection
		var yd = yo - top;//ydirection
		var count = 0;
		if (!framecount)
		{	var framecount = 1;
		}
		function slideMargin ()
		{	count++;
			//(x1, y1) = (xorigin, yorigin) + k * (xdirection, ydirection)
			var x = xo + ((count * -xd) / framecount);
			var y = yo + ((count * -yd) / framecount);
			var marginLeft = parseInt (element.getStyle ('margin-left'));
			var marginTop = element.getStyle ('margin-top');
			if (count >= framecount || (marginLeft == left && marginTop == top))
			{	element.moveMargin (left, top);
				clearInterval (element.intervals[interval]);
				element.intervals[interval] = null;
				if (onreturn)
				{	this.onreturn ();
				}
				return element;
			}
			if (marginLeft == left)
			{	if (marginTop != top + 'px')
				{	element.moveMargin (left, y);
				}
			}else
			{	element.moveMargin (x, y);
			}
			
		}
		this.slideMargin = slideMargin;
		if (onreturn)
		{	this.onreturn = onreturn;
		}
		if (element.intervals[this.interval])
		{	clearInterval (element.intervals[this.interval]);
		}
		element.intervals[this.interval] = setInterval (this.slideMargin.bind (this), 15);
		return element;
	},
	setOpacityTo: function (element, nopacity, framecount, onreturn)
	{	this.interval = 3;
		element = $ (element);
		var count = 0;
		var oopacity = element.getStyle ('opacity');
		var d = oopacity - nopacity;
		if (!framecount)
		{	var framecount = 1;
		}
		function setOpacity ()
		{	count++;
			var opacity = oopacity + ((count * -d) / framecount);
			if (count >= framecount)
			{	element.setOpacity (nopacity);
			}else
			{	element.setOpacity (opacity);
			}
			if (element.getOpacity () == nopacity)
			{	clearInterval (element.intervals[this.interval]);
				element.intervals[this.interval] = null;
				if (onreturn)
				{	this.onreturn ();
				}
				return element;
			}
		}
		if (onreturn)
		{	this.onreturn = onreturn;
		}
		this.setOpacity = setOpacity;
		if (element.intervals[this.interval])
		{	clearInterval (element.intervals[this.interval]);
		}
		element.intervals[this.interval] = setInterval (this.setOpacity.bind (this), 15);
	},
	setColorTo: function (element, startcolor, endcolor, framecount, onreturn)
	{	this.interval = 4;
		//expected format for color variables  #123456
		element = $ (element);
		var sr, sg, sb, er, eg, eb;
		startcolor = getRGB (startcolor);
		endcolor = getRGB (endcolor);
		sr = startcolor[0];
		sg = startcolor[1];
		sb = startcolor[2];
		er = endcolor[0];
		eg = endcolor[1];
		eb = endcolor[2];
		mr = (er - sr) / framecount;
		mg = (eg - sg) / framecount;
		mb = (eb - sb) / framecount;
		var count = 0;
		var framecount = framecount || 1;
		function setColor ()
		{	count++;
			var r = Math.floor ((mr * count) + sr);
			var b = Math.floor ((mb * count) + sb);
			var g = Math.floor ((mg * count) + sg);
			if (count >= framecount)
			{	clearInterval (element.intervals[this.interval]);
				element.intervals[this.interval] = null;
				element.setStyle ({backgroundColor:'rgb(' + er + ',' + eg + ',' + eb +')'});
				if (onreturn)
				{	this.onreturn ();
				}
				return element;
			}else
			{	element.setStyle ({backgroundColor:'rgb(' + r + ',' + g + ',' + b +')'});
			}
		}
		if (onreturn)
		{	this.onreturn = onreturn;
		}
		this.setColor = setColor;
		if (element.intervals[this.interval])
		{	clearInterval (element.intervals[this.interval]);
		}
		element.intervals[this.interval] = setInterval (this.setColor.bind (this), 15);
		return element;
	},
	addToHistory: function (element)
	{	element = $ (element);
		if(dhtmlHistory)
		{	dhtmlHistory.add ('_' + element.id, {message: 'open'})
		}
	},
	init: function (element)
	{	element = $ (element);
		element.intervals = new Array ();
		element.o = new Array ();
		return element;
	}
};
//add methods from csEffects library
Element.addMethods (csEffects);

function getRGB (str)
{	var rgb = new Array ();
	if (typeof str != "string")
	{	alert ('Error: String expected')
		return 0;
	}
	if (str.match (/^transparent$/i))
	{	window.status = 'Error: function getRGB (str), str = transparent;';	
	}
	if (str.match (/^\#([A-Za-f0-9]){6}$/))	
	{	rgb[0] = parseInt (str.substring (1,3), 16);
		rgb[1] = parseInt (str.substring (3,5), 16);
		rgb[2] = parseInt (str.substring (5,7), 16);
	}else if (str.match (/^rgb/))//todo: fix regex
	{	rgb = str.replace (/\(|\)|[a-z]/gi, "").split (",");
	}
	return rgb;
}
function getXMLText (element)
{	if (typeof element.text == 'undefined')
	{	if (typeof element.textContent == 'undefined')
		{	if (typeof  element.innerText == 'undefined')
			{	element.text = null;
			}else
			{	element.text = element.innerText;
			}
		}else
		{	element.text = element.textContent;
		}
	}
	return element.text;
}
function getXMLElementById (elements, id)
{	for (var j = 0;j < elements.length ;j++ )
	{	if (elements[j].getAttribute ('id') == id)
		{	var element = elements[j];
		}
	}
	return element? element: null;
}
