function getEventTrigeretBy(e){
	var targ;
	if (!e) var e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	return targ;
}
function prepare_HTML_container(name, firce_unload){
	var tmp = jQuery('#'+name);
	if(tmp.attr('id') == name){
		tmp.hide(1,function(){
			tmp.remove();
			if(firce_unload){
				if(typeof(GUnload) == 'function'){
					GUnload();
				}
			}
		});
	}
	tmp = jQuery('<div id="'+name+'"><div id="ba6kontainer"></div></div>').hide(0);
	return tmp;
}
function checkParameter(params,param, alert_){
	var res = true;
	var eval_ = "if(typeof(params."+param+") == 'undefined'){if(alert_ != false)alert('missing param (params."+param+")');res = false;}";
	eval(eval_);
	return res;
}

function getIconMarker(type,size){
		var tinyIcon = new GIcon(G_DEFAULT_ICON);
		tinyIcon.image = '/images/google/icons/markers/'+type+'.png';
		tinyIcon.iconSize = new GSize(size[0], size[1]);
		tinyIcon.shadow = '/images/google/icons/markers/shadow_'+type+'.png';
		tinyIcon.shadowSize = new GSize(size[0], size[1]);
		return tinyIcon;
}
function getMapMarker(params,index){
	var latlng = new GLatLng(params.lat,params.lng);
	var marker = new GMarker(latlng,{icon:getIconMarker(params.type,((typeof(params.size) == 'undefined')?[19,25]:params.size))});
	if((typeof(params.showhtmlwindow) == 'undefined') || (params.showhtmlwindow == 'click')){
		GEvent.addListener(marker, 'click', function(o) {
			/*click event*/
			marker.openInfoWindowHtml(params.name);
		});
	}else if(params.showhtmlwindow == 'over'){
		GEvent.addListener(marker, 'mouseover', function() {
			/*mouse over event*/
			marker.openInfoWindowHtml(params.name);
		});
	}else if(params.showhtmlwindow == 'overout'){
		GEvent.addListener(marker, 'mouseover', function() {
			/*mouse over event*/
			marker.openInfoWindowHtml(params.name);
		});
		GEvent.addListener(marker, 'mouseout',function(){
			/*mouse out event*/
			marker.closeInfoWindowHtml(params.name);
		});
	}
	return marker;
}

function initMap(HTML_container,params){
	var map = new GMap2(HTML_container.get(0),
			{ size: new GSize(params.size[0],params.size[1]) }
	);
	var zoom = 12;
	if(checkParameter(params,'zoom', false)){
		zoom = params.zoom;
	}
	map.removeMapType(G_HYBRID_MAP);
	map.setCenter(new GLatLng(params.map_ceter[0], params.map_ceter[1]), zoom);
	map.addControl(new GSmallMapControl());
	var mapControl = new GMapTypeControl();
    map.addControl(mapControl);
    if(checkParameter(params,'layers', false)){
    	 if(checkParameter(params.layers,'wikipedia', false)){
    		 var wikipedia = new GLayer("org.wikipedia.en");
    		 map.addOverlay(wikipedia);
    	 }
	}
    for(i in params.poi){
    	map.addOverlay(getMapMarker(params.poi[i],i));
    }
}

function getGMAP(params){
	//points of interests
	if(!checkParameter(params,'poi'))
		return jQuery();
	if(!checkParameter(params.poi[0],'lat') || !checkParameter(params.poi[0],'lng')){
		return jQuery();
	}else if((params.poi[0].lat == '') || (params.poi[0].lng == '')){
		return jQuery();
	}
	if(typeof(params) == 'undefined'){
		alert('missing param: params');
		return jQuery();
	}
	//container name
	if(!checkParameter(params,'container'))
		return jQuery();
	//google map size
	if(!checkParameter(params,'size'))
		return jQuery();
	//map center
	if(!checkParameter(params,'map_ceter'))
		return jQuery();
	//map head
	var map_fill = {head:jQuery('<span class="mphead"></span>'),foot:'<span class="mpfoot"></span>'};
	if(checkParameter(params,'map_head', false)){
		jQuery(params.map_head).appendTo(map_fill.head);
	}
	//map foot
	if(checkParameter(params,'map_foot', false)){
		jQuery(params.map_foot).appendTo(map_fill.foot);
	}
	var HTML_container = params.container;
	HTML_container = prepare_HTML_container(HTML_container, (((typeof(params.force_unload) == 'undefined') || (params.force_unload == true))?true:false));
	HTML_container.find('div').before(map_fill.head).after(map_fill.foot);
	//set container size
	HTML_container.css({"width":params.size[0]+'px',"height":params.size[1]+'px'});
	if(typeof(GMap2) == 'undefined'){
		jQuery.getScript('http://www.google.com/jsapi?key='+google_api_key, function(){
			google.load(
				"maps",
				"2.x",
				{
					"callback":function(){
						initMap(HTML_container.find('div'),params);
					}
				}
			);
		});
	}else{
		initMap(HTML_container.find('div'),params);
	}
	//attach afetr|before|append
	if(checkParameter(params,'position_nexto', false)){
		var nexto = jQuery(params.position_nexto).position();
		HTML_container.css({position:"absolute",top:nexto.top+'px',left:(params.size[0]-nexto.left)+'px'});
	}
	if(!checkParameter(params,'attach'))
		return jQuery();
	var tmp_eval = params.attach+'(HTML_container);';
	eval(tmp_eval);
	return HTML_container;
}
