﻿/**
 * bonjour.js - JavaScript Lite Framework
 *
 * author		Makoto Wadasako <wadasako@gmail.com>
 * copyright	2010 wadasako.com
 * version		2.0.0 (6.Apr.2010)
 * license		MIT-style license.
 */

var Bonjour = {
	Version: '2.0.0'
};

var Browser = {
	isOP: !!(navigator.userAgent.indexOf("Opera")>-1?1:0),
	isIE: !!(navigator.userAgent.indexOf("MSIE")>-1?1:0),
	isFF: !!(navigator.userAgent.indexOf("Firefox")>-1?1:0),
	isNS: !!(navigator.userAgent.indexOf("Netscape")>-1?1:0),
	isSaf: !!(navigator.userAgent.indexOf("Safari")>-1?1:0)
};

/* ElementExtensions */
function $_id() {
	if (arguments.length == 0) return false; 
	var element;
	element = arguments[0];
	if (typeof element == 'string'){
		element = document.getElementById(element);
	}
	return Element.extend(element);
}


function $_class(){
	if (arguments.length == 0) return false;

	var results = [], node, elements;
	node = (arguments[0]=='' || arguments[0]==null)? window.document: arguments[0];
	elements = node.getElementsByTagName("*");
	for(var i=0; i<elements.length; i++){
		if(elements[i].className==arguments[1]){
			results.push(Element.extend(elements[i]));
		}
	}
	return results;
}

function $_extend() {
	if (arguments.length == 0) return false; 
	var element;
	element = arguments[0];

	return Element.extend(element);
}

if (!window.Element)
	var Element = new Object();

Element.extend = function(element) {
	if (!element) return;

	if (!element._extended && element.tagName && element != window) {
		var methods = Element.Methods;
		for (property in methods) {
			var value = methods[property];
			if (typeof value == 'function')
				element[property] = methods[property];
		}
	}

	element._extended = true;
	return element;
}

Element.Methods = {
	visible: function() {
		return this.style.display != 'none';
	},

	toggle: function() {
		this[this.visible()? 'hide' : 'show']();
	},

	hide: function() {
		this.style.display = 'none';
	},

	show: function() {
		this.style.display = '';
	},

	setOpacity: function(opacity) {
		this.style.filter = 'alpha(opacity=' + (opacity * 10) + ')';	//IE(0-100)
		this.style.MozOpacity = opacity / 10;	//FF(0-1.0)
		this.style.opacity = opacity / 10;	//Safari(0-1.0)
	},

	getOpacity: function() {
		return this.filters['alpha'].opacity || this.style.MozOpacity || this.style.opacity;
	},

	getPosition: function (){
		var objPos = new Object();
		objPos.x = this.offsetLeft;
		objPos.y = this.offsetTop;
		var offsetElement = this.offsetParent;

		while(offsetElement){
			if (offsetElement.tagName.toUpperCase() == 'BODY') break;
			var p = offsetElement.style.position;
			if (p !== 'static') break;
			objPos.x += offsetElement.offsetLeft;
			objPos.y += offsetElement.offsetTop;
			offsetElement = offsetElement.offsetParent;
		}
		return objPos;
	},

	getScrollPosition: function() {
		var objScPos = new Object();
		objScPos.x = document.body.scrollLeft || document.documentElement.scrollLeft;
		objScPos.y = document.body.scrollTop || document.documentElement.scrollTop;
		return objScPos;
	},

	addListener: function(eventType, funcRef, flg) {
		if(this.addEventListener) {
			this.addEventListener(eventType, funcRef, flg);
		} else if(this.attachEvent) {
			this.attachEvent('on' + eventType, funcRef);
		} else {
			return false;
		}
		return true;
	},

	fadeIn: function(){
		var intervalTime =  (!arguments[0])? 80 : arguments[0];
		var targetOpacity = (!arguments[1])? 0 : arguments[1];
		var targetElem = this;
		var eventTimer; 

		var run = function() {
			if(targetOpacity < 10)	{
 		 		targetOpacity += 1;
    			targetElem.setOpacity(targetOpacity);
    		}else{
    			clearInterval(eventTimer);
    		}
		};
		eventTimer = setInterval(run, intervalTime);
	},
	
	fadeOut: function(){
		var intervalTime =  (!arguments[0])? 80 : arguments[0];
		var targetOpacity = (!arguments[1])? 10 : arguments[1];
		var targetElem = this;
		var eventTimer; 

		var run = function() {
			if(targetOpacity > 0)	{
 		 		targetOpacity -= 1;
    			targetElem.setOpacity(targetOpacity);
    		}else{
    			clearInterval(eventTimer);
    		}
		};
		eventTimer = setInterval(run, intervalTime);
	},

	moveTo: function(){
		var targetElem = this;
		var eventTimer;
		var restScrollX= (!arguments[0])? 0 : arguments[0];
		var restScrollY= (!arguments[1])? 0 : arguments[1];
		var intervalTime =  (!arguments[2])? 80 : arguments[2];
		var callBackMethod = (!arguments[3])? null : arguments[3];
		var posTargetElem = targetElem.getPosition();
		var posXValue = 0;
		var posYValue = 0;

		var setMoveValue = function(arg){
			if(Math.abs(arg)>80){
				rst = (arg>0)?20:-20;
			}else{
				rst = Math.round(arg/4);
			}
			return rst;
		}

		var setMove = function(){

			if(restScrollX==0 && restScrollY==0) return;

			var moveValueX = 0;
			var moveValueY = 0;

			moveValueX = setMoveValue(restScrollX);
			moveValueY = setMoveValue(restScrollY);

			posXValue += moveValueX;
			restScrollX -= moveValueX;
			posYValue += moveValueY;
			restScrollY -= moveValueY;
			
			if(!targetElem.style.position) targetElem.style.position = 'relative'; 
			targetElem.style.left = posTargetElem.x + posXValue + 'px';
			targetElem.style.top = posTargetElem.y + posYValue + 'px';

			if(moveValueX==0 && moveValueY==0){
				clearInterval(eventTimer);
				restScrollX=0;
				restScrollY=0;
				posXValue = 0;
				posYValue = 0;
				if(callBackMethod) return callBackMethod();
			}
		};

		eventTimer = setInterval(setMove,intervalTime);
	},

	scrollToTop: function(){
		var targetElem =this;
		var intervalTime =  (!arguments[0])? 35 : arguments[0];

		var setScroll = function(){
			var pos = targetElem.getScrollPosition();
			window.scrollTo(Math.max(Math.floor(pos.x / 2),0), Math.max(Math.floor(pos.y - (pos.y / 5)),0));
			if (pos.x > 0 || pos.y > 0) {
				window.setTimeout(setScroll, intervalTime);
				return false;
			}
		}

		setScroll();
	}

};


