
var G2gmap={
	c_id:'_G2gmap_container',
	i_id:'_G2D_gmap',
	t_id:'_G2gmap_tools',
	t_j_id:'_G2gmap_tools_jump',

//--------------- General Function
// G2gmap.observe (element,event,function,bool)
//  Event Dispatcher
//
// G2gmap._append (parentTag,tag,arguments,html)
//  append tag to parentTag
//
// G2gmap._setStyle (element,arguments)
//  set style to the element
//

	observe:function(elementname,name,observer,useCapture){

		if (window.addEventListener){
			return function(elementname,name,observer,useCapture){
				if (typeof elementname=='string'){
					element=document.getElementById(elementname)||document.getElementsByTagName(elementname)[0];
				} else {
					element=elementname;
				}
				element.addEventListener(name,observer,useCapture);
			}
		}else if(window.attachEvent){
			return function(elementname,name,observer,useCapture){
				if (typeof elementname=='string'){
					element=document.getElementById(elementname)||document.getElementsByTagName(elementname)[0];
				} else {
					element=elementname;
				}
				element.attachEvent('on'+name,observer);
			}
		}
	}(),

	_getPageSize:function() {
		var de = document.documentElement;
		var w = self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
		var h = self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
		if (window.innerHeight && window.scrollMaxY) {	
			var y = window.innerHeight + window.scrollMaxY;
		}else if (document.body.scrollHeight > document.body.offsetHeight){ 
			var y = document.body.scrollHeight;
		} else { 
			var y = document.body.offsetHeight;
		}
		if (self.pageYOffset) {
			var t = self.pageYOffset;
		} else if (document.documentElement && document.documentElement.scrollTop){	
			var t = document.documentElement.scrollTop;
		} else if (document.body) {
			var t = document.body.scrollTop;
		}
		return ({"w":w,"h":h,"y":y,"t":t});
	},

	_append:function(parentTag,tag,args,html){
		var child=document.createElement(tag);
		for (element in args){
			if (args.hasOwnProperty(element)){
				child.setAttribute(element,args[element]);
			}
		}
		if(html!='')child.innerHTML=html;
		var parent=document.getElementsByTagName(parentTag)[0]||document.getElementById(parentTag);
		parent.appendChild(child);
	},
	_setStyle:function(element,style){
		element = document.getElementById(element);
			for (var name in style) {
				var value = style[name];
				element.style[name.replace(/-([a-z])/g,function($0,$1){return $1.toUpperCase})] = value;
			}
		return element;
	},
//--------------- Main
	show:function(address,e){
//alert(address)
		if (document.getElementById(G2gmap.c_id)) {
			//var x=G2gmap.getX(e);
			//var y=(G2gmap.getY(e)>155)?(G2gmap.getY(e)-155):0;
			if(e!=null){
				var x=G2gmap.initX(e);
				var y=(G2gmap.initY(e)>155)?(G2gmap.initY(e)-155):0;
			}else{
				var size=G2gmap._getPageSize();
				var x=(size.w-310)/2;
				var y=size.t+(size.h-310)/2;
			}
			G2gmap._setStyle(G2gmap.c_id,{'display':'block','top':y+'px','left':x+'px'})
			document.getElementById(G2gmap.t_j_id).href='http://maps.google.com/maps?q='+address;
			document.getElementById(G2gmap.i_id).src='http://www.got2do.com/api/G2gmap.htm#'+address+'|'+encodeURI(location.href);
		}else{
			G2gmap.make(address,e);//<-------------------
		}
/*
		var afterLoaded=setInterval(function(){
			try {
				//G2gmap.moveto(address);  //<-------------------
				clearInterval(afterLoaded);
			}catch(e){
				throw("Still loading Google map...")
			}
		},1000)
*/
	},
	make:function(address,e){//<-------------------
		var html='';
		html+='<a name="G2gmap">';
		html+='<div id="'+this.t_id+'">'
		html+='<a id="'+this.t_j_id+'" href="http://maps.google.com/maps?q='+address+'">[Jump to Google Map]</a>    ';
		html+='Powered By <a href="http://teddy-g.cocolog-nifty.com/" target="_blank">TEDDY-G</a>';
		html+='  <img src="http://www.got2do.com/lab/img/close.gif" id="_G2gmap_close" style="cursor:pointer">';
		html+='</div>';
		html+='<iframe id="'+this.i_id+'" name="'+this.i_id+'" src="http://www.got2do.com/api/G2gmap.htm#'+address+'|'+encodeURI(location.href)+'"';//<-------------------
		html+='width="310" height="290" scrolling="no" frameborder="0" hspace="0" vspace="0" marginheight="0" marginwidth="0"';
		html+='>';
		html+='</iframe>';
		
		G2gmap._append('body','div',{'id':this.c_id},html);

		if(e!=null){
			var x=G2gmap.getX(e);
			var y=(G2gmap.getY(e)>155)?(G2gmap.getY(e)-155):0;
		}else{
			var size=G2gmap._getPageSize();
			var x=(size.w-310)/2;
			var y=size.t+(size.h-310)/2;
		}

		G2gmap._setStyle(G2gmap.c_id,{'width':'310px','height':'310px','position':'absolute','top':y+'px','left':x+'px','border':'solid 1px #ffcc33','backgroundColor':'#ffffcc','zIndex':'250','cursor':'move'});
		G2gmap._setStyle(G2gmap.t_id,{'width':'310px','height':'20px','verticalAlign':'middle','textAlign':'right','fontFamily':'\'Trebuchet MS\', Verdana, sans-serif','fontSize':'12px','textDecoration':'none','color':'#000000'});

		G2gmap.observe(this.c_id,'mousedown',G2gmap.down,false);
		G2gmap.observe(this.c_id,'mouseup',G2gmap.up,false);
		G2gmap.observe(this.c_id,'mouseout',G2gmap.up,false);
		G2gmap.observe(this.c_id,'mousemove',G2gmap.move,false);
		G2gmap.observe('_G2gmap_close','click',G2gmap.hide,false);
	
		this.clicked=false;
	},
	hide:function(){
		G2gmap._setStyle(G2gmap.c_id,{'display':'none'})
	},
//--------------- Control Child Gmap
	moveto:function(address){
		window[G2gmap.i_id].showAddress(address);
	},
//--------------- Mouse Function
	down:function(e){
		G2gmap.clicked=true;
		G2gmap.offsetX=parseInt(document.getElementById(G2gmap.c_id).style.left)-G2gmap.getX(e);
		G2gmap.offsetY=parseInt(document.getElementById(G2gmap.c_id).style.top)-G2gmap.getY(e);
	},
	up:function(e){
		G2gmap.clicked=false;
	},
	move:function(e){
		if (G2gmap.clicked){
			var x=G2gmap.getX(e)+G2gmap.offsetX;
			var y=G2gmap.getY(e)+G2gmap.offsetY;
			G2gmap._setStyle(G2gmap.c_id,{'left':x+'px','top':y+'px'});
		}
	},
	getX:function(e){
		if (window.opera){
			return function(e){return e.clientX}
		}else if (document.all){
			return function(e){return document.body.scrollLeft+event.clientX}
		}else if (document.layers||document.getElementById){
			return function(e){return e.pageX}
		}
	}(),
	getY:function(e){
		if (window.opera){
			return function(e){return e.clientY}
		}else if (document.all){
			return function(e){return document.body.scrollTop+event.clientY}
		}else if (document.layers||document.getElementById){
			return function(e){return e.pageY}
		}
	}(),
	initX:function(e){
		if (window.opera){
			return function(e){return window.event.clientX}
		}else if (document.all){
			return function(e){return window.event.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft) - window.document.body.clientLeft}
		}else if (document.layers||document.getElementById){
			return function(e){return e.clientX  + window.pageXOffset}
		}
	}(),
	initY:function(e){
		if (window.opera){
			return function(e){return window.event.clientY}
		}else if (document.all){
			return function(e){return window.event.clientY+ (document.body.scrollTop || document.documentElement.scrollTop) - window.document.body.clientTop}
		}else if (document.layers||document.getElementById){
			return function(e){return e.clientY + window.pageYOffset}
		}
	}()

}

//==============================
G2gmap.observe(window,'load',function(){
	var tags=document.getElementsByTagName('*');
	var element;
	var tag;
	var address;
	var html;
	var debug='';
	for (element in tags){
		try{
			if (tags[element].className=='G2gmap'){
				address=tags[element].textContent||tags[element].innerText;
				html='<a href="javascript:void(0);" onclick="G2gmap.show(\''+encodeURI(address)+'\',arguments[0]);return false;">'+tags[element].innerHTML+'(View Map)</a>';
				//html='<a href="#G2gmap" onclick="G2gmap.show(\''+encodeURI(address)+'\',arguments[0])">'+tags[element].innerHTML+'</a>';
				tags[element].innerHTML=html;
//				G2gmap.observe(tags[element],'click',G2gmap.show(address))
			}
		}catch(e){
			//throw ('cannot read className')
		}
	}

});
