﻿if (!Array.prototype.pop)
{
	Array.prototype.pop = function()
	{
		if (!this.length) return null;
		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.indexOf)
{
	Array.prototype.indexOf = function(value,idx)
	{
		if (typeof(idx) != 'number') idx = 0;
		else if (idx < 0) idx = this.length + idx;
		for (var i=idx,n=this.length;i<n;i++)
			if (this[i] === value) return i;
		return -1;
	}
}
function Browser()
{
	this.name = navigator.userAgent;
	this.isWinIE = this.isMacIE = false;
	this.isGecko = this.name.match(/Gecko\//);
	this.isSafari = this.name.match(/AppleWebKit/);
	this.isKHTML = this.isSafari || navigator.appVersion.match(/Konqueror|KHTML/);
	this.isOpera = window.opera;
	this.hasNS = (document.documentElement) ? document.documentElement.namespaceURI : null;
	if (document.all && !this.isGecko && !this.isSafari && !this.isOpera)
	{
		this.isWinIE = this.name.match(/Win/);
		this.isMacIE = this.name.match(/Mac/);
	}
}
var Browser = new Browser();
if (!window.Event) var Event = new Object;
Event = {
	cache : false,
	getEvent : function(evnt)
	{
		return (evnt) ? evnt : ((window.event) ? window.event : null);
	},
	getKey : function(evnt)
	{
		evnt = this.getEvent(evnt);
		return (evnt.which) ? evnt.which : evnt.keyCode;
	},
	stop : function(evnt)
	{
		try{ evnt.stopPropagation() } catch(err){};
		evnt.cancelBubble = true;
		try{ evnt.preventDefault() } catch(err){};
		return (evnt.returnValue = false);
	},
	register : function(object, type, handler)
	{
		if (type == 'keypress' && (Browser.isKHTML || object.attachEvent)) type = 'keydown';
		if (type == 'mousewheel' && Browser.isGecko) type = 'DOMMouseScroll';
		if (!this.cache) this.cache = [];
		if (object.addEventListener)
		{
			this.cache.push([object,type,handler]);
			object.addEventListener(type, handler, false);
		}
		else if (object.attachEvent)
		{
			this.cache.push([object,type,handler]);
			object.attachEvent(['on',type].join(''),handler);
		}
		else
		{
			object[['on',type].join('')] = handler;
		}
	},
	deregister : function(object, type, handler)
	{
		if (type == 'keypress' && (Browser.isKHTML || object.attachEvent)) type = 'keydown';
		if (type == 'mousewheel' && Browser.isGecko) type = 'DOMMouseScroll';
		if (object.removeEventListener)
			object.removeEventListener(type, handler, false);
		else if (object.detachEvent)
			object.detachEvent(['on',type].join(''), handler);
		else
			object[['on',type].join('')] = null;
	},
	deregisterAll : function()
	{
		if (!Event.cache) return
		for (var i=0,n=Event.cache.length;i<n;i++)
		{
			Event.deregister(Event.cache[i]);
			Event.cache[i][0] = null;
		}
		Event.cache = false;
	}
};
Event.register(window, 'unload', Event.deregisterAll);
function ToolTip(option)
{
	var self = this;
	self._tt = new Array();
	self._timer = null;
	self._box  = null;
	self._caption = null;
	self._text = null;
	self.tt_musX = 0;
	self.tt_musY = 0;
	self.tt_w = 0;
	self.tt_h = 0;
	self.tt_wMax = 300;
	self.tt_scrlX = 0; 
	self.tt_scrlY = 0;
	self.tt_maxPosX = 0; 
	self.tt_maxPosY = 0;
	self._opacity = 0;
	self._duration = 50;
	self._offsetX = 15;
	self._offsetY = 15;
	self._hiding = [];
	self._first = false;
	self.tt_bJmpVert = true;
	self.ieOld = Browser.isWinIE && (!document.compatMode || document.compatMode == "BackCompat");
	self.tt_db = !self.ieOld ? document.documentElement : (document.body || null);
	self.tt_u = "undefined";
	self.tt_iState = 0;
	return self._init(option);
}
ToolTip.prototype = {
	_init : function(option)
	{
		var self = this;
		var d = document;
		if (!d.getElementsByTagName) return;
		if (Browser.isMacIE) return self;
		var links = d.getElementsByTagName("a");
		for (var i=0;i<links.length;i++)
		{
			var anchor = links[i];
			var num = self._tt.length;
			var rel = String(anchor.getAttribute("rel")).toLowerCase();
			if (!rel.match('tooltip')) continue;
			var txt = '';
			self._tt[num] = {
				w:-1,
				h:-1,
				title:'',
				text:'',
				id : ""
			};
			if ( anchor.firstChild 
			       && anchor.firstChild.getAttribute 
			       && anchor.firstChild.getAttribute("alt")
			       && anchor.firstChild.getAttribute("title")
			       && anchor.firstChild.getAttribute("id")){
			    var img = anchor.firstChild;
				self._tt[num].title = img.getAttribute("alt");
				self._tt[num].id = img.getAttribute("id");
				img.setAttribute("alt", '');
				Event.register(img,'mouseover',function(e) { self._show_action(e); });
				Event.register(img,'mouseout',function() { self._hide_action(); });
				Event.register(img,'mousemove',function(e) { self.tt_Move(e); });
				self._tt[num].text = img.getAttribute("title");
				anchor.firstChild.setAttribute("title", '');
			}
		}
		var body = d.getElementsByTagName("body")[0];
		if(Browser.isWinIE)
		{
			self.tt_db = !self.ieOld ? document.documentElement : (document.body || null);
		}
		else
		{
			self.tt_db = document.documentElement || document.body ||
					(document.getElementsByTagName ? body
					: null);
		}
		self._box  = self._createBoxOn(body, option);
		self._caption  = self._createBoxTitle(self._box, option);
		self._text  = self._createBoxText(self._box, option);
		self._setOpacyty();
		Event.register(window,'scroll',function() { self.tt_OnScrl(); });
		Event.register(window,'mousewheel',function() { self.tt_OnScrl(); });
		self.tt_OnScrl();
		return self;
	},
	_createBoxOn : function(obj, option)
	{
		var self = this;
		if (!obj) return null;
		var box = document.createElement('div');
		obj.appendChild(box);
		box.id = 'tooltip';
		box.style.display = 'none';
		box.style.position = 'absolute';
		box.style.top = 0;
		box.style.left = 0;
		box.style.zIndex = '5000';
		box.className = option.tooltipBox;
		return box;
	},
	_createBoxTitle : function(obj, option)
	{
		var self = this;
		if (!obj) return null;
		var caption = document.createElement('div');
		obj.appendChild(caption);
		caption.id = 'tooltipCaption';
		caption.className = option.tooltipTitle;
		return caption;
	},
	_createBoxText : function(obj, option)
	{
		var self = this;
		if (!obj) return null;
		var boxtext = document.createElement('div');
		boxtext.id = 'tooltipBody';
		boxtext.className = option.tooltipText;
		obj.appendChild(boxtext);
		return boxtext;
	},
	_show_action : function(e)
	{
		var self = this;
		if (self.tt_iState == 0)
		{
 			self.tt_Hide();
		}
		if(!self._box)return;
		if(!e.target)
			e.target = e.srcElement; 
		var _id = e.target.id;
		num = self._getIndex(_id);
		if (num == -1) return;
		self._show(num);
		self.tt_Fade();
	},
	_getIndex : function(el)
	{
		var self = this;
		for(i = 0; i < self._tt.length; i++)
		{
			if(self._tt[i].id == el)
				return i;
		}
		return -1;
	},
	_hide_action : function()
	{
		var self = this;
		if (self.tt_iState == 1)
		{
 			self.tt_Show();
		}
		if(!self._box)return;
		self.tt_iState = 0;
		self.tt_Fade();
		
	},
	_toggle_wrap : function(flag)
	{
		var self = this;
		if (self._hiding.length == 0 && !self._first)
		{
			var tags = ['select','embed','object'];
			for (var i=0,n=tags.length;i<n;i++)
			{
				var elem = document.getElementsByTagName(tags[i]);
				for (var j=0,m=elem.length;j<m;j++)
				{ 
					var check = elem[j].style.visibility;
					if (!check)
					{
						if (elem[j].currentStyle)
							check = elem[j].currentStyle['visibility'];
						else if (document.defaultView)
							check = document.defaultView.getComputedStyle(elem[j],'').getPropertyValue('visibility');
					}
					if (check == 'hidden') continue;
					self._hiding.push(elem[j]);
				}
			}
			self._first = true;
		}
		for (var i=0,n=self._hiding.length;i<n;i++)
			self._hiding[i].style.visibility = flag ? "hidden" : "visible";
	},
	_show : function(num)
	{
		var self = this;
		if (num < 0 || num >= self._tt.length) return;
		self._box.style.display = "block";
		self._box.style.width = "auto";
		//self._box.style.width = self.tt_wMax+"px";
		if(self._caption.firstChild)
			self._caption.removeChild(self._caption.firstChild);
		var capt = self._tt[num].title;
		if (capt != '')
		{
			self._caption.style.display = "block";
			self._caption.appendChild(document.createTextNode(capt));
		}
		else
		{
			self._caption.style.display = 'none';
		}
		if(self._text.firstChild)
			self._text.removeChild(self._text.firstChild);
		var txt = self._tt[num].text;
		if (txt != '')
		{
			self._box.style.display = "block";
			self._text.appendChild(document.createTextNode(txt));
		}
		else
		{
			self._text.style.display = 'none';
		}
		self.tt_w = self.tt_GetDivW(self._box);
		if (self.tt_w > self.tt_wMax)
		{
			self.tt_w = self.tt_wMax;
			self._box.style.width = self.tt_w + "px";
		}
		self.tt_h = self.tt_GetDivH(self._box);
		self.tt_maxPosX = self.tt_GetClientW() + self.tt_scrlX - self.tt_wMax - 1;
		self.tt_maxPosY = self.tt_GetClientH() + self.tt_scrlY - self.tt_h - 1;
		self._toggle_wrap(true);
		self.tt_setPos();
		self.tt_iState = 1;
	},
	_setOpacyty : function ()
	{
		var self = this;
		self._box.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + self._opacity + ")";
		self._box.style.MozOpacity = self._opacity/100;
	},
	tt_Fade : function ()
	{
		var self = this;
		var flag = self.tt_iState == 1;
		var z;
		flag ? z = 100 : z = 0;
		if(flag)
			self._opacity += 20;
		else
			self._opacity -= 20;
		if((flag) ? (self._opacity > z) : (self._opacity < z))
			self._opacity = z;
		if (self._timer == null)
			self._timer = window.setInterval( function() { self.tt_Fade() } ,
							self._duration, true);
		self._setOpacyty();					
		if(self._opacity == z){
			flag ? self.tt_Show() : self.tt_Hide();
		}
	},
	tt_Show : function ()
	{
		var self = this;
		if (self._timer != null)
		{
 			window.clearInterval(self._timer);
 			self._timer = null;
		}
	},
	tt_Hide : function ()
	{
		var self = this;
		if (self._timer != null)
		{
 			window.clearInterval(self._timer);
 			self._timer = null;
		}
		self._toggle_wrap(false);
		self._box.style.display = "none";
		self.tt_bJmpVert = true;
	},
	tt_setPos : function ()
	{
		var self = this;
		var lf = self.tt_PosX()
		var tp = self.tt_PosY();
		self._box.style.top = tp+"px";
		self._box.style.left = lf+"px";
	},
	tt_Move : function (e)
	{
		var self = this;
		e = e || window.event;
		if(e)
		{
			self.tt_musX = (typeof(e.pageX) != self.tt_u) ? e.pageX : (e.clientX + self.tt_scrlX);
			self.tt_musY = (typeof(e.pageY) != self.tt_u) ? e.pageY : (e.clientY + self.tt_scrlY);
		}
		if(self.tt_iState == 1)
		{
			self.tt_setPos();
		}
		else
		{
			if(!e.target)
				e.target = e.srcElement; 
			var _id = e.target.id;
			num = self._getIndex(_id);
			if (num != -1)
			{
				self._show(num);
			}
		}
	},
	tt_PosX : function(){
		var self = this;
		var x;

		x = self.tt_musX + self._offsetX;
		if(x > self.tt_maxPosX)
			x = self.tt_maxPosX;
		x = ((x < self.tt_scrlX) ? self.tt_scrlX : x);
		return x;
	},
	tt_PosY : function(){
		var self = this;
		var y;
		
		if((self.tt_bJmpVert && self.tt_CalcPosYAbove() >= self.tt_scrlY + 16) || (!self.tt_bJmpVert && self.tt_CalcPosYBelow() > self.tt_maxPosY - 16))
			y = self.tt_DoPosYAbove();
		else
			y = self.tt_DoPosYBelow();
		return y;
	},
	tt_DoPosYBelow : function(){
		var self = this;
		self.tt_bJmpVert = false;
		return self.tt_CalcPosYBelow();
	},
	tt_DoPosYAbove : function(){
		var self = this;
		self.tt_bJmpVert = true;
		return self.tt_CalcPosYAbove();
	},
	tt_CalcPosYBelow : function(){
		var self = this;
		return(self.tt_musY + self._offsetY);
	},
	tt_CalcPosYAbove : function ()
	{
		var self = this;
		var dy = self._offsetY;

		return(self.tt_musY - self.tt_h - dy);
	},
	tt_GetDivW : function (el)
	{
		return(el ? (el.offsetWidth || el.style.pixelWidth || 0) : 0);
	},
	tt_GetDivH : function (el)
	{
		return(el ? (el.offsetHeight || el.style.pixelHeight || 0) : 0);
	},
	tt_GetScrollX : function ()
	{
		var self = this;
		return(window.pageXOffset || (self.tt_db ? (self.tt_db.scrollLeft || 0) : 0));
	},
	tt_GetScrollY : function ()
	{
		var self = this;
		return(window.pageYOffset || (self.tt_db ? (self.tt_db.scrollTop || 0) : 0));
	},
	tt_GetClientW : function ()
	{
		return(document.body && (typeof(document.body.clientWidth) != self.tt_u) ? document.body.clientWidth
				: (typeof(window.innerWidth) != self.tt_u) ? window.innerWidth
				: tt_db ? (tt_db.clientWidth || 0)
				: 0);
	},
	tt_GetClientH : function ()
	{
		return(document.body && (typeof(document.body.clientHeight) != self.tt_u) ? document.body.clientHeight
				: (typeof(window.innerHeight) != self.tt_u) ? window.innerHeight
				: tt_db ? (tt_db.clientHeight || 0)
				: 0);
	},
	tt_OnScrl : function ()
	{
		var self = this;
		self.tt_scrlX = self.tt_GetScrollX();
		self.tt_scrlY = self.tt_GetScrollY();
		if(self.tt_iState)
			self._hide_action();
	}
};

function initToolTips()
{
	var tooltip = new ToolTip({	tooltipBox:'tooltipbox', tooltipTitle:'tooltiptitle', tooltipText:'tooltiptext'	});
}

Event.register(window,"load",function() {
	initToolTips();
});
