function customStopPropagation(event){
	if (event.stopPropagation)//this code is for Mozilla and Opera
		event.stopPropagation();
	else if (window.event)// this code is for IE
		window.event.cancelBubble = true;
}
function closeTroughBody(){
	jQuery('body').click();
}
function closedByBody(clickTarget){
	jQuery('body').bind('click', function(event){
		clickTarget.trigger('click');
		jQuery(this).unbind('click');
	});
};
function getPosforGMAP(el){
	var r = new String;
	if(el.parent().get(0).tagName.toLowerCase() == 'li')
		el = el.parent();
	else
		el = el.parent().parent();
	return {top:el.position().top,left:el.position().left};
}
function getGMAP(params){
	this.resourceImages = {image:{},shadow:{}};
	this.params = {};
	this.checkParameter = function(params,param, alert_){
		var res = true;
		if(typeof(params[param]) == 'undefined'){
			if(alert_ != false)
				alert('missing param (params.'+param+')');
			res = false;
		}
		return res;
	}
	this.getIconMarker = function(type,size){
		var img = {};
		if(typeof(this.resourceImages.image[type]) == 'undefined'){
			img.image = new google.maps.MarkerImage('/images/google/icons/markers/'+type+'.png',
					new google.maps.Size(size[0], size[1]),// This marker is 20 pixels wide by 32 pixels tall.
					new google.maps.Point(0,0),// The origin for this image is 0,0.
					new google.maps.Point(0,0)// The anchor for this image is the base of the flagpole at 0,32.
			);
			img.shadow = new google.maps.MarkerImage('/images/google/icons/markers/shadow_'+type+'.png',
					new google.maps.Size(size[0], size[1]),
					new google.maps.Point(0,0),
					new google.maps.Point(-2,-2)
			);
			this.resourceImages.image[type] = img.image;
			this.resourceImages.shadow[type] = img.shadow;
		}else{
			img.image = this.resourceImages.image[type];
			img.shadow = this.resourceImages.shadow[type];
		}
		return img;
	};
	this.getMapMarker = function(params,index, map){
		var latlng = new google.maps.LatLng(params.lat,params.lng);
		var icon = this.getIconMarker(params.type,((typeof(params.size) == 'undefined')?[19,25]:params.size));
		var marker = new google.maps.Marker({
			position: latlng, 
			'map': map,
			shadow:icon.shadow,
			icon:icon.image
		});
		infowindow = new google.maps.InfoWindow();
		if((typeof(params.showhtmlwindow) == 'undefined') || (params.showhtmlwindow == 'click')){
			google.maps.event.addListener(marker, 'click', function(e){
				infowindow.setContent(params.name);
				infowindow.setPosition(latlng);
				infowindow.open(map);
			});
		}else if(params.showhtmlwindow == 'over'){
			google.maps.event.addListener(marker, 'mouseover', function(e){
				infowindow.setContent(params.name);
				infowindow.setPosition(latlng);
				infowindow.open(map);
			});
		}else if(params.showhtmlwindow == 'overout'){
			google.maps.event.addListener(marker, 'mouseover', function(e){
				infowindow.setContent(params.name);
				infowindow.setPosition(latlng);
				infowindow.open(map);
			});
			google.maps.event.addListener(marker, 'mouseout', function(e){
				infowindow.setContent(params.name);
				infowindow.setPosition(latlng);
				infowindow.close(map);
			});
		}
	};
	this.getGmapContainer = function(){
		return jQuery('<div><div id="layer-front"></div><div id="layer-back"></div>').attr('id', this.params.container).css({zIndex:10}).click(function(event){event.stopPropagation();});
	};
	this.unsetGmapContainer = function(){
		var cont = jQuery('#'+this.params.container);
		if(typeof(cont.attr('id')) != 'undefined'){
			jQuery('#'+this.params.container).remove();
			return true;
		}
		return false;
	};
	this.initMap = function(HTML_container,params){
		var obj = this;
		var map_options = {};
		map_options.center = new google.maps.LatLng(params.map_ceter[0], params.map_ceter[1]);
		map_options.zoom = 12;
		if(this.checkParameter(params,'zoom', false)){
			map_options.zoom = params.zoom;
		}
		map_options.mapTypeId = google.maps.MapTypeId.ROADMAP;
		var map = new google.maps.Map(HTML_container.get(0), map_options);
	    for(i in params.poi){
	    	obj.getMapMarker(params.poi[i],i, map);
	    }
	};
	this.setPosition = function(element){
		element.css({position:'absolute',top:0,left:0});
	};
	this.setLayerBackContent = function(layer, params){
		if(this.checkParameter(params,'layer_back', false)){
			layer.append(params.layer_back);
		}
	};
	
	this.init = function(){
		if(!this.params.totalResult)
			return false;
		var obj = this;
		if(true === this.unsetGmapContainer())
			return false;
		var gmapHolder = this.getGmapContainer();
		this.setPosition(gmapHolder);
		jQuery(this.params.attach).after(gmapHolder);
		if(typeof(google) == 'undefined'){
			jQuery.getScript('http://www.google.com/jsapi?key='+google_api_key, function(){
				google.load("maps","3.x",{
					"other_params":"sensor=false",
					"callback":function(){
						obj.initMap(gmapHolder.find('#layer-front'),params);
						obj.setLayerBackContent(gmapHolder.find('#layer-back'),params);
					}
				});
			});
		}else{
			obj.initMap(gmapHolder.find('#layer-front'),params);
			obj.setLayerBackContent(gmapHolder.find('#layer-back'),params);
		}
		return gmapHolder;
	};
	this.getParams = function(params){
		if(typeof(params) == 'undefined')
			return this.params.totalResult = false;
		if(!this.checkParameter(params,'zoom', false))
			params.zoom = 6;
		if(!this.checkParameter(params,'poi'))
			return this.params.totalResult = false;
		if(!this.checkParameter(params.poi[0],'lat') || !this.checkParameter(params.poi[0],'lng'))
			return this.params.totalResult = false;
		if((params.poi[0].lat == '') || (params.poi[0].lng == ''))
			return this.params.totalResult = false;
		if(!this.checkParameter(params,'container'))
			return this.params.totalResult = false;
		if(!this.checkParameter(params,'size'))
			return this.params.totalResult = false;
		if(!this.checkParameter(params,'map_ceter'))
			return this.params.totalResult = false;
		if(!this.checkParameter(params,'attach'))
			return this.params.totalResult = false;
		this.params = params;
		return this.params.totalResult = true;
	};
	this.getParams(params);
}
