var rob={
	//CSS classes
	showClass:'show_rob',
	hideClass:'hide_rob',
	now_showing:null,
	winWidth:null,
	winHeight:null,
	
/* Initialize functionality */
	init:function(){
		var d=document;
		if(!d.getElementById || !d.createTextNode){return;}		
		if (typeof window.innerWidth!='undefined') {
			rob.winWidth = window.innerWidth;
			rob.winHeight = window.innerHeight;
		} else if ( d.documentElement && typeof d.documentElement.clientWidth!='undefined' && d.documentElement.clientWidth!=0 ) {
			rob.winWidth = d.documentElement.clientWidth;
			rob.winHeight = d.documentElement.clientHeight;
		} else if ( d.body && typeof d.body.clientWidth!='undefined') {
			rob.winWidth = d.body.clientWidth;
			rob.winHeight = d.body.clientHeight;
		};		
		rob.initLinks();
	},
	initLinks:function(){
		if(document.getElementsByTagName('a')[0]){
			var links=document.getElementsByTagName('a');
			for(var i=0;i<links.length;i++){
				var link_class=links[i].className;				
				if(link_class=="rollover"){				
					var ro_destination=links[i].href.toString().match(/#(.*)/)[1];
					var ro_target=document.getElementById(ro_destination);
					rob.cssjs('add',ro_target,rob.hideClass);
					rob.addEvent(links[i],'focus',rob.showBox,false);
					rob.addEvent(links[i],'mouseover',rob.showBox,false);
					rob.addEvent(links[i],'mouseout',rob.hideBox,false);
					rob.addEvent(links[i],'blur',rob.hideBox,false);
					rob.fixSafari(links[i]);			
				}
			}
			var areas=document.getElementsByTagName('area');
			for(var i=0;i<areas.length;i++){
				var area_class=areas[i].className;				
				if(area_class=="rollover"){				
					var ro_destination=areas[i].href.toString().match(/#(.*)/)[1];
					var ro_target=document.getElementById(ro_destination);
					rob.cssjs('add',ro_target,rob.hideClass);
					rob.addEvent(areas[i],'focus',rob.showBox,false);
					rob.addEvent(areas[i],'mouseover',rob.showBox,false);
					rob.addEvent(areas[i],'mouseout',rob.hideBox,false);
					rob.addEvent(areas[i],'blur',rob.hideBox,false);
					rob.fixSafari(areas[i]);			
				}
			}
		}
	},
	showBox:function(e){
		var event_info=rob.getTarget(e);				
		var selected_link=event_info.e_target;
		
		var event_x=event_info.posx; //x pos rel to entire doc	
		var event_y=event_info.posy; //y pos rel to entire doc
		var window_y = event_info.winy; //y pos rel to window
		
		var rob_pad = 20; //space btw event and box corner
		var v_offset = -rob_pad/2; //vertical offset of box, default set if no conflict
		var h_offset = -rob_pad/2; //horizontal offset of box, default set if no conflict
			
		var toshow=selected_link.getAttribute('href').toString().match(/#(.*)/)[1];
		if(document.getElementById(toshow)){
			
			//hide selects
			var selects=document.getElementsByTagName('select');
			for(var i=0;i<selects.length;i++){
				selects[i].style.visibility = "hidden";
			}
			
			//hide objects
			var objects=document.getElementsByTagName('object');
			for(var i=0;i<objects.length;i++){
				objects[i].style.visibility = "hidden";
			}
			
			//apply show class to rob content
			rob.now_showing=document.getElementById(toshow);
			rob.cssjs('remove',rob.now_showing,rob.hideClass);
			rob.cssjs('add',rob.now_showing,rob.showClass);
			
			//get rob size
			var pop_h = rob.now_showing.scrollHeight;
			var pop_w = rob.now_showing.scrollWidth;
			
			//get dif btw rob x/y & screen w/h
			
			var room_bot = rob.winHeight - window_y;
			var room_right = rob.winWidth - event_x;			
			
			//see if there is a conflict and adjust offsets
			if (pop_h + rob_pad > room_bot) {
				v_offset = pop_h - room_bot + rob_pad;
			}
			if (pop_w + rob_pad > room_right) {
				h_offset = pop_w - h_offset;
			}
			//alert("scrolltop: " + document.body.scrollTop + "\nwinHeight: " + rob.winHeight + "\nroom_bot: " + room_bot + "\ne_y: " + event_y + "\nv_offset: " + v_offset + "\npop_h: " + pop_h + "\ntop: " + (event_y - v_offset));
			//position rob
			
			rob.now_showing.style.left = event_x - h_offset + "px";
			rob.now_showing.style.top = event_y - v_offset + "px";
		}
		rob.cancelClick(e);
	},
	hideBox:function(){
		
		rob.cssjs('remove',rob.now_showing,rob.showClass);
		rob.now_showing.style.left = "-1000em";
		rob.now_showing.style.top = "-1000em";
		rob.cssjs('add',rob.now_showing,rob.hideClass);

		//show selects
		var selects=document.getElementsByTagName('select');
		for(var i=0;i<selects.length;i++){
			selects[i].style.visibility = "visible";
		}		
			
		//show objects
		var objects=document.getElementsByTagName('object');
		for(var i=0;i<objects.length;i++){
			objects[i].style.visibility = "visible";
		}
	},
/* helper methods */
	fixSafari:function(node){
		node.onclick = function() { return false; }; // Safari
	},
	getTarget:function(e){
		var e_target = window.event ? window.event.srcElement : e ? e.target : null;		
		var targ;
		var posx = 0;
		var posy = 0;
		var winx = 0;
		var winy = 0;
		if (!e_target){return false;}
			
		if ((e_target.nodeName.toLowerCase() != 'a') && (e_target.nodeName.toLowerCase() != 'area')) {
			e_target = e_target.parentNode;
		}
			
		if(e.type=="mouseover"){
			winx = e.clientX;
			winy = e.clientY;
			if (e.pageX || e.pageY){
				posx = e.pageX;
				posy = e.pageY;			
			} else if (e.clientX || e.clientY) {
				posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
				posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
			}			
		} else if (e.type=="focus") {
			winy = e_target.offsetTop - document.documentElement.scrollTop;			
			if (e.target) {
				targ = e.target;
			} else if (e.srcElement) {
				targ = e.srcElement;
			}
			if (targ.offsetParent) {
				do {
				posx += targ.offsetLeft;
				posy += targ.offsetTop;
				} while (targ = targ.offsetParent);
			}
			winy = posy;
		}
		
		return {
			e_target:e_target,
			posx:posx,
			posy:posy,
			winx:winx,
			winy:winy
		}			
	},
	cancelClick:function(e){
		if (window.event){
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			return;
		}
		if (e){
			e.stopPropagation();
			e.preventDefault();
		}
	},
	addEvent: function(elm, evType, fn, useCapture){
		if (elm.addEventListener) 
		{
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}
	},
	// cssjs tests 
	cssjs:function(a,o,c1,c2){
		switch (a){
			case 'swap':
				o.className=!rob.cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
			break;
			case 'add':
				if(!rob.cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
			break;
			case 'remove':
				var rep=o.className.match(' '+c1)?' '+c1:c1;
				o.className=o.className.replace(rep,'');
			break;
			case 'check':
				return new RegExp("(^|\\s)" + c1 + "(\\s|$)").test(o.className)
			break;
		}
	}
}
rob.addEvent(window, 'load', rob.init, false);