/* Classe para trabalhar com API do Google Maps 															                                          
  Copyright JonathanVicente@2007               															                                          
 
  Options{
  objName: Indica o nome que esta a igualar a Class. Ex. var MyMap = new mooMaps({objName:MyMap}). (NOTA: Caso a váriavel objName não for igual )
  size: {
		width: lagura do mapa (INT)
		height: altura do mapa (INT)
	}
	mapSearch: Inicia o objecto de pesquisa GClientGeocoder (Boolean)
  showMapControl: Mostrar controlos do mapa (Boolean)
  mapControl{
    control: Cria controlos grandes, pequenos ou apenas o zoom ('large','small','zoom')
    infoScale: Informa a escala actual do mapa (Boolean)
    type: Mostra os vários tipos de visualização do mapa (Boolean)
    overview: Mostra mini mapa da posição actual do mapa (Boolean)
  }
  mapConfig:{
    dragging:   Activa/desactiva o drag do mapa (Boolean)
    infoWindow: Activa/desactiva as janelas de informação. Caso existir janelas abertas serão fehadas e não permitirá criar mais janelas. (Boolean)
    clickZoom:  Activa/desactiva o doble click do rato para zoom (Boolean)
    wheelZoom:  Activa/desactiva o scroll do rato para zoom (Boolean)
  }
  center{
    lt: 
    ln:
    zoom:
    maptype:
      G_NORMAL_MAP        Mostra mapa em modo normal.
      G_SATELLITE_MAP     Mostra mapa em modo satelite.
      G_HYBRID_MAP        Mostra mapa em modo de união de G_NORMAL_MAP e G_SATELLITE_MAP.
  }
  onError: evento disparado quando ocorre um erro
  onExit: evento disparado quando sai do mapa
 
*/
var saveMyObj;
var mooMaps = new Class({
	options: {
		debug: false ,
    objName: null,
    size: {width: '100%' , height: '300px'},
		mapSearch: false,
    mapControlShow:true,
    mapControl:{control:'large', infoScale:'true' , type:'true' , overview:'true'},
    mapConfig:{dragging:'true', infoWindow:'true', clickZoom:'true', wheelZoom:'true'},
    center:{lt:40.6382509014415 , ln:-8.63276481628418, zoom:4, maptype:G_NORMAL_MAP},
    markermanager:{ borderPadding: 50, maxZoom: 15, trackMarkers: true },
		onInitialize: Class.empty,
		onStart: Class.empty,
    onLoaded: Class.empty,
		onError: Class.empty,
    onExit: Class.empty
  },
  
  initialize: function(el, options) {
		this.element = $(el) || null;
		this.setOptions(options);
		this.fireEvent('onInitialize',options,10);
		this.start();
  },
	
	start: function(){
    //this.setLoading();
		if(this.element){
			this.element.setStyles({
				height: this.options.size.height,
				width: this.options.size.width
			});
			if(this.options.objName && this.options.objName !=''){
        if (GBrowserIsCompatible()){
            this.map = new GMap2(this.element);
            if(this.options.mapSearch){this.geocoder = new GClientGeocoder();}
            this.setControls(this.options.mapControl);
            this.setConfig(this.options.mapConfig);
            this.setCenter(this.options.center);
            this.setMarkerManager();
            this.gmarkers = [];
            this.gmarkersID = [];
            this.fireEvent('onStart',this.element,10);
            this.saveObj();
        }
        else{
          this.setError({code:100,error:'O Browser não suporta o google maps API.'});
        }
      }
      else{
        this.setError({code:200,error:'Erro critico. O objName não está definido no objecto.',unload:false,fire:true});
      }
		}
		else{
      this.setError({code:300,error:'Elemento não encontrado.'});
    }
	},
  
  setConfig: function(op){
    if(op.dragging == 'true'){
      if(!this.map.draggingEnabled()) this.map.enableDragging();
    }
    else{
      if(this.map.draggingEnabled()) this.map.disableDragging();
    }
    
    if(op.infoWindow == 'true'){
      if(!this.map.infoWindowEnabled()) this.map.enableInfoWindow();
    }
    else{
      if(this.map.infoWindowEnabled()) this.map.disableInfoWindow();
    }
    
    if(op.clickZoom == 'true'){
      if(!this.map.doubleClickZoomEnabled()) this.map.enableDoubleClickZoom();
    }
    else{
      if(this.map.doubleClickZoomEnabled()) this.map.disableDoubleClickZoom();
    }
    
    if(op.wheelZoom == 'true'){
      if(!this.map.scrollWheelZoomEnabled()) this.map.enableScrollWheelZoom();
    }
    else{
      if(this.map.scrollWheelZoomEnabled()) this.map.disableScrollWheelZoom();
    }
  },
  
  savePosition: function(){
    this.element.savePosition();
  },
  
  returnSavedPosition: function(){
    this.element.returnToSavedPosition();
  },
  	
	setCenter: function(op){
    op = this.setOps(['lt','ln','zoom','maptype'] , [this.options.center.ln,this.options.center.ln,this.options.center.zoom,this.options.center.maptype] , op);
		this.map.setCenter(new GLatLng(op.lt,op.ln),op.zoom,op.maptype);
	},
	
	setControls: function(op){

    op = this.setOps(['control','infoScale','type','overview'] , ['large','true','true','true'] , op);
    if(this.options.mapControlShow){
      switch(op.control){
        case 'large':
          this.map.addControl(new GLargeMapControl());
        break
          
        case 'small':
          this.map.addControl(new GSmallMapControl());
        break
          
        case 'zoom':
          this.map.addControl(new GSmallZoomControl());
        break
          
        default:
        this.debuger("Não fui definido nenhum tipo de control do mapa");
      }
      if(op.infoScale == 'true') this.map.addControl(new GScaleControl());
      if(op.type == 'true') this.map.addControl(new GMapTypeControl());
      if(op.overview == 'true') this.map.addControl(new GOverviewMapControl());
    }
	},
  
  setControlCostume: function(op)
	{
    //addControl(control, position?)
	},
  
  removeControlCostume: function(op)
	{
    //removeControl(control)
	},
  
  setMarkerManager:function(){
    this.mgr = new GMarkerManager(this.map, this.options.markermanager);
    //this.addListener(this.mgr , 'changed', function(){alert('Tenho evento change');})
    //this.unsetLoading.delay(5000, this);
  },
  
  createMarker:function (op){
    if(op.id)
    {
      var marker , Myicon;
      op.title = op.title || '';
      if(typeof op.icon == "object"){Myicon = this.createIcon(op.icon);}else{Myicon = null;}
      marker = new GMarker(op.points,{draggable: op.drag,icon:Myicon,title:op.title,dragCrossMove:true,bouncy:true});
      marker.values = op.values||null;
      marker.category = op.category || 'default';
      marker.id = op.id;
      marker.tabs = op.tabs || null;
      if((op.events.length == op.handlers.length) && op.events.length > 0){
        for(i=0;i<op.events.length;i++){
          this.addListener(marker , op.events[i] , op.handlers[i]);
        }
      }
      this.gmarkers[op.id] = marker;
      this.gmarkersID.push(marker);
      return marker;
    }
    else
    {
      this.debuger("Marcador sem ID!");
      return null;
    }
  },
  
  createIcon:function(op){
    var baseIcon = new GIcon();
    baseIcon.iconSize=new GSize(op.iconSizeW,op.iconSizeH);
    baseIcon.shadowSize=new GSize(op.shadowSizeW,op.shadowSizeH);
    baseIcon.iconAnchor=new GPoint(op.iconAnchorX,op.iconAnchorY);
    baseIcon.infoWindowAnchor=new GPoint(op.infoWindowAnchorX,op.infoWindowAnchorY);
    icon = new GIcon(baseIcon, ""+op.url+op.img+"", null, ""+op.url+op.imgShadow+"");
    return icon;
  },
  
  downloadUrl:function(op){
    //this.setLoading();
    var objName = this.options.objName;
    this.debuger("downloadUrl");
    if(($type(op.url)=='array') && (op.url.length > 0)){
      this.downloaded = op.url.length;
      for(i=0;i<this.downloaded;i++){
        this.debuger("Vou Submeter url "+i);  
        GDownloadUrl(op.url[i] ,
          function(data, responseCode){
            var myobj = eval(objName);
            myobj.debuger("responseCode "+responseCode);
            if(responseCode == 200){
              var xml = GXml.parse(data);
              var markers = xml.documentElement.getElementsByTagName("marker");
              myobj.debuger(markers.length);
              if(markers.length > 0){
                var ops = xml.documentElement.getElementsByTagName("type");
                if(ops.length > 0) ops = ops[0].getAttribute("name"); else ops = null;
                switch(ops)
                {
                  case 'gs':
                    myobj.setSchools(markers);
                  break;
                  
                  case 'gstd':
                    myobj.setSchoolsToDistrito(markers);
                  break;
                
                  case 'grs':
                    myobj.setRooms(markers);
                  break;
                
                case 'gr':
                    myobj.setRoom(markers);
                  break;
                
                  case 'grtd':
                    myobj.setRoomsToDistrito(markers);
                  break;
                
                  case 'gsd':
                    myobj.setSchoolsDistrito(markers);
                  break;
                }
              }
            }
            else{
              myobj.setError({code:404,error:'Página não encontrada.'});
            }
          }
        );
      }
    }
  },
  
  setSchools:function(markers){
    var objName = this.options.objName;
    var managermarkers = [];
    for (var i = 0; i < markers.length; i++){
      var markerid = 's'+markers[i].getAttribute("id");
      var name = markers[i].getAttribute("name");
      var address1 = markers[i].getAttribute("address1");
      var address2 = markers[i].getAttribute("address2");
      var address3 = markers[i].getAttribute("address3");
      var address4 = markers[i].getAttribute("address4");
      var type = markers[i].getAttribute("type");
      var point = new GLatLng(parseFloat(markers[i].getAttribute("lt")), parseFloat(markers[i].getAttribute("ln")));
      managermarkers.push (this.createMarker({
				points:point,
				drag:false,
        category:'schools',
        icon:{
          iconSizeW:32, iconSizeH:32,
          shadowSizeW:56, shadowSizeH:32,
          iconAnchorX:16, iconAnchorY:32,
          infoWindowAnchorX:16, infoWindowAnchorY:0,
          url:'http://maps.google.com/mapfiles/kml/pal3/',
          img:'icon21.png',
          imgShadow:'icon21s.png'
        },
        id:markerid,
        values:"{'name':'"+name+"','address1':'"+address1+"','address2':'"+address2+"','address3':'"+address3+"','address4':'"+address4+"','type':'"+type+"'}",
        events:['click'],
        handlers:[function(){
          var op = Json.evaluate(this.values);
          this.openInfoWindowHtml
          (
            '<div class="gcontent">'
            +'<p class="gtitle">Estabelecimento:</p>'
            +'<p class="glabel">'+op.type +'</p>'
            +'<p class="glabel">'+op.name +'</p>'
            +'<p class="glabel">'+op.address2 +'</p>'
            +'<p class="glabel">'+op.address3 +'</p>'
            +'<p class="glabel">'+op.address1+" "+op.address4 +'</p>'
            +'<p class="glabel"><a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomIn();"><img src="http://rooms.ucuckoo.com/img/zoomin.png" />&nbsp;Zoom</a>&nbsp;&nbsp;'
            +'<a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomOut();"><img src="http://rooms.ucuckoo.com/img/zoomout.png" />&nbsp;Zoom</a></p>'
            +'</div>'
          );
        }
        ]
      }));
      
    }
    this.mgr.addMarkers(managermarkers, 6, 15);
    this.mgr.refresh();
    //if(!this.i<this.downloaded) this.unsetLoading.delay(5000, this);
  },
  
  setSchoolsDistrito:function(markers){
    var objName = this.options.objName;
    var managermarkers = [];
    for (var i = 0; i < markers.length; i++){
      var markerid = 's'+markers[i].getAttribute("id");
      var name = markers[i].getAttribute("name");
      var address1 = markers[i].getAttribute("address1");
      var address2 = markers[i].getAttribute("address2");
      var address3 = markers[i].getAttribute("address3");
      var address4 = markers[i].getAttribute("address4");
      var type = markers[i].getAttribute("type");
      var point = new GLatLng(parseFloat(markers[i].getAttribute("lt")), parseFloat(markers[i].getAttribute("ln")));
      managermarkers.push (this.createMarker({
				points:point,
				drag:false,
        category:'schools',
        icon:{
          iconSizeW:32, iconSizeH:32,
          shadowSizeW:56, shadowSizeH:32,
          iconAnchorX:16, iconAnchorY:32,
          infoWindowAnchorX:16, infoWindowAnchorY:0,
          url:'http://maps.google.com/mapfiles/kml/pal3/',
          img:'icon21.png',
          imgShadow:'icon21s.png'
        },
        id:markerid,
        values:"{'name':'"+name+"','address1':'"+address1+"','address2':'"+address2+"','address3':'"+address3+"','address4':'"+address4+"','type':'"+type+"'}",
        events:['click'],
        handlers:[function(){
          var op = Json.evaluate(this.values);
          this.openInfoWindowHtml
          (
            '<div class="gcontent">'
            +'<p class="gtitle">Estabelecimento:</p>'
            +'<p class="glabel">'+op.type +'</p>'
            +'<p class="glabel">'+op.name +'</p>'
            +'<p class="glabel">'+op.address2 +'</p>'
            +'<p class="glabel">'+op.address3 +'</p>'
            +'<p class="glabel">'+op.address1+" "+op.address4 +'</p>'
            +'<p class="glabel"><a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomIn();"><img src="http://rooms.ucuckoo.com/img/zoomin.png" />&nbsp;Zoom</a>&nbsp;&nbsp;'
            +'<a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomOut();"><img src="http://rooms.ucuckoo.com/img/zoomout.png" />&nbsp;Zoom</a></p>'
            +'</div>'
          );
        }
        ]
      }));
      
    }
    this.mgr.addMarkers(managermarkers, 1, 15);
    this.mgr.refresh();
    //if(!this.i<this.downloaded) this.unsetLoading.delay(5000, this);
  },
  
  setSchoolsToDistrito:function(markers){
    var objName = this.options.objName;
    var managermarkers = [];
    for (var i = 0; i < markers.length; i++){
      var markerid = 'std'+markers[i].getAttribute("id");
      var name = markers[i].getAttribute("name");
      var numestab = markers[i].getAttribute("numestab");
      var point = new GLatLng(parseFloat(markers[i].getAttribute("lt")), parseFloat(markers[i].getAttribute("ln")));
      managermarkers.push (this.createMarker({
				points:point,
				drag:false,
        category:'schools',
        icon:{
          iconSizeW:32, iconSizeH:32,
          shadowSizeW:56, shadowSizeH:32,
          iconAnchorX:16, iconAnchorY:32,
          infoWindowAnchorX:16, infoWindowAnchorY:0,
          url:'http://maps.google.com/mapfiles/kml/pal2/',
          img:'icon13.png',
          imgShadow:'icon13s.png'
        },
        id:markerid,
        values:"{'name':'"+name+"','numestab':'"+numestab+"'}",
        events:['click'],
        handlers:[function(){
          var op = Json.evaluate(this.values);
          this.openInfoWindowHtml
          (
            '<div class="gcontent">'
            +'<p class="gtitle">Distrito:</p>'
            +'<p class="glabel">'+op.name +'</p>'
            +'<p class="glabel">Existem '+op.numestab+' estabelecimentos.</p>'
            +'<p class="glabel"><a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.closeInfoWindow();myobj.map.setZoom(6);"><img src="http://rooms.ucuckoo.com/img/zoomin.png" />&nbsp;Zoom</a>&nbsp;&nbsp;'
            +'<a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomOut();"><img src="http://rooms.ucuckoo.com/img/zoomout.png" />&nbsp;Zoom</a></p>'
            +'</div>'
          );
        }
        ]
      }));
      
    }
    this.mgr.addMarkers(managermarkers, 1, 5);
    this.mgr.refresh();
    //if(!this.i<this.downloaded) this.unsetLoading.delay(5000, this);
  },
  
  
  setRoomsToDistrito:function(markers){
    var objName = this.options.objName;
    var managermarkers = [];
    for (var i = 0; i < markers.length; i++){
      var markerid = 'std'+markers[i].getAttribute("id");
      var name = markers[i].getAttribute("name");
      var numrooms = markers[i].getAttribute("numrooms");
      var point = new GLatLng(parseFloat(markers[i].getAttribute("lt")), parseFloat(markers[i].getAttribute("ln")));
      managermarkers.push (this.createMarker({
				points:point,
				drag:false,
        category:'rooms',
        icon:{
          iconSizeW:32, iconSizeH:32,
          shadowSizeW:56, shadowSizeH:32,
          iconAnchorX:16, iconAnchorY:32,
          infoWindowAnchorX:16, infoWindowAnchorY:0,
          url:'http://maps.google.com/mapfiles/kml/pal3/',
          img:'icon48.png',
          imgShadow:'icon48s.png'
        },
        id:markerid,
        values:"{'name':'"+name+"','numrooms':'"+numrooms+"','lt':'"+parseFloat(markers[i].getAttribute("lt"))+"','ln':'"+parseFloat(markers[i].getAttribute("ln"))+"'}",
        events:['click'],
        handlers:[function(){
          var op = Json.evaluate(this.values);
          this.openInfoWindowHtml
          (
            '<div class="gcontent">'
            +'<p class="gtitle">Distrito:</p>'
            +'<p class="glabel">'+op.name +'</p>'
            +'<p class="glabel">Existem '+op.numrooms+' quartos.</p>'
            +'<p class="glabel"><a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.closeInfoWindow();myobj.setCenter({lt:'+op.lt+',ln:'+op.ln+',zoom:6,type:myobj.map.getCurrentMapType()});"><img src="http://rooms.ucuckoo.com/img/zoomin.png" />&nbsp;Zoom</a>&nbsp;&nbsp;'
            +'<a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomOut();"><img src="http://rooms.ucuckoo.com/img/zoomout.png" />&nbsp;Zoom</a></p>'
            +'</div>'
          );
        }
        ]
      }));
      
    }
    this.mgr.addMarkers(managermarkers, 1, 5);
    this.mgr.refresh();
    //if(!this.i<this.downloaded) this.unsetLoading.delay(5000, this);
  },
  
  setRooms:function(markers){
    
    var objName = this.options.objName;
    var managermarkers = [];
    for (var i = 0; i < markers.length; i++){
      var markerid = 'r'+markers[i].getAttribute("id");
      var username = markers[i].getAttribute("username");
      var address1 = markers[i].getAttribute("address1");
      var address2 = markers[i].getAttribute("address2");
      var address3 = markers[i].getAttribute("address3");
      var address4 = markers[i].getAttribute("address4");
      var typeroom = markers[i].getAttribute("typeroom");
      var availability = markers[i].getAttribute("availability");
      var obs = markers[i].getAttribute("obs");
      var price = markers[i].getAttribute("price");
      var point = new GLatLng(parseFloat(markers[i].getAttribute("lt")), parseFloat(markers[i].getAttribute("ln")));
      var infoTabs = [
        new GInfoWindowTab("Geral", '<div class="gcontent grooms">'
          +'<p class="gtitle">'+typeroom+'</p>'
          +'<p class="glabel">'+address2 +'</p>'
          +'<p class="glabel">'+address3 +'</p>'
          +'<p class="glabel">'+address1+" "+address4 +'</p>'
          +'<p class="glabel"><a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomIn();"><img src="http://rooms.ucuckoo.com/img/zoomin.png" />&nbsp;Zoom</a>&nbsp;&nbsp;'
          +'<a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomOut();"><img src="http://rooms.ucuckoo.com/img/zoomout.png" />&nbsp;Zoom</a></p>'
          +'</div>'),
        new GInfoWindowTab("+ info", '<div class="gcontent grooms">'
          +'<p class="glabel">Disponibilidade apartir: '+availability +'</p>'
          +'<p class="glabel">Pre&ccedil;o: '+price +'</p>'
          +'<p class="glabel">Observa&ccedil;&otilde;es:<br /> '+obs +'</p>'
          +'</div>'),
        new GInfoWindowTab("Contactar", '<div class="gcontent grooms"><form action="" method="post" enctype="application/x-www-form-urlencoded" name="email">'
          +'<table width="100%" border="0" cellspacing="0" cellpadding="0">'
          +'<tr><td>Nome</td></tr>'
          +'<tr><td><input name="name" type="text" size="26" class="ginput" /></td></tr>'
          +'<tr><td>Email</td></tr>'
          +'<tr><td><input name="email" type="text" size="26" class="ginput" /></td></tr>'
          +'<tr><td>Mensagem</td></tr>'
          +'<tr><td><textarea name="msg" cols="31" rows="4" class="garea"></textarea></td></tr>'
          +'<tr><td><input name="enviar" type="button" value="Enviar" /></td></tr>'
          +'</table></form></div>')
      ];
      managermarkers.push (this.createMarker({
				points:point,
				drag:false,
        category:'rooms',
        tabs:infoTabs,
        icon:{
          iconSizeW:32, iconSizeH:32,
          shadowSizeW:56, shadowSizeH:32,
          iconAnchorX:16, iconAnchorY:32,
          infoWindowAnchorX:16, infoWindowAnchorY:0,
          url:'http://maps.google.com/mapfiles/kml/pal3/',
          img:'icon56.png',
          imgShadow:'icon56s.png'
        },
        id:markerid,
        values:"{'infoTabs':'"+infoTabs+"'}",
        events:['click'],
        handlers:[function(){
          this.openInfoWindowTabsHtml(infoTabs);
        }
        ]
      }));
      
    }
    
    this.mgr.addMarkers(managermarkers, 6, 15);
    this.mgr.refresh();
    //if(!this.i<this.downloaded) this.unsetLoading.delay(5000, this);
  },
  
  setRoom:function(markers){
    
    var objName = this.options.objName;
    var managermarkers = [];
    for (var i = 0; i < markers.length; i++){
      var markerid = 'room';
      var username = markers[i].getAttribute("username");
      var address1 = markers[i].getAttribute("address1");
      var address2 = markers[i].getAttribute("address2");
      var address3 = markers[i].getAttribute("address3");
      var address4 = markers[i].getAttribute("address4");
      var typeroom = markers[i].getAttribute("typeroom");
      var availability = markers[i].getAttribute("availability");
      var obs = markers[i].getAttribute("obs");
      var price = markers[i].getAttribute("price");
      var point = new GLatLng(parseFloat(markers[i].getAttribute("lt")), parseFloat(markers[i].getAttribute("ln")));
      var infoTabs = [
        new GInfoWindowTab("Geral", '<div class="gcontent grooms">'
          +'<p class="gtitle">'+typeroom+'</p>'
          +'<p class="glabel">'+address2 +'</p>'
          +'<p class="glabel">'+address3 +'</p>'
          +'<p class="glabel">'+address1+" "+address4 +'</p>'
          +'<p class="glabel"><a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomIn();"><img src="http://rooms.ucuckoo.com/img/zoomin.png" />&nbsp;Zoom</a>&nbsp;&nbsp;'
          +'<a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomOut();"><img src="http://rooms.ucuckoo.com/img/zoomout.png" />&nbsp;Zoom</a></p>'
          +'</div>'),
        new GInfoWindowTab("+ info", '<div class="gcontent grooms">'
          +'<p class="glabel">Disponibilidade apartir: '+availability +'</p>'
          +'<p class="glabel">Pre&ccedil;o: '+price +'</p>'
          +'<p class="glabel">Observa&ccedil;&otilde;es:<br /> '+obs +'</p>'
          +'</div>'),
        new GInfoWindowTab("Contactar", '<div class="gcontent grooms"><form action="" method="post" enctype="application/x-www-form-urlencoded" name="email">'
          +'<table width="100%" border="0" cellspacing="0" cellpadding="0">'
          +'<tr><td>Nome</td></tr>'
          +'<tr><td><input name="name" type="text" size="26" class="ginput" /></td></tr>'
          +'<tr><td>Email</td></tr>'
          +'<tr><td><input name="email" type="text" size="26" class="ginput" /></td></tr>'
          +'<tr><td>Mensagem</td></tr>'
          +'<tr><td><textarea name="msg" cols="31" rows="4" class="garea"></textarea></td></tr>'
          +'<tr><td><input name="enviar" type="button" value="Enviar" /></td></tr>'
          +'</table></form></div>')
      ];
      managermarkers.push (this.createMarker({
				points:point,
				drag:false,
        category:'rooms',
        tabs:infoTabs,
        icon:{
          iconSizeW:32, iconSizeH:32,
          shadowSizeW:56, shadowSizeH:32,
          iconAnchorX:16, iconAnchorY:32,
          infoWindowAnchorX:16, infoWindowAnchorY:0,
          url:'http://maps.google.com/mapfiles/kml/pal3/',
          img:'icon56.png',
          imgShadow:'icon56s.png'
        },
        id:markerid,
        values:"{'infoTabs':'"+infoTabs+"'}",
        events:['click'],
        handlers:[function(){
          this.openInfoWindowTabsHtml(infoTabs);
        }
        ]
      }));
      
    }
    
    this.mgr.addMarkers(managermarkers, 1, 15);
    this.mgr.refresh();
    //if(!this.i<this.downloaded) this.unsetLoading.delay(5000, this);
  },
  
	setSearchLocations:function (op) {
		this.query = op.q;
		this.querycount = 0;
    this.queryOnNotFound = op.OnNotFound || null;
    this.queryClearOverlays = op.ClearOverlays || true;
    this.queryZoom = op.zoom || 10;
		this.search();
	},
	
	search:function () {
    if (this.geocoder)
		{
			if((this.query.length > 0) && (this.querycount < this.query.length))
			{
        this.queryname = this.query[this.querycount];
        this.saveObj();
        this.debuger("search "+this.queryname);
        this.geocoder.getLocations(this.queryname, this.searchResponse);
				this.querycount++;
			}
      else
      {
        this.debuger("queryOnNotFound "+this.queryOnNotFound);
        eval(this.queryOnNotFound);
      }
		}
	},
	
	searchResponse:function(response){
    if (!response || response.Status.code != 200){
      saveMyObj.search();
    }
		else{
      var objName = saveMyObj.options.objName;
      saveMyObj.map.clearOverlays();
			place = response.Placemark[0];
      point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);
      marker = saveMyObj.createMarker({
				points:point,
				drag:false,
        icon:{
          iconSizeW:39, iconSizeH:34,
          shadowSizeW:50, shadowSizeH:34,
          iconAnchorX:12, iconAnchorY:34,
          infoWindowAnchorX:16, infoWindowAnchorY:0,
          url:'http://www.google.com/intl/en_ALL/mapfiles/',
          img:'arrow.png',
          imgShadow:'arrowshadow.png'
        },
        id:'searchLocations',
        events:['click'],
        handlers:[function(){var myobj = eval(objName); myobj.setInfWinSearchLocations(place);}]
      });
			
      saveMyObj.map.addOverlay(marker);
      saveMyObj.setInfWinSearchLocations(place,objName);
      saveMyObj.setCenter({lt:place.Point.coordinates[1],ln:place.Point.coordinates[0],zoom:saveMyObj.queryZoom,type:saveMyObj.map.getCurrentMapType()});
    }
	},
  
  goToDistrito:function (op) {
    point = new GLatLng(op.lt,op.ln);
    var objName = this.options.objName;
    var marker = this.createMarker({
      points:point,
			drag:false,
      id:'distrito',
      icon:{
        iconSizeW:39, iconSizeH:34,
        shadowSizeW:50, shadowSizeH:34,
        iconAnchorX:12, iconAnchorY:34,
        infoWindowAnchorX:16, infoWindowAnchorY:0,
        url:'http://www.google.com/intl/en_ALL/mapfiles/',
        img:'arrow.png',
        imgShadow:'arrowshadow.png'
      },
			events:['click'],
      handlers:[function(){var myobj = eval(objName); myobj.setInfWinDistrito(op.distrito);}]
    });
    this.map.addOverlay(marker);
    this.setInfWinDistrito(op.distrito,objName);
    this.setCenter({lt:op.lt,ln:op.ln,zoom:this.queryZoom,type:this.map.getCurrentMapType()});
  },
  
  setInfWinSearchLocations: function(place,objName){
    this.gmarkers['searchLocations'].openInfoWindowHtml
    (
      '<div class="gcontent">'
      +'<p class="gtitle">Endere&ccedil;o:</p>'
      +'<p class="glabel">'+place.address+'</p>'
      +'<p class="glabel"><a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomIn();"><img src="http://rooms.ucuckoo.com/img/zoomin.png" />&nbsp;Zoom</a>&nbsp;&nbsp;'
      +'<a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomOut();"><img src="http://rooms.ucuckoo.com/img/zoomout.png" />&nbsp;Zoom</a></p>'
      +'</div>'
    );
  },
  
  setInfWinDistrito: function(distrito, objName){
    this.gmarkers['distrito'].openInfoWindowHtml
    (
      '<div class="gcontent">'
      +'<p class="gtitle">Distrito:</p>'
      +'<p class="glabel">'+distrito + '</p>'
      +'<p class="glabel"><a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomIn();"><img src="http://rooms.ucuckoo.com/img/zoomin.png" />&nbsp;Zoom</a>&nbsp;&nbsp;'
      +'<a class="glabel" href="javascript:void(0);" onclick="javascript:var myobj = eval('+objName+');myobj.map.zoomOut();"><img src="http://rooms.ucuckoo.com/img/zoomout.png" />&nbsp;Zoom</a></p>'
      +'</div>'
    );
  },
  
  showMarkers:function(category){
    for (var i=0; i<this.gmarkersID.length; i++) {
      if (this.gmarkersID[i].category == category) {
        this.gmarkersID[i].show();
      }
    }
  },
  
  hideMarkers:function(category) {
    for (var i=0; i<this.gmarkersID.length; i++) {
      if (this.gmarkersID[i].category == category) {
        this.gmarkersID[i].hide();
      }
    }
  },
   
  addListener:function (source ,event , handler) {
    GEvent.addListener(source ,event , handler);  
  },
  
  setInfoWindow:function (op) {
    //openInfoWindow(point,  node,  opts?)
  },
  
  setInfoWindowHtml:function (op) {
    //openInfoWindowHtml(point,  html,  opts?)
  },
  
  setInfoWindowTabs:function (op) {
    //openInfoWindowTabs(point,  tabs,  opts?)
  },
  
  setInfoWindowTabsHtml:function (op) {
    //openInfoWindowTabs(point,  tabs,  opts?)
  },
  
	setpanTo: function(op){
    if(op.lt == "undefind" || op.ln == "undefind" || op.duration == "undefind"){
      alert("Erro: Impossível fazer panTo. Parâmetros em falta.");
    }
    else{
      window.setTimeout(function() {
          this.map.panTo(new GLatLng(op.lt, op.ln));
      }, op.duration);
      if(op.zoom) this.map.setZoom(op.zoom);
    }
	},
	
  setError:function(ops){
    ops = this.setOps(['code','error','fire','gunload'] , [100,'Erro nao defindo.','true','true'] , ops);
    alert("Tas aqui "+ops.code+" | "+ops.error+" | "+ops.fire+" | "+ops.gunload);
		if(ops.unload){
      alert("Gunload");
      GUnload();
    }
		if(ops.fire){
      alert("Envent Onerror fire");
      this.fireEvent('onError',ops,10);
    }
	},
  
  setClose:function(){
		GUnload();
    this.fireEvent('onExit');
	},
  
	debuger: function(mgs){
		if(this.options.debug) alert(mgs);
	},
  
  saveObj: function()
	{
		saveMyObj = this;
	},
  
  getSavedObj: function(mgs){
		return saveMyObj;
	},
  
  setOps: function (names,values,ops){
    if(names.length == values.length){
      if(typeof(ops) != 'object') ops = {};
      var result = {};
      for(i=0; i< names.length; i++){
        result[names[i]] = ops[names[i]] || values[i];
      }
      //getTime(s);//Teste do tempo de execução
      return result;
    }
    else
    {
      alert("Erro: Os arry passados não tem o mesmo tamanho. Arry1["+names.length+"] <> Arry2["+values.length+"]");
      return null; 
    }
  },
	
	setLoading: function ()
	{
      if(!this.overlay) this.overlay = new Element('div', {'id': 'gOverlay', 'styles': {'width':this.options.size.width,'height':this.options.size.height}}).injectTop($('loadmap'));
      if(!this.overlayLoad) this.overlayLoad = new Element('div', {'id': 'gOverlayLoad','styles': {'width':this.options.size.width,'height':'35px'}}).injectInside(this.overlay);
      var mySlider = new Fx.Slide(this.overlayLoad,{'onComplete':function(){ $('gOverlayLoad').setHTML("<div id='gloadingbar'></div><div id='gloadingmsg'>Carregando mapa ...</div>"); }});
      mySlider.hide();
      var myFx = new Fx.Style(this.overlay, 'opacity',
        {'onComplete': function(){mySlider.slideIn();}
      }).start(0,0.8);
	},
  
  unsetLoading: function ()
	{
    var myFx = new Fx.Style(this.overlay, 'opacity');
    var mySlider = new Fx.Slide(this.overlayLoad,{
      'onComplete': function(){myFx.start(0.8,0);}
    }).slideOut();
	}
});

mooMaps.implement(new Options , new Events);

function setTime()
{
  return(new Date());
}

function getTime(startTime){
  //var t=Math.floor((new Date()-startTime)/100)/10;
  var t=((new Date()-startTime)/1000);
  if (t%1==0) t+=".0";
  alert("Demorou "+t);
  window.status = "Demorou "+t;
}
/*
mooMaps.prototype.onMapClick = function() {
  this.counter++;
  alert("Ja fizeste duplo clique " + this.counter + " " +
        (this.counter == 1 ?"vez" : "vez"));
  }
*/