/**************************************************************
* SA Team, megazone
* sateam.co.kr
* Bathory(이길환)
* mini version 0.1
***************************************************************/
if (typeof(SA) != "object" || SA == null) SA = {};
SA = {
	addEvent: function(element, type, callback) {
		var eventListener = function(element, event) {
			element.addEventListener(event, function(e) {
				var obj = e.relatedTarget;
				while (obj != element) {
					if (!obj) return callback.apply(this);
					obj = obj.parentNode;
				}
				return false;
			}, false);
		};

		if (element.addEventListener) {
			switch(type) {
				case 'mouseleave': eventListener(element, 'mouseout');
					break;
				case 'mouseenter': eventListener(element, 'mouseover');
					break;
				default : element.addEventListener(type, callback, false);
					break;
			}
		} else if (element.attachEvent) {
			element.attachEvent('on' + type, function() {
				callback.apply(element);
			});
		}
	},
	classNames: function(classname, methods, parents) {
		var element = parents || document, elements = [];

		if (!document.getElementsByClassName) {
			var nodes = methods ? element.getElementsByTagName(methods.toLowerCase()) : element.getElementsByTagName('*');
			for(var i=0; i<nodes.length; i++) {
				var elementClassName = nodes[i].className;
				if (elementClassName.length > 0 && (elementClassName == classname || new RegExp("(^|\\s)" + classname + "(\\s|$)").test(elementClassName))) {
					elements.push(nodes[i]);
				}
			}
		} else {
			var nodes = element.getElementsByClassName(classname);
			for(var i=0; i<nodes.length; i++) {
				if (!methods) elements.push(nodes[i]);
				else {
					if (nodes[i].tagName.toLowerCase() == methods.toLowerCase()) elements.push(nodes[i]);
				}
			}
		}
		return elements;
	},
	addClass: function(element, classname) {
		element.className += (element.className ? ' ' : '') + classname;
	},
	removeClass: function(element, classname) {
		element.className = element.className.replace(new RegExp("(^|\\s+)" + classname + "(\\s+|$)"), '');
	},
	hasClassName: function(element, classname) {
		var elementClassName = element.className;
		return (elementClassName.length > 0 && (elementClassName == classname || new RegExp("(^|\\s)" + classname + "(\\s|$)").test(elementClassName)));
	},
	setStyle: function(element, data) {
		for (prop in data) {
			if (document.all && prop == 'opacity') element.style.filter = 'alpha(opacity=' + parseFloat(data[prop] * 100) + ')';
			else if (!document.all && prop == 'opacity') element.style[prop] = data[prop];
			else element.style[prop] = data[prop];
		}
	},
	animate: function(element, params) {
		var index = 0, endIndex = 0;
		if (!params.speed) var speed = 1500;
		else var speed = params.speed;
		speed = speed / 100;
		var objEasing = params.easing ? SA.Easing[params.easing] : linear = function(t, b, c, d) { return c*t/d + b; };

		var startEvent = function(prop, end) {
			var scroll = {time:1, start:0, change:0, duration:speed};
			var originalTime = scroll.time;
			var objTimer = null;
			var start = parseFloat(element.style[prop]);

			if (objTimer != null) {
				clearInterval(objTimer);
				objTimer = null;
			}

			if (isNaN(start)) {
				switch(prop) {
					case 'opacity': start = 0;
						break;
					case 'width': start = element.offsetWidth;
						break;
					case 'height': start = element.offsetHeight;
						break;
					default: start = parseFloat(element.style[prop]) || 0;
				}
			}

			scroll.start = start;
			scroll.change = end - start;

			objTimer = setInterval(function() {
				if (scroll.time > scroll.duration) {
					clearInterval(objTimer);
					scroll.time = originalTime;
					objTimer = null;
					endIndex++;

					if (index == endIndex && params.callback) params.callback.apply(element);
				} else {
					var propData = objEasing(scroll.time, scroll.start, scroll.change, scroll.duration);

					if (prop == 'opacity' && document.all) element.style.filter = 'alpha(opacity=' + parseFloat(propData * 100) + ')';
					else if (prop == 'opacity' && !document.all) element.style[prop] = propData;
					else element.style[prop] = propData + 'px';

					if (params.callFn) params.callFn.apply(element, [propData]);

					scroll.time++;
				}
			}, 15);
		};

		for (prop in params.effects) {
			startEvent(prop, parseFloat(params.effects[prop]));
			index++;
		}
	},
	offset: function () {
		var objRoot = null, currentObj = arguments[0], bLoop = !!arguments[1], data = { left:0, top:0, width:0, height:0 };

		data.width = currentObj.offsetWidth;
		data.height = currentObj.offsetHeight;

		switch (bLoop) {
			case true:
				while (!!currentObj && currentObj.nodeName.toLowerCase() != 'body') {
					data.top += currentObj.offsetTop;
					data.left += currentObj.offsetLeft;
					currentObj = currentObj.offsetParent;
				}
				break;
			case false:
				data.top = currentObj.offsetTop;
				data.left = currentObj.offsetLeft;
				break;
		}

		return data;
	}
};

if (typeof(Easing) != "object" || Easing == null) Easing = {};
SA.Easing = {
	/*bounce*/
	bounceIn: function(t, b, c, d) {
		return c - SA.Easing.bounceOut(d-t, 0, c, d) + b;
	},
	bounceOut: function(t, b, c, d) {
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
		} else {
			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
		}
	},
	bounceInOut: function(t, b, c, d) {
		if (t < d/2) return SA.Easing.bounceIn(t*2, 0, c, d) * .5 + b;
		else return SA.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b;
	},

	/*circ*/
	circIn: function(t, b, c, d) {
		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
	},
	circOut: function(t, b, c, d) {
		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
	},
	circInOut: function(t, b, c, d) {
		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
	},

	/*cubic*/
	cubicIn: function(t, b, c, d) {
		return c*(t/=d)*t*t + b;
	},
	cubicOut: function(t, b, c, d) {
		return c*((t=t/d-1)*t*t + 1) + b;
	},
	cubicInOut: function(t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t + b;
		return c/2*((t-=2)*t*t + 2) + b;
	},

	/*Expo*/
	expoIn: function(t, b, c, d) {
		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
	},
	expoOut: function(t, b, c, d) {
		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
	},
	expoInOut: function(t, b, c, d) {
		if (t==0) return b;
		if (t==d) return b+c;
		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
	},

	/*linear*/
	linear: function(t, b, c, d) {
		return c*t/d + b;
	},

	/*quad*/
	quadIn: function(t, b, c, d) {
		return c*(t/=d)*t + b;
	},
	quadOut: function(t, b, c, d) {
		return -c *(t/=d)*(t-2) + b;
	},
	quadInOut: function(t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t + b;
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},

	/*quart*/
	quartIn: function(t, b, c, d) {
		return c*(t/=d)*t*t*t + b;
	},
	quartOut: function(t, b, c, d) {
		return -c * ((t=t/d-1)*t*t*t - 1) + b;
	},
	quartInOut: function(t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
		return -c/2 * ((t-=2)*t*t*t - 2) + b;
	},

	/*quint*/
	quintIn: function(t, b, c, d) {
		return c*(t/=d)*t*t*t*t + b;
	},
	quintOut: function(t, b, c, d) {
		return c*((t=t/d-1)*t*t*t*t + 1) + b;
	},
	quintInOut: function(t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
		return c/2*((t-=2)*t*t*t*t + 2) + b;
	},

	/*sine*/
	sineIn: function(t, b, c, d) {
		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
	},
	sineOut: function(t, b, c, d) {
		return c * Math.sin(t/d * (Math.PI/2)) + b;
	},
	sineInOut: function(t, b, c, d) {
		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
	}
};

