﻿/*-------------------------------------------------------------------

  Browser detect

-------------------------------------------------------------------*/

function UserAgentDetection(){
	var ua = navigator.userAgent;
	this.ua = {};
	this.ua.isWin     = ua.match(/Win/);
	this.ua.isMac     = ua.match(/Mac/);
	this.ua.isGecko   = (ua.match(/Gecko\//) && ua.indexOf('KHTML') == -1);
	this.ua.isFirefox = (this.ua.isGecko && ua.match(/Firefox/))
	this.ua.isSafari  = ua.match(/AppleWebKit/);
	this.ua.isOpera   = window.opera;
	this.ua.isIE      = (document.all && !this.ua.isOpera);
	this.ua.ver       = navigator.appVersion;
	this.ua.majorver  = parseInt(navigator.appVersion);
;
}
var env = new UserAgentDetection();



/*-------------------------------------------------------------------

  Array

-------------------------------------------------------------------*/

if(!Array.prototype.pop) {
	Array.prototype.pop = function() {
		if(!this.length) {
			return null;
		}
		else {
			var last = this[this.length - 1];
			--this.length;
			return last;
		}
	}
}

if(!Array.prototype.push) {
	Array.prototype.push = function() {
		for (var i = 0, n = arguments.length; i < n; i++) {
			this[this.length] = arguments[i];
		}
		return this.length;
	}
}

if(!Array.prototype.shift) {
	Array.prototype.shift = function() {
		if(!this.length) {
			return null;
		}
		else {
			this.reverse();
			var ret = this.pop();
			this.reverse();
			return ret;
		}
	}
}

if(!Array.prototype.unshift) {
	Array.prototype.unshift = function() {
		this.reverse();
		for (var i = arguments.length - 1; i >= 0; i--) {
			this.push(arguments[i]);
		}
		this.reverse();
		return this.length;
	}
}


if( !Array.prototype.forEach ){
	Array.prototype.forEach = function( callback,thisObject ){
		for(var i=0,len=this.length;i<len;i++) {
			callback.call(thisObject,this[i],i,this);
		}
	}
}

if( !Array.prototype.shuffle ){
	Array.prototype.shuffle = function() {
		var i = this.length;
		while(i)
		{
			var j = Math.floor(Math.random()*i);
			var t = this[--i];
			this[i] = this[j];
			this[j] = t;
		}
		return this;
	}
}



/*-------------------------------------------------------------------

  Util

-------------------------------------------------------------------*/


function Util(){}

Util.prototype = {


	$: function(el){
		return typeof el == 'string' ? document.getElementById(el) : el;
	},

	getStyle: function(o,s){
		var res;
		try{
			if(document.defaultView && document.defaultView.getComputedStyle){
				res = document.defaultView.getComputedStyle(o, null).getPropertyValue(s);
			} else {
				if(o.currentStyle){
					var camelized = s.replace(/-([^-])/g, function(a,b){return b.toUpperCase()});
					res = o.currentStyle[camelized];
				}
			}
			return res;
		} catch(e){}
		return "";
	},

	setStyle: function( element, styles ){
		if(!element) return;
		for( var key in styles ){
			element.style[key] = styles[key];
		}
//		console.log(styles);
	},

	addClassName: function( el, className ){
		el = this.$(el);
		if( !this.hasClassName( el, className ) )
			el.className += ( el.className? " " : "" ) + className;
	},

	removeClassName: function(el, className){
		el = this.$(el);
		if(el.className == null) return;
		var newList = [];
		var curList = el.className.split(/\s+/);

		for(var i = 0; i < curList.length; i++)
			if(curList[i] != className)
				newList[newList.length] = curList[i];
				//newList.push(curList[i]);
		el.className = newList.join(" ");
	},

	hasClassName: function(el, className){
		el = this.$(el);
		if(!el.className) return false;
		return new RegExp("(^|\\s)" + className + "(\\s|$)" ).test( el.className );
	},

	foreach: function( array,callback ){
		var len = array.length;
		for(var i=0;i<len;i++){
			callback(array[i],i,array)
		}
	},

	// ret : '../..//common/'
	getCommonDirPath: function(){
		var dirName = arguments.length? arguments[0] : 'common';
		var links = document.getElementsByTagName('LINK');
		var reg = new RegExp( "(.*\/?" + dirName + "\/).+$" );
		if( links ){
			for( var i=0; i<links.length; i++ ){
				if( links[i].getAttribute("rel") && links[i].getAttribute("rel").indexOf("stylesheet") != -1 ) {
					if( links[i].href && links[i].href.match( reg ) )
						return RegExp.$1;
				}
			}
		}
		return '/'+ dirName +'/';
	},

	isContainerWith: function(el, tagName, className) {
		while (el != null)
		{
			if (el.tagName != null && el.tagName == tagName && u.hasClassName(el, className))
				return true;
			else
				el = el.parentNode;
		}
		return false;
	},

	getContainerWith: function(el, tagName, className) {
		while (el != null)
		{
			if (el.tagName != null && el.tagName == tagName && u.hasClassName(el, className))
				return el;
			else
				el = el.parentNode;
		}
		return el;
	}

}
var u = new Util();



/*-------------------------------------------------------------------

  Event

-------------------------------------------------------------------*/


var EventManager = {};

EventManager.list = [];

EventManager.removeEvent = function( obj, event, listener, useCapture ){
	//if(navigator.userAgent.match(/Mac/) && document.all && !this.env.isOpera ) return;
	useCapture = useCapture || false;
	if(obj.removeEventListener){
		obj.removeEventListener( event, listener, useCapture );
	} else if(obj.detachEvent){
		obj.detachEvent( "on"+event, listener );
	} else {
		//delete obj['on'+event];
	}
};

EventManager.addEvent = function( obj, event, listener, useCapture ){
	//EventManager.list.push(arguments);
	EventManager.list[EventManager.list.length] = arguments;
	useCapture = useCapture || false;
	if(obj.addEventListener){
		obj.addEventListener( event, listener, useCapture );
	} else if(obj.attachEvent){
		obj.attachEvent( "on"+event, listener );
	} else {
		var exists = obj['on'+event];
		obj['on'+event] = (exists)?
			function(){
				exists();
				listener();
			} : function() {
				listener();
			};
	}
};


EventManager.addLoadEvent = function( listener ){
	EventManager.addEvent( window, "load", listener, false );
};
/**/
EventManager.removeEventCache = function(){
	if(!EventManager.list) return;
	for( var i=0; i<EventManager.list.length; i++ ){
//		EventManager.removeEvent.apply( this, EventManager.list[i] );
		EventManager.removeEvent( EventManager.list[i][0], EventManager.list[i][1], EventManager.list[i][2], EventManager.list[i][3] );
	}
}


EventManager.addEvent(window, 'unload', EventManager.removeEventCache, false);



/*-------------------------------------------------------------------

  Rollover

-------------------------------------------------------------------*/


function RolloverImages( className, onSuffix, aSuffix ){
	if( !className ) return;
	this.targetClassName = className;
	this.onSuffix = onSuffix;
	this.aSuffix = aSuffix;
	this.buttons = [];
	this.init();
}


RolloverImages.prototype = {

	preloadImages : function(){
		var ret = [];
		for( var i=0; i<this.buttons.length; i++ ){
			(new Image()).src = this.buttons[i].onsrc;
			ret[ret.length] = this.buttons[i].onsrc;
			if(this.buttons[i].activesrc){
				(new Image()).src = this.buttons[i].activesrc;
				ret[ret.length] = this.buttons[i].activesrc;
			}
		}
	},


	swapImage : function( obj, status ){
		if( !obj || !obj[status+"src"] ) return;
		if( !obj.lock )
			obj.src = obj[status+"src"];
	},

	activate : function( el ){
		this.swapImage( el, 'active' );
		this.lock( el );
	},

	deactivate : function( el ){
		this.unlock( el );
		this.swapImage( el, 'off' );
	},

	lock : function( obj ){
		if( obj.lock == 'undefined' ) return;
		if(!obj.lock) obj.lock = true;
	},

	unlock : function( obj ){
		if( obj.lock == 'undefined' ) return;
		if( obj.lock ) obj.lock = false;
	},


	registButton : function( el ){
		var _this = this;
		var btn = new Object();
		btn.src = el.src;
		btn.filetype = btn.src.substring(btn.src.lastIndexOf('.'));
		btn.basename = btn.src.substring(0, btn.src.length-btn.filetype.length);
		btn.onsrc = btn.basename + this.onSuffix + btn.filetype;

		el.offsrc = btn.src;
		el.onsrc  = btn.onsrc;
		el.lock   = false;
		if( this.aSuffix ){
			btn.activesrc = btn.basename + this.aSuffix + btn.filetype;
			el.activesrc = btn.activesrc;
		}

		this.buttons.push( el );


		if( !this.aSuffix ){
			EventManager.addEvent( el, 'mouseover', function(){ _this.swapImage( el, 'on' ); }, false );
			EventManager.addEvent( el, 'mouseout',  function(){ _this.swapImage( el, 'off'); }, false );
		}
		else {
			EventManager.addEvent( el, 'mouseover', function(){ if(!el.lock) _this.swapImage( el, 'on' ); }, false );
			EventManager.addEvent( el, 'mouseout',  function(){ if(!el.lock) _this.swapImage( el, 'off'); }, false );
			EventManager.addEvent( el, 'mouseup', function(){
				u.foreach(_this.buttons, function(button){
					_this.deactivate(button);
				});
				_this.activate( el );
			}, false );
		}
	},


	init : function(){
		if(!document.getElementById && document.images) return;

		var _this = this;
		var imgs = [];
		var inputs = [];

		u.foreach( document.getElementsByTagName('IMG'), function(el){
			if(u.hasClassName( el, _this.targetClassName )) imgs.push(el);
		} );
		u.foreach( document.getElementsByTagName('INPUT'), function(el){
			if(u.hasClassName( el, _this.targetClassName )) inputs.push(el);
		} );

		var objs = imgs.concat(inputs);
		u.foreach( objs, function( obj ){ _this.registButton( obj ); } )

		this.preloadImages();
	}
}