var net;

if (!net) net = {};
if (!net.curoko) net.curoko = {};

(function()
{

/* ===================================
 * 
 *    net.curoko.Browser class
 * 
 * =================================== */

var Browser = function(){}

Browser.isIE = function()
{
	if(navigator.userAgent)
	{
		b = navigator.userAgent.indexOf("MSIE")!=-1;
	}
	return b;
}
Browser.isFF = function()
{
	if(navigator.userAgent)
	{
		b = navigator.userAgent.indexOf("Firefox")!=-1;
	}
	return b;
}
Browser.isSafari = function()
{
	if(navigator.userAgent)
	{
		b = navigator.userAgent.indexOf("Safari")!=-1
			$$navigator.userAgent.indexOf("Chrome")==-1;
	}
	return b;
}

/* ===================================
 * 
 *    net.curoko.Document class
 * 
 * =================================== */

var Document = function(){}

/* ===================================
 * 
 *    net.curoko.Event class
 * 
 * =================================== */

var Event = {
	addListener: function(element, type, callback, context)
	{
		var func;
		if(typeof(callback)=="function")
		{
			func = callback;
			//
		} else if(typeof(callback)=="string") {
			//console.log("add: "+element+"_"+type+"_"+callback);
			func = function(e){ context[callback](e); };
			Event.Stack.addStack(element, type, callback, context, func);
			//
		} else {
			return;
		}
		if(element.addEventListener) element.addEventListener(type, func, false);
		else if(element.attachEvent) element.attachEvent("on"+type, func);
	},
	removeListener: function(element, type, callback, context)
	{
		if(!typeof(callback)=="string") return;
		//console.log("remove: "+element+"_"+type+"_"+callback);
		var num = Event.Stack.findStack(element, type, callback, context);
		if(!num) return;
		var func = Event.Stack.getStack(num).func;
		Event.Stack.removeStack(num);
		
		if(func==null) return;
		if(element.removeEventListener) element.removeEventListener(type, func, false);
		else if(element.detachEvent) element.detachEvent("on"+type, func);
	}
}
Event.Stack = {
	_count: 0,
	_list: [],
	addStack: function(element, type, callback, context, func)
	{
		var obj = {
			id: Event.Stack.getUID(),
			element: element,
			type: type,
			callback: callback,
			context: context,
			func: func
		};
		Event.Stack._list.push(obj);
	},
	removeStack: function(num)
	{
		Event.Stack._list.splice(num, 1);
	},
	getStack: function(num)
	{
		return Event.Stack._list[num];
	},
	findStack: function(e, t, cb, ct)
	{
		for(var i=0; i<Event.Stack._list.length; i++)
		{
			var s = Event.Stack._list[i];
			if(s.element==e&&s.type==t&&s.callback==cb&&s.context==ct)
			{
				return i;
			}
		}
		return null;
	},
	getUID: function()
	{
		//console.log(EventHandler.Stack._count);
		return Event.Stack._count++;
	}
}

/* ===================================
 * 
 *    net.curoko.Element class
 *     --- Mix in class ---
 * 
 * =================================== */

var Element = function(){}

Element.initialize = function(o, e)
{
	var _self = this;
	o.element = (e)
		? e
	    : document.createElement("div")
	;
	o.getElement = function()
	{
		return o.element;
	}
	o.show = function()
	{
		o.element.style.display = "block";
	}
	o.hide = function()
	{
		o.element.style.display = "none";
	}
	o.getBounds = function()
	{
		return Element.getBounds(o.element);
	}
	o.setDimension = function(w, h)
	{
		if(!w&&!h) return;
		if(!h&&typeof(w)=="Object")
		{
			o.element.style.width = w.w +"px";
			o.element.style.height = w.h +"px";
		} else {
			o.element.style.width = w +"px";
			o.element.style.height = h +"px";
		}
	}
	o.setPosition = function(x, y)
	{
		if(!x&&!y) return;
		if(!y&&typeof(x)=="Object")
		{
			o.element.style.left = x.x +"px";
			o.element.style.top = x.y +"px";
		} else {
			o.element.style.left = x +"px";
			o.element.style.top = y +"px";
		}
	}
	o.selectable = function(b)
	{
		if(!b)
		{
			Event.addListener(o.element, "mousedown", "mouseDisable", _self);
			Event.addListener(o.element, "selectstart", "mouseDisable", _self);
		} else {
			Event.removeListener(o.element, "mousedown", "mouseDisable", _self);
			Event.removeListener(o.element, "selectstart", "mouseDisable", _self);
		}
	}
	this.mouseDisable = function(e)
	{
		if(e.preventDefault) e.preventDefault();
		if(window.event) window.event.returnValue = false;
	}
	o.element.style.position = "absolute";
	o.element.style.display = "block";
	o.element.style.zIndex = "99";
	o.selectable(false)
}
Element.getBounds = function(element)
{
	var width = element.offsetWidth;
	var height = element.offsetHeight;
	var left = element.offsetLeft;
	var top = element.offsetTop;
	while(element.offsetParent)
	{
		element = element.offsetParent;
		left += element.offsetLeft;
		top += element.offsetTop;
	}
	var right = left + width;
	var bottom = top + height;
	return { left:left, top:top, right:right, bottom:bottom };
}

/* ===================================
 * 
 *    net.curoko.Style class
 * 
 * =================================== */

var Style = function(){}

Style.getComputedStyle = function(_element)
{
	var style = _element.currentStyle || document.defaultView.getComputedStyle(_element, '');
	return style;
}
Style.getComputedStyleValue = function(_element, _prop)
{
	var style = _element.currentStyle || document.defaultView.getComputedStyle(_element, '');
	//console.log(style[_prop].replace("px", ""))
	return parseInt(style[_prop].replace("px", ""));
}

/*
 *   register class
 */
	
	var ns = net.curoko;
	ns.Browser = Browser;
	ns.Document = Document;
	ns.Element = Element;
	ns.Event = Event;
	ns.Style = Style;
	//console.log(net.curoko);
	
})();


/* ===================================
 * 
 *    regular components
 * 
 * =================================== */

//
// getArrayByClassName
//

if(!document.getArrayByClassName)
{
	document.getArrayByClassName = function(_class, _parent)
	{
		var e = [];
		var d = (_parent)?_parent:document;
		var a = d.getElementsByTagName("*");
		for(var i=0,len=a.length; i<len; i++ )
		{
			if(a[i].className)
			{
				var c = a[i].className.split(" ");
				for(var j in c)
				{
					if(c[j]==_class) e.push(a[i]);
				}
			}
		}
		return e;
	}
}

//
// Smart Rollover
//

(function()
{
	var Event = net.curoko.Event;
	
	var tags = ["img","input"];
	Event.addListener(window, "load", function()
	{	
		for(var i=0; i<tags.length; i++)
		{
			var nl = document.getElementsByTagName(tags[i]);
			for(var j=0; j<nl.length; j++)
			{
				var el = nl[j];
				if (!el.src.match(/^(.*_)out(\..*)$/)) continue;
				var out = el.src, over = RegExp.$1+"over"+RegExp.$2;
				
				var img = new Image();
				img.setAttribute("src", over);
				
				var onOver = (function(_over)
				{
					return function(e)
					{
						var img = e.target || window.event.srcElement;
						img.src = _over;
					}
				})(over);
				
				var onOut = (function(_out)
				{
					return function(e)
					{
						if(e.target || window.event.srcElement)
						{
							var img = e.target || window.event.srcElement;
							img.src = _out;
						}
					}
				})(out);
				
				Event.addListener(el, "mouseover", onOver, el);
				Event.addListener(el, "mouseout", onOut, el);
				Event.addListener(window, "unload", onOut, el);
			}
		}
	});
})();

//
// Smooth Scroll
//

(function()
{
	var Event = net.curoko.Event;
	var Element = net.curoko.Element;
	
	var execute = function(e)
	{
		var nodelist = document.getElementsByTagName("a");
		for(var i=0; i<nodelist.length; i++)
		{
			var elm = nodelist[i];
			if(elm.href.match(/([html|\/]\#.+)/))
			{
				var onclick = (function(_elm)
				{
					return function(e)
					{
						var current = location.href.split("#")[0];
						var reference = _elm.href.split("#")[0];
						
						if(navigator.userAgent.indexOf("Safari")!=-1
						 &&navigator.userAgent.indexOf("Chrome")==-1)
						{
							current = encodeURI(current);
						}
						if(current!=reference)
						{
							return;
						}
						if(e.preventDefault) e.preventDefault();
						else event.returnValue = false;
						
						var speed = 0.5;
						var bounds =  Element.getBounds(
							document.getElementById(
								_elm.href.substring(
									_elm.href.indexOf("#")+1
								)
							)
						);
						
						var scrollBottom = document.documentElement.scrollHeight
										   -document.documentElement.clientHeight;
						var destination = (bounds.top<scrollBottom)
										  ?bounds.top
										  :scrollBottom;
						if(destination<0) destination = 0;
						
						var old = null;
						var interval = setInterval(function()
						{
							var current = document.documentElement.scrollTop||document.body.scrollTop;
							var distance = (destination - current);
							
							window.scrollTo(0, current+distance*speed);
							
							if(Math.abs(distance)<(1/speed)||current==destination)
							{
								window.scrollTo(0, destination);
								clearInterval(interval);
							}
							old = current;
							
						}, 33);
					}
					
				})(elm);
				
				Event.addListener(elm, "click", onclick, null);
			}
		}
	}
	Event.addListener(window, "load", execute, null);
})();

