
var scroller;

$(init);

function init () {
	
	scroller = new SmoothScroll();
}


/* SmoothScroll */
function SmoothScroll () {
	//fac.log("SmoothScroll(" + [] + ")");
	
	$('a[href^=#], area[href^=#]').click(this.scroll);
	$(document).mousewheel(this.onMouseWheel);
}

SmoothScroll.prototype = {

	scroll : function () {
		//fac.log("SmoothScroll.scroll(" + [] + ")");
		
		if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
			var $target = $(this.hash);
			$target = $target.length && $target || $('[name=' + this.hash.slice(1) +']');
			if ($target.length) {
				var position = $target.offset().top;
				this.scrollTo(position);
				return false;
			}
		}
		
	}, 

	scrollTo : function (value) {
		//fac.log("SmoothScroll.scrollTo(" + [value] + ")");
		
		var scrollLeft = $('html, body').scrollLeft();
		$($.browser.opera ? document.compatMode == 'BackCompat' ? 'body' : 'html' : 'html,body')
			.stop()
			.animate({scrollLeft:scrollLeft, scrollTop:value}, 800, "easeOutQuart");
	}, 
	
	onMouseWheel : function () {
		//fac.log("SmoothScroll.onMouseWheel(" + [] + ")");
		
		$($.browser.opera ? document.compatMode == 'BackCompat' ? 'body' : 'html' : 'html,body')
			.stop();
	}
	
}

if (typeof(fac) == "undefined") fac = function() {};

/* delegate */
fac.delegate = function (this_object, method) {
	//fac.log("delegate" + [this_object, method] + ")");
	
	return function () { return method.apply(this_object, arguments); }
};

fac.delegateWithArgs = function  (this_object, method, args, join_args) {
	//fac.log("fac.delegateWithArgs(" + [this_object, method, args, join_args] + ")");
	
	return function () {
		if (join_args) {
			var joined_args = new Array();
			var i;
			var length = arguments.length;
			for (i = 0; i < length; i++) {
				joined_args.push(arguments[i]);
			};
			joined_args = joined_args.concat(args);
			return method.apply(this_object, joined_args);
		}
		else {
			return method.apply(this_object, args);
		};
	};
};


/* Log */
fac.log = function (args) {
	//console.log.apply(this, arguments);
	
	if ($("#console_log").length == 0) {
		$("body").append('<div id="console_log" style="width:200px; height:30em; position:fixed; _position:absolute; z-index:10000; left:0; top:0; background:#fff; border:1px solid #000; color:#000; text-align:left; overflow-y:auto;">::Log::</div>'); 
	};
	
	$("#console_log").append('<div>' + String(args) + '</div>');
	
	$("#console_log").scrollTop = $("#console_log").scrollHeight;
};


