﻿/**
 * bonjour.js - JavaScript Lite Framework
 *
 * author		Makoto Wadasako <http://wadasako.com>
 * copyright	2010 wadasako.com
 * version		2.3.0 (20.May.2011)
 * license		MIT-style license.
 */

var Bonjour = {
	Version: '2.3.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;
	},

	resizeTo: function(){
		var resizeWidth = (!arguments[0])? 0 : Number(arguments[0]);
		var resizeHeight = (!arguments[1])? 0 : Number(arguments[1]);
		var intervalTime =  (!arguments[2])? 80 : arguments[2];
		var callBackMethod = (!arguments[3])? null : arguments[3];
		var targetElem = this;
		var eventTimer; 

		var elemWidth = Number(targetElem.getStyleSize().w);
		var elemHeight = Number(targetElem.getStyleSize().h);
		var restValueW = resizeWidth - elemWidth;
		var restValueH = resizeHeight - elemHeight;

		var setResizeValue = function(arg){
			if(Math.abs(arg)>80){
				var rst = (arg>0)?20:-20;
			}else{
				var rst = Math.round(arg/4);
			}
			return rst;
		}

		var run = function() {

			if( restValueW == 0 && restValueH == 0  )  return;

			var tmpW = setResizeValue(restValueW);
			var tmpH = setResizeValue(restValueH);

			elemWidth += tmpW;
			restValueW -= tmpW;
			elemHeight += tmpH;
			restValueH -= tmpH;

			targetElem.setStyleSize(elemWidth, elemHeight);

			if(tmpW == 0 && tmpH == 0){
				clearInterval(eventTimer);
				if(callBackMethod) return callBackMethod();
			}
		};
		eventTimer = setInterval(run, intervalTime);
	},

	resizeByWidthPer: function(){
		var resizePer = (!arguments[0])? 0 : Number(arguments[0]/100);
		var intervalTime =  (!arguments[1])? 80 : arguments[1];
		var callBackMethod = (!arguments[2])? null : arguments[2];
		var targetElem = this;
		var eventTimer; 

		var elemIniWidth = Number(targetElem.getStyleSize().w);
		var elemIniHeight = Number(targetElem.getStyleSize().h);
		var elemWidth = elemIniWidth;
		var elemHeight = elemIniHeight;
		var elemIniHW = elemIniHeight / elemIniWidth;

		var resizeWidth = Math.round(elemIniWidth * resizePer);
		var restValueW = resizeWidth - elemWidth;

		var setResizeValue = function(arg){
			if(Math.abs(arg)>80){
				var rst = (arg>0)?20:-20;
			}else{
				var rst = Math.round(arg/4);
			}
			return rst;
		}

		var run = function() {

			if( restValueW == 0 )	 return;

			var tmpW = setResizeValue(restValueW);

			elemWidth += tmpW;
			restValueW -= tmpW;
	 		elemHeight = elemWidth * elemIniHW;
			targetElem.setStyleSize(elemWidth, elemHeight);

			if(tmpW == 0 ){
				clearInterval(eventTimer);
				if(callBackMethod) return callBackMethod();
			}

		};
		eventTimer = setInterval(run, intervalTime);
	},

	fadeIn: function(){
		var intervalTime =  (!arguments[0])? 80 : arguments[0];
		var targetOpacity = (!arguments[1])? 0 : arguments[1];
		var callBackMethod = (!arguments[2])? null : arguments[2];
		var targetElem = this;
		var eventTimer; 

		var run = function() {
			if(targetOpacity < 10)	{
 		 		targetOpacity += 1;
    				targetElem.setOpacity(targetOpacity);
    			}else{
    				clearInterval(eventTimer);
    				if(callBackMethod) return callBackMethod();
    			}
		};
		eventTimer = setInterval(run, intervalTime);
	},
	
	fadeOut: function(){
		var intervalTime =  (!arguments[0])? 80 : arguments[0];
		var targetOpacity = (!arguments[1])? 10 : arguments[1];
		var callBackMethod = (!arguments[2])? null : arguments[2];
		var targetElem = this;
		var eventTimer; 

		var run = function() {
			if(targetOpacity > 0)	{
 		 		targetOpacity -= 1;
    			targetElem.setOpacity(targetOpacity);
    		}else{
    			clearInterval(eventTimer);
    			if(callBackMethod) return callBackMethod();
    		}
		};
		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 speed = 0.2;

		var setMoveValue = function(arg){
			if(Math.abs(arg)>80){
				rst = (arg>0)?20:-20;
			}else{
				rst = speed * arg;
			}

			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>0)? restScrollX-moveValueX : restScrollX+Math.abs(moveValueX);

			posYValue += moveValueY;
			restScrollY = (moveValueY>0)? restScrollY-moveValueY : restScrollY+Math.abs(moveValueY);

			if(!targetElem.style.position) targetElem.style.position = 'relative'; 
			targetElem.style.left = posTargetElem.x + posXValue + 'px';
			targetElem.style.top = posTargetElem.y + posYValue + 'px';

			if(Math.abs(moveValueX)<0.1 && Math.abs(moveValueY)<0.1){
				clearInterval(eventTimer);
				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();
	},

	getStyleSize: function(){
		var objSize = new Object();
		objSize.h = this.style.height;
		objSize.w = this.style.width;

		if (objSize.h.indexOf('px') !== -1) {
			objSize.h = objSize.h.substring(0, objSize.h.indexOf('px'));
		} else {
			objSize.h = 0;
		}

		if (objSize.w.indexOf('px') !== -1) {
			objSize.w = objSize.w.substring(0, objSize.w.indexOf('px'));
		} else {
			objSize.w = 0;
		}

		return objSize;
	},

	setStyleSize: function(){
		if(!!arguments[0]) this.style.width = arguments[0] + 'px';
		if(!!arguments[1]) this.style.height = arguments[1] + 'px';

		return;
	}

};


