
//------------------------------------------------------------------------------
// geotool.js - version 1.0.0
//
//  Copyright (c) 2005 Craftworks Corp. All Right Reserved.
//
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License, or (at your option) any later version.
//
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public
//  License along with this library; if not, write to the Free Software
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
//  For details, see the Craftworks web site: http://www.craft-works.co.jp/
//
//  AUTHOR: Isam Nakane <isam@craft-works.co.jp>
//
//  SYNOPSIS:
//      wgs = Geotool.wgs2tky(deg.lat, deg.lng);
//      dms.lat = Geotool.dms2deg(wgs.lat);
//      dms.lng = Geotool.dms2deg(wgs.lng);
//      boolean = Geotool.isJapan(deg.lat, deg.lng);
//
//------------------------------------------------------------------------------


var Geotool = {
    // radian
    RD : Math.PI / 180,

    // --------------- WGS 84 ---------------
    // (Equatorial radius, Ellipticity, Eccentricity)
    A_WGS  : 6378137,
    F_WGS  : 1 / 298.257222101,
    E2_WGS : 0.006694380022900787, // 2 * F_WGS - Math.pow(F_WGS, 2)

    // --------------- Bessel 1841 ---------------
    // (Equatorial radius, Ellipticity, Eccentricity)
    A_TKY  : 6377397.155,
    F_TKY  : 1 / 299.1528128,
    E2_TKY : 0.006674372231802145, // 2 * F_TKY - Math.pow(F_TKY, 2)

    // parallel distance
    DX_T :  148, DX_W : -148,
    DY_T : -507, DY_W : +507, 
    DZ_T : -681, DZ_W : +681, 

    dms2deg : function(dms) {
        dms = dms + "";
        if (dms.match(/^(\d{2,3})(\d{2})(\d{2}\.?\d*)$/)) {
            return (RegExp.$1 / 1 + RegExp.$2 / 60 + RegExp.$3 / 3600);
        } else {
            return false;
        }
    },

    deg2dms : function(deg) {
        var sf = Math.round(deg * 360000);
        var s  = Math.floor(sf / 100) % 60;
        var m  = Math.floor(sf / 6000) % 60;
        var d = Math.floor(sf / 360000);
        sf %= 100;
        if (m  < 10) m  = "0" + m;
        if (s  < 10) s  = "0" + s;
        if (sf < 10) sf = "0" + sf;
        var dms = "" + d + m + s + "." + sf;
        return dms;
    },

    blh2xyz : function(b, l, h, a, e2) {
        b *= this.RD;
        l *= this.RD;
        var sb = Math.sin(b);
        var cb = Math.cos(b);
        var rn = a / Math.sqrt(1 - e2 * Math.pow(sb, 2));
        var x = (rn + h) * cb * Math.cos(l);
        var y = (rn + h) * cb * Math.sin(l);
        var z = (rn * (1 - e2) + h) * sb;
        return [x, y, z];
    },

    xyz2blh : function(x, y, z, a, e2) {
        var bda = Math.sqrt(1 - e2);
        var p = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
        var t = Math.atan2(z, p * bda);
        var st = Math.sin(t);
        var ct = Math.cos(t);
        var b = Math.atan2(z + e2 * a / bda * Math.pow(st, 3), p - e2 * a * Math.pow(ct, 3));
        var l = Math.atan2(y, x);
        var sb = Math.sin(b);
        var rn = a / Math.sqrt(1 - e2 * Math.pow(sb, 2));
        var h = p / Math.cos(b) - rn;
        var blh = new Array(b / this.RD, l / this.RD, h);
        return blh;
    },

    wgs2tky : function(bb, bl) { // lat, lng (degree)
        var xyz = this.blh2xyz(bb, bl, 0, this.A_WGS, this.E2_WGS);
        var blh = this.xyz2blh(xyz[0] + this.DX_T, xyz[1] + this.DY_T, xyz[2] + this.DZ_T, this.A_TKY, this.E2_TKY);
        return { x : blh[1], y : blh[0], lat : blh[0], lng : blh[1] };
    },

    tky2wgs : function(bb, bl) { // lat, lng (degree)
        var xyz = this.blh2xyz(bb, bl, 0, this.A_TKY, this.E2_TKY);
        var blh = this.xyz2blh(xyz[0] + this.DX_W, xyz[1] + this.DY_W, xyz[2] + this.DZ_W, this.A_WGS, this.E2_WGS);
        return { x : blh[1], y : blh[0], lat : blh[0], lng : blh[1] };
    },

    isJapan : function(lat, lng) { // WGS
        if (   lat >  30 && lat <  50
            && lng > 115 && lng < 152 ) {
            return true;
        } else {
            return false;
        }
    }

};

if(typeof _map_server == 'undefined'){
	_map_server = 'gmap';
}

function ogmBrowserIsCompatible(server){
	switch(server){
		case 'fe':
			return true;
		case 've':
			return true;
		case 'gmap':
		default:
			return GBrowserIsCompatible();
	}
};

function ogmUnload(){
	switch(_map_server){
		case 'fe':
			return true;
		case 've':
			return true;
		case 'gmap':
		default:
			GUnload();
	}
};

ogmMap = function(target,type){
	var map = null;
	switch(type){
		case 'fe':
			var div = document.createElement("DIV");
			div.setAttribute('id','fe_container');
			
			div.style.width = '100%';
			div.style.height = '100%';
			div.style.overflow = 'auto';
			target.appendChild(div);
			 
			map = new FE.Map(div);
			map.load();
			break;
		case 've':
        	map = new VEMap(target.getAttribute('id'));
        	map.LoadMap();

			var ev = ['onclick','onendpan','onendzoom','onmouseover'];
        	
        	for(var i=0; i<4; i++){
        		var evt = ev[i];
        		(function(evtName){
					map.AttachEvent(evt,function(e){
						if(e.elementID==null && map.callback && map.callback[evtName]){
							var cb = map.callback[evtName];
							cb();
							return true;
						}else if(e.elementID!=null){
							var shape = map.GetShapeByID(e.elementID);
							if(shape.callback[evtName]){
								var cb = shape.callback[evtName];
								cb();				
								return true;
							}
						}
					});
        		})(evt);
        	}
			
			map.AttachEvent('ondoubleclick',function(e){
				if(e.elementID==null && e.rightMouseButton==true){
					map.ZoomOut();
				}
			});
			
        	break;        	
		case 'gmap':
		default:
			map = new GMap2(target);
			map.setCenter(new GLatLng(0,0),0);
						
			if(arguments.length==3){
				var cfg = arguments[2];
				if(!cfg.scroll){ map.disableDragging(); }
				
	   	   		if(cfg.zoom){
	   	   			map.enableDoubleClickZoom();
   		   			map.enableContinuousZoom();
	   		   		map.enableScrollWheelZoom();
	   	   			map.addontrol(new GLargeMapControl());
	   	   		}
	   	   		
	   	   		if(cfg.type){ map.addControl(new GMapTypeControl()); }
   	   			if(cfg.scale){ map.addControl(new GScaleControl()); }
   	   			if(cfg.overview){ map.addControl(new GOverviewMapControl()); }
			}else{
	   	   		map.enableDoubleClickZoom();
   		   		map.enableContinuousZoom();
   		   		map.enableScrollWheelZoom();
   	   			map.addControl(new GLargeMapControl());
//   	   		map.addControl(new GMapTypeControl());
   	   			map.addControl(new GScaleControl());
   	   			map.addControl(new GOverviewMapControl());   	   		
   	   			
   	   			map.addControl(new DragZoomControl(null,{
   	   				buttonHTML: '<img src="./images/icons/zoom_in.png" style="behavior:url(./iepngfix.htc)" />',
					buttonStyle: {backgroundColor: 'white',textAlign:'center',width: '25px', border: '1px solid black', padding: '2px', position: 'absolute', top:'7px', left: '70px'},
   	   				buttonZoomingHTML: '<img src="./images/icons/zoom_in.png" style="behavior:url(./iepngfix.htc)" />',
					buttonZoomingStyle: {backgroundColor: 'yellow', textAlign:'center',width: '25px', border: '1px solid black', padding: '2px', position: 'absolute', top:'7px', left: '70px'},
   	   				backButtonEnabled: true,
   	   				backButtonHTML: '<img src="./images/icons/zoom_out.png" />',
					backButtonStyle: {behavior:'url(./iepngfix.htc)', display:'none',backgroundColor: 'yellow', textAlign:'center',width: '25px', border: '1px solid black', padding: '2px', position: 'absolute', top:'7px', left: '100px'}
   	   			}));
   	   			
				G_SATELLITE_MAP.getMaximumResolution = function(a) {return 23};   	   			

				/* Relief Layers */
			    var min = 0;
			    var reliefmax = 11;   
			    var osmmax = 15;   

				// ------- Layer Functions -------

			    // Water Layer
			    function getWaterLayer() {
			      var layer = new GTileLayer(copyrightCollection, min, reliefmax);
			      layer.getTileUrl = function (a,b) {
			        return "http://maps-for-free.com/layer/water/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
			      };
			      return layer;
			    }    

			    // Street Layer
			    function getStreetLayer() {
			      var layer = new GTileLayer(copyrightCollection, min, reliefmax);
			      layer.getTileUrl = function (a,b) {
			        return "http://maps-for-free.com/layer/streets/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
			      };            
			      return layer;
			    }    

			    // Forest Layer
			    function getForestLayer() {
			      var layer = new GTileLayer(copyrightCollection, min, reliefmax);
			      layer.getTileUrl = function (a,b) {
			        return "http://maps-for-free.com/layer/forest/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
			      };            
			      return layer;
			    }    

			    // Tundra Layer
			    function getTundraLayer() {
			      var layer = new GTileLayer(copyrightCollection, min, reliefmax);
			      layer.getTileUrl = function (a,b) {
			        return "http://maps-for-free.com/layer/tundra/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
	      		  };            
			      return layer;
			    }    

			    // Swamp Layer
			    function getSwampLayer() {
			      var layer = new GTileLayer(copyrightCollection, min, reliefmax);
			      layer.getTileUrl = function (a,b) {
			        return "http://maps-for-free.com/layer/swamp/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
			      };            
			      return layer;
			    }    

			    // Grass Layer
			    function getGrassLayer() {
			      var layer = new GTileLayer(copyrightCollection, min, reliefmax);
			      layer.getTileUrl = function (a,b) {
			        return "http://maps-for-free.com/layer/grass/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
			      };            
			      return layer;
			    }    

			    // Crop Layer
			    function getCropLayer() {
			      var layer = new GTileLayer(copyrightCollection, min, reliefmax);
			      layer.getTileUrl = function (a,b) {
			        return "http://maps-for-free.com/layer/crop/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
			      };            
			      return layer;
			    }    

			    // Sand Layer
			    function getSandLayer() {
			      var layer = new GTileLayer(copyrightCollection, min, reliefmax);
			      layer.getTileUrl = function (a,b) {
			        return "http://maps-for-free.com/layer/sand/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
			      };            
			      return layer;
			    }    

			    // Ice Layer
			    function getIceLayer() {
			      var layer = new GTileLayer(copyrightCollection, min, reliefmax);
			      layer.getTileUrl = function (a,b) {
			        return "http://maps-for-free.com/layer/ice/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
			      };            
			      return layer;
			    }    

			    // Country Layer
			    function getCountryLayer() {
			      var layer = new GTileLayer(copyrightCollection, min, reliefmax);
			      layer.getTileUrl = function (a,b) {
			        return "http://maps-for-free.com/layer/country/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".png";
			      };            
			      return layer;
			    }

			    var interval = [1000, 1000,  750,  750,  750,  250,  250,  250, 200, 100,  50,  50,  25,  25, 25, 10,  3];
			    // Contour Lines
			    function getContourLayer() {
			      var layer = new GTileLayer(copyrightCollection, min, reliefmax);
			      layer.getTileUrl = function (tile, zoom) {
			        return "http://www.heywhatsthat.com/bin/contour_tiles.cgi?x=" + tile.x + "&y=" + tile.y + "&zoom=" + zoom + "&interval=" + interval[zoom] + "&color=ff0000";
			      };            
			      return layer;
			    }
	
				// ------- Add Layer Control to Map -------

			    // Water Layer
			    waterLayer = new GTileLayerOverlay(getWaterLayer());
			    waterLayer.visible = false;
		    
			    // Street Layer
			    streetLayer = new GTileLayerOverlay(getStreetLayer());
			    streetLayer.visible = false;

			    // Forest Layer
			    forestLayer = new GTileLayerOverlay(getForestLayer());
			    forestLayer.visible = false;

			    // Tundra Layer
			    tundraLayer = new GTileLayerOverlay(getTundraLayer());
			    tundraLayer.visible = false;

			    // Swamp Layer
			    swampLayer = new GTileLayerOverlay(getSwampLayer());
			    swampLayer.visible = false;

			    // Grass Layer
			    grassLayer = new GTileLayerOverlay(getGrassLayer());
			    grassLayer.visible = false;

			    // Sand Layer
			    sandLayer = new GTileLayerOverlay(getSandLayer());
			    sandLayer.visible = false;

			    // Crop Layer
			    cropLayer = new GTileLayerOverlay(getCropLayer());
			    cropLayer.visible = false;

			    // Ice Layer
			    iceLayer = new GTileLayerOverlay(getIceLayer());
			    iceLayer.visible = false;

			    // Country Layer
			    countryLayer = new GTileLayerOverlay(getCountryLayer());
			    countryLayer.visible = false;

			    // Contour Layer
			    contourLayer = new GTileLayerOverlay(getContourLayer());
			    contourLayer.visible = false;
			    
			    map.extraLayers = {
			    	water:	waterLayer,
			    	forest:	forestLayer,
			    	street:	streetLayer,
			    	tundra:	tundraLayer,
			    	swamp: 	swampLayer,
			    	grass: 	grassLayer,
			    	sand:	sandLayer,
			    	crop:	cropLayer,
			    	ice:	iceLayer,
			    	country:countryLayer,
			    	contour:contourLayer
			    };

			    var license = "<a href='http://www.maps-for-free.com/html/about.html' target='_blank'>License</a>";
		    	var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, license);
			    var copyrightCollection = new GCopyrightCollection("Relief Maps: ");
			    copyrightCollection.addCopyright(copyright);

			    var relief = [new GTileLayer(copyrightCollection, min, reliefmax)];
			    relief[0].getTileUrl = function(a,b) {
			      return "http://maps-for-free.com/layer/relief/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".jpg"; 
			    };
			    var reliefLayer = new GMapType(relief, G_SATELLITE_MAP.getProjection(), _lang!='en'?"模型図":"Relief", {minResolution:min, maxResolution:reliefmax});

			    var reliefWithLabels = [new GTileLayer(copyrightCollection, min, reliefmax),G_HYBRID_MAP.getTileLayers()[1]];

			    reliefWithLabels[0].getTileUrl = function(a,b) {
			      return "http://maps-for-free.com/layer/relief/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".jpg"; 
			    };

			    var reliefLayerWithLabels = new GMapType(reliefWithLabels, G_SATELLITE_MAP.getProjection(), "Hybrid Relief", {minResolution:min, maxResolution:reliefmax});

			    var osmlicense = "<a href='http://www.openstreetmap.com' target='_blank'>License</a>";
			    var osmcopyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, osmlicense);
			    var osmcopyrightCollection = new GCopyrightCollection("OpenStreetsMap: ");
			    osmcopyrightCollection.addCopyright(osmcopyright);

			    var osm = [new GTileLayer(osmcopyrightCollection, min, osmmax)];
			    osm[0].getTileUrl = function(a,b) {
			      return "http://tile.openstreetmap.org/" + b + "/" + a.x + "/" + a.y + ".png"; 
			    };
			    
			    var osmLayer = new GMapType(osm, G_SATELLITE_MAP.getProjection(), "OSM", {minResolution:min, maxResolution:osmmax});

			    var osmWithLabels = [new GTileLayer(osmcopyrightCollection, min, osmmax),G_HYBRID_MAP.getTileLayers()[1]];

			    osmWithLabels[0].getTileUrl = function(a,b) {
			      return "http://tile.openstreetmap.org/" + b + "/" + a.x + "/" + a.y + ".png"; 
			    };

			    var osmLayerWithLabels = new GMapType(osmWithLabels, G_SATELLITE_MAP.getProjection(), "Hybrid OSM", {minResolution:min, maxResolution:osmmax});

				var physWithLabels = [ G_PHYSICAL_MAP.getTileLayers()[0], G_HYBRID_MAP.getTileLayers()[1] ];
				var physWithLabelsMap = new GMapType(physWithLabels, G_PHYSICAL_MAP.getProjection(), "Hybrid Terrain");	

				map.addMapType(G_PHYSICAL_MAP);
				map.addMapType(physWithLabelsMap);
			    map.addMapType(reliefLayer);
			    map.addMapType(reliefLayerWithLabels);
			    map.addMapType(osmLayer);
			    map.addMapType(osmLayerWithLabels);
				
				var mapControl = new GHierarchicalMapTypeControl();
				mapControl.clearRelationships();
				mapControl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, _lang!='en'?"ラベル":"Labels", false);
				mapControl.addRelationship(G_PHYSICAL_MAP, physWithLabelsMap, _lang!='en'?"ラベル":"Labels", false);
				mapControl.addRelationship(reliefLayer, reliefLayerWithLabels, _lang!='en'?"ラベル":"Labels", false);
				mapControl.addRelationship(osmLayer, osmLayerWithLabels, _lang!='en'?"ラベル":"Labels", false);
				map.addControl(mapControl);					    
			}
	}

	this._ogmt = type;
	this.map = map;
};

ogmMap.prototype = {
	getOriginal: function(){
		return this.map;
	},
	
	setCenter:	function(loc,zoom){
		var lat = loc.lat();
		var lng = loc.lng();
		if(arguments.length==2){ var new_zoom = zoom; }
		else{ var new_zoom = this.getZoom(); }
		
		switch(_map_server){
			case 'fe':
				//this.pan(loc.latlng);
				break;
			case 've':
				this.map.SetCenterAndZoom(loc.latlng,new_zoom);
				break;
			case 'gmap':
			default:
				this.map.setCenter(loc.latlng,new_zoom);
		}	
	},

	getCenter:	function(){
		var ret = null;
		switch(_map_server){
			case 'fe':
				var tmp = this.map.getTargetLatLng();
				ret = new ogmLatLng(tmp.lat,tmp.lng);
				break;
			case 've':
				var tmp = this.map.GetCenter();
				ret = new ogmLatLng(tmp.Latitude,tmp.Longitude);
				break;
			case 'gmap':
			default:
				var tmp = this.map.getCenter();
				ret = new ogmLatLng(tmp.lat(),tmp.lng());	
		}
		return ret;
	},
	
	setMapType:	function(type){
		var ret = null;
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				var map_types = {
					"normal": VEMapStyle.Road,
					"air"	: VEMapStyle.Aerial,
					"hybrid": VEMapStyle.Hybrid
				};
				this.map.SetMapStyle(map_types[type]);
				break;
			case 'gmap':
			default:
				var map_types = {
					"normal": G_NORMAL_MAP,
					"air"	: G_SATELLITE_MAP,
					"hybrid": G_HYBRID_MAP
				};
				
			　	var mtype = map_types[type];
				if(!mtype){ mtype = G_NORMAL_MAP; }
				 
				this.map.setMapType(mtype);
		}
	},
	
	getMapType: function(){
		var ret = null;
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				var c_type = this.map.GetMapStyle();
				switch(c_type){
					case VEMapStyle.Aerial:
						return "air";
					case VEMapStyle.Hybrid:
						return "hybrid";					
					case VEMapStyle.Road:
					default:
						return "normal";
				}
			case 'gmap':
			default:
				var c_type = this.map.getCurrentMapType();
				switch(c_type){
					case G_SATELLITE_MAP:
						return "air";
					case G_HYBRID_MAP:
						return "hybrid";					
					case G_NORMAL_MAP:
					default:
						return "normal";
				}
		}
	},

	addOverlay:	function(mrk){
		switch(_map_server){
			case 'fe':
				this.pan(mrk.point);
				var mp = this.map;
				setTimeout(function(){
					mp.addOverlay(mrk.getOriginal());
				},2500);
				break;
			case 've':
				this.map.AddShape(mrk.getOriginal());
				break;
			case 'gmap':
			default:
				this.map.addOverlay(mrk.getOriginal());
		}
	},

	removeOverlay:	function(mrk){
		switch(_map_server){
			case 'fe':
				this.map.clearOverlays();
				break;
			case 've':
				this.map.DeleteShape(mrk.getOriginal());
				break;
			case 'gmap':
			default:
				this.map.removeOverlay(mrk.getOriginal());
		}
	},

	clearOverlays:	function(){
		switch(_map_server){
			case 'fe':
				this.map.clearOverlays();
				break;
			case 've':
				break;
			case 'gmap':
			default:
				this.map.clearOverlays();
		}
	},
	
	getCurrentMapType: function(){
		switch(_map_server){
			case 'fe':
				return ogmMapType.THREED;
			case 've':
				var tmp = this.map.GetMapStyle();
		 		switch(mapType)	{
 					case VEMapStyle.Road:
 						return ogmMapType.NORMAL;
 					case VEMapStyle.Aerial:
 					case VEMapStyle.Birdeye:
 						return ogmMapType.AERIAL;
 					case VEMapStyle.Hybrid:
 						return ogmMapType.HYBRID;
		 		}
			case 'gmap':
			default:
				var tmp = this.map.getCurrentMapType();
		 		switch(mapType)	{
 					case GMapType.G_NORMAL_MAP:
 						return ogmMapType.NORMAL;
 					case GMapType.G_SATTELITE_MAP:
 						return ogmMapType.AERIAL;
 					case GMapType.G_HYBRID_MAP:
 						return ogmMapType.HYBRID;
		 		}
 		}
	},

	pan:		function(loc){		
		switch(_map_server){
			case 'fe':
    			var easeFunctions = ['easenone', 'easeinquad', 'easeincubic', 'easeinexpo', 'easeoutelastic'];
			    var delay = Math.random() * 2000;
      			delay += 500;
				this.map.panTo(loc.latlng,delay/1000,easeFunctions[Math.floor(Math.random() * easeFunctions.length)]);
				break;
			case 've':
				this.map.PanToLatLong(loc.latlng);
				break;
			case 'gmap':
			default:
		 		this.map.panTo(loc.latlng);
		}
	},

	getZoom:	function(){
		switch(_map_server){
			case 'fe':
				return 18;
//				return this.map.getAltitude();
				break;
			case 've':
				return this.map.GetZoomLevel();
			case 'gmap':
			default:
				return this.map.getZoom();
		}
	},

	setZoom:	function(zoom){
		switch(_map_server){
			case 'fe':
				this.map.zoomTo(zoom);
				break;
			case 've':
				this.map.SetZoomLevel(zoom);
				break;
			case 'gmap':
			default:
				this.map.setZoom(zoom);
		}
	},
	
	closeInfoWindow:	function(){
		switch(_map_server){
			case 'fe':
				this.map.closeInfoWindow();	
				break;
			case 've':
				this.map.HideInfoBox();
				break;
			case 'gmap':
			default:
				this.map.closeInfoWindow();	
		}
	},
	
	getInfoWindow:	function(){
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				break;
			case 'gmap':
			default:
				var ret =  new ogmInfoWindow(this.map.getInfoWindow());
				return ret;	
		}		
	},

	checkResize	:	function(){
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				break;
			case 'gmap':
			default:
				this.map.checkResize();	
		}
	},

	getBounds	:	function(){
		var ret = null;
		switch(_map_server){
			case 'fe':
				var tmp = this.getCenter();
				var sw = new ogmLatLng(tmp.lat()-5>-90?tmp.lat()-5:-90,tmp.lng()-5>-180?tmp.lng()-5:360+tmp.lng()-5);
				var ne = new ogmLatLng(tmp.lat()+5<90?tmp.lat()+5:90,tmp.lng()+5<180?tmp.lng()+5:tmp.lng()+5-360);
				ret = new ogmLatLngBounds(sw,ne);
				break;
			case 've':
				var tmp = this.map.GetMapView();
				var sw = new ogmLatLng(tmp.BottomRightLatLong.Latitude,tmp.TopLeftLatLong.Longitude);
				var ne = new ogmLatLng(tmp.TopLeftLatLong.Latitude,tmp.BottomRightLatLong.Longitude);
				ret = new ogmLatLngBounds(sw,ne);	
				break;
			case 'gmap':
			default:
				var tmp = this.map.getBounds();
				var sw = new ogmLatLng(tmp.getSouthWest().lat(),tmp.getSouthWest().lng());
				var ne = new ogmLatLng(tmp.getNorthEast().lat(),tmp.getNorthEast().lng());
				ret = new ogmLatLngBounds(sw,ne);	
		}
		return ret;
	},
	
	getContainer	: function(){
		switch(_map_server){
			case 'fe':
				return this.map.getContainer();	
			case 've':
				return;
			case 'gmap':
			default:
				return this.map.getContainer();	
		}
	}
};

ogmLatLng = function(lat,lng){
	if(lat<-90){ lat = -90; }
	if(lat>90){ lat = 90; }
	if(lng<-180){ lng = -180; }
	if(lng>180){ lng = 180; }

	switch(_map_server){
		case 'fe':
			this.latlng = new FE.LatLng(lat,lng);
			break;
		case 've':
			this.latlng = new VELatLong(lat,lng);
			break;
		case 'gmap':
		default:
			this.latlng = new GLatLng(lat,lng);
	}
};

ogmLatLng.prototype = {
	getOriginal: function(){
		return this.latlng;
	},
	
	lat	:	function(){
		switch(_map_server){
			case 'fe':
				return this.latlng.lat;
			case 've':
				return this.latlng.Latitude;
			case 'gmap':
			default:
				return this.latlng.lat();	
		}				
	},
	
	lng :	function(){
		switch(_map_server){
			case 'fe':
				return this.latlng.lng;
			case 've':
				return this.latlng.Longitude;
			case 'gmap':
			default:
				return this.latlng.lng();	
		}		
	},
	
	distanceFrom :	function(other){
		switch(_map_server){
			case 'fe':
			case 've':
				var lat1 = this.lat()/180*Math.PI;
				var lng1 = this.lng()/180*Math.PI;
				var lat2 = other.lat()/180*Math.PI;
				var lng2 = other.lng()/180*Math.PI;
				var R = 6370*1000;
				
				var a = Math.sin(lat1)*Math.sin(lat2)+Math.cos(lat1)*Math.cos(lat2)*Math.cos(lng2-lng1);
				var h = Math.acos(a);
				
				var ret = R*h;
				return ret;
			case 'gmap':
			default:
				var ret = this.latlng.distanceFrom(other.latlng); 
				return 	ret;
		}		
	}	
};

ogmLatLngBounds = function(sw,ne){
	switch(_map_server){
		case 'fe':
			this.latlngBounds = {sw:sw,ne:ne};
			break;
		case 've':
			var se = new ogmLatLng(sw.lat(),ne.lng());
			var nw = new ogmLatLng(ne.lat(),sw.lng());
			this.latlngBounds = new VELatLongRectangle(nw.latlng,se.latlng,ne.latlng,sw.latlng);
			break;
		case 'gmap':
		default:
			this.latlngBounds = new GLatLngBounds(sw.latlng,ne.latlng);
	}
};

ogmLatLngBounds.prototype = {
	getOriginal: function(){
		return this.latlngBounds;
	},
		
	getSouthWest	:	function(){
		var ret = null;
		switch(_map_server){
			case 'fe':
				var ret = this.latlngBounds.sw;
				break;
			case 've':
				var tmp = this.latlngBounds.BottomRightLatLong;
				var tmp2 = this.latlngBounds.TopLeftLatLong;
				ret = new ogmLatLng(tmp.Latitude,tmp2.Longitude);
				break;
			case 'gmap':
			default:
				var tmp = this.latlngBounds.getSouthWest();
				ret = new ogmLatLng(tmp.lat(),tmp.lng());
		}
		return ret;
	},
	
	getNorthEast :	function(){
		var ret = null;
		switch(_map_server){
			case 'fe':
				var ret = this.latlngBounds.ne;
				break;
			case 've':
				var tmp = this.latlngBounds.TopLeftLatLong;
				var tmp2 = this.latlngBounds.BottomRightLatLong;
				ret = new ogmLatLng(tmp.Latitude,tmp2.Longitude);
				break;
			case 'gmap':
			default:
				var tmp = this.latlngBounds.getNorthEast();
				ret = new ogmLatLng(tmp.lat(),tmp.lng());
		}
		return ret;
	},

	getCenter :	function(){
		var ret = null;
		switch(_map_server){
			case 'fe':
				var sw = this.sw;
				var ne = this.ne;
				var lat1 = sw.lat();
				var lat2 = ne.lat();
				var lng1 = sw.lng();
				var lng2 = ne.lng();
				
				var c_lat = (lat1+lat2)/2;
				var c_lng = lng1>lng2?(lng1+lng2)/2:((lng1+lng2)>0?(lng1+lng2)/2-180:180+(lng1+lng2)/2);
				ret = new ogmLatLng(c_lat,c_lng);
				break;			
			case 've':
				var se = this.latlngBounds.BottomRightLatLong;
				var nw = this.latlngBounds.TopLeftLatLong;
				var lat1 = se.Latitude;
				var lat2 = nw.Latitude;
				var lng1 = nw.Longitude;
				var lng2 = se.Longitude;
				
				var c_lat = (lat1+lat2)/2;
				var c_lng = lng1>lng2?(lng1+lng2)/2:((lng1+lng2)>0?(lng1+lng2)/2-180:180+(lng1+lng2)/2);
				ret = new ogmLatLng(c_lat,c_lng);
				break;			
			case 'gmap':
			default:
				var tmp = this.latlngBounds.getCenter();
				ret = new ogmLatLng(tmp.lat(),tmp.lng());
		}
		return ret;
	}	
};

ogmPolyline = function(points,color,width,opt){
	var gpoints = [];
	for(var i=0; i<points.length; i++){
		gpoints[i] = points[i].latlng;
	}

	switch(_map_server){
		case 'fe':
			break;
		case 've':
			this.polyline = new VEShape(VEShapeType.Polyline,gpoints);
			this.map = opt.map.getOriginal();
			break;
		case 'gmap':
		default:
			this.polyline = new GPolyline(gpoints,color,width);
	}
};

ogmPolyline.prototype = {
	getOriginal: function(){
		return this.polyline;
	}
};

ogmInfoWindow = function(iw){
	switch(_map_server){
		case 'fe':
			break;
		case 've':
			break;
		case 'gmap':
		default:
			this.iw = iw;
	}		
};

ogmInfoWindow.prototype = {
	getPoint:	function(){
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				break;
			case 'gmap':
			default:
				var pt = this.iw.getPoint();
				var ret = new ogmLatLng(pt.lat(),pt.lng());
				return ret;
		}
	}		
};

ogmMarker = function(point,opt){
	this.point = point;
	switch(_map_server){
		case 'fe':
			if(!opt || !opt.icon){
				var icon = 'http://ongmap.com/images/icons/markers/red_MarkerF.png';
			}else{
				var icon = opt.icon;
			}
			this.marker = new FE.Pushpin(point.latlng,icon);
			break;
		case 've':
			this.marker = new VEShape(VEShapeType.Pushpin,[point.latlng]);
			this.map = opt.map.getOriginal();
			this.marker.callback = [];
			this.marker.callback['onmouseover'] = function(){ return true; }
			break;
		case 'gmap':
		default:
			if(opt && opt.label){
				var icon = new GIcon();
				icon.image = './images/icons/markers/red_marker.png';
				icon.iconSize = new GSize(32, 32);
				icon.iconAnchor = new GPoint(16, 16);
				icon.infoWindowAnchor = new GPoint(25, 7);
				
				this.marker = new LabeledMarker(point.latlng,{
					clickable: true,
					icon: icon,
					labelOffset: new GSize(-16, -16),
					labelText: opt.label
				});
			}else{
				var baseIcon = new GIcon();	
				if(opt && opt.icon){
					var w = parseInt(opt.icon.width);
					var h = parseInt(opt.icon.height);
				
					baseIcon.image = opt.icon.image;
					baseIcon.iconSize = new GSize(w, h);
					baseIcon.iconAnchor = new GPoint(Math.round(w/2)-1, h);
					baseIcon.infoWindowAnchor = new GPoint(Math.round(w/2)-1, 2);
				}else{
					baseIcon.image = './images/icons/markers/icon_pin.png';
					baseIcon.iconSize = new GSize(32, 32);
					baseIcon.iconAnchor = new GPoint(15, 32);
					baseIcon.infoWindowAnchor = new GPoint(15, 2);
					baseIcon.infoShadowAnchor = new GPoint(23, 25);	
				}
/*			
			baseIcon.iconSize = new GSize(20, 34);
			baseIcon.shadowSize = new GSize(37, 34);
			baseIcon.iconAnchor = new GPoint(9, 34);
			baseIcon.infoWindowAnchor = new GPoint(9, 2);
			baseIcon.infoShadowAnchor = new GPoint(18, 25);	
*/
				this.marker = new GMarker(point.latlng,{
					icon: baseIcon,
					dragCrossMove:true,
					draggable:true,
					bouncy: true
				});
			
				this.marker.disableDragging();
			}
	}
};

ogmMarker.prototype = {
	getOriginal: function(){
		return this.marker;
	},
	
	enableDragging		:	function(){
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				break;
			case 'gmap':
			default:
				this.marker.enableDragging();
		}		
	},

	disableDragging		:	function(){
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				break;
			case 'gmap':
			default:
				this.marker.disableDragging();
		}		
	},
		
	openInfoWindowHtml	:	function(msg,opt){
		switch(_map_server){
			case 'fe':
				this.marker.openInfoWindowHtml(msg);
				break;
			case 've':
				if(typeof msg == 'object'){ msg = msg.innerHTML; }
				this.marker.SetTitle('');
				this.marker.SetDescription(msg);
				this.map.ShowInfoBox(this.marker);
				break;
			case 'gmap':
			default:
				this.marker.openInfoWindowHtml(msg,opt);
		}
	},

	setImage	:	function(url){
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				break;
			case 'gmap':
			default:
				this.marker.setImage(url);
		}		
	},
	
	getPoint	:	function(){
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				break;
			case 'gmap':
			default:
				var pt = this.marker.getPoint();
				var ret = new ogmLatLng(pt.lat(),pt.lng());
				return ret;
		}		
	}
};

ogmGeocoder = function(){
	switch(_map_server){
		case 'fe':
			break;
		case 've':
			this.geocoder = new Object();
			break;
		case 'gmap':
		default:
			this.geocoder = new GClientGeocoder();
	}
};

ogmGeocoder.prototype = {
	getOriginal: function(){
		return this.geocoder;
	},

	getLocations	:	function(address,callback){
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				return null;
			case 'gmap':
			default:
				this.geocoder.getLocations(address,function(locations){
					callback(locations);
				});
		}
	}		
};

ogmEvent = {
	addListener	:	function(target,event,callback){
		switch(_map_server){
			case 'fe':
				FE.Event.addListener(target.getOriginal(),event,function(){
					callback();
				});
				break;
			case 've':
				var ev = {
					'click':'onclick',
					'dragend':'onendpan',
					'zoomend':'onendzoom'
				};
				
				var evt = ev[event];
				var org = target.getOriginal();
				
				if(!org.callback){ org.callback = []; }
				org.callback[evt] = callback;
				break;
			case 'gmap':
			default:
				GEvent.addListener(target.getOriginal(),event,function(){
					if(arguments && arguments.length>0){
						callback(arguments);
					}else{
						callback();
					}
				});
		}
	},


	clearListeners	:	function(target,event){
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				break;
			case 'gmap':
			default:
				GEvent.clearListeners(target.getOriginal(),event);
		}
	},
		
	clearInstanceListeners:	function(target){
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				target.getOriginal().callback = [];
				break;
			case 'gmap':
			default:
				GEvent.clearInstanceListeners(target.getOriginal());
		}		
	},
	
	trigger:	function(target,event){
		switch(_map_server){
			case 'fe':
				break;
			case 've':
				var ev = {
					'click':'onclick',
					'dblclick':'ondoubleclick',
					'dragend':'onendpan',
					'zoomend':'onendzoom'
				};
				var org = target.getOriginal();
				if(org.callback){
					var cb = org.callback[ev[event]];
					cb();
				}
				break;
			case 'gmap':
			default:
				GEvent.trigger(target.getOriginal(),event);
		}		
	}
};

ogmMapType = {
	NORMAL:	"normal",
	HYBRID:	"hubrid",
	AERIAL:	"aerial",
	THREED: "3d"
};

////////////////////////////////////////////////////////////////////
// Globals
window.onload = createOnGMap;
window.onunload = unloadOnGMap;

function createOnGMap(){
	var geoip_used = false;

    if(ogmBrowserIsCompatible(_map_server)){
    	if(!centerLat || !centerLng){
	    	centerLat = geoip_latitude();
    		centerLng = geoip_longitude();
    		if(!_lang && geoip_country_name()=="Japan"){ OGM.msg.mode = "jp"; }
			else if(!_lang){ OGM.msg.mode = "en"; }
			geoip_used = true;
    	}
    	
    	if(typeof _username != 'undefined'){
    		OGM.status.username = _username;
    	}

    	if(typeof _session_token != 'undefined'){
    		OGM.status.session_token = _session_token;
    	}

		// if geoip failed
    	if(!centerLat || !centerLng){
    		centerLat = 0;
    		centerLng = 0;
    	}

    	Ext.onReady(function(){
	    	// Initialize data
	    	var conn = new Ext.data.Connection();	
			conn.request({
				url		:	"./ogm_init_handler.php",
				params	:	{
					mode	: "init",
					lang	: OGM.msg.mode
				},
				scope	:	this,
				callback:	function(o,s,r){
					if(s){
						if(r.responseText.length==0){ return; }
						eval("var res = "+r.responseText);
						OGM.msg.msg = res.msg;
						OGM.mode = res.mode;
						OGM.msg.infowindow = res.infowindow;
						ogm_init();

						if(geoip_used){
							var c_url = mapObj.getUrl();
							var conn = new Ext.data.Connection();
							conn.request({
								url		:	"./ogm_init_handler.php",
								params	:	{ mode: "set_default_loc", url: c_url  },
								callback:	function(o,s,r){
									if(s){
										var res = r.responseText;
										if(res=='OK'){
											setTimeout(function(){
												Ext.Msg.alert(OGM.msg.get('title_welcome'),
															  OGM.msg.get('msg_welcome'));
											},1200);
										}
									}
								}
							});
						}
					}else{
						
					}				
				}
			});
		});
    
		ogm_init = function(){
			var dBoard = new DrawingBoard('div_drawing_board',{
				innerDivId	:	'div_drawing_board_items'
			});			

			mapObj.canvas = dBoard;
		
			var menu = new TopMenu(
				{ id: 'div_menu', canvas:	dBoard }
			);
			
			Ext.get("loading_message").remove();
			Ext.Msg.wait("Loading","Loadind data...");
				
			setTimeout(function(){Ext.Msg.hide();}, 1000);		
			
			// Layout handling
			var layout = new Ext.BorderLayout(document.body,{
				north:	{
            		split:true,
               		autoScroll:false,
               		initialSize: 28,
               		minSize: 28,
               		maxSize: 28,
               		titlebar: false,
               		collapsible: true,
               		collapsed: false,
               		useShim: false,
               		animate: false
				},
			
				center: {
					titlebar:	false
				},

				east:	{
        	       split:true,
        	       autoScroll:true,
        	       initialSize: 300,
        	       minSize: 50,
        	       maxSize: 500,
        	       titlebar: true,
        	       collapsible: true,
        	       collapsed: true,
        	       useShim: true,
        	       animate: true,
		           tabPosition: 'top',
		           resizeTabs: true,
		           alwaysShowTabs: true        	       
				},
				west:	{
    	           split:true,
    	           autoScroll:false,
    	           initialSize: 200,
    	           minSize: 200,
    	           maxSize: 200,
    	           resizable: false,
    	           titlebar: true,
    	           collapsible: true,
    	           collapsed: false,
    	           useShim: true,
    	           animate: true
				},
				south:	{
    	           split:true,
    	           autoScroll:false,
    	           initialSize: 200,
    	           minSize: 200,
    	           maxSize: 200,
    	           titlebar: true,
    	           collapsible: true,
        	       collapsed: true,
        	       useShim: true,
        	       animate: true,
        	       cmargins: {top:2,bottom:0,right:0,left:0}
				}
			});
		
			var CP = Ext.ContentPanel;

			layout.beginUpdate();

			var center_p= new CP("center", "Map");
			var south_p	= new CP("south", {
				title:"Data",
				fitToFrame:true,
				resizeEl:"south"
			});

			var north_p	= new CP("north", "Map");

			var west_p	= new CP("west", {
				title:"Menu",
				autoScroll:false,
				fitToFrame:true
			});
					
			var acc = new Ext.ux.Accordion('west', { 
				title: OGM.msg.get('title_control_panel'),
				body: 'west_body',
				fitContainer: true, 
				fitToFrame: true , 
				useShadow: true,
				adjustments: [ 0, -26 ]
			});

			var pnl_idx = ['tree','search','url','weather','address','elevation','area_keywords','cropmap','misc'];

			var pnl_cfg = {
				tree			: {id: 'acc_panel_tree', as:true,icon: './images/icons/folder.gif'},
				search			: {id: 'acc_panel_search', as:false, icon: './images/icons/keyboard.gif'},
				url				: {id: 'acc_panel_url', as:false, flag: 'urlFlag', icon: './images/icons/link.gif'},
				weather			: {id: 'acc_panel_weather', as:false,flag: 'weatherFlag', icon: './images/icons/weather_cloudy.gif'},
				address			: {id: 'acc_panel_address', as:false,flag: 'addressFlag', icon: './images/icons/font.gif'},
				elevation		: {id: 'acc_panel_elevation', as:false,flag: 'elevationFlag', icon: './images/icons/arrow_up.gif'},
				area_keywords	: {id: 'acc_panel_area_keywords', as:false,flag: 'areaKeyFlag', icon: './images/icons/star.gif'},
				cropmap			: {id: 'acc_panel_cropmap', as:false,flag: 'cropFlag', icon: './images/icons/shape_handles.gif'},
				misc			: {id: 'acc_panel_misc', as:false, icon: './images/icons/tag_orange.gif'}
			};			

			Ext.get(pnl_cfg.tree.id).dom.innerHTML = '<div>'+OGM.msg.get('title_menu')+'</div><div id="acc_tree_menu"></div>';
			Ext.get(pnl_cfg.search.id).dom.innerHTML = '<div>'+OGM.msg.get('title_search')+'</div><div id="acc_search"></div>';
			Ext.get(pnl_cfg.url.id).dom.innerHTML = '<div>'+OGM.msg.get('title_url')+'</div><div id="acc_url"><input id="acc_url_input" class="x-form-text" type="text" size="25" /></div>';
			Ext.get(pnl_cfg.weather.id).dom.innerHTML = '<div>'+OGM.msg.get('title_weather')+'<span id="weather_loc"></span></div><div id="acc_weather" class="weather"></div>';
			Ext.get(pnl_cfg.misc.id).dom.innerHTML = '<div>'+OGM.msg.get('title_misc')+'</div><div id="acc_misc"></div>';
			Ext.get(pnl_cfg.address.id).dom.innerHTML = '<div>'+OGM.msg.get('title_address')+'</div><div id="acc_address" class="address"></div>';
			Ext.get(pnl_cfg.elevation.id).dom.innerHTML = '<div>'+OGM.msg.get('title_elevation')+'</div><div id="acc_elevation" class="elevation"></div>';
			Ext.get(pnl_cfg.area_keywords.id).dom.innerHTML = '<div>'+OGM.msg.get('title_area_keywords')+'</div><div id="acc_area_keywords" class="area_keywords"></div>';
			Ext.get(pnl_cfg.cropmap.id).dom.innerHTML = '<div>'+OGM.msg.get('title_cropmap')+'</div><div id="acc_cropmap" class="area_cropmap"><a href="http://ongmap.com/blog/?p=117" target="_blank">Help?</a><br /><form><textarea id="ogm_crop_tag" readonly="readonly" rows="5" style="width:190px;font-size:small"></textarea></form></div>';

			var pnl_num = pnl_idx.length;
			OGM.acc_panels = [];
			
			for(var j=0; j<pnl_num; j++){
				var cfg = pnl_cfg[pnl_idx[j]];
				var panel = new Ext.ux.InfoPanel(cfg.id, {
					trigger		:'title',
//					pinned		:cfg.pinned,
					icon		: cfg.icon,
					showPin		: true, 
					collapseOnUnpin: true,
					autoScroll  : cfg.as,
					resizable	: true
				});
				
				acc.add(panel);	
				
				if(cfg.flag){
					(function(p,f){
						p.on('expand',function(){ 
							OGM.status[f] = 1;
							if(f=='cropFlag'){ 
								mapObj.setCropMode();
							}else{
								mapObj.news();
							}
						});
						p.on('collapse',function(){ 
							OGM.status[f] = 0; 
							if(f=='cropFlag'){ mapObj.unsetCropMode(); }
						});
					})(panel,cfg.flag);
				}
				
				OGM.acc_panels[j] = panel
			}
							
			Ext.get('west').setStyle({visibility:"visible"});
	
			OGM.acc_panels[0].expand(true);
			if(Ext.isIE){
				Ext.get('acc_tree_menu').setStyle({width:'198px'});
			}

			OGM.acc_panels[0].pinned = true;
			
			layout.add("center", center_p);
			layout.add("west", acc);
			layout.add("north", north_p);
			layout.add("south", south_p);
			layout.endUpdate();

			layout.on("regionexpanded",function(o){
				mapObj.checkResize();
				if(o.getPosition() == "south"){
					var h = o.getEl().getHeight();
					var d = Ext.get("div_drawing_board");
					var t = Ext.get("div_drawing_board_items");
				
					d.setHeight(h-25);
					t.setHeight(h-25);
				}else if(o.getPosition() == "east"){
					o.expanded = true;
					layout.getRegion('south').collapse();
					OGM.data.RetrieveNewsBlogs(o);
				}
			});

			layout.on("regioncollapsed",function(o){
				mapObj.checkResize();
				if(o.getPosition() == "east"){
					o.expanded = false;
				}
			});
			
			layout.on("regionresized",function(o,h){
				mapObj.checkResize();
				
				if(o.getPosition() == "south"){
					var d = Ext.get("div_drawing_board");
					var t = Ext.get("div_drawing_board_items");
				
					d.setHeight(h-25);
					t.setHeight(h-25);
				}
			});
			
			var Tree = Ext.tree;
		    var tree = new Tree.TreePanel(Ext.get("acc_tree_menu"), {
		        animate:true, 
		        loader: new Tree.TreeLoader({
		        	dataUrl		: 'ogm_init_handler.php',
		        	baseParams	: {
		        		mode	: 'tree',
		        		lang	: OGM.msg.mode
		        	}
		        }),
		        containerScroll: true
		    });
		    
		    // set the root node
		    var root = new Tree.AsyncTreeNode({
		        text: 'menu',
		        draggable:false,
		        id:'source'
		    });
		    tree.setRootNode(root);

		    // render the tree
		    tree.render();
		    root.expand();
    
		    tree.on('click',function(n,e){
		    	if(n.attributes.callback){
		    		eval(n.attributes.callback);
		    	}
		    });
		    
		    var sorter = new Tree.TreeSorter(tree,{
		    	folderSort:	true
		    });
		    
		    OGM.layout = layout;
		    OGM.tree   = tree;		    
		    
		    // Create Map
    	   	var mapDIV = document.getElementById('div_map');
			var gmapObj = new ogmMap(mapDIV,_map_server);
   		   	gmapObj.setCenter(new ogmLatLng(centerLat,centerLng),mapZoom);
   		   	gmapObj.setMapType(_map_type);
   		   	   		   	
   		   	/////////////
			var search_keywords = new Ext.form.TextField({
		        name		:	"acc_search_keywords",
		        id			:	"acc_search_keywords",
		        width		:	180
		    });		        

			var search_option = new Ext.data.SimpleStore({
				fields: ['option', 'option_title'],
				data : [
					[0,OGM.msg.get('menu_search_address')],
					[1,OGM.msg.get('menu_search_photo')],
					[2,OGM.msg.get('menu_search_video')]
				]
			});
			
			var search_combo = new Ext.form.ComboBox({
			    store: search_option,
			    displayField:'option_title',
			    valueField:'option',
			    value: 0,
			    typeAhead: true,
			    mode: 'local',
			    triggerAction: 'all',
			    emptyText:'Select a state...',
			    readOnly: true,
			    selectOnFocus:true,
			    width: 170
			});
				
		    var search_form = new Ext.form.Form();
		    search_form.column({
					labelWidth	:	0,
					labelSeparator: '',					
					width		:	198,
			    	style		:	{border: "none", 'margin-top':'3px',padding:0}
		    	},
		    	search_keywords,
		    	search_combo
			);

			search_form.addButton({
				text	:	OGM.msg.get('title_search_button'),
				handler	:	function(){
					var sk = search_keywords.getRawValue();
					if(sk.length==0){ return; }

					var op = search_combo.getValue();
					if(op.length==0){ return; }

					switch(op){
						case 0:
							OGM.status.mask();
							searchAndMove(sk);
							break;
						case 1:
					    	generalSearch({type:'image',cat:'photo_search_keyword',search:sk});
							break;
						case 2:
					    	generalSearch({type:'image',cat:'video_search_keyword',search:sk});
							break;
						default:
							break;
					}
				}
			});	
		    search_form.render(Ext.get('acc_search'));   		   	
		    search_keywords.on("specialkey",function(t,e){
		    	if(e.getKey()==Ext.EventObject.RETURN){
					var sk = search_keywords.getRawValue();
					if(sk.length==0){ return; }

					var op = search_combo.getValue();
					if(op.length==0){ return; }

					switch(op){
						case 0:
							OGM.status.mask();
							searchAndMove(sk);
							break;
						case 1:
					    	generalSearch({type:'image',cat:'photo_search_keyword',search:sk});
							break;
						case 2:
					    	generalSearch({type:'image',cat:'video_search_keyword',search:sk});
							break;
						default:
							OGM.status.unmask();
							break;
					}
		    	}    	
		    });    

			var misc_tb = new Ext.Toolbar(Ext.get('acc_misc'));
			var toggle_ve = new Ext.Toolbar.Button({
				cls:  "x-btn-icon",
				icon: "./images/icons/markers/blue_MarkerV.png",
		       	tooltip: { text: OGM.msg.get('qtip_menu_ve'), autoHide:true },
		       	enableToggle: true,
		       	toggleHandler: function(i,p){
		       		if(p){
			       		Ext.Msg.confirm(OGM.msg.get('title_map_change'),OGM.msg.get('msg_switch_to_ve'),function(id){
		    	   			if(id=="yes"){
		    	   				var new_url = mapObj.getUrl().replace(/map_server=.*/,"map_server=ve");
								location.href = new_url;	
		       				}else{
		       					toggle_ve.toggle(false);
		       				}
		    	   		});
		       		}    	   		
		       	},
		       	pressed: _map_server=='ve'?true:false
		   	});

			var toggle_gmap = new Ext.Toolbar.Button({
				cls:  "x-btn-icon",
				icon: "./images/icons/markers/red_MarkerG.png",
		       	tooltip: { text: OGM.msg.get('qtip_menu_gmap'), autoHide:true },
		       	enableToggle: true,
		       	toggleHandler: function(i,p){
		       		if(p){
			       		Ext.Msg.confirm(OGM.msg.get('title_map_change'),OGM.msg.get('msg_switch_to_gmap'),function(id){
		    	   			if(id=="yes"){
		    	   				var new_url = mapObj.getUrl().replace(/map_server=.*/,"map_server=gmap");
								location.href = new_url;	
		       				}else{
		       					toggle_gmap.toggle(false);
		       				}
		    	   		});
		       		}    	   		
		       	},
		       	pressed: _map_server=='gmap'?true:false
		   	});
			
			misc_tb.add(
				toggle_gmap,
				toggle_ve,'-',
				new Ext.Toolbar.Button({
					cls:  "x-btn-icon",
					icon: "./images/delicious.small.gif",
					tooltip: { text: OGM.msg.get('qtip_delicious'), autoHide:true },
					handler: function(){
						window.open(
							'http://del.icio.us/post?v=4&noui&jump=close&url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title), 
							'delicious',
							'toolbar=no,width=700,height=400');
					}
				}),
				new Ext.Toolbar.Button({
					cls:  "x-btn-icon",
					icon: "./images/icon_su.gif",
					tooltip: { text: 'Stumble!', autoHide:true },
					handler: function(){
						window.open('http://www.stumbleupon.com/submit?url=http://ongmap.com/&title=ONGMAP.COM');
					}
				}),	
				new Ext.Toolbar.Button({
					cls:  "x-btn-icon",
					icon: "./images/hatena.append.gif",
					tooltip: { text: OGM.msg.get('qtip_hatena'), autoHide:true },
					handler: function(){
						window.open('http://b.hatena.ne.jp/append?'+encodeURIComponent(location.href)); 
					}
				})
			);
   		   	/////////////
   		   	   		   	   		   	
			var context = createContextMenu();
			OGM.contextmenu = context;

		   	ogmEvent.addListener(gmapObj,"singlerightclick",function(args){
	   			var point = args[0]; // Google Maps Only
	   			var westPanel = OGM.layout.getRegion('west').el;
	   			if(westPanel.dom.style.visibility=='hidden'){
		   			var offsetX = 0;	   				
	   			}else{
		   			var offsetX = westPanel.getWidth();
	   			}
	   			var offsetY = OGM.layout.getRegion('north').el.getHeight();
	   			
			   	if(OGM.status.session_token && OGM.status.kmlurl){
			   		OGM.contextmenu.kml.enable();
			   	}else{
			   		OGM.contextmenu.kml.disable();			   		
			   	}
	   			
	   			OGM.contextmenu.coord = mapObj.map.getOriginal().fromContainerPixelToLatLng(point);
	   			OGM.contextmenu.showAt([point.x+offsetX,point.y+offsetY]);   		   		
	   		});

	   		ogmEvent.addListener(gmapObj,"click",function(args){
	   			OGM.contextmenu.hide();   		   		
	   		});

   		   	ogmEvent.addListener(gmapObj,"infowindowopen",function(){
   		   		var selectbx = document.getElementById("ogm_infowindow_search_form");
   		   		if(selectbx){
   		   			var center = gmapObj.getInfoWindow().getPoint();
					var conn = new Ext.data.Connection();		
					conn.request({
						url		:	"./ogm_js_handler.php",
						params	:	{ 
							type	: "country",
							lat	: center.lat(), 
							lng	: center.lng()
						},
						scope	:	this,
						callback:	function(o,s,r){
							if(s){
								var res = r.responseText;
								if(res=='jp' || res=='us' || res=='world'){
									selectbx.innerHTML = OGM.msg.infowindow[res];
								}
							}
						}
					});
   		   		}
   		   	});
   		   	
   		   	mapObj.add(gmapObj);
   		   	mapObj.news();
   		   	   		   	
   		   	if(_kml){ OGM.kml.view(_kml); }
		};
    }	
};

OnGmap = function(){
	this.map 		= null;
	this.current 	= 0;
	this.timeout	= new Object();
	this.request	= null;
	this.autoUpdate = false;
	this.markers	= [];
	this.lines		= [];
	this.mode		= null;
	this.tag		= null;
	this.chkboxes  = [];
};

OnGmap.prototype = {
	setCropMode:	function(){
		mapObj.map.getOriginal().disableScrollWheelZoom();
		Ext.get("div_map_magnifyingglass").remove();

		if(OGM.cropbox){
			OGM.cropbox.setStyle({
				top		: 0,
				left	: 0,
				display: 'none',
				width	: 0,
				height	: 0
			});			
		}else{
			OGM.cropbox = new Ext.get(document.createElement('DIV'));
			OGM.cropbox.appendTo(Ext.get("div_map"));
		
			OGM.cropbox.setStyle({
				position: "relative",
				top		: 0,
				left	: 0,
				display: 'none',
				width	: 0,
				height	: 0,
				borderWidth: '3px',
				borderStyle: 'solid',
				borderColor: "red"
			});
		}

		if(OGM.cropbox_bd){
			OGM.cropbox_bd.setStyle({
				top		: 0,
				left	: 0,
				display: 'none',
				width	: 0,
				height	: 0
			});						
		}else{
			OGM.cropbox_bd = new Ext.get(document.createElement('DIV'));
			OGM.cropbox_bd.appendTo(Ext.get("div_map"));
		
			OGM.cropbox_bd.setStyle({
				position: "relative",
				top		: 0,
				left	: 0,
				display: 'none',
				width	: 0,
				height	: 0,
				borderWidth: '3px',
				borderStyle: 'dotted',
				borderColor: "red"
			});
		}
		
		OGM.cropbox.start = true;
		OGM.status.crop = true;
		
		ogmEvent.addListener(this.map,'click',function(args){
   			var point = args[1]; // Google Maps Only
   			
   			var pix_pt = mapObj.map.getOriginal().fromLatLngToDivPixel(point);
   			var box = mapObj.getBox();
   			var nw = new ogmLatLng(box.ne.lat,box.sw.lng);
   			var nw_pt = mapObj.map.getOriginal().fromLatLngToDivPixel(nw.getOriginal());

   			var x = parseInt(pix_pt.x)-parseInt(nw_pt.x);
   			var y = parseInt(pix_pt.y)-parseInt(nw_pt.y);
			
   			if(OGM.cropbox.start){
	   			OGM.cropbox.setStyle({
   					left	: x+'px',
   					top		: y+'px',
   					width	: 0,
   					height  : 0,
					display: 'none'
   				});
   				OGM.cropbox.start = false;
   				OGM.cropbox_bd.setStyle({
					display: ''
   				});
   			}else{
   				var cb_top = Math.min(parseInt(OGM.cropbox.dom.style.top),parseInt(y));
   				var cb_left = Math.min(parseInt(OGM.cropbox.dom.style.left),parseInt(x));
   				
   				var cb_width = Math.abs(parseInt(OGM.cropbox.dom.style.left)-parseInt(x));
   				var cb_height = Math.abs(parseInt(OGM.cropbox.dom.style.top)-parseInt(y));   				

	   			OGM.cropbox.setStyle({
   					left	: cb_left+'px',
   					top		: cb_top+'px',
   					width	: cb_width+'px',
   					height	: cb_height+'px',
					display: 'block'
   				});
   				OGM.cropbox.start = true;
   				OGM.cropbox_bd.setStyle({
					display: 'none'
   				});
   				
   				var nw_latlng = mapObj.map.getOriginal().fromContainerPixelToLatLng(new GPoint(cb_left,cb_top));
   				var se_latlng = mapObj.map.getOriginal().fromContainerPixelToLatLng(new GPoint(cb_left+cb_width,cb_top+cb_height));
   				
   				var clat = (nw_latlng.lat()+se_latlng.lat())/2;
   				var clng = (nw_latlng.lng()+se_latlng.lng())/2;
   				var dy = nw_latlng.lat()-se_latlng.lat();
   				var dx = se_latlng.lng()-nw_latlng.lng();
   				
   				if(nw_latlng.lng()>se_latlng.lng()){
   					clng = clng>0?clng-180:180+clng;
   					dx = 360+dx;
   				}
   				
   				if(OGM.msg.mode=='jp'){
   					var gurl = 'http://maps.google.co.jp/';
   					var gmsg = '拡大地図を表示';
   				}else{
   					var gurl = 'http://maps.google.com/';
   					var gmsg = 'View Larger Map';   					
   				}
   				
				if(mapObj.getMapType()=='air'){ var mtype = '&t=k'; }
				else if(mapObj.getMapType()=='hybrid'){ var mtype = '&t=h'; }
				else{ var mtype = ''; }

   				var iframe_str = '<iframe width="'+cb_width+'" height="'+cb_height+'" frameborder="no" scrolling="no"' 
								+ 'marginheight="0" marginwidth="0"	src="'+gurl+'?ie=UTF8&'
								+ 'll='+clat+','+clng
								+ '&spn='+dx+','+dy
								+ '&z='+box.zoom+mtype;
				
				
				iframe_str  += '&om=1&output=embed&s=AARTsJqzARj-Z8VnW5pkPMLMmZbqrJcYpw"></iframe><br />'
							+  '<a href="'+gurl+'?ie=UTF8&amp;z='+box.zoom+mtype+'&om=1&ll='+clat+','+clng+'&amp;source=embed" style="color:#0000FF;text-align:left;font-size:small">'+gmsg+'</a>'
							+  '<span style="text-align:right;font-size:x-small">(Tag by <a href="http://ongmap.com" style="font-size:xx-small">ongmap.com</a>)</span>';
				
				Ext.get('ogm_crop_tag').dom.value = iframe_str;
   			}
		});
		
		ogmEvent.addListener(this.map,'mousemove',function(args){
   			if(OGM.cropbox && !OGM.cropbox.start){
	   			var point = args[0]; // Google Maps Only
   			
	   			var pix_pt = mapObj.map.getOriginal().fromLatLngToDivPixel(point);
	   			var box = mapObj.getBox();
	   			var nw = new ogmLatLng(box.ne.lat,box.sw.lng);
	   			var nw_pt = mapObj.map.getOriginal().fromLatLngToDivPixel(nw.getOriginal());

	   			var x = parseInt(pix_pt.x)-parseInt(nw_pt.x);
	   			var y = parseInt(pix_pt.y)-parseInt(nw_pt.y);
  
   				var cb_top = Math.min(parseInt(OGM.cropbox.dom.style.top),parseInt(y)+8);
   				var cb_left = Math.min(parseInt(OGM.cropbox.dom.style.left),parseInt(x)+8);

   				var cb_width = Math.max(Math.abs(parseInt(OGM.cropbox.dom.style.left)-parseInt(x))-8,0);
   				var cb_height = Math.max(Math.abs(parseInt(OGM.cropbox.dom.style.top)-parseInt(y))-8,0);
   				
	   			OGM.cropbox_bd.setStyle({
   					left	: cb_left+'px',
   					top		: cb_top+'px',
   					width	: cb_width+'px',
   					height	: cb_height+'px'
   				});   				
   			}
		});		
	},
	
	unsetCropMode:	function(){
		OGM.status.crop = false;
		if(OGM.cropbox){ 
	   		OGM.cropbox.setStyle({
   				left	: 0,
   				top		: 0,
   				width	: 0,
   				height  : 0,
				display: 'none'
   			});
		}
		if(OGM.cropbox_bd){ 
	   		OGM.cropbox_bd.setStyle({
   				left	: 0,
   				top		: 0,
   				width	: 0,
   				height  : 0,
				display: 'none'
   			});
		}
		ogmEvent.clearListeners(this.map,'click');
		ogmEvent.clearListeners(this.map,'mousemove');
		
   		ogmEvent.addListener(this.map,"click",function(args){
   			OGM.contextmenu.hide();   		   		
   		});		
		mapObj.map.getOriginal().enableScrollWheelZoom();
	},
	
	add:	function(o){
		ogmEvent.addListener(o,"dragend",function(){
			OGM.mapEvent.dragend(mapObj);
		});				   	

		ogmEvent.addListener(o,"zoomend",function(){
			OGM.mapEvent.zoomend(mapObj);
		});
		
		if(_map_server=="gmap"){
			var extra_layers = ["street","crop","water","forest","tundra","swamp","grass","sand","ice","country","contour"];
			var chkboxes = [];
			for(var i=0; i<extra_layers.length; i++){	
				chkboxes[i] = new Ext.form.Checkbox({
			    	fieldLabel	: 	OGM.msg.get('msg_layer_'+extra_layers[i]),
			    	value		:	extra_layers[i]
			    });

				chkboxes[i].on('check',function(o,checked){
					var m = mapObj.map.getOriginal();
					var l = m.extraLayers[o.value];
					if(checked){
						m.addOverlay(l);
						l.visibile = true;
					}else{
						m.removeOverlay(l);
						l.visible = false;
					}
				});
			}
	
		    var frm = new Ext.form.Form();
			frm.column({
					width		:	125,
					labelWidth	:	80,
		    		labelAlign	:	"left",
		    		style		:	{verticalAlign:'top', textAlign : "left", border: "none", 'margin-left':"5px",'margin-top':'0',padding:0}
				},
				chkboxes[0],
				chkboxes[1],
				chkboxes[2],
				chkboxes[3],
				chkboxes[4],
				chkboxes[5],
				chkboxes[6],
				chkboxes[7],
				chkboxes[8],
				chkboxes[9],
				chkboxes[10]
			);
		    frm.render(Ext.get('div_extra_layers').dom);
			
			ogmEvent.addListener(o,"maptypechanged",function(){
				var mtype = o.getOriginal().getCurrentMapType().getName();
				if(mtype == "Relief" || mtype == "OSM" || mtype == "模型図" || mtype == "Hybrid Relief" || mtype == "Hybrid OSM"){
					Ext.get('div_extra_layers').show();
				}else{
//					mapObj.clearAll();
					Ext.get('div_extra_layers').hide();
					for(var i=0; i<chkboxes.length; i++){	
						chkboxes[i].reset();
					}
				}
			});		
		}
		
		this.map = o;
		this.chkboxes = chkboxes;
	},
		
	// abstraction
	setCenter:	function(loc){ this.map.setCenter(loc);},
	setCenterAndZoom:	function(loc,zoom){ this.map.setCenter(loc,zoom);},
	getCenter:	function(){ return this.map.getCenter();},
	addOverlay:	function(mrk){	this.map.addOverlay(mrk);},
	removeOverlay:	function(mrk){	this.map.removeOverlay(mrk);},
	clearOverlays:	function(){	this.map.clearOverlays();},
	getCurrentMapType: function(){	return this.map.getCurrentMapType();},
	pan: function(loc){this.map.pan(loc);},
	getZoom:	function(){ return this.map.getZoom();},
	setZoom:	function(zoom){ return this.map.setZoom(zoom);},
	getMapType:	function(){ return this.map.getMapType();},
	setMapType:	function(type){ return this.map.setMapType(type);},
	closeInfoWindow:	function(){ this.map.closeInfoWindow();},
	getInfoWindow:	function(){ return this.map.getInfoWindow();},
	checkResize	:	function(){ this.map.checkResize();},
	getBounds	:	function(){ return this.map.getBounds();},
	getContainer	: function(){ return this.map.getContainer();	},
	
	getUrl:	function(){
		var ret = 'http://'+location.hostname+location.pathname+'?';
		var center = this.getCenter();
		var zoom = this.getZoom();
		var type = this.getMapType();
		var lang = OGM.msg.mode;
		
		ret += 'lat='+center.lat()
		      +'&lng='+center.lng()
		      +'&zoom='+zoom
		      +'&map_type='+type
		      +'&lang='+lang
		      +'&map_server='+_map_server;
		
		return ret;
	},
	
	move:		function(opt){
		var lat = opt.lat;
		var lng = opt.lng;
		var datum = opt.datum;
		var msg = opt.msg;

		if(datum=='tky'){		
			var wgs = Geotool.tky2wgs(lat,lng);
			lat = wgs.lat;
			lng = wgs.lng;
		}
							
		var loc = new ogmLatLng(lat,lng);
		var mrk = new ogmMarker(loc,{map:mapObj.map});
		
		var msg_add = msg;
		if(msg){
			msg_add = '<div style="font-size:small"><p>'+msg+'</p>';
			msg_add += '<form id="ogm_infowindow_search_form"></form>';			
			msg_add += '</div>';

			ogmEvent.addListener(mrk,"click",function(){
				mrk.openInfoWindowHtml(msg_add);
			});
		}
		
		this.setCenter(new ogmLatLng(lat,lng)); 		
		this.addOverlay(mrk);
 		
		if(msg){
			mrk.openInfoWindowHtml(msg_add);
		}
		
		this.markers.push(mrk); 		
		this.news();
	},

	moveToAddress: function(address){
		if(_map_server!='gmap'){
			OGM.status.unmask();
			Ext.DialogManager.hideAll();
			Ext.Msg.hide();

			Ext.Msg.show({
				title:	OGM.msg.get("title_not_found_001"),
			   	msg: 	OGM.msg.get({id: "msg_not_found_001", arg: [address]}),
			   	buttons: Ext.Msg.OK
			});						
		}
		
		var geocoder = new ogmGeocoder();
		var ret = [];
  	
		if(address.length>0){ geocoder.getLocations(address,function(locations){
			if(locations.Status.code==200){	
				if(locations.Placemark.length>=1){
					OGM.status.unmask();
					Ext.DialogManager.hideAll();				
			   		var lng 	= locations.Placemark[0].Point.coordinates[0];
		   			var lat 	= locations.Placemark[0].Point.coordinates[1];		   	
	   				ret.push(locations.Placemark[0].address);
	   				mapObj.move({
	   					lat: lat,
	   					lng: lng,
	   					msg: locations.Placemark[0].address
	   				});
	   			}
			}else{
				OGM.status.unmask();
				Ext.DialogManager.hideAll();
				Ext.Msg.hide();

				Ext.Msg.show({
					title:	OGM.msg.get("title_not_found_001"),
				   	msg: 	OGM.msg.get({id: "msg_not_found_001", arg: [address]}),
				   	buttons: Ext.Msg.OK
				});			
	   		}});	
		}
	},
		
	zoom:		function(opt){
		if(arguments.length==0){
			return this.getZoom();
		}

		if(opt.to){
			this.setZoom(opt.to);
		}else if(opt.outBy){
			this.setZoom(this.getZoom()-opt.outBy);
		}else if(opt.inBy){
			this.setZoom(this.getZoom()+opt.outBy);
		}
		
		return this.getZoom();
	},
	
	clearAll:	function(){
		this.clearMarkers();
		this.clearLines();
		this.clearSingletonMarker();

		this.clearOverlays();
		
		this.canvas.clear();
		
		OGM.status.kmlurl = null;
	},
	
	clearMarkers:	function(){
		if(!this.markers){ return; }
		for(var i=0; i<this.markers.length; i++){
			ogmEvent.clearInstanceListeners(this.markers[i]);
			this.removeOverlay(this.markers[i]);
		}
		delete this.markers;
		this.closeInfoWindow();
		this.markers = [];
	},

	addSingletonMarker: function(m){
		this.clearSingletonMarker();
		this.addOverlay(m);
		this.marker_singleton = m;
	},
	
	clearSingletonMarker: function(){
		if(!this.marker_singleton){ return; }
		ogmEvent.clearInstanceListeners(this.marker_singleton);
		this.removeOverlay(this.marker_singleton);

		this.closeInfoWindow();
		this.marker_singleton = null;		
	},

	clearLines:	function(){
		if(!this.lines){ return; }
		for(var i=0; i<this.lines.length; i++){
			this.removeOverlay(this.lines[i]);
		}
		delete this.lines;
		this.closeInfoWindow();
		this.lines = [];
	},
	
	showMarkers:	function(opt){
		this.clearMarkers();
		
		var recs =	opt.recs;
		var ret  = [];

		for(var i=0; i<recs.length; i++){
			var d = recs[i].data;
			
			var mrk_html = '<table><tbody>';

			if(d.title && d.title.length>0){
				mrk_html += '<tr><td colspan="2"><h3>';
			
				if(d.link && d.link.length>0){ 
					mrk_html += '<a href="'+d.link+'" target="_blank">'+d.title+'</a>';
				}else{
					mrk_html += d.title;
				}
				mrk_html += '</h3></td></tr>';				
			}
			
			mrk_html += '<tr>';

			if(d.image && d.image.length>0){
				mrk_html += '<td><div class="infoWindow_img"><img src="'+d.image+'" /></div></td>';
			}			

			mrk_html += '<td>';
			
			if(d.address && d.address.length>0){
				mrk_html += '<span class="infoWindow_address>'+d.address+'</span><br />';
			}

			if(d.phone && d.phone.length>0){
				mrk_html += '<span class="infoWindow_phone>'+d.phone+'</span><br />';
			}

			if(d.desc && (d.desc.length>0 || d.desc.html)){
				if(d.desc.html){
					mrk_html += '<div class="infoWindow_body" ';
					mrk_html += 'style="width:'+d.desc.width+';height:'+d.desc.height+'">';
					mrk_html += d.desc.text;
					mrk_html += '</div>';

					var wrap_html = '<div><div id="infoWindow_open" class="infoWindow_div" ';
					wrap_html += 'style="width:'+d.desc.width+';height:'+d.desc.height+'">';
				}else{
					mrk_html += '<span class="infoWindow_desc ';
					mrk_html += 'style="width:350px;height:200px">';
					mrk_html += d.desc;
					mrk_html += '</span>';

					var wrap_html = '<div><div id="infoWindow_open" class="infoWindow_div" ';
					wrap_html += 'style="width:350px;height:200px">';
				}
								
			}else{
				var wrap_html = '<div><div id="infoWindow_open" class="infoWindow_div" ';
				wrap_html += 'style="width:150px;height:80px">';
			}

			mrk_html += '</td></tr></tbody></table>';
			
			var msg_html = wrap_html+mrk_html+'</div></div>';
			
			var marker = (function(input_arg){
				var html = input_arg.msg;
				var id = input_arg.id;
				var icon = input_arg.icon;
				var lbl = input_arg.label;

				if(lbl){
	  				var m = new ogmMarker(new ogmLatLng(d.lat,d.lng),{map:mapObj.map,label:lbl});						
				}else if(icon){
	  				var m = new ogmMarker(new ogmLatLng(d.lat,d.lng),{map:mapObj.map,
						icon : {
							image : icon,
							height: 34,
							width: 34
						}
					});
				}else{
	  				var m = new ogmMarker(new ogmLatLng(d.lat,d.lng),{map:mapObj.map});					
				}

				ogmEvent.addListener(m,"click",function(){
					m.openInfoWindowHtml(html);					
					var prtDiv = Ext.get(Ext.get('infoWindow_open').dom.parentNode);
					var w = parseInt(Ext.get('infoWindow_open').getStyle('width'))*1.05;
					var h = parseInt(Ext.get('infoWindow_open').getStyle('height'))*1.05
					prtDiv.setStyle({width:w+'px',height:h+'px'});

				});
				
				m.id = id;
					
				return m;
   			})({msg: msg_html,id: d.id, icon: d.icon, label: d.label});
						
			this.addOverlay(marker);
			ret.push(marker);		
		}
		return ret;
	},
	
	showLines:	function(opt){
		var recs =	opt.recs;
		var mrk_recs = [];
		var ret  = [];
		var lines = [];

		this.clearLines();		
		
		for(var i=0; i<recs.length; i++){
			var d = recs[i].data;			
			var tmp = {
				desc	:	d.desc,
				link	:	d.link,
				lng		:	d.to.lng,
				lat		:	d.to.lat
			};
			mrk_recs.push({data: tmp});

			var line = new ogmPolyline([
				new ogmLatLng(d.from.lat, d.from.lng),
				new ogmLatLng(d.to.lat, d.to.lng)
			],"blue",3,{map:mapObj.map});
						
			this.addOverlay(line);
			lines.push(line);
		}
		
		mapObj.lines = lines;
		return this.showMarkers({recs: mrk_recs});		
	},	
		
	getBox:			function(){
		this.checkResize();
		var b = this.getBounds();
		var sw = b.getSouthWest();
		var ne = b.getNorthEast();
		var zoom = this.zoom();
		var center = this.getCenter();

		var south = new ogmLatLng(sw.lat(),(sw.lng()+ne.lng())/2);
		var north = new ogmLatLng(ne.lat(),(sw.lng()+ne.lng())/2);
		var east = new ogmLatLng((sw.lat()+ne.lat())/2,ne.lng());
		var west = new ogmLatLng((sw.lat()+ne.lat())/2,sw.lng());
		
		var ns = south.distanceFrom(north)/1000;
		var ew = east.distanceFrom(west)/1000;
		var range = (ns>ew?ns:ew)/2;
		
		return {
			sw: { lat: sw.lat(), lng: sw.lng() }, 
			ne: { lat: ne.lat(), lng: ne.lng() },
			lat: center.lat(),
			lng: center.lng(), 
			zoom: zoom,
			range:range,
			rangeNS: ns,
			rangeEW: ew
		};
	},
	
	news:		function(){
		if(OGM.status.urlFlag){
			Ext.get("acc_url_input").dom.value = mapObj.getUrl();			
		}
		
		if(this.request && this.request.connection.isLoading()){
			this.request.connection.abort();
		}
				
		var bx = this.getBox();
		var conn = new Ext.data.Connection();
		
		if(this.request &&
		   bx.sw.lat == this.request.box.sw.lat &&
		   bx.sw.lng == this.request.box.sw.lng &&
		   bx.ne.lat == this.request.box.ne.lat &&
		   bx.ne.lng == this.request.box.ne.lng){
			var old_request = this.request;
			this.request = {
				connection: conn,
				box		  : bx,
				weather	  : OGM.status.weatherFlag-old_request.weather==1?1:0,
				address	  : OGM.status.addressFlag-old_request.address==1?1:0,
				elevation : OGM.status.elevationFlag-old_request.elevation==1?1:0,
				areaKey	  : OGM.status.areaKeyFlag-old_request.areaKey==1?1:0
			};			
		}else{
			this.request = {
				connection: conn,
				box		  : bx,
				weather	  : OGM.status.weatherFlag,
				address	  : OGM.status.addressFlag,
				elevation : OGM.status.elevationFlag,
				areaKey	  : OGM.status.areaKeyFlag
			};
		}
		
		if(bx.zoom>3){
			if(this.request.weather){
				Ext.get("acc_weather").dom.innerHTML = '<div class="loading_panel">loading...<img src="./images/loading2.gif" /></div>';
			}
		
			if(this.request.address){
				Ext.get("acc_address").dom.innerHTML = '<div class="loading_panel">loading...<img src="./images/loading2.gif" /></div>';
			}
		
			if(this.request.elevation){		
				Ext.get("acc_elevation").dom.innerHTML = '<div class="loading_panel">loading...<img src="./images/loading2.gif" /></div>';
			}
		
			if(this.request.areaKey){
				Ext.get("acc_area_keywords").dom.innerHTML = '<div class="loading_panel">loading...<img src="./images/loading2.gif" /></div>';
			}
		}
		
		if(!_loggedin && !this.request.weather && !this.request.address && !this.request.elevation && !this.request.areaKey){ return; }
		
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type	: "news",
				min_lat	: bx.sw.lat, 
				min_lng	: bx.sw.lng,
				max_lat	: bx.ne.lat, 
				max_lng	: bx.ne.lng,
				zoom	: bx.zoom,
				lang	: OGM.msg.mode,
				weather 	: this.request.weather,
				address 	: this.request.address,
				elevation	: this.request.elevation,
				areaKey		: this.request.areaKey
			},
			scope	:	this,
			callback:	function(o,s,r){
				if(s){
					if(r.responseText.length==0){ return; }
					
					eval("var res = {result:"+r.responseText+"}");
					// weather
					if(res.result.weather && this.request.weather){
						var w_data = res.result.weather;
						if(!w_data.dayaftertomorrow){
							w_data.dayaftertomorrow = {icon:'', hi:'', lo:''};
						}
							
						var d = new Ext.get("acc_weather");
							
						Ext.get("weather_loc").dom.innerHTML = '@'+w_data.title;
							
						var weather_table = '<table><tbody>'
    						+ '<tr><td>Today</td><td>-></td><td>->-></td></tr><tr>'
    						+ '<td class="weather_item"><img height="31px" src="'+w_data.today.icon+'" /></td>'
    						+ '<td class="weather_item"><img height="31px" src="'+w_data.tomorrow.icon+'" /></td>'
    						+ '<td class="weather_item">';
    					weather_table += w_data.dayaftertomorrow.icon?	
    						'<img height="31px" src="'+w_data.dayaftertomorrow.icon+'" /></td>':'';
    					weather_table += '</td></tr><tr>'
    						+ '<td class="weather_item"><span class="weather_hi">'+w_data.today.hi+'</span>'
    						+ '/<span class="weather_lo">'+w_data.today.lo+'</span></td>'
    						+ '<td class="weather_item"><span class="weather_hi">'+w_data.tomorrow.hi+'</span>'
    						+ '/<span class="weather_lo">'+w_data.tomorrow.lo+'</span></td>'
    						+ '<td class="weather_item"><span class="weather_hi">'+w_data.dayaftertomorrow.hi+'</span>'
    						+ '/<span class="weather_lo">'+w_data.dayaftertomorrow.lo+'</span></td>'
    						+ '</tr></tbody></table>';
	    					
    					d.dom.innerHTML = weather_table;
					}else if(!res.result.weather && this.request.weather){
    					d.dom.innerHTML = 'N/A';
					}						

					if(this.request.address){
						if(res.result.address){
							var a_data = res.result.address;
							Ext.get("acc_address").dom.innerHTML = a_data;
						}else{
							Ext.get("acc_address").dom.innerHTML = 'N/A';						
						}
					}

					if(this.request.elevation){
						if(res.result.elevation){
							var e_data = res.result.elevation;
							Ext.get("acc_elevation").dom.innerHTML = e_data+"m";
						}else{
							Ext.get("acc_elevation").dom.innerHTML = 'N/A';						
						}
					}
					
					if(this.request.areaKey){
						if(res.result.areaKey){
							var ak_data = res.result.areaKey;
							var key_num = ak_data.length;
							var ak_html = '<div class="area_keywords_list">';
							for(var k=0; k<key_num; k++){
								ak_html += '<span class="area_keyword" lat="'+ak_data[k].lat+'" lng="'+ak_data[k].lng+'">'+ak_data[k].title+'</span> ';
							}
							ak_html +='</div>';
							Ext.get("acc_area_keywords").dom.innerHTML = ak_html;								
						}else{
							Ext.get("acc_area_keywords").dom.innerHTML = 'N/A';						
						}
						
						Ext.select('.area_keyword').on('mouseover',function(){
							var ak = this.lastChild.data;
							var lat = this.getAttribute('lat');
							var lng = this.getAttribute('lng');
							
							var mrk = new ogmMarker(new ogmLatLng(lat,lng),{
								icon : {
									image : './images/icons/markers/mano2.png',
									height: 34,
									width: 20
								}
							});
							mapObj.addSingletonMarker(mrk);
							mrk.openInfoWindowHtml('<span>'+ak+'</span>')
						});
					}					
				}
			}
		});				
	},
	
	gotoHome	:	function(){
		var conn = new Ext.data.Connection();
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type	: "home"
			},
			scope	:	this,
			callback:	function(o,s,r){
				if(s){
					var res = r.responseText;
					if(res && res.length>0){
						eval('var ret='+res);
						if(ret.lat && ret.lng && ret.zoom){
							this.setCenterAndZoom(new ogmLatLng(ret.lat,ret.lng),parseInt(ret.zoom));
						}
					}
				}
			}
		});		
	},
	
	showCurrentMapInfo	:	function(){
		var box = this.getBox();
		
		if(this.infoDlg){
			Ext.get('centerLat').dom.value = box.lat;
			Ext.get('centerLng').dom.value = box.lng;
			Ext.get('swLat').dom.value = box.sw.lat;
			Ext.get('swLng').dom.value = box.sw.lng;
			Ext.get('neLat').dom.value = box.ne.lat;
			Ext.get('neLng').dom.value = box.ne.lng;
			Ext.get('zoomlevel').dom.value = box.zoom;
			Ext.get('eastwest').dom.value = box.rangeEW;
			Ext.get('northsouth').dom.value = box.rangeNS;
			Ext.get('map_url').dom.value = mapObj.getUrl();
			
			if(!this.infoDlg.isVisible()){
				this.infoDlg.show();
			}
		}else{
			var map = this;			
			var dlg = new Ext.BasicDialog('div_info_dialog',{
				autoCreate: false,
		        height: 350,
		   		width: 260,
		   		modal: false,
		   		proxyDrag: true,
		   		shadow: true,
		   		collapsible: true,
		   		resizable: true,
		   		animateTarget: 'div_wrapper',
		   		autoScroll: false
			});
	
			dlg.setTitle("INFO");
			var map_url = new Ext.form.TextField({
		    	fieldLabel	: 	'URL',
		        name		:	"map_url",
		        id			:	"map_url",
		        width		:	120
		    });		        

			var zoomLevel = new Ext.form.TextField({
		    	fieldLabel	: 	OGM.msg.get('msg_zoom_level'),
		        name		:	"zoomlevel",
		        id			:	"zoomlevel",
		        width		:	120
		    });		        
	
			var lat1 = new Ext.form.TextField({
		    	fieldLabel	: 	OGM.msg.get('msg_center_latlng'),
		        name		:	"centerLat",
		        id			:	"centerLat",
		        width		:	120
		    });		        

			var lng1 = new Ext.form.TextField({
				labelSeparator: "",
		        name		:	"centerLng",
		        id			:	"centerLng",
		        width		:	120
		    });		        

			var lat2 = new Ext.form.TextField({
		    	fieldLabel	: 	OGM.msg.get('msg_sw_latlng'),
		        name		:	"swLat",
		        id			:	"swLat",
		        width		:	120
		    });		        

			var lng2 = new Ext.form.TextField({
				labelSeparator: "",
		        name		:	"swLng",
		        id			:	"swLng",
		        width		:	120
		    });		        

			var lat3 = new Ext.form.TextField({
		    	fieldLabel	: 	OGM.msg.get('msg_ne_latlng'),
		        name		:	"neLat",
		        id			:	"neLat",
		        width		:	120
		    });		        

			var lng3 = new Ext.form.TextField({
				labelSeparator: "",
		        name		:	"neLng",
		        id			:	"neLng",
		        width		:	120
		    });		        
	
			var ns = new Ext.form.TextField({
		    	fieldLabel	: 	OGM.msg.get('msg_south_north_range'),
		        name		:	"northsouth",
		        id			:	"northsouth",
		        width		:	120
		    });		        

			var ew = new Ext.form.TextField({
		    	fieldLabel	: 	OGM.msg.get('msg_east_west_range'),
		        name		:	"eastwest",
		        id			:	"eastwest",
		        width		:	120
		    });		        
	
		    var sb = new Ext.form.Form();
			sb.column({
				width		:	235,
				labelWidth	:	110,
		    	labelAlign	:	"left",
		    	style		:	{verticalAlign:'top', textAlign : "left", border: "none", 'margin-left':"5px",'margin-top':'0',padding:0}
				},sb.fieldset({
					legend: "CURRENT MAP INFO",
					style: { border: "none",padding:0,margin:0 }
				},lat1,lng1,lat2,lng2,lat3,lng3,zoomLevel,ns,ew,map_url)
			);
			sb.end();

			sb.addButton({
				text	:	'OK',
				handler	:	function(){
					dlg.hide();
				}
			});
	
		    sb.render(dlg.body);

			zoomLevel.setRawValue(box.zoom)		
			lat1.setRawValue(box.lat);
			lng1.setRawValue(box.lng);
			lat2.setRawValue(box.sw.lat);
			lng2.setRawValue(box.sw.lng);
			lat3.setRawValue(box.ne.lat);
			lng3.setRawValue(box.ne.lng);
			ew.setRawValue(box.rangeEW);
			ns.setRawValue(box.rangeNS);
			map_url.setRawValue(mapObj.getUrl());

		    dlg.show();
		    map.infoDlg = dlg;
		}
	},
	
	msg : function(title, format){
   		var msgCt = new Ext.get(document.createElement("DIV"));
   		msgCt.appendTo(Ext.get("div_wrapper"));
   		msgCt.set({id:"msg-div"});
 //       msgCt.alignTo(document, 't-t');
        var s = String.format.apply(String, Array.prototype.slice.call(arguments, 1));
        var m = Ext.DomHelper.append(msgCt, {html:createBox(title, s)}, true);
        m.slideIn('t').pause(3).ghost("t", {remove:true});
        
	    function createBox(t, s){
    	    return ['<div class="msg">',
        	        '<div class="x-box-tl"><div class="x-box-tr"><div class="x-box-tc"></div></div></div>',
            	    '<div class="x-box-ml"><div class="x-box-mr"><div class="x-box-mc"><h3>', t, '</h3>', s, '</div></div></div>',
            	    '<div class="x-box-bl"><div class="x-box-br"><div class="x-box-bc"></div></div></div>',
            	    '</div>'].join('');
    	}
	}	
};

TopMenu = function(opt){
	var elem = Ext.get(opt.id);	
	this.el = elem;
	
	Ext.QuickTips.init();
	
	var tb = new Ext.Toolbar(elem);

	var toggle_jp = new Ext.Toolbar.Button({
		cls:  "x-btn-icon",
		icon: "./images/icons/flags/jp.png",
       	tooltip: { text: '日本語表示に切り替え', autoHide:true },
       	enableToggle: true,
       	toggleHandler: function(i,p){
       		if(p){
	       		Ext.Msg.confirm('日本語に切り替え','日本語表示に切り替えますか？',function(id){
    	   			if(id=="yes"){
    	   				var new_url = mapObj.getUrl().replace(/lang=../,"lang=jp");
						location.href = new_url;
       				}else{
       					toggle_jp.toggle(false);
       				}
       			});
       		}
       	},
       	pressed: OGM.msg.mode=='jp'?true:false
    });

	var toggle_en = new Ext.Toolbar.Button({
		cls:  "x-btn-icon",
		icon: "./images/icons/flags/gb.png",
       	tooltip: { text: 'switch to English mode', autoHide:true },
       	enableToggle: true,
       	toggleHandler: function(i,p){
       		if(p){
	       		Ext.Msg.confirm('Language Change','Switch to English mode?',function(id){
    	   			if(id=="yes"){
    	   				var new_url = mapObj.getUrl().replace(/lang=../,"lang=en");
						location.href = new_url;
       				}else{
       					toggle_en.toggle(false);
       				}
    	   		});
       		}    	   		
       	},
       	pressed: OGM.msg.mode=='en'?true:false
   	});
   	
   	if(_loggedin){
	   	var login_btn = new Ext.Toolbar.Button({
			cls:  "x-btn-icon",
			icon: "./images/icons/door_out.png",
			tooltip: { text: OGM.msg.get('msg_logout'), autoHide:true },
			handler: function(){
				logoutDlg();
			}			
		});
   	}else{
	   	var login_btn = new Ext.Toolbar.Button({
			cls:  "x-btn-icon",
			icon: "./images/icons/door_in.png",
			tooltip: { text: OGM.msg.get('msg_login'), autoHide:true },
			handler: function(){
				loginDlg();
			}			
		});   		
   	}		
	
	var search_key_top = new Ext.form.TextField({
       	name		:	"search_key_top",
       	id			:	"search_key_top",
       	width		:	100
    });
    
    search_key_top.on("specialkey",function(t,e){
    	if(e.getKey()==Ext.EventObject.RETURN){
			var search = Ext.get('search_key_top').dom.value;
			if(search.length==0){ return; }
			OGM.status.mask();
			searchAndMove(search);
    	}    	
    });
    
    OGM.search_key_top = search_key_top;
	
	tb.add(
  		'<span style="color:#444444">'+OGM.msg.get("label_move_top")+'</span>',
  		search_key_top
	);

	tb.addButton({
		cls:  "x-btn-icon",
		icon: "./images/icons/resultset_next.png",
		tooltip: { text: 'GO!', autoHide:true },
		handler:function(){
			var search = Ext.get('search_key_top').dom.value;
			if(search.length==0){ return; }
			OGM.status.mask();
			searchAndMove(search);
		}		
	});
		
	tb.add(
		"-",
		new Ext.Toolbar.Button({
			cls:  "x-btn-icon",
			icon: "./images/icons/house.png",
			tooltip: { text: OGM.msg.get('menu_goto_home'), autoHide:true },
        	handler: function(){
        		mapObj.gotoHome();
        	}
    	}),
		new Ext.Toolbar.Button({
			cls:  "x-btn-icon",
			icon: "./images/icons/flag_red.png",
			tooltip: { text: OGM.msg.get('qtip_set_default_loc'), autoHide:true },
			handler: function(){
				var c_url = mapObj.getUrl();
				var conn = new Ext.data.Connection();
				conn.request({
					url		:	"./ogm_init_handler.php",
					params	:	{ mode: "set_default_loc", url: c_url  },
					callback:	function(o,s,r){
						if(s){
							var res = r.responseText;
							if(res=='OK'){
								Ext.Msg.alert(OGM.msg.get('title_set_default_loc'),
											  OGM.msg.get('msg_set_default_loc_success'));					
							}else{
								Ext.Msg.alert(OGM.msg.get('title_set_default_loc'),
											  OGM.msg.get('msg_set_default_loc_fail'));					
							}
						}else{
							Ext.Msg.alert(OGM.msg.get('title_set_default_loc'),
										  OGM.msg.get('msg_set_default_loc_fail'));					
						}
					}
				});
		    }
		}),
		login_btn,
		"-",
		new Ext.Toolbar.Button({
			cls:  "x-btn-icon",
			icon: "./images/icons/arrow_refresh.png",
			tooltip: { text: OGM.msg.get('toggle_auto_update'), autoHide:true },
        	enableToggle: true,
        	toggleHandler: function(i,p){
        		if(p){ mapObj.autoUpdate = true; }
        		else{ mapObj.autoUpdate = false; }
        	},
        	pressed: false
    	}),
		"-",
		new Ext.Toolbar.Button({
			cls:  "x-btn-icon",
			icon: "./images/icons/map.png",
			tooltip: { text: OGM.msg.get('qtip_info'), autoHide:true },
			handler: function(){
				mapObj.showCurrentMapInfo();
			}
		}),
		new Ext.Toolbar.Button({
			cls:  "x-btn-icon",
			icon: "./images/icons/kml.png",
			tooltip: { text: OGM.msg.get('qtip_kml'), autoHide:true },
			handler: function(){
				OGM.kml.check();
			}
		}),   		
		"-",
		new Ext.Toolbar.Button({
			cls:  "x-btn-icon",
			icon: "./images/icons/layout_sidebar.png",
			tooltip: { text: OGM.msg.get('qtip_menu_open'), autoHide:true },
			handler	: 	function(){
		   		OGM.layout.getRegion('west').expand();
			}	
		}),
		new Ext.Toolbar.Button({
			cls:  "x-btn-icon",
			icon: "./images/icons/newspaper.png",
			tooltip: { text: OGM.msg.get('qtip_menu_news'), autoHide:true },
			handler	: 	function(){
		   		OGM.layout.getRegion('east').expand();
			}	
		}),
		new Ext.Toolbar.Button({
			cls:  "x-btn-icon",
			icon: "./images/icons/arrow_out.png",
			tooltip: { text: OGM.msg.get('qtip_menu_close'), autoHide:true },
			handler	: 	function(){
		   		OGM.layout.getRegion('west').collapse();
		   		OGM.layout.getRegion('east').collapse();
		   		OGM.layout.getRegion('south').collapse();
			}	
		})
	);
	
	tb.add(
		new Ext.Toolbar.Button({
			cls:  "x-btn-icon",
			icon: "./images/icons/brick.png",
			tooltip: { text: 'ONGMAP.COM is powered by...', autoHide:true },
			handler: function(){
				var m = new ogmMarker(mapObj.getCenter(),{map:mapObj.map});
				mapObj.addOverlay(m);

				var msg = '<div style="width:400px;height:300px"><iframe style="margin-bottom: -10px; border: 0; padding: 0;width:400px;height:300px;" src="credit.html" scrolling="auto" frameBorder="0" /></div>';					
				m.openInfoWindowHtml(msg);	
//				m.openInfoWindowHtml('<h1 style="color:#333333;font-weight:bold">Maximize me!</h1>',{maxUrl:"credit.html"});					
			}			
		}),
		"-"
	);
	
   	if(_loggedin){
   		tb.add(
	   		new Ext.Toolbar.Button({
				cls:  "x-btn-icon",
				icon: "./images/icons/wrench_orange.png",
				tooltip: { text: OGM.msg.get('msg_user_config'), autoHide:true },
				handler: function(){
					configDlg();
				}			
	   		})
   		);
	}else{
   		tb.add(
	   		new Ext.Toolbar.Button({
				cls:  "x-btn-text",
				text: OGM.msg.get('title_register'),
				handler: function(){
					registerDlg();
				}			
	   		})
	   	);		
	}
	
	if(OGM.msg.mode=='jp'){
		tb.add(
			"-",
			new Ext.Toolbar.Button({
				cls:  "x-btn-text",
				text: OGM.msg.get('qtip_help'),
				handler: function(){
					window.open("http://ongmap.com/blog/?page_id=135");
				}			
			}),			
			"-",
			new Ext.Toolbar.Button({
				cls:  "x-btn-text",
				text: OGM.msg.get('menu_about'),
				handler: function(){
					window.open("http://ongmap.com/blog/?page_id=16#japanese");
				}			
			}),
			new Ext.Toolbar.Button({
				cls:  "x-btn-text",
				text: OGM.msg.get('menu_blog'),
				handler: function(){
					window.open("http://ongmap.com/blog/");
				}
			})
		);
	}else{
		tb.add(
			"-",
			new Ext.Toolbar.Button({
				cls:  "x-btn-text",
				text: OGM.msg.get('qtip_help'),
				handler: function(){
					window.open("http://ongmap.com/blog/?page_id=134");
				}			
			}),
			'-',
			new Ext.Toolbar.Button({
				cls:  "x-btn-text",
				text: OGM.msg.get('menu_about'),
				handler: function(){
					window.open("http://ongmap.com/blog/?page_id=16");
				}			
			}),
			new Ext.Toolbar.Button({
				cls:  "x-btn-text",
				text: OGM.msg.get('menu_blog'),
				handler: function(){
					window.open("http://7ns.jp/en/");
				}
			})
		);		
	}
	
	tb.add(
		"-",
    	toggle_jp,
    	toggle_en			
	);	
}


function loginDlg(){
	var conn = new Ext.data.Connection();
	conn.request({
		url		:	"./ogm_auth_handler.php",
		params	:	{ mode: "token" },
		callback:	function(o,s,r){
			if(s){
				var token = r.responseText;
				var container = 'div_login_dialog';
				var dlg = new Ext.BasicDialog(container,{
					autoCreate: false,
			        height: 150,
			   		width: 300,
			   		modal: true,
			   		proxyDrag: true,
			   		shadow: true,
			   		collapsible: false,
			   		resizable: false,
			   		autoScroll: false
				});
		
				var txt_user = new Ext.form.TextField({
			   		fieldLabel	: 	OGM.msg.get('title_username'),
			       	maxLength	:	20,
			       	width		:	150
			   	});		        

				var txt_pwd = new Ext.form.TextField({
   					fieldLabel	: 	OGM.msg.get('title_password'),
			       	inputType	:	"password",
			       	maxLength	:	32,
			       	width		:	150
			   	});		        

			    var sb = new Ext.form.Form();
    
				sb.column({
						width		:	290,
						labelWidth	:	100,
			   			labelAlign	:	"left",
			   			style		:	{textAlign : "left", border: "none", marginTop: "10px", marginBottom: "10px"}
					},
					txt_user,
					txt_pwd
				);
		
				sb.addButton(OGM.msg.get('msg_login'),function(){
					var err_flag = false;
					var userValue = txt_user.getRawValue();
					var pwdValue = txt_pwd.getRawValue();
					
					if(userValue.length<4 || userValue.length>20 || userValue.search(/[^-a-zA-Z0-9_]/)>-1){
						err_flag = true;
						txt_user.markInvalid(OGM.msg.get('msg_invalid_username'));
					}
					
					if(pwdValue.length<6 || pwdValue.length>32 || pwdValue.search(/[^-a-zA-Z0-9_]/)>-1){
						err_flag = true;
						txt_pwd.markInvalid(OGM.msg.get('msg_invalid_password'));						
					}
					
					if(err_flag===false){
						OGM.status.authorize({
							token	: token,
							user	: txt_user.getRawValue(),
							pwd		: txt_pwd.getRawValue()
						});
						dlg.hide();
					}
				});		

				sb.render(dlg.body);

				dlg.setTitle(OGM.msg.get('title_login'));
				dlg.on("hide",function(){
					this.purgeListeners();
					sb.buttons[0].purgeListeners();
					this.destroy();
					Ext.get(container).dom.innerHTML = '';
				});
	
				dlg.on("show",function(){
					txt_user.focus();
				});

			    dlg.show();
			}
		}
	});
}

function logoutDlg(){
	var conn = new Ext.data.Connection();
	conn.request({
		url		:	"./ogm_auth_handler.php",
		params	:	{ mode: "logout", user: OGM.status.username },
		callback:	function(o,s,r){
			if(s){
				var res = r.responseText;
				if(res=='msg_logout_failed'){
					Ext.Msg.alert(OGM.msg.get('msg_logout'),OGM.msg.get('msg_logout_failed'));
				}else{
					location.reload();
				}

			}
		}
	});
}

function registerDlg(){
	var conn = new Ext.data.Connection();
	conn.request({
		url		:	"./ogm_auth_handler.php",
		params	:	{ mode: "token" },
		callback:	function(o,s,r){
			if(s){
				var token = r.responseText;
				var container = 'div_login_dialog';
				var dlg = new Ext.BasicDialog(container,{
					autoCreate: false,
			        height: 210,
			   		width: 360,
			   		modal: true,
			   		proxyDrag: true,
			   		shadow: true,
			   		collapsible: false,
			   		resizable: false,
			   		autoScroll: false
				});

				var txt_email = new Ext.form.TextField({
			   		fieldLabel	: 	OGM.msg.get('title_email'),
			       	maxLength	:	254,
			       	width		:	150
			   	});		        
		
				var txt_user = new Ext.form.TextField({
			   		fieldLabel	: 	OGM.msg.get('title_username_reg'),
			       	maxLength	:	20,
			       	width		:	150
			   	});		        

				var txt_pwd = new Ext.form.TextField({
   					fieldLabel	: 	OGM.msg.get('title_password_reg'),
			       	inputType	:	"password",
			       	maxLength	:	32,
			       	width		:	150
			   	});		        

				var txt_pwd_chk = new Ext.form.TextField({
   					fieldLabel	: 	OGM.msg.get('title_password_chk'),
			       	inputType	:	"password",
			       	maxLength	:	32,
			       	width		:	150
			   	});		        

			    var sb = new Ext.form.Form();
    
				sb.column({
						width		:	355,
						labelWidth	:	160,
			   			labelAlign	:	"left",
			   			style		:	{textAlign : "left", border: "none"}
					},
					txt_email,
					txt_user,
					txt_pwd,
					txt_pwd_chk
				);
		
				sb.addButton(OGM.msg.get('msg_register'),function(){
					var err_flag = false;
					var emailValue = txt_email.getRawValue();
					var userValue = txt_user.getRawValue();
					var pwdValue = txt_pwd.getRawValue();
					var pwdchkValue = txt_pwd_chk.getRawValue();

					if(emailValue.length<6 || emailValue.length>254 || emailValue.search(/[@\.]/)==-1){
						err_flag = true;
						txt_email.markInvalid(OGM.msg.get('msg_invalid_email'));
					}else{
						var emailValue_parts = emailValue.split('@');
						if(emailValue_parts.length!=2){
							err_flag = true;
							txt_email.markInvalid(OGM.msg.get('msg_invalid_email'));					
						}else if(emailValue_parts[1].split('.').length<2){
							err_flag = true;
							txt_email.markInvalid(OGM.msg.get('msg_invalid_email'));
						}
					}

					if(userValue.length<4 || userValue.length>20 || userValue.search(/[^-a-zA-Z0-9_]/)>-1){
						err_flag = true;
						txt_user.markInvalid(OGM.msg.get('msg_invalid_username'));
					}

					if(pwdValue.length<6 || pwdValue.length>32 || pwdValue.search(/[^-a-zA-Z0-9_]/)>-1){
						err_flag = true;
						txt_pwd.markInvalid(OGM.msg.get('msg_invalid_password'));						
					}else if(pwdValue.search(userValue)>-1){
						err_flag = true;
						txt_pwd.markInvalid(OGM.msg.get('msg_invalid_password'));
					}
					
					if(pwdchkValue!=pwdValue){
						err_flag = true;
						txt_pwd_chk.markInvalid(OGM.msg.get('msg_unmatch_password'));						
					}
					
					if(err_flag===false){
						OGM.status.register({
							token	: token,
							email	: txt_email.getRawValue(),
							user	: txt_user.getRawValue(),
							pwd		: txt_pwd.getRawValue(),
							pwd_chk	: txt_pwd_chk.getRawValue()
						});
						dlg.hide();
					}
				});		
				sb.render(dlg.body);

				dlg.setTitle(OGM.msg.get('title_register'));
				dlg.on("hide",function(){
					this.purgeListeners();
					sb.buttons[0].purgeListeners();
					this.destroy();
					Ext.get(container).dom.innerHTML = '';
				});
	
				dlg.on("show",function(){
					txt_email.focus();
				});

			    dlg.show();
			}
		}
	});	
}

function configDlg(){
	var conn = new Ext.data.Connection();
	conn.request({
		url		:	"./ogm_auth_handler.php",
		params	:	{ 
			mode: "config_init", 
			session	: OGM.status.session_token
		},
		callback:	function(o,s,r){
			if(s){
				var token = r.responseText;
				if(!token || token.length==0){ return; }
				
				var container = 'div_config_dialog';
				var dlg = new Ext.BasicDialog(container,{
					autoCreate: false,
			        height: 150,
			   		width: 360,
			   		modal: true,
			   		proxyDrag: true,
			   		shadow: true,
			   		collapsible: false,
			   		resizable: false,
			   		autoScroll: false
				});
		
				var txt_pwd_current = new Ext.form.TextField({
			   		fieldLabel	: 	OGM.msg.get('title_password_current'),
			       	inputType	:	"password",
			       	maxLength	:	32,
			       	width		:	150
			   	});		        

				var txt_pwd = new Ext.form.TextField({
   					fieldLabel	: 	OGM.msg.get('title_password_new'),
			       	inputType	:	"password",
			       	maxLength	:	32,
			       	width		:	150
			   	});		        

				var txt_pwd_chk = new Ext.form.TextField({
   					fieldLabel	: 	OGM.msg.get('title_password_chk'),
			       	inputType	:	"password",
			       	maxLength	:	32,
			       	width		:	150
			   	});		        

			    var sb = new Ext.form.Form();
    
				sb.column({
						width		:	355,
						labelWidth	:	160,
			   			labelAlign	:	"left",
			   			style		:	{textAlign : "left", border: "none"}
					},
					txt_pwd_current,
					txt_pwd,
					txt_pwd_chk
				);
		
				sb.addButton(OGM.msg.get('msg_update'),function(){
					var err_flag = false;
					var pwdValue_old = txt_pwd_current.getRawValue();
					var pwdValue = txt_pwd.getRawValue();
					var pwdchkValue = txt_pwd_chk.getRawValue();


					if(pwdValue_old.length<6 || pwdValue_old.length>32 || pwdValue_old.search(/[^-a-zA-Z0-9_]/)>-1){
						err_flag = true;
						txt_pwd_current.markInvalid(OGM.msg.get('msg_invalid_password'));						
					}

					if(pwdValue.length<6 || pwdValue.length>32 || pwdValue.search(/[^-a-zA-Z0-9_]/)>-1){
						err_flag = true;
						txt_pwd.markInvalid(OGM.msg.get('msg_invalid_password'));						
					}else if(pwdValue.search(OGM.status.username)>-1){
						err_flag = true;
						txt_pwd.markInvalid(OGM.msg.get('msg_invalid_password'));
					}
					
					if(pwdchkValue!=pwdValue){
						err_flag = true;
						txt_pwd_chk.markInvalid(OGM.msg.get('msg_unmatch_password'));						
					}
					
					if(err_flag===false){
						OGM.status.userConfig({
							token	: token,
							session	: OGM.status.session_token,
							pwd_current	: pwdValue_old,
							pwd		: pwdValue,
							pwd_chk	: pwdchkValue
						});
						dlg.hide();
					}
				});		
				sb.render(dlg.body);

				dlg.setTitle(OGM.msg.get('title_user_config'));
				dlg.on("hide",function(){
					this.purgeListeners();
					sb.buttons[0].purgeListeners();
					this.destroy();
					Ext.get(container).dom.innerHTML = '';
				});
	
				dlg.on("show",function(){
					txt_pwd_current.focus();
				});

			    dlg.show();
			}
		}
	});	
}

function searchAndMove(search){
	if(search.length==0){
		OGM.status.unmask();
		return;
	}

	// LatLng move
	var s_parts = search.split('=');
	if(s_parts.length==2 && s_parts[0]=='ll' && s_parts[1].split(',').length==2){
		var ll = s_parts[1].split(',');
		var lat = parseFloat(ll[0]);
		var lng = parseFloat(ll[1]);
		
		if(lat>=-90 && lat<=90 && lng>=-180 && lng<=180){
			mapObj.canvas.clear();
			mapObj.clearAll();
			OGM.status.unmask();
			mapObj.pan(new ogmLatLng(lat,lng));
			return;	
		}else if(lat<-90 || lat>90 || lng<-180 || lng>180){
			OGM.status.unmask();
			alert(OGM.msg.get('msg_invalid_latlng'));
			return;			
		}
	}

	OGM.layout.getRegion('south').collapse();
	OGM.layout.getRegion('east').collapse();
				
	var conn = new Ext.data.Connection();
	conn.request({
		url		:	"./ogm_js_handler.php",
		params	:	{ type		: "geocode", 
					  search_key: search, 
					  lang		: OGM.msg.mode },
		callback:	function(o,s,r){
			if(s){
				mapObj.canvas.clear();
				mapObj.clearAll();
				
				eval("var res = {result:"+r.responseText+"}");
				OGM.status.unmask();
					
		
				if(res.result.length==0){
					Ext.Msg.alert(OGM.msg.get('title_not_found_002'), OGM.msg.get('msg_not_found_002'));
				}else if(res.result.length==1){
					mapObj.move({
						lat		: res.result[0].lat,
						lng		: res.result[0].lng,
						datum	: res.result[0].datum,
						msg		: res.result[0].addr
					});
				}else{
					mapObj.move({
						lat		: res.result[0].lat,
						lng		: res.result[0].lng,
						datum	: res.result[0].datum,
						msg		: res.result[0].addr
					});							
					var options = {
						handler	:	function(point){
							mapObj.move({
								lat		: point.lat,
								lng		: point.lng,
								datum	: point.datum,
								msg		: point.addr										
							});
						},
						records	:	res
					}

					selectDialog(options);
				}
			}else{
				OGM.status.unmask();
				Ext.Msg.alert(OGM.msg.get('title_not_found_002'), OGM.msg.get('msg_not_found_002'));
			}
		}
	});
}

function selectDialog(opt){
	var ds = new Ext.data.Store({
		proxy:	new Ext.data.MemoryProxy(opt.records),
		reader:	new Ext.data.JsonReader({root: "result"},[
			{name: 'title'},
			{name: 'addr'}
		])
	});
    ds.load();

	var cm = new Ext.grid.ColumnModel([
	    {header: OGM.msg.get('col_title'), width: 100, dataIndex: 'title'},
		{header: OGM.msg.get('col_address'), width: 200, dataIndex: 'addr'}
	]);
	
	cm.defaultSortable = false;

	var sm = new Ext.grid.RowSelectionModel({singleSelect: true});
	sm.on("rowselect",function(sm,ri){
		var recs = opt.records.result;		
		mapObj.move({
			lat	 : recs[ri].lat,
			lng	 : recs[ri].lng,
			datum: recs[ri].datum,
			msg	 : '<div><p>'+recs[ri].addr+'</p></div>'
		});
	});

	if(mapObj.selectDlg){
		var innerDiv = mapObj.selectDlg.innerDiv;
	}else{
		var innerDiv = Ext.get(document.createElement("DIV"));
		innerDiv.dom.style.overflowY = "scroll";
		innerDiv.dom.style.overflowX = "hidden";
		innerDiv.setHeight(160);
		innerDiv.setWidth(320);
	}
	
	// create the grid
	var grid = new Ext.grid.Grid(innerDiv, {
		ds: ds,
		cm:	cm,
		selModel: sm
	});
	
	var container = 'div_select_dialog';
	if(!mapObj.selectDlg){
		var dlg = new Ext.BasicDialog(container,{
			autoCreate: false,
	        height: 250,
	   		width: 350,
	   		minHeight: 100,
	   		minWidth: 200,
	   		modal: true,
	   		proxyDrag: true,
	   		shadow: true,
	   		autoScroll: true,
	   		resizable:	false,
		 	title:	OGM.msg.get("title_multi_candidate")
		});

		dlg.addButton('OK',dlg.hide,dlg);		

		dlg.on("hide",function(){
			this.purgeListeners();
			ds.removeAll();
			sm.purgeListeners();
			dlg.buttons[0].purgeListeners();
			grid.purgeListeners();
			grid.destroy();
		});

		var sb = dlg.body;		
		sb.appendChild(innerDiv);
		
		dlg.innerDiv = innerDiv;
		mapObj.selectDlg = dlg;
	}else{
		var dlg = mapObj.selectDlg;
	}
	grid.render();			
	dlg.show();
}

DrawingBoard = function(targetDiv, opt){
	var grid = null;
	var elem = Ext.get(targetDiv);
	this.el = elem;
	this.images = false;
	
	var innerDiv = new Ext.Element(document.createElement("DIV"));
	innerDiv.dom.setAttribute('id',opt.innerDivId);
	innerDiv.appendTo(elem);
	innerDiv.addClass('drawing_board');

	var prevDiv = new Ext.Element(document.createElement("DIV"));
	prevDiv.dom.setAttribute('id','div_prev');
	prevDiv.appendTo(elem);
	prevDiv.dom.style.display = "none";
	var prevBtn = new Ext.Button(prevDiv,{
		text: "&lt;&lt;Prev",
		minWidth: 75
	});

	var nextDiv = new Ext.Element(document.createElement("DIV"));
	nextDiv.dom.setAttribute('id','div_next');
	nextDiv.appendTo(elem);
	nextDiv.dom.style.display = "none";    
	var nextBtn = new Ext.Button(nextDiv,{
		text: "Next&gt;&gt;",
		minWidth: 75
	});

    prevBtn.show = function(){ prevDiv.show(); }    
    nextBtn.show = function(){ nextDiv.show(); }
    prevBtn.hide = function(){ prevDiv.hide(); }    
    nextBtn.hide = function(){ nextDiv.hide(); }
    
    this.innerDiv = innerDiv;
    this.prev = prevBtn;
    this.next = nextBtn;		
};

DrawingBoard.prototype = {	
	clear	:	function(){
//		var container = Ext.get(this.innerDiv.dom.getAttribute("id"));
		var container = this.innerDiv;

		if(this.grid){
			this.grid.getColumnModel().purgeListeners();
			this.grid.getSelectionModel().purgeListeners();
			this.grid.getDataSource().purgeListeners();
			this.grid.getDataSource().removeAll();
			this.grid = null;
		}
		
		var tags = ["IMG","TD","TR","TABLE","DIV"];
		
		for(var i=0; i<5; i++){
			container.select(tags[i]).each(function(){
				this.removeAllListeners();
			});
		}

		for(var i=0; i<5; i++){
			container.select(tags[i]).remove();
		}
		
		OGM.layout.getRegion('south').titleTextEl.innerHTML = 'Data';		
	},
	
	registerGrid:	function(grid){
		this.grid = grid;
	}
};

function unloadOnGMap(){
	if(OGM.status.session_token){
		OGM.status.endUserSession();
	}
	
	if(mapObj.canvas){ mapObj.canvas.clear(); }
	if(mapObj.infoDlg){ mapObj.infoDlg.destroy(); }
	if(mapObj.photoDlg){ mapObj.photoDlg.destroy(); }
	if(mapObj.videoDlg){ mapObj.videoDlg.destroy(); }
	if(mapObj.chkboxes && mapObj.chkboxes.length>0){
		for(var i=0; i<mapObj.chkboxes.length; i++){
			mapObj.chkboxes[i].purgeListeners();
		}
	}
	
	for(var i=0; i<OGM.acc_panels.length; i++){
		OGM.acc_panels[i].purgeListeners();
	}
	
	OGM.layout.purgeListeners();
	OGM.search_key_top.purgeListeners();
	OGM.tree.root.eachChild(function(){
		this.purgeListeners();
	});
	OGM.tree.purgeListeners();
	ogmUnload();
	delete mapObj;
	delete OGM;	
};

OGM = {
	isAutoUpdateMode : function(m){
		for(var i in OGM.mode.auto){
			if(OGM.mode.auto[i]==m){ return true; }
		}
		return false;		
	},

	isImageMode	: function(m){
		for(var i in OGM.mode.image){
			if(OGM.mode.image[i]==m){ return true; }
		}
		return false;		
	},

	isDataMode	: function(m){
		for(var i in OGM.mode.data){
			if(OGM.mode.data[i]==m){ return true; }
		}
		return false;		
	},
	
	isDBMode	: function(m){
		for(var i in OGM.mode.db){
			if(OGM.mode.db[i]==m){ return true; }
		}
		return false;		
	},
	
	isExMode	: function(m){
		for(var i in OGM.mode.ex){
			if(OGM.mode.ex[i]==m){ return true; }
		}
		return false;		
	},
	
	isValidZoom	: function(m,z){
		switch(m){
			case	"train_station":
				if(z>=12){ return true; }
				else{ return false; }
			case	"airport":
				if(z>=10){ return true; }
				else{ return false; }
			case	"world_heritage":
				if(z>=10){ return true; }
				else{ return false; }
			case	"photo_search_geo":
				if(z>3){ return true; }
				else{ return false; }
			case	"restaurant_search_geo":
				if(z>=14){ return true; }
				else{ return false; }
			case	"hotel_search_geo":
				if(z>=11){ return true; }
				else{ return false; }
			default:
				return true;
		}
	}
};

OGM.status = {
	_status:	"done",
	DONE:	"done",
	get:	function(){ return OGM.status._status; },
	set:	function(s){ OGM.status._status = s; },
	
	addressFlag: 0,
	weatherFlag: 0,
	elevationFlag: 0,
	areaKeyFlag: 0,
	cropFlag: 0,
	
	mask:	function(o){
		if(arguments.length==0){ o = "body_elem"; }
		if(arguments.length==2 && arguments[1]==true){
			var mask = Ext.get('transparent_mask');
			mask.show();
			OGM.status.masked = 'transparent_mask';
		}else{
			Ext.get(o).mask('loading', 'x-mask-loading');
			OGM.status.masked = o;			
		}
	},

	unmask:	function(){
		var o = OGM.status.masked;
		if(o=='transparent_mask'){ Ext.get('transparent_mask').hide(); }
		else if(o){ Ext.get(o).unmask(); }
		OGM.status.masked = false;
	},
	
	isMasked:	function(){
		return OGM.status.masked;
	},
	
	masked:	false,

	show_progress: function(){
		Ext.get('div_loading_box').show();
	},

	hide_progress: function(){
		Ext.get('div_loading_box').hide();
	},
	
	userConfig:	function(opt){
		var token = opt.token;
		var session = opt.session;
		var pwd_old = opt.pwd_current;
		var pwd_new = opt.pwd;
		var pwd_chk = opt.pwd_chk;
		
		if(token.length<1 || session.length<1){
			Ext.Msg.alert("ERROR", "ERROR");
		}else{
			var conn = new Ext.data.Connection();
			conn.request({
				url		:	"./ogm_auth_handler.php",
				params	:	{
					mode	: "config",
					token	: token,
					session	: session,
					pwd_old	: pwd_old,
					pwd_new	: pwd_new,
					pwd_chk	: pwd_chk
				},
				callback:	function(o,s,r){
					if(s){
						var res = r.responseText;
						if(res=='OK'){
							Ext.Msg.alert("",OGM.msg.get("msg_update_success"));
						}else{
							Ext.Msg.alert("",OGM.msg.get("msg_update_failed"));
						}
					}
				}
			});
		}
	},
	
	authorize:	function(opt){
		var token = opt.token;
		var user = opt.user;
		var pwd = opt.pwd;
		
		if(token.length<1){
			Ext.Msg.alert("Login Failed", "Login Failed");
		}else{
			var conn = new Ext.data.Connection();
			conn.request({
				url		:	"./ogm_auth_handler.php",
				params	:	{
					mode	: "login",
					token	: token,
					user	: user,
					pwd		: pwd
				},
				callback:	function(o,s,r){
					if(s){
						var res = r.responseText;
						if(res=='msg_login_failed'){
							Ext.Msg.alert("ERROR",OGM.msg.get(res),function(){
								loginDlg();							
							});
						}else{
							location.reload();						
						}
					}
				}
			});
		}
	},
	
	register:	function(opt){
		var token = opt.token;
		var email = opt.email;
		var user = opt.user;
		var pwd = opt.pwd;
		var pwd_chk = opt.pwd_chk;
		
		if(token.length<1){
			Ext.Msg.alert("Registeration Failed", "Registration Failed");
		}else{
			var conn = new Ext.data.Connection();
			conn.request({
				url		:	"./ogm_auth_handler.php",
				params	:	{
					mode	: "register",
					token	: token,
					email	: email,
					user	: user,
					pwd		: pwd,
					pwd_chk	: pwd_chk,
					lang	: OGM.msg.mode
				},
				callback:	function(o,s,r){
					if(s){
						var res = r.responseText;
						Ext.Msg.alert("Thank you",OGM.msg.get(res),function(){
							if(res!='msg_register_success'){
								registerDlg();
							}	
						});
					}
				}
			});
		}		
	},
	
	endUserSession: function(){
		var conn = new Ext.data.Connection();
		conn.request({
			url		:	"./ogm_auth_handler.php",
			params	:	{
				mode	: "end",
				token	: OGM.status.session_token
			},
			callback:	function(o,s,r){
				if(s){ return; }
			}
		});		
	}
};

OGM.msg = {
	mode	: _lang?_lang:"en",

	get	: function(loc){
		if(loc.id && loc.arg){
			var ret = "";
			switch(OGM.msg.mode){
				case "jp":
					ret = OGM.msg.msg[loc.id].jp;
					break;
				case "en":
				default:
					ret = OGM.msg.msg[loc.id].en;
			}
			if(OGM.msg.msg[loc.id].arg){
				var msgOut = [ret];
				return String.format.apply(String, msgOut.concat(loc.arg));
//				return ret.replace("arg",loc.arg);
			}
		}else{
			switch(OGM.msg.mode){
				case "jp":
					return OGM.msg.msg[loc].jp;
				case "en":
				default:
					return OGM.msg.msg[loc].en;
			}
		}
	}
}

OGM.data = {
	_store	:	{},
			
	_drawTable:	function(opt,model){
		var cat		= opt.category;
		var sw		= opt.box.sw;
		var ne		= opt.box.ne;
		var zoom	= opt.box.zoom;
		var range	= opt.box.range;
		var canvas	= opt.canvas;
		var search	= opt.search;
		
		if(!cat || !sw || !ne || !canvas || !zoom){ return; }
		else if(!model.map || !model.tbl){ return; }

		if(opt.table!==false){	OGM.layout.getRegion('south').expand(); }
		
		var page	= opt.page?opt.page:1;
		var per_page= opt.per_page?opt.per_page:30;
		var overlay	= opt.overlay?opt.overlay:"point";
		var tag = opt.tag?opt.tag:'';

		canvas.clear();
		canvas.prev.hide();
		canvas.next.hide();			

		var container 	= new Ext.get(canvas.innerDiv.dom.getAttribute("id"));
		var tableDiv 	= new Ext.get(document.createElement("DIV"));
		tableDiv.addClass("ogm_data_table");

		tableDiv.appendTo(container);

		var ds_mapping = model.map;
		var grid_header = model.tbl;

		var ds = new Ext.data.Store({
			proxy:	new Ext.data.HttpProxy({
				url		:	"./ogm_js_handler.php"
			}),
			reader:	new Ext.data.JsonReader(
				{root: "result", totalProperty:	'total'},
				ds_mapping
			)
		});

		var cm = new Ext.grid.ColumnModel(grid_header);
		cm.defaultSortable = true;

		var sm = new Ext.grid.RowSelectionModel({singleSelect: true});
		sm.on("rowselect",function(sm,ri){
			if(mapObj.mode=="kml"){ return; }

			var r = ds.getAt(ri);
			var m = mapObj.markers[ri];

			if(mapObj.mode=='mapmark'){
				var params = r.data.link.split("&");
				if(params[3]){
					var t = params[3].split("=");
					mapObj.setMapType(t[1]);
				}
				var z = params[2].split("=");
				mapObj.setCenterAndZoom(new ogmLatLng(r.data.lat,r.data.lng),parseInt(z[1]));
			}else if(overlay=="lines"){
				mapObj.pan(new ogmLatLng(r.data.to_lat,r.data.to_lng));
	    	}else{
				mapObj.pan(new ogmLatLng(r.data.lat,r.data.lng));	    		
	    	}
	    	
			setTimeout(function(){
				ogmEvent.trigger(m,'click');
			},500);
		});
	
		// create the grid
		var grid = new Ext.grid.Grid(tableDiv, {
			ds: ds,
			cm:	cm,
			selModel: sm,
			loadMask: true
		});
		grid.render();

	    var gridFoot = grid.getView().getFooterPanel(true);

		var d_msg = OGM.msg.get("paging_display");
		var e_msg = OGM.msg.get("paging_empty");
		
	    // add a paging toolbar to the grid's footer
	    var paging = new Ext.PagingToolbar(gridFoot, ds, {
	        pageSize: per_page,
	        displayInfo: true,
	        displayMsg: d_msg,
	        emptyMsg: e_msg
	    });
	    
	    ds.addListener("beforeload", function(t,o){
	    	var s = o.params.start;
	    	var l = o.params.limit;
	    	var type = "db";
	    	
	    	if(OGM.isDBMode(cat)){ var type = "db"; }
	    	else if(OGM.isExMode(cat)){ var type = "search"; }
	    	
	    	var params = {
				type	: type,
				category: cat,
				tag		: tag,
				min_lat	: sw.lat,
				min_lng	: sw.lng,
				max_lat	: ne.lat,
				max_lng	: ne.lng,
				zoom	: zoom,
				range	: range,
				search_key: search,
				page	: s/l+page,
				lang	: OGM.msg.mode,
				per_page: l,
				start	: s,
				limit	: l,
				token	: OGM.status.session_token?OGM.status.session_token:'',
				timeout	: 30000   		
	    	}
	    	o.params = params;
	    	return true;
	    });

	    ds.addListener("load", function(t,r,o){
	    	OGM.status.set(OGM.status.DONE);
	    	OGM.data._store = r;

    		if(r.length==0){
		   		OGM.layout.getRegion('south').collapse();
				setTimeout(function(){
		    		if(opt.auto){ OGM.status.hide_progress(); }
		    		else{Ext.Msg.alert(OGM.msg.get('title_not_found_001'),OGM.msg.get('msg_not_found_003')); }
				},500);
	    		return;	    			
	   		}

			var points = OGM.data._createMarkerData(r,cat,tag);
			
			if(points!=null){
		    	if(overlay=="lines"){ var markers = mapObj.showLines(points);}
		    	else{ var markers = mapObj.showMarkers(points);}
		    	mapObj.markers = markers;
			}
	    	
  			var para = o.params;
    		var data1 = ((para.page-1)*para.per_page)+1;
    		var data2 = t.totalLength>r.length?data1-1+r.length:t.totalLength;
    		var data3 = t.totalLength;
    		
    		if(data1==1 && data2==data3){
    			return;
    		}else if(data1==1){
				mapObj.msg(OGM.msg.get("title_search_result"),OGM.msg.get("msg_search_result_init"),data3,data1,data2);    		    		
    		}else{
				mapObj.msg(OGM.msg.get("title_search_result"),OGM.msg.get("msg_search_result"),data3,data1,data2);    			
    		}
	    });

	    ds.load({
	    	params:{start:0,limit:per_page},
	    	callback: function(r,o,s){
	    		if(!s){
			    	OGM.status.set(OGM.status.DONE);
			   		OGM.layout.getRegion('south').collapse();
					setTimeout(function(){
			    		if(opt.auto){ OGM.status.hide_progress(); }
			    		else{Ext.Msg.alert(OGM.msg.get('title_not_found_001'),OGM.msg.get('msg_not_found_003')); }
					},500);
	    		}
	    		return;
	    	}
	    });
	    
	    canvas.registerGrid(grid);
	},
	
	_drawImage:	function(opt){
		var pict 	= opt.pict;
		var search_key 	= opt.search;
		var box 	= opt.box;
		var pages  	= opt.pages;
		var per_page  = opt.per_page;
		var canvas 	= opt.canvas;
		var cat		= opt.category;
		var unloaded= pict.length;
		var total = opt.total;

		canvas.clear();
		mapObj.clearAll();

		var container = new Ext.get(canvas.innerDiv.dom.getAttribute("id"));
		var region = OGM.layout.getRegion('south'); 
		region.expand();
		
		if(pages && pages.length>0){
			if(canvas.prev.hasListener('click')){ canvas.prev.purgeListeners(); }
			if(canvas.next.hasListener('click')){ canvas.next.purgeListeners(); }
			
			canvas.prev.show();
			canvas.next.show();
			
			var next_p = parseInt(pages[1]);
			var prev_p = parseInt(pages[0]);
			
			canvas.prev.on("click",function(){
				OGM.status.set(OGM.status.DONE);
				setTimeout(function(){
					generalSearch({type:'image',cat:cat,search:search_key,index:prev_p,move:false,per_page:per_page,box:box});
				},100);
			});	
			
			canvas.next.on("click",function(){
				OGM.status.set(OGM.status.DONE);
				setTimeout(function(){
					generalSearch({type:'image',cat:cat,search:search_key,index:next_p,move:false,per_page:per_page,box:box});
				},100);
			});	
			
			var current_page = next_p-1>0?next_p-1:prev_p+1;
			var current_index = (current_page-1)*15+1;
			region.titleTextEl.innerHTML = '<p>Total:'+total.toLocaleString()+' ('+String(current_index)+'-'+String(current_index+pict.length-1)+')</p>'
		}else{
			canvas.prev.hide();
			canvas.next.hide();			
		}

		if(mapObj.mode=='book_search_geo'){
			var cells = 10; 
			var cell_h = 0.75*200;
			var cell_w = 0.6*Ext.get('body_elem').getWidth()/cells;
		}
		else{ 
			var cells = 15;
			var cell_h = 0.9*200;
			var cell_w = 0.9*Ext.get('body_elem').getWidth()/cells;
		}

		
		if(cell_h<cell_w){ cell_w = cell_h; }

		var tbl_html = '<table class="thumbnail_tbl" width="'+Ext.get('body_elem').getWidth()+'"><tbody><tr>';
 
		for(var i=0; i<cells; i++){
			tbl_html += '<td style="width:'+cell_w+'px;text-align:center">';

			if(i>=pict.length){
				tbl_html += '<img src="./images/blank.gif" /><br /></td>';
				continue;
			}

			var thumbnail_id = 'ogm_thumbnail_'+i;
			
			tbl_html += '<img id="'+thumbnail_id+'" class="ogm_thumbnail" src="'+pict[i].src+'"';
			tbl_html += ' width="'+parseFloat(cell_w-2.0)+'px"';
			tbl_html += ' style="cursor:pointer;border-width:2px;border-color:white;border-style:solid"';
			tbl_html += ' alt="'+pict[i].title+'"';
			tbl_html += ' pict_index="'+i+'"';

			if(pict[i].lat && pict[i].lng){
				tbl_html += ' lat="'+pict[i].lat+'"'			
				tbl_html += ' lng="'+pict[i].lng+'"'			
			}
			
			tbl_html += ' /><br />';

			// Title
			if(pict[i].title.length>25){
				var spn_title = pict[i].title.substring(0,22)+'...';
			}else{
				var spn_title = pict[i].title;				
			}
			tbl_html += '<span>'+spn_title+'</span><br />';

			// Link to original
			img_source = pict[i].link;
			tbl_html += '<a href="'+img_source+'" target="_blank">';
			if(img_source.search('panoramio')>-1){ var linkTitle = 'Panoramio'; }
			else if(img_source.search('flickr')>-1){ var linkTitle = 'Flickr'; }
			else if(img_source.search('youtube')>-1){ var linkTitle = 'YouTube'; }
			else if(img_source.search('amazon')>-1){ var linkTitle = 'Amazon'; }
			tbl_html += linkTitle+'</a><br /></td>';			

			if(pict[i].lat && pict[i].lng){
	   			var marker = (function(img_arg,src_id){
	   				var m = new ogmMarker(new ogmLatLng(img_arg.lat,img_arg.lng),{map:mapObj.map});

					ogmEvent.addListener(m,"click",function(){
						var img = new Image();
						
						var link = img_arg.link;
			 			
			 			if(cat=="photo_search_geo"){ var src = img_arg.mediumSrc; }
			 			else if(cat=='video_search_geo'){ var src = img_arg.largeSrc; }
			 			
						var title = img_arg.title;

						if(link.search('panoramio')>-1){ var linkTitle = 'Panoramio'; var linkURL = 'http://www.panoramio.com'; }
						else if(link.search('flickr')>-1){ var linkTitle = 'Flickr'; var linkURL = 'http://www.flickr.com';}
						else if(link.search('youtube')>-1){ var linkTitle = 'YouTube'; var linkURL = 'http://www.youtube.com';}

						var ok = false;
						OGM.status.mask('div_wrapper');
						img.onload = function(){
				 			if(cat=="photo_search_geo"){
								OGM.status.unmask();
								var html = '<div class="ogm_photo_bubble"><a href="'+link+'" target="_blank">'+title+'</a><br />'
										+ '<img src="'+img.src+'" /><br />'
										+ '<a href="'+linkURL+'" target="_blank">'+linkTitle+'</a></div>';
				 			}else if(cat=="video_search_geo"){
								var html = '<div class="ogm_video_bubble"><a href="'+link+'" target="_blank">'+title+'</a><br />'
										+ '<span></span><object width="255" height="210">'
										+ '<param name="movie" value="'
										+ src
										+ '"></param><param name="wmode" value="transparent"></param><embed src="'
										+ src
										+ '" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>';
										+ '<br /><a href="'+linkURL+'" target="_blank">'+linkTitle+'</a></div>';
								setTimeout(function(){
									var mskd = OGM.status.isMasked(); 
									if(mskd){
										OGM.status.unmask(mskd);
									}
								},3000);
 							}
				 			
							m.openInfoWindowHtml(html);							
						};

			 			if(cat=="photo_search_geo"){ img.src = src; }
			 			else if(cat=='video_search_geo'){ img.src = img_arg.src; }
					});

					ogmEvent.addListener(m,"mouseover",function(){
		   				var src_tag = Ext.get(src_id);
						src_tag.setStyle({borderColor:"red"});
					});

					ogmEvent.addListener(m,"mouseout",function(){
		   				var src_tag = Ext.get(src_id);
						src_tag.setStyle({borderColor:"white"});
					});
										
					return m;
	   			})(pict[i],thumbnail_id);
	   			
  		 		mapObj.addOverlay(marker);
  		 		mapObj.markers.push(marker);
			}
		}
		
		tbl_html += '</tr></tbody></table>';
		container.dom.innerHTML = tbl_html;

		Ext.select('.ogm_thumbnail').on('click',function(){
			var src_tag = Ext.get(this.getAttribute('id'));
			if(this.getAttribute('lat') && this.getAttribute('lng')){
				var tgt_m = mapObj.markers[this.getAttribute('pict_index')];
				ogmEvent.trigger(tgt_m,'click');
			}else{
				slideShowDlg(cat,pict,this.getAttribute('pict_index'));
			}
		});

		Ext.select('.ogm_thumbnail').on('mouseover',function(){
			var src_tag = Ext.get(this.getAttribute('id'));
			if(this.getAttribute('lat') && this.getAttribute('lng')){
				var tgt_m = mapObj.markers[this.getAttribute('pict_index')];
				src_tag.setStyle({borderColor:"red"});
				tgt_m.setImage('./images/icons/markers/icon_camera.png');
			}else{
				src_tag.setStyle({borderColor:"red"});
			}
		});

		Ext.select('.ogm_thumbnail').on('mouseout',function(){
			var src_tag = Ext.get(this.getAttribute('id'));
			if(this.getAttribute('lat') && this.getAttribute('lng')){
				var tgt_m = mapObj.markers[this.getAttribute('pict_index')];
				src_tag.setStyle({borderColor:"white"});
				tgt_m.setImage('./images/icons/markers/icon_pin.png');					
			}else{
				src_tag.setStyle({borderColor:"white"});
			}
		});

 		OGM.status.set(OGM.status.DONE);
 		
 		function slideShowDlg(cat,pict,idx){
 			if(cat=="photo_search_keyword"){
 				photoViewer(pict,idx);
 			}else if(cat=="video_search_keyword"){
 				videoViewer(pict,idx); 				
 			}else if(cat=="book_search_geo"){
 				bookViewer(pict,idx); 				
 			}
 		};
 		
 		function photoViewer(pict,index){
			var c_index = parseInt(index);

			var largeImg = new Image();
			var prevImage = new Image();
			var nextImage = new Image();
			var prevIndex = c_index==0?pict.length-1:c_index-1;
			var nextIndex = c_index==pict.length-1?0:c_index+1;

			var container = 'div_photos_dialog';
			if(!mapObj.photoDlg){
				var dlg = new Ext.BasicDialog(container,{
					height:	200,
					width:	200,
        			minHeight: 100,
        			minWidth: 100,
        			modal: true,
        			proxyDrag: true,
        			shadow: true
    			});
				var panel = new Ext.get(document.createElement("DIV"));
				var panelImg = new Ext.get(document.createElement("IMG"));
				var brk = new Ext.get(document.createElement("BR"));
				var link = new Ext.get(document.createElement("A"));
				
				panelImg.appendTo(panel);
				brk.appendTo(panel);
				link.appendTo(panel);
				
				dlg.body.dom.appendChild(panel.dom);
								
				var viewer = new Ext.form.Form({
					labelWidth		:	125,
				    labelAlign		:	"left"
				});

				viewer.addButton(OGM.msg.get('btn_prev'),null);
				viewer.addButton(OGM.msg.get('btn_next'),null);
				viewer.render(dlg.body);
				
				dlg.img = panelImg;
				dlg.viewer = viewer;
				dlg.link = link;
				mapObj.photoDlg = dlg;
			}else{
				var dlg = mapObj.photoDlg;
				var panelImg = dlg.img;
				var viewer = dlg.viewer;
				var link = dlg.link;
			}

			if(pict[index].link.search('panoramio')>-1){ var linkTitle = 'Panoramio'; var linkURL = pict[index].link; }
			else if(pict[index].link.search('flickr')>-1){ var linkTitle = 'Flickr'; var linkURL = pict[index].link;}
			link.set({href:linkURL,target:'_blank'});
			link.setStyle({color:'#444444'});
			link.dom.innerHTML = linkTitle;

			viewer.buttons[0].on('click',showPrevImg);
			viewer.buttons[1].on('click',showNextImg);

			largeImg.loaded = false;
			largeImg.onload = function(){
				this.loaded = true;

				var mskd = OGM.status.isMasked(); 
				if(mskd && mskd==container){
					OGM.status.unmask(mskd);
				}
				
				dlg.resizeTo(this.width+30,this.height+99);
				dlg.center();
				panelImg.dom.src = this.src;
				dlg.setTitle(this.title);

				prevIndex = c_index==0?pict.length-1:c_index-1;
				nextIndex = c_index==pict.length-1?0:c_index+1;

				delete prevImage;
				delete nextImage;
				prevImage = new Image();
				nextImage = new Image();
				
				prevImage.src = pict[prevIndex].largeSrc;					
				nextImage.src = pict[nextIndex].largeSrc;

				prevImage.title = pict[prevIndex].title;					
				nextImage.title = pict[nextIndex].title;
			};
					
			largeImg.src = pict[c_index].largeSrc;
			largeImg.title = pict[c_index].title;

			dlg.on('hide',function(){
				this.purgeListeners();
				largeImg.onload = null;
				delete largeImage;
				delete prevImage;
				delete nextImage;
				viewer.buttons[0].purgeListeners();				
				viewer.buttons[1].purgeListeners();				
			},dlg);
						    	
			dlg.show();
			OGM.status.mask(container);
			
			setTimeout(function(){
				var mskd = OGM.status.isMasked(); 
				if(mskd && mskd==container){
					OGM.status.unmask(mskd);
				}
			},1500);
			
			function showPrevImg(){
				OGM.status.mask(container);
				largeImg.title = prevImage.title;
				dlg.setTitle(largeImg.title);
				c_index = prevIndex;
				largeImg.src = prevImage.src;

				setTimeout(function(){
					var mskd = OGM.status.isMasked(); 
					if(mskd && mskd==container){
						OGM.status.unmask(mskd);
					}
				},1500);	
			};
			
			function showNextImg(){
				OGM.status.mask(container);
				largeImg.title = nextImage.title;
				dlg.setTitle(largeImg.title);
				c_index = nextIndex;
				largeImg.src = nextImage.src;

				setTimeout(function(){
					var mskd = OGM.status.isMasked(); 
					if(mskd && mskd==container){
						OGM.status.unmask(mskd);
					}
				},1500);	
			}
 		};

 		function bookViewer(pict,index){
			var c_index = parseInt(index);

			var largeImg = new Image();
			var prevImage = new Image();
			var nextImage = new Image();
			var prevIndex = c_index==0?pict.length-1:c_index-1;
			var nextIndex = c_index==pict.length-1?0:c_index+1;

			var container = 'div_books_dialog';
			if(!mapObj.bookDlg){
				var dlg = new Ext.BasicDialog(container,{
					height:	200,
					width:	200,
        			minHeight: 100,
        			minWidth: 100,
        			modal: true,
        			proxyDrag: true,
        			shadow: true
    			});
				var panel = new Ext.get(document.createElement("DIV"));
				var panelImg = new Ext.get(document.createElement("IMG"));
				var brk = new Ext.get(document.createElement("BR"));
				var link = new Ext.get(document.createElement("A"));
				
				panelImg.appendTo(panel);
				brk.appendTo(panel);
				link.appendTo(panel);
				
				dlg.body.dom.appendChild(panel.dom);
								
				var viewer = new Ext.form.Form({
					labelWidth		:	125,
				    labelAlign		:	"left"
				});

				viewer.addButton(OGM.msg.get('btn_prev'),null);
				viewer.addButton(OGM.msg.get('btn_next'),null);
				viewer.render(dlg.body);
				
				dlg.img = panelImg;
				dlg.viewer = viewer;
				dlg.link = link;
				mapObj.bookDlg = dlg;
			}else{
				var dlg = mapObj.bookDlg;
				var panelImg = dlg.img;
				var viewer = dlg.viewer;
				var link = dlg.link;
			}

			var linkTitle = 'Amazon';
			var linkURL = pict[index].link;

			link.set({href:linkURL,target:'_blank'});
			link.setStyle({color:'#444444'});
			link.dom.innerHTML = linkTitle;

			viewer.buttons[0].on('click',showPrevImg);
			viewer.buttons[1].on('click',showNextImg);

			largeImg.loaded = false;
			largeImg.onload = function(){
				this.loaded = true;

				var mskd = OGM.status.isMasked(); 
				if(mskd && mskd==container){
					OGM.status.unmask(mskd);
				}
				
				dlg.resizeTo(this.width+30,this.height+99);
				dlg.center();
				panelImg.dom.src = this.src;
				dlg.setTitle(this.title);

				prevIndex = c_index==0?pict.length-1:c_index-1;
				nextIndex = c_index==pict.length-1?0:c_index+1;

				delete prevImage;
				delete nextImage;
				prevImage = new Image();
				nextImage = new Image();
				
				prevImage.src = pict[prevIndex].largeSrc;					
				nextImage.src = pict[nextIndex].largeSrc;

				prevImage.title = pict[prevIndex].title;					
				nextImage.title = pict[nextIndex].title;
			};
					
			largeImg.src = pict[c_index].largeSrc;
			largeImg.title = pict[c_index].title;

			dlg.on('hide',function(){
				this.purgeListeners();
				largeImg.onload = null;
				delete largeImage;
				delete prevImage;
				delete nextImage;
				viewer.buttons[0].purgeListeners();				
				viewer.buttons[1].purgeListeners();				
			},dlg);
						    	
			dlg.show();
			OGM.status.mask(container);
			
			setTimeout(function(){
				var mskd = OGM.status.isMasked(); 
				if(mskd && mskd==container){
					OGM.status.unmask(mskd);
				}
			},1500);
			
			function showPrevImg(){
				OGM.status.mask(container);
				largeImg.title = prevImage.title;
				dlg.setTitle(largeImg.title);
				c_index = prevIndex;
				largeImg.src = prevImage.src;

				setTimeout(function(){
					var mskd = OGM.status.isMasked(); 
					if(mskd && mskd==container){
						OGM.status.unmask(mskd);
					}
				},1500);	
			};
			
			function showNextImg(){
				OGM.status.mask(container);
				largeImg.title = nextImage.title;
				dlg.setTitle(largeImg.title);
				c_index = nextIndex;
				largeImg.src = nextImage.src;

				setTimeout(function(){
					var mskd = OGM.status.isMasked(); 
					if(mskd && mskd==container){
						OGM.status.unmask(mskd);
					}
				},1500);	
			}
 		};

		function videoViewer(video,index){
			var c_index = parseInt(index);
			var container = 'div_videos_dialog';

			var prevIndex = c_index==0?video.length-1:c_index-1;
			var nextIndex = c_index==video.length-1?0:c_index+1;
					
			if(!mapObj.videoDlg){
				var dlg = new Ext.BasicDialog(container,{
					height:	450,
					width:	447,
					minHeight: 100,
					minWidth: 100,
					modal: true,
					proxyDrag: true,
					shadow: true
				});
				var panel = new Ext.get(document.createElement("DIV"));						
			    var form = new Ext.form.Form({
		    		labelWidth		:	125,
		    		labelAlign		:	"left"
		   		});
	    	
				form.addButton(OGM.msg.get('btn_prev'),null);
				form.addButton(OGM.msg.get('btn_next'),null);
						
				dlg.body.appendChild(panel);
				form.render(dlg.body);
				
				dlg.panel = panel;
				dlg.form = form;
				mapObj.videoDlg = dlg;
			}else{
				var dlg = mapObj.videoDlg;
				var panel = dlg.panel;
				var form = dlg.form;				
			}
			
			form.buttons[0].on('click',function(){
				createVideoViewer(prevIndex,video);					
			});
				
			form.buttons[1].on('click',function(){
				createVideoViewer(nextIndex,video);					
			});			
			
			panel.dom.innerHTML = prepareVideoPanel(video[c_index].largeSrc);
			dlg.setTitle(video[c_index].title);

			dlg.on('hide',function(){
				clearTimeout(to);
				this.purgeListeners();
				form.buttons[0].purgeListeners();
				form.buttons[1].purgeListeners();
			},dlg);
			
			dlg.show();	
			
			OGM.status.mask(container);
			var to = setTimeout(function(){
				var mskd = OGM.status.isMasked(); 
				if(mskd && mskd==container){
					OGM.status.unmask(mskd);
				}
			},1500);
	
			function prepareVideoPanel(src){
				var innerhtml = '<span></span><object width="425" height="350">';
				innerhtml += '<param name="movie" value="';
				innerhtml += src;
				innerhtml += '"></param><param name="wmode" value="transparent"></param><embed src="';
				innerhtml += src;
				innerhtml += '" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>';
				return innerhtml;
			};

			function createVideoViewer(index,video){
				panel.dom.innerHTML = prepareVideoPanel(video[index].largeSrc);
				dlg.setTitle(video[index].title);
				
				c_index = index;
				prevIndex = index==0?video.length-1:index-1;
				nextIndex = index==video.length-1?0:index+1;
					
				OGM.status.mask(container);
				setTimeout(function(){
					var mskd = OGM.status.isMasked(); 
					if(mskd && mskd==container){
						OGM.status.unmask(mskd);
					}
				},500);				
			}
		};
	},
	
	_createMarkerData:	function(data,category,tag){
		switch(category){
			case "kml":
				return null;
			case "mapmark":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					var msg = '<table class="mapmark_tbl"><tbody><tr><td>';
					if(d.tags){
						var tags = d.tags.split(",");
						
						if(OGM.status.username==tags[0] || OGM.status.username==d.tags){
							msg += '[<a href="index.php" onclick="javascript:OGM.mm.edit('+d.id+');return false;">'+OGM.msg.get('title_mm_edit')+'</a>] ';
							msg += '[<a href="index.php" onclick="javascript:OGM.mm.remove('+d.id+');return false;">'+OGM.msg.get('title_mm_delete')+'</a>]';
						}else{
							msg += 'By <a href="index.php" onclick="javascript:generalSearch({type:\'data\',cat:\'mapmark\',move:false,tag:\''+tags[0]+'\'});return false;">'+tags[0]+'</a>';					
						}

						msg += '<a href="index.php" onclick="javascript:window.open(\'http://del.icio.us/post?v=4&noui&jump=close&url=http://ongmap.com/?mm='+d.id+'&title='+encodeURIComponent(d.title)+'\',\'delicious\',\'toolbar=no,width=700,height=400\');return false;">';
						msg += '<img src="./images/delicious.small.gif" /></a>';
						msg += '<a href="http://www.stumbleupon.com/submit?url=http://ongmap.com/?mm='+d.id+'" target="_blank">';
						msg += '<img src="./images/icon_su.gif" /></a>';
						msg += '<a href="http://b.hatena.ne.jp/append?http://ongmap.com/?mm='+d.id+'" target="_blank">';
						msg += '<img src="./images/hatena.append.gif" /></a><br />';
												
						if(tags.length>1){
							for(var j=1; j<tags.length; j++){
								msg += '<a href="index.php" onclick="javascript:generalSearch({type:\'data\',cat:\'mapmark\',move:false,tag:\''+tags[j]+'\'});return false;" style="fontSize:xxsmall">'+tags[j]+'</a>,';
							}
						}
					}
					var params = d.link.split("&");
					var z = params[2].split("=");
					msg += '<h3><a href="index.php" onclick="javascript:mapObj.setCenterAndZoom(new ogmLatLng('+d.lat+','+d.lng+'),'+z[1]+');return false;">'+d.title+'</a></h3>';
					if(d.desc){ msg += '<p>'+d.desc+'</p>'; }
					if(d.address){ msg += '<p class="mapmark_address">'+d.address+'</p>'; }
					msg +=	'</td></tr></tbody></table>';
			
					desc = '<div style="font-size:small"><p>'+msg+'</p>';
					desc += '<form id="ogm_infowindow_search_form"></form>';			
					desc += '</div>';
			
					if(d.address){
						var win_width = '250px';
						var win_height = '150px';						
					}else{
						var win_width = '200px';
						var win_height = '100px';
					}
					
					items.push({
						data:{
							id		:	d.id?d.id:'',
							desc	:	{html: true, text: desc, width: win_width, height: win_height},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}			
					});
				}
				var points = { recs: items };
				break;
			case "news_blogs":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i];
			        var desc = '<div class="feed-item">' +
			        			'<div class="item-title"><a href="'+d.link+'" target="_blank">'+d.title+'</a></div>' +
		    	              	'<div class="item-date">'+d.date+'</div>' +
		        	          	d.desc+'</div>';
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '250px', height: '180px'},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}			
					});
				}
				var points = { recs: items };
				break;
			case "world_heritage":
			case "destination":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					var desc = '<table class="destination_tbl"><tbody><tr>';
					if(d.image){
						desc += '<td colspan="2">';
						if(d.tags){ desc += '<p class="destination_tag">'+d.tags+'</p>'; }
						desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3></td></tr>';
						desc += '<tr><td><img src="'+d.image+'" width="150px" /></td><td>';
					}else{
						desc += '<td>';
						if(d.tags){ desc += '<p class="destination_tag">'+d.tags+'</p>'; }
						desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3>';
					}
					desc += '<p class="destination_address">'+d.address+'</p>';
					desc += '<p>'+d.desc+'</p>';
					desc +=	'</td></tr></tbody></table>';
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '350px', height: '200px'},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}			
					});
				}
				var points = { recs: items };
				break;
			case "wifi":
			case "restaurant":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					var desc = '<table class="wifi_tbl"><tbody><tr><td>';
					desc += '<p class="wifi_tag">'+d.desc+'</p>';
					desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3>';
					desc += '<p>'+d.address+'</p>';
					if(d.phone){desc += '<p>'+d.phone+'</p>';}
					desc += '<p class="small_tags_list">'+d.tags+'</p>';
					desc +=	'</td></tr></tbody></table>';
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '250px', height: '100px'},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}			
					});
				}
				var points = { recs: items };
				break;
			case "store":
				if(tag=="TSUTAYA" || tag=="Edy"){
					var items = [];
					for(var i=0; i<data.length; i++){
						var d = data[i].data;

						var desc = '<table class="tsutaya_tbl"><tbody><tr><td>';
						desc += '<p class="tsutaya_tag">'+d.tags+'</p>';
						desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3>';
						desc += '<p>'+d.address+'</p>';
						desc += '<p class="note_warning">'+d.desc+'</p>';
						desc +=	'</td></tr></tbody></table>';
			
						items.push({
							data:{
								desc	:	{html: true, text: desc, width: '250px', height: '100px'},
								lat		:	d.lat,
								lng		:	d.lng,
								link	:	d.link
							}			
						});
					}
					var points = { recs: items };
				}
				break;
			case "airline":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;
					var params = d.title.split(':');
			
					var desc = '<table class="airline_tbl"><tbody><tr><td>';
					desc += '<p class="airline_cat">'+params[0]+'</p>';
					desc += '<h3><a href="'+d.link+'" target="_blank">'+params[1]+'</a></h3>';
					desc += '<a href="./index.php" onclick="airlineSearch('+d.to_id+',mapObj.canvas); return false;">[この空港の路線を表示する(ANA)]</a>';
					desc +=	'</td></tr></tbody></table>';
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '250px', height: '100px'},
							from	:	{ lat: d.from_lat, lng: d.from_lng },
							to		:	{ lat: d.to_lat, lng: d.to_lng},
							link	:	d.link
						}			
					});
				}
				var points = { recs: items };
				break;
			case "airport":	
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;
					var ap_tags = d.tags.split(',');

					var desc = '<table class="airline_tbl"><tbody><tr><td>';
					desc += '<p class="airline_cat">'+d.desc?d.desc:''+'</p>';
					desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3>';
					desc += '<p>'+d.address+'</p>';
					if(ap_tags[1]=='Japan'){
						desc += '<a href="./index.php" onclick="airlineSearch('+d.id+',mapObj.canvas); return false;">[この空港の路線を表示する(ANA)]</a>';
					}
					desc +=	'</td></tr></tbody></table>';
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '250px', height: '100px'},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}			
					});
				}
				var points = { recs: items };
				break;
			case "event_search_geo":	
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					var desc = '<table class="event_tbl"><tbody><tr><td>';
					desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3>';
					desc += '<p>'+d.address+'<br />'
					desc += OGM.msg.get('col_start')+'：'+d.start+'<br />';
					desc += OGM.msg.get('col_end')+'：'+d.end+'</p>';
					desc += '<div class="event_desc">'+d.desc+'</div><br />';
					desc += '<p>[<a href="'+d.link+'" target="_blank">Powered by Eventful.com</a>]</p>';
					desc += '</td></tr></tbody></table>';
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '350px', height: '200px'},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}
					});
				}
				var points = { recs: items };
				break;
			case "speed_meter_search_geo":	
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					var desc = '<table class="event_tbl"><tbody><tr><td>';
					desc += '<p>Data by <a href="http://www.foxytag.com" target="_blank">FoxyTag</a></p>';
					desc += '</td></tr></tbody></table>';
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '150px', height: '50px'},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link,
							icon	:   './images/icons/markers/foxycircle.png'
						}
					});
				}
				var points = { recs: items };
				break;
			case "restaurant_search_geo":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					if(d.link.search('tabelog.com')>-1){
						var link_parts = d.link.split("/");
						var tabelog_id = link_parts[link_parts.length-2];
						
						var desc = '<table class="tabelog_tbl"><tbody><tr><td>';
						desc += '<p class="tableog_cat">'+d.category+'</p>';
						desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3>';
						desc += '<p>'+d.address+'<br />TEL'+d.phone+'<br />営業時間：'+d.business_hour;
						desc += '<br />定休日：'+d.holiday+'<br />';
						desc += '[<a href="'+d.link+'" target="_blank">食べログ.comの詳細ページ</a>]';
						desc += '[<a href="./index.php" onclick="javascript:OGM.special.doodle('+tabelog_id+','+d.lat+','+d.lng+',\'tabelog\');return false;">doodle?</a>]';
						desc += '<p class="tabelog_score"><span>'+d.total_score+'</span>ポイント</p>';
						desc += '<p><span>（料理・味：'+d.taste_score+'／サービス：'+d.service_score+'／雰囲気：'+d.mood_score+'）</span></p>';
						desc += '<table class="tabelog_inner_tbl"><tbody>';
						desc += '<tr><th>ランチ</th><td>'+d.lunch_price+'</td>';
						desc += '<tr><th>ディナー</th><td>'+d.dinner_price+'</td>';
						desc += '<tr><th>シチュエーション</th><td>'+d.situation+'</td>';
						desc +=	'</tbody></table>';
						desc += '<p style="font-size:x-small">Powered by <a href="http://r.tabelog.com" target="_blank">食べログ</a></p>';
						desc += '</td></tr></tbody></table>';
					}else if(d.link.search('yelp.com')>-1){
				        var desc = '<div class="marker">';
				        desc += '<img class="businessimage" src="./images/yelp.png"/><br />';
				        desc += '<img class="businessimage" src="'+d.taste_score+'"/>';
				        desc += '<div class="businessinfo">';
				        desc += '<a href="'+d.link+'" target="_blank">'+d.title+'</a><br/>';
				        desc += '<img class="ratingsimage" src="'+d.service_score+'"/>&nbsp;based&nbsp;on&nbsp;';
				        desc += d.mood_score + '&nbsp;reviews<br/><br />';
				        desc += 'Categories:'+d.category+'<br />';
				        desc += d.address + '<br/>';
				        desc += d.phone+'<br />';
				        desc += '<br/><a href="'+d.link+'" target="_blank">Read the reviews ≫</a><br/>';
				        desc += '</div></div>';						
					}else{
						if(d.link.search('gnavi')>-1){ 
							var powb = 'ぐるなび';
							var powurl = 'http://www.gnavi.co.jp/'; 
							var doodle_link = '';
						}else{ 
							var powb = 'Hotpepper'; 
							var powurl = 'http://www.hotpepper.jp/'; 
							var doodle_link = '[<a href="./index.php" onclick="javascript:OGM.special.doodle(\''+d.taste_score+'\','+d.lat+','+d.lng+',\'hotpepper\');return false;">doodle?</a>]';
						}

						var desc = '<table class="tabelog_tbl"><tbody><tr><td>';
						desc += '<p class="tableog_cat">'+d.category+'</p>';
						desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3>';
						desc += '<p style="font-size:x-small">'+d.situation+'</p><br />';
						desc += '<p>'+d.address+'<br />';
						if(d.phone.length>0){ desc += 'TEL'+d.phone+'<br />'; }
						desc += '営業時間：'+d.business_hour;
						desc += '<br />定休日：'+d.holiday+'<br />';
						desc += '[<a href="'+d.link+'" target="_blank">';
						desc += powb+'の詳細ページ</a>]'+doodle_link+'<br />';
						desc += '[<a href="http://r.tabelog.com/restaurantlist.asp?LstKind=01&sw='+d.lunch_price+'" target="_blank">食べログ.comで'+d.title+'を検索</a>]';
						desc += '<table class="tabelog_inner_tbl"><tbody>';
						desc += '<tr><th>平均予算</th><td>'+d.dinner_price+'</td>';
						desc +=	'</tbody></table>';
						desc += '<p style="font-size:x-small">Powered by <a href="'+powurl+'" target="_blank">'+powb+'</a></p>';
						desc += '</td></tr></tbody></table>';						
					}
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '270px', height: '220px'},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}
					});
				}
				var points = { recs: items };
				break;
			case "school_search_geo":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					if(d.link.search('yelp.com')>-1){
						var params = d.desc.split("||");
				        var desc = '<div class="marker">';
				        desc += '<img class="businessimage" src="./images/yelp.png"/><br />';
				        desc += '<img class="businessimage" src="'+params[4]+'"/>';
				        desc += '<div class="businessinfo">';
				        desc += '<a href="'+d.link+'" target="_blank">'+d.title+'</a><br/>';
				        desc += '<img class="ratingsimage" src="'+params[2]+'"/>&nbsp;based&nbsp;on&nbsp;';
				        desc += params[3] + '&nbsp;reviews<br/><br />';
				        desc += 'Categories:'+d.category+'<br />';
				        desc += d.address + '<br/>';
				        desc += params[0]+'<br />';
				        desc += '<br/><a href="'+d.link+'" target="_blank">Read the reviews ≫</a><br/>';
				        desc += '</div></div>';
					}else{
						var desc = '<table class="school_tbl"><tbody><tr><td>';
						desc += '<p class="school_cat">'+d.type+'</p>';
						desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3>';
						desc += '<p>'+d.address+'</p><br />';
						desc += '<p class="school_desc">'+d.desc+'</p>';
						desc += '[<a href="'+d.link+'" target="_blank">リクルート進学ネットの詳細ページ</a>]<br />';
						desc += '</td></tr></tbody></table>';						
					}
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '300px', height: '220px'},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}
					});
				}
				var points = { recs: items };
				break;
			case "hairsalon_search_geo":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					if(d.link.search("yelp.com")>-1){
						var params = d.note.split("||");
				        var desc = '<div class="marker">';
				        desc += '<img class="businessimage" src="./images/yelp.png"/><br />';
				        desc += '<img class="businessimage" src="'+d.image+'"/>';
				        desc += '<div class="businessinfo">';
				        desc += '<a href="'+d.link+'" target="_blank">'+d.title+'</a><br/>';
				        desc += '<img class="ratingsimage" src="'+params[2]+'"/>&nbsp;based&nbsp;on&nbsp;';
				        desc += params[3] + '&nbsp;reviews<br/><br />';
				        desc += 'Categories:'+d.desc+'<br />';
				        desc += d.address + '<br/>';
				        desc += params[0]+'<br />';
				        desc += '<br/><a href="'+d.link+'" target="_blank">Read the reviews ≫</a><br/>';
				        desc += '</div></div>';
						var window_width = '280px';						
						var window_height = '280px';
					}else{
						var desc = '<table class="hairsalon_tbl"><tbody><tr><td colspan="2">';
						desc += '<p class="hairsalon_cat">'+d.kodawari+'</p>';
						desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3></td></tr><tr><td>';
						desc += '<img src="'+d.image+'"></td><td>';
						desc += '<p class="hairsalon_desc">'+d.desc+'</p></td></tr><tr><td colspan="2"><br />';
						desc += '<p>'+d.address+'</p>';
						desc += '[<a href="'+d.link+'" target="_blank">Hotpepper Beauty</a>]';
						desc += '[<a href="'+d.qlink+'" target="_blank">クーポンはこちら</a>]<br />';
						desc += '<p class="hairsalon_detail"><span>価格：'+d.price+'円</span>/<span>席数：'+d.seat+'</span></p>';
						desc += '<p class="hairsalon_detail"><span>営業時間：'+d.open+'</span></p>';
						desc += '<p class="hairsalon_detail"><span>定休日：'+d.close+'</span></p>';
						desc += '<p class="hairsalon_detail"><span>駐車場：'+d.parking+'</span></p>';
						desc += '</td></tr></tbody></table>';

						var window_width = '380px';						
						var window_height = '280px';
					}
					
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: window_width, height: window_height},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}
					});
				}
				var points = { recs: items };
				break;
			case "wikipedia_search_geo":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

			        var desc = '<div>';
			        desc += '<p class="geonames_credit">Powered by <a href="http://www.geonames.org/export/" target="_blank">Geonames Web Service</a>';
			        if(OGM.msg.mode=='jp'){
				        desc += '/<a href="http://wikipedia.simpleapi.net/" target="_blank">SimpleAPI</a>';  	
			        }
			        desc += '</p>';
			        if(d.image){ desc += '<img src="'+d.image+'"/>'; }
			        desc += '<div class="geonames_body">';
			        desc += '<a href="'+d.link+'" target="_blank">'+d.title+'</a><br/>';
			        desc += '<p class="geonames_summary">'+d.desc+'</p>';
			        desc += '<br/><a href="'+d.link+'" target="_blank">Read more ≫</a><br/>';
			        desc += '</div></div>';
			        
			        if(d.desc){
						var window_width = '300px';						
						var window_height = '200px';
			        }else{
						var window_width = '200px';						
						var window_height = '100px';			        	
			        }
					
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: window_width, height: window_height},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}
					});
				}
				var points = { recs: items };
				break;											
			case "hotel_search_geo":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					if(d.link.search("booking.com")>-1){
						var wgs = {lat:d.lat,lng:d.lng};
						var window_height = '230px';
						var window_width = '380px';
						var desc = '<iframe class="Booking" style="margin-bottom: -10px; border: 0; padding: 0; width: 380px; height: 230px;" src="'+d.link + '&tmpl=mapgadget_hotel" scrolling="no" frameBorder="0" />';
					}else if(d.link.search("yelp.com")>-1){
						var window_width = '280px';						
						var window_height = '280px';						
						var wgs = {lat:d.lat,lng:d.lng};						
						var params = d.access.split("||");
				        var desc = '<div class="marker">';
				        desc += '<img class="businessimage" src="./images/yelp.png"/><br />';
				        desc += '<img class="businessimage" src="'+d.image+'"/>';
				        desc += '<div class="businessinfo">';
				        desc += '<a href="'+d.link+'" target="_blank">'+d.title+'</a><br/>';
				        desc += '<img class="ratingsimage" src="'+params[1]+'"/>&nbsp;based&nbsp;on&nbsp;';
				        desc += d.rating_num + '&nbsp;reviews<br/><br />';
				        desc += 'Categories:'+d.type+'<br />';
				        desc += d.address + '<br/>';
				        desc += params[0]+'<br />';
				        desc += '<br/><a href="'+d.link+'" target="_blank">Read the reviews ≫</a><br/>';
				        desc += '</div></div>';
					}else{
						var desc = '<table class="jalan_tbl"><tbody><tr><td>';
						desc += '<p class="jalan_cat">'+d.type+'</p>';
						desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3>';
						desc += '<p class="jalan_desc">'+d.desc+'</p>';
						desc += '<p>'+d.address+'</p>';
						if(d.access){ desc += '<p class="jalan_access">アクセス：'+d.access+'</p>'; }
						if(d.chkin){ desc += '<p>チェックイン：'+d.chkin+'</p>';}
						if(d.chkout){ desc += '<p>チェックアウト：'+d.chkout+'</p>';}
						if(d.link){
							if(d.link.search("booking.com")>-1){
								desc += '[<a href="'+d.link+'" target="_blank">BOOKING.COM</a>]';
							}else{
								desc += '[<a href="'+d.link+'" target="_blank">じゃらんの詳細ページ</a>]';							
							}
						}
						if(d.price){ desc += '<p class="jalan_price"><span>一泊'+d.price+'</span>～</p>';}
						if(d.rating){ desc += '<p class="jalan_score"><span>評価：'+d.rating+'</span>ポイント';}
						if(d.rating_num){ desc += '<span>（'+d.rating_num+'件の評価）</span></p>';}
						if(d.visa || d.master || d.jcb || d.amex){ 
							desc += '<p>利用可能なクレジットカード</p>';
							desc += '<table class="jalan_inner_tbl"><tbody>';
							desc += '<tr><th>VISA</th><td>'+(d.visa?'○':'×')+'</td>';
							desc += '<th>MASTER</th><td>'+(d.master?'○':'×')+'</td>';
							desc += '<th>JCB</th><td>'+(d.jcb?'○':'×')+'</td>';
							desc += '<th>AMEX</th><td>'+(d.amex?'○':'×')+'</td></tr>';
						}
						desc +=	'</tbody></table>';
						desc += '</td></tr></tbody></table>';

						var wgs = Geotool.tky2wgs(d.lat,d.lng);	
						var window_width = '350px';						
						var window_height = '280px';						
					}
					
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: window_width, height: window_height},
							lat		:	wgs.lat,
							lng		:	wgs.lng,
							link	:	d.link
						}
					});
				}
				var points = { recs: items };
				break;
			case "doodle_search_geo":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					var window_height = '170px';
					var window_width = '305px';
//					var desc = '<a href="'+d.link+'" target="_blank"><img src="./images/doodle_pc.gif" /></a><br /><iframe class="doodleBBS" style="margin-bottom: -10px; border: 0; padding: 0; width: 301px; height: 2000px;" src="'+d.desc + '" scrolling="no" frameBorder="0" />';
					var desc = '<a href="'+d.link+'" target="_blank"><img src="./images/doodle_pc.gif" /></a><br /><iframe class="doodleBBS" style="margin-bottom: -10px; border: 0; padding: 0;" src="'+d.desc + '" scrolling="auto" frameBorder="0" />';

					items.push({
						data:{
							desc	:	{html: true, text: desc, width: window_width, height: window_height},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}
					});
				}
				var points = { recs: items };
				break;								
			case "general_local_search_geo":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					if(d.link.search("doko.jp")>-1){
						var desc = '<table class="hairsalon_tbl"><tbody><tr><td colspan="2">';
						desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3></td></tr><tr><td>';
						if(d.phone){ desc += '<p>'+d.phone+'</p>'; }
						if(d.address){ desc += '<p>'+d.address+'</p>'; }
						desc += 'Powered by <a href="http://www.doko.jp/" target="_blank">ドコイク？Webサービス（β版）</a>';
						desc += '</td></tr></tbody></table>';

						var window_width = '250px';						
						var window_height = '120px';
					}else{
						var desc = '<table class="hairsalon_tbl"><tbody><tr><td colspan="2">';
						desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3></td></tr><tr><td>';
						if(d.phone){ desc += '<p>'+d.phone+'</p>'; }
						if(d.address){ desc += '<p>'+d.address+'</p>'; }
						desc += 'Powered by <a href="http://developer.yahoo.com/search/local/V2/localSearch.html" target="_blank">Yahoo! Search Web Services</a>';
						desc += '</td></tr></tbody></table>';

						var window_width = '250px';						
						var window_height = '120px';
					}
					
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: window_width, height: window_height},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}
					});
				}
				var points = { recs: items };
				break;
			case "medical_search_geo":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					if(d.link.search("yelp.com")>-1){
						var params = d.desc.split("||");
				        var desc = '<div class="marker">';
				        desc += '<img class="businessimage" src="./images/yelp.png"/><br />';
				        desc += '<img class="businessimage" src="'+d.image+'"/>';
				        desc += '<div class="businessinfo">';
				        desc += '<a href="'+d.link+'" target="_blank">'+d.title+'</a><br/>';
				        desc += '<img class="ratingsimage" src="'+params[1]+'"/>&nbsp;based&nbsp;on&nbsp;';
				        desc += params[2] + '&nbsp;reviews<br/><br />';
				        desc += 'Categories:'+d.type+'<br />';
				        desc += d.address + '<br/>';
				        desc += d.phone+'<br />';
				        desc += '<br/><a href="'+d.link+'" target="_blank">Read the reviews ≫</a><br/>';
				        desc += '</div></div>';
						var window_width = '280px';						
						var window_height = '280px';
					}else{
						var desc = '<table class="hairsalon_tbl"><tbody><tr><td colspan="2">';
						desc += '<p class="hairsalon_cat">'+d.type+'</p>';
						desc += '<h3><a href="'+d.link+'" target="_blank">'+d.title+'</a></h3></td></tr><tr><td>';
						desc += '<p>'+d.phone+'</p>';
						desc += '<p>'+d.address+'</p>';
						desc += '[<a href="'+d.link+'" target="_blank">QLife</a>]';
						desc += '</td></tr></tbody></table>';

						var window_width = '250px';						
						var window_height = '120px';
					}
					
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: window_width, height: window_height},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}
					});
				}
				var points = { recs: items };
				break;
			case "train_station":
			case "country":
			case "city":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;

					var desc = '<table class="event_tbl"><tbody><tr><td>';
					desc += '<h3>'+d.title+'</h3>';
					desc += '<p>'+d.address+'<br />';
					desc += '<form id="ogm_infowindow_search_form"></form>';			
					desc += '</td></tr></tbody></table>';
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '180px', height: '100px'},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}
					});
				}
				var points = { recs: items };
				break;
			case "bus_stop_search_geo":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;
					var desc = d.desc;
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '180px', height: '100px'},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	"http://calta.jp/bybus/"
						}
					});
				}
				var points = { recs: items };
				break;	
			case "michelin":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;
					var desc = d.desc;
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '250px', height: '150px'},
							lat		:	d.lat,
							lng		:	d.lng
						}
					});
				}
				var points = { recs: items };
				break;																							
			case "gas_search_geo":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;
					var desc = d.desc;
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '200px', height: '140px'},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link,
							label	:	d.price
						}
					});
				}
				var points = { recs: items };
				break;
			case "shonan_search_geo":
				var items = [];
				for(var i=0; i<data.length; i++){
					var d = data[i].data;
					var desc = d.desc;
			
					items.push({
						data:{
							desc	:	{html: true, text: desc, width: '300px', height: '200px'},
							lat		:	d.lat,
							lng		:	d.lng,
							link	:	d.link
						}
					});
				}
				var points = { recs: items };
				break;																												
			default:
		   		var points = { recs: data };
		   		break;
	   	}
	   	
	   	return points;
	},	

	_Retrieve: function(opt,type){
		var canvas = opt.canvas;
		
		if(opt.tag){ mapObj.tag = opt.tag; }
		
		canvas.clear();
		OGM.status.set("loading");
		if(opt.auto){
			OGM.status.show_progress();
		}else{
			Ext.Msg.wait(OGM.msg.get('msg_loading_data'), OGM.msg.get('title_loading_data'));
		}

		if(type=="data"){
			if(OGM.status.data_request && OGM.status.data_request.isLoading()){
				OGM.status.data_request.abort();
			}
			
			var conn = new Ext.data.Connection();
			OGM.status.data_request = conn;
			conn.request({
				url		:	"./ogm_init_handler.php",
				params	:	{
					mode	: "model",
					cat		: opt.category,
					lang	: OGM.msg.mode
				},
				scope	:	this,
				callback:	function(o,s,r){
					if(s){
						if(r.responseText.length==0 && !opt.auto){ 
					    	OGM.status.set(OGM.status.DONE);
							setTimeout(function(){
					    		Ext.Msg.alert(OGM.msg.get('title_not_found_001'),OGM.msg.get('msg_not_found_003'));
							},500);
							return;
						}else if(r.responseText.length==0 && opt.auto){
					    	OGM.status.set(OGM.status.DONE);
							OGM.status.hide_progress();
						}

						eval("var res = "+r.responseText);						

						var attr = res.attr;
						OGM.data._drawTable(opt,{ map:res.map, tbl:res.tbl});
/*
						if(attr.min_zoom && opt.box.zoom<attr.min_zoom){
				       		Ext.Msg.confirm(
				       			OGM.msg.get("title_zoom_change"),
				       			OGM.msg.get({
				       				id: "msg_zoom_min_change",
				       				arg: [
				       					OGM.msg.get('mode_'+opt.category),
				       					attr.min_zoom,
				       					opt.box.zoom
				       				]
				       			}),
				       			function(id){
				       				var timeout = 0;
			    	   				if(id=="yes"){
			    	   					mapObj.zoom({to: attr.min_zoom});
			    	   					opt.box = mapObj.getBox();
			    	   					timeout = 1500;
			       					}
									OGM.status.set("loading");
									Ext.Msg.wait(OGM.msg.get('msg_loading_data'), OGM.msg.get('title_loading_data'));
			       					setTimeout(function(){
										OGM.data._drawTable(opt,{ map:res.map, tbl:res.tbl});
			       					},timeout);
			       				}
			       			);
						}else if(attr.max_zoom && opt.box.zoom>attr.max_zoom){
				       		Ext.Msg.confirm(
				       			OGM.msg.get("title_zoom_change"),
				       			OGM.msg.get({
				       				id: "msg_zoom_max_change",
				       				arg: [
				       					OGM.msg.get('mode_'+opt.category),
				       					attr.max_zoom,
				       					opt.box.zoom
				       				]
				       			}),
				       			function(id){
				       				var timeout = 0;
			    	   				if(id=="yes"){
			    	   					mapObj.zoom({to: attr.max_zoom});
			    	   					opt.box = mapObj.getBox();
			    	   					timeout = 1500;
			       					}
									OGM.status.set("loading");
									Ext.Msg.wait(OGM.msg.get('msg_loading_data'), OGM.msg.get('title_loading_data'));
			       					setTimeout(function(){
										OGM.data._drawTable(opt,{ map:res.map, tbl:res.tbl});
			       					},timeout);
			       				}
			       			);
						}else{
							OGM.data._drawTable(opt,{ map:res.map, tbl:res.tbl});
						}
*/ 
					}else{
				    	OGM.status.set(OGM.status.DONE);
						setTimeout(function(){
				    		Ext.Msg.alert(OGM.msg.get('title_not_found_001'),OGM.msg.get('msg_not_found_003'));
						},500);						
					}				
				}
			});
		}else if(type=="image"){
			OGM.data._drawImage(opt);
		}
		
		var intvl = setInterval(function(){
			var intvl_count = 0;
			if(OGM.status.get()==OGM.status.DONE){
				clearInterval(intvl);
				if(opt.auto){ OGM.status.hide_progress(); }
				else{ Ext.Msg.hide(); }
			}else{
				intvl_count++;
				if(intvl_count>=50){
					clearInterval(intvl);
					return;
				}
			}
		},200);
	},
	
	RetrieveData: function(opt){
		OGM.layout.getRegion('east').collapse();
		OGM.data._Retrieve(opt,"data");
	},

	RetrieveImage: function(opt){
		OGM.layout.getRegion('east').collapse();

		if(OGM.status.image_request && OGM.status.image_request.isLoading()){
			OGM.status.image_request.abort();
		}

		var search	= opt.search;
		var page	= opt.page;
		var per_page= opt.per_page;
		var cat		= opt.category;
		var box		= opt.box;

		var tag		= opt.tag?opt.tag:'';
		
		if(opt.auto){
			OGM.status.show_progress();
		}else{
			Ext.Msg.wait(OGM.msg.get('msg_searching_data'), OGM.msg.get('title_searching_data'));
		}
	
		var conn = new Ext.data.Connection();
		OGM.status.image_request = conn;

		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type		: "search", 
				category	: cat,
				search_key	: search,
				tag			: tag,
				page		: page,
				per_page	: per_page,
				lang		: OGM.msg.mode,
				min_lat		: box.sw.lat,
				max_lat		: box.ne.lat,
				min_lng		: box.sw.lng,
				max_lng		: box.ne.lng,
				zoom		: box.zoom
			},
			callback:	function(o,s,r){
				if(s){	
					eval("var res = "+r.responseText);
					var res_len = res.records.length;
							
					if(res_len==0 && !opt.auto){
	  					Ext.Msg.hide();
						OGM.status.set("NOT FOUND");
						Ext.Msg.alert(OGM.msg.get('title_not_found_001'), OGM.msg.get('msg_not_found_003'));
					}else if(res_len==0 && opt.auto){
						OGM.status.hide_progress();
					}else{				
						var pages = [res.prev,res.next];
						var pict = [];
						var loaded = 0;
					
						for(var i=0; i<res_len; i++){	
							if(i+1>res_len){ break; }
							var img = new Image();
//							img.loaded = false;
//							img.onload = function(){ this.loaded = true; loaded++; };
					
							img.src 	= res.records[i].url_s;
							img.largeSrc= res.records[i].url_r;
							img.mediumSrc= res.records[i].url_m;
							img.title	= res.records[i].title;
							img.link	= res.records[i].source;
							img.index 	= i;
							img.id		= res.records[i].id;
							
							if(res.records[i].longitude && res.records[i].latitude){
								img.lng 	= parseFloat(res.records[i].longitude);
								img.lat 	= parseFloat(res.records[i].latitude);
							}else if(res.records[i].lng && res.records[i].lat){
								img.lng 	= parseFloat(res.records[i].lng);
								img.lat 	= parseFloat(res.records[i].lat);
							}
					
							pict.push(img);
						}				
					
						opt.pict = pict;
						opt.pages = pages;
						opt.total = res.total;
						
						OGM.data._Retrieve(opt,"image");
/*
						if(search && opt.move!==false){
							searchAndMove(search);
						}	
*/ 
					}
				}else{
					Ext.Msg.hide();
					OGM.status.set("NOT FOUND");
					Ext.Msg.alert(OGM.msg.get('title_not_found_001'), OGM.msg.get('msg_not_found_003'));
				}
			}
		});
	},
	
	RetrieveNewsBlogs:	function(region){
		mapObj.clearAll();
		mapObj.canvas.clear();
		mapObj.mode = null;

		OGM.status.mask(region.getEl());
		var box = mapObj.getBox();
		
		if(OGM.status.news_blog_request && OGM.status.news_blog_request.isLoading()){
			OGM.status.news_blog_request.abort();
		}
		
		var conn = new Ext.data.Connection();
		
		OGM.status.news_blog_request = conn;
		
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type		: "news_blogs", 
				min_lat		: box.sw.lat,
				max_lat		: box.ne.lat,
				min_lng		: box.sw.lng,
				max_lng		: box.ne.lng,
				zoom		: box.zoom,
				lang		: OGM.msg.mode
			},
			callback:	function(o,s,r){
				if(s && r.responseText.length>2){

					eval("var res = "+r.responseText);
					var res_len = res.length;
							
					if(res_len==0){
						OGM.status.set("NOT FOUND");
						OGM.status.unmask(region.getEl());
						Ext.Msg.alert(OGM.msg.get('title_not_found_001'), OGM.msg.get('msg_not_found_003'));
					}else{
						OGM.status.unmask(region.getEl());
			            function reformatDate(feedDate){
			            	return feedDate;
			                var d = new Date(Date.parse(feedDate));
			                return d ? d.dateFormat('D M j, Y, g:i a') : '';
			            }

						if(region.panels){
							region.panels.each(function(){
								if(this.view){ this.view.purgeListeners(); }
								if(this.ds){ this.ds.removeAll(); }
								this.purgeListeners();
								region.remove(this);
							});
						}
						
						for(var i=0; i<res.length; i++){
							var pnl = new Ext.ContentPanel('east_panel'+i,{
								title: res[i].title,
								autoScroll: true,
								autoCreate : true,
								fitToFrame:true
							});
							pnl.data = res[i].data;
							pnl.on('activate',function(t){
								if(!pnl.view){
									var reader=	new Ext.data.JsonReader({root: "data"},[
										{name: 'title'},
										{name: 'link'},
										{name: 'desc'},
										{name: 'date'}
									]);
            	
			    			        ds = new Ext.data.Store({
			       						proxy:	new Ext.data.MemoryProxy({data:t.data}),
		        	    			    reader : reader
			           			 	});
            
				         			var tpl = new Ext.Template(
			             		    	'<div class="feed-item">' +
			                  			'<div class="item-title">{title}</div>' +
		    	              			'<div class="item-date">{date}</div>' +
		        	          			'{desc}</div>'
			        	    		);
	            					var el = region.getActivePanel().getEl();
    	        					var view = new Ext.View(el, tpl, {
    	        						store: ds,
    	        						singleSelect:true,
    	        						selectedClass:'selected-article'
    	        					});
									
        				    		view.prepareData = function(data){
        			    	    		return {
       			        		    		title: data.title,
       			            				date: reformatDate(data.date),
            			        			desc: data.desc,
            			        			link: data.link
	       				        		};
    	        					};
    	        					
    	        					view.on('dblclick', function(vw,idx,node,e){
    	        						var targetLink = t.data[idx].link;
    	        						window.open(targetLink);
    	        					});
            			
        	    					ds.load();
        	    					pnl.view = view;
        	    					pnl.ds = ds;
								}
								
								var markerData = [];
								for(var k=0; k<t.data.length; k++){
									if(t.data[k].lat && t.data[k].lng){
										markerData.push(t.data[k]);
									}
								}
								if(markerData.length>0){
									var points = OGM.data._createMarkerData(markerData,'news_blogs','');	    	
		    						var markers = mapObj.showMarkers(points);	    		
		    						mapObj.markers = markers;
		    						pnl.on("deactivate",function(){
		    							mapObj.clearAll();
		    						});
	    						}										
							});
							region.add(pnl);							
						}
						if(region.panels){
							var activePanel = region.getPanel('east_panel0');
							region.showPanel(activePanel);
							activePanel.fireEvent('activate',activePanel);
						}						
					}
				}else{
					OGM.status.set("NOT FOUND");
					OGM.status.unmask(region.getEl());
					Ext.Msg.alert(OGM.msg.get('title_not_found_001'), OGM.msg.get('msg_not_found_003'));
				}
			}
		});	
	},
	
	RetrieveTimeline: function(opt){
		var cat = opt.category;
		if(!cat){ return; }
		
		OGM.layout.getRegion('west').collapse();
		OGM.layout.getRegion('east').collapse();
		OGM.layout.getRegion('south').collapse();

		mapObj.clearAll();
		mapObj.canvas.clear();
		
		if(cat=='doodle'){
			mapObj.setCenterAndZoom(new ogmLatLng(36.50963615733049,138.31787109375),7);
			var interval = 5000;		
		}else{
			mapObj.setZoom(2);
			var interval = 3000;
		}
		
		var page = 1;
		if(opt.page){ page = opt.page; }

		var mask_msg = new Ext.get('transparent_mask_msg');
				
		mask_msg.on('click',function(){
			if(OGM.status.flag_intvl){	clearInterval(OGM.status.flag_intvl); }
			if(OGM.status.autoplay && OGM.status.autoplay.isLoading()){
				OGM.status.autoplay.abort();
				OGM.status.autoplay = false;
			}
					
			mask_msg.dom.innerHTML = '';
			OGM.status.unmask();
			OGM.layout.getRegion('west').expand();
		});
		
   		OGM.status.mask('body_elem',true);	
   		mask_msg.dom.innerHTML = OGM.msg.get('msg_autoplay_loading');
		       		
		var conn = new Ext.data.Connection();
		OGM.status.autoplay = conn;
					
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ type: "timeline", category: cat, page:page, lang:OGM.msg.mode },
			timeout :   180000,
			callback:	function(o,s,r){
				if(s){
			   		Ext.get('transparent_mask_msg').dom.innerHTML = OGM.msg.get('msg_autoplay');
					eval("var res = "+r.responseText);
					var page = res.page;
					var ret = res.data;
					
					if(!ret){
						mask_msg.dom.innerHTML = '';
						OGM.status.unmask();
						OGM.layout.getRegion('west').expand();
						return;
					}
					
					var count = ret.length;
							
					var idx = 0;

					var msg = '<span style="font-size:small;color:#000000">'+ret[idx].time+'</a></span><br />';
					msg += '<span style="font-size:small"><a href="'+ret[idx].link+'" target="_blank" style="color:#444444">'+ret[idx].title+'</a></span><br />';
					if(ret[idx].desc){	msg += ret[idx].desc }
					
					if(ret[idx].icon){
						var mrk = (function(params){
							var m = new ogmMarker(new ogmLatLng(params.lat,params.lng),{icon:params.icon});
							ogmEvent.addListener(m,'click',function(){ m.openInfoWindowHtml(params.msg); } );
							return m;
						})({lat:ret[idx].lat,lng:ret[idx].lng,icon:ret[idx].icon,msg:msg});
					}else{
						var mrk = (function(params){
							var m = new ogmMarker(new ogmLatLng(params.lat,params.lng));
							ogmEvent.addListener(m,'click',function(){ m.openInfoWindowHtml(params.msg); } );
							return m;
						})({lat:ret[idx].lat,lng:ret[idx].lng,msg:msg});
					}

					mapObj.addOverlay(mrk);
					mapObj.markers.push(mrk);
										
					mrk.openInfoWindowHtml(msg);
												
					OGM.status.flag_intvl = setInterval(function(){
						idx++;
						if(idx<count){
							var msg = '<span style="font-size:small;color:#000000">'+ret[idx].time+'</a></span><br />';
							msg += '<span style="font-size:small;color:#444444"><a href="'+ret[idx].link+'" target="_blank">'+ret[idx].title+'</a></span><br />';
							if(ret[idx].desc){	msg += ret[idx].desc }

							if(ret[idx].icon){
								var mrk = (function(params){
									var m = new ogmMarker(new ogmLatLng(params.lat,params.lng),{icon:params.icon});
									ogmEvent.addListener(m,'click',function(){ m.openInfoWindowHtml(params.msg); } );
									return m;
								})({lat:ret[idx].lat,lng:ret[idx].lng,icon:ret[idx].icon,msg:msg});
							}else{
								var mrk = (function(params){
									var m = new ogmMarker(new ogmLatLng(params.lat,params.lng));
									ogmEvent.addListener(m,'click',function(){ m.openInfoWindowHtml(params.msg); } );
									return m;
								})({lat:ret[idx].lat,lng:ret[idx].lng,msg:msg});
							}

							mapObj.addOverlay(mrk);
							mapObj.markers.push(mrk);
						
							mrk.openInfoWindowHtml(msg);
						}else{
							clearInterval(OGM.status.flag_intvl);
							OGM.data.RetrieveTimeline({category:cat,page:parseInt(page)+1});
						}
					},interval);
				}else{
	       			OGM.status.unmask();								
				}
			}
		});
	}						
};

OGM.mapEvent = {
	_end	: function(map){
		if(OGM.status.crop){
			map.unsetCropMode();
			map.setCropMode();
		}
		
		map.news();
		if(map.infoDlg && map.infoDlg.isVisible()){ map.showCurrentMapInfo(); }
		
		if(OGM.layout.getRegion("east").expanded){
			OGM.data.RetrieveNewsBlogs(OGM.layout.getRegion("east"));
		}	

		if(!map.autoUpdate){ return; }
		
		if(OGM.isAutoUpdateMode(map.mode)){
			var box = mapObj.getBox();
			if(OGM.isDataMode(map.mode)){
				OGM.data.RetrieveData({
					category :	map.mode,
					tag 	 :	map.tag,
					box		 :	box,
					canvas	 :	map.canvas,
					auto	 : true
				});
			}else if(OGM.isImageMode(map.mode)){
				OGM.data.RetrieveImage({
					category :	map.mode,
					tag 	 :	map.tag,
					box		 :	box,
					canvas	 :	map.canvas,
					auto	 : true
				});
			}
		}		
	},
	
	dragend: function(map){
		OGM.mapEvent._end(map);
	},

	zoomend: function(map){
		if(OGM.isValidZoom(map.mode,map.zoom())){
			OGM.mapEvent._end(map);
		}
	}
};

OGM.mm = {
	createNew	: function(){
		var center = mapObj.getCenter();
		var conn = new Ext.data.Connection();
		OGM.status.mask();
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type	: "mapmark",
				category: "init",
				lang	: OGM.msg.mode,
				session	: OGM.status.session_token,
				lat		: center.lat(),
				lng		: center.lng()
			},
			callback:	function(o,s,r){
				OGM.status.unmask();
				if(s){
					var res = r.responseText.split("::");
					if(res.length!=2){
						Ext.Msg.alert("ERROR","ERROR! Sorry.");
						return;
					}
				
					var token = res[0];
					var addr  = res[1];
		
					var m = new ogmMarker(mapObj.getCenter());
					m.enableDragging();
					mapObj.addOverlay(m);
					mapObj.markers.push(m);
					
					var title = new Ext.form.TextField({
		    			fieldLabel	: 	OGM.msg.get("title_mm_title"),
		    			maxLength	:	254,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
		    	    	width		:	200
		    		});		        
					var address = new Ext.form.TextField({
		    			fieldLabel	: 	OGM.msg.get("title_mm_address"),
		    			maxLength	:	254,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
		    	    	width		:	200
		    		});
					var desc = new Ext.form.TextArea({
		    			fieldLabel	: 	OGM.msg.get("title_mm_desc"),
		    			maxLength	:	1000,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
		    	    	width		:	250
		    		});
					var tags = new Ext.form.TextField({
    					fieldLabel	: 	OGM.msg.get("title_mm_tags"),
		    			maxLength	:	254,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
        				width		:	250
    				});		        
					var flag = new Ext.form.Checkbox({
    					fieldLabel	: 	OGM.msg.get("title_mm_public_flag"),
    					boxLabel	: 	OGM.msg.get("msg_mm_public_flag"),
    					checked		:	true    					
    				});		        

					var cont = new Ext.get(document.createElement('DIV'));
									
				    var sb = new Ext.form.Form();
					sb.fieldset({
						legend		:	OGM.msg.get('msg_mm_create'),					
						labelWidth	:	120,
						labelAlign	:	"left",
						style		:	{textAlign : "left", border: "none"}
					},title,address,desc,tags,flag);

					sb.addButton(OGM.msg.get("title_mm_get_address"),function(){					
						OGM.status.mask();
						var pt = m.getPoint();
						var conn = new Ext.data.Connection();
						conn.request({
							url		:	"./ogm_js_handler.php",
							params	:	{ 
								type	: "mapmark",
								category: 'address',
								lat		: pt.lat(),
								lng		: pt.lng(),
								lang	: OGM.msg.mode
							},
							callback:	function(o,s,r){
								OGM.status.unmask();
								if(s){
									var res = r.responseText;
									address.setRawValue(res);
								}
							}
						});
					});
					
					sb.addButton(OGM.msg.get("title_mm_insert"),function(){
						mapObj.setCenter(m.getPoint());
	    				var centerUrl = mapObj.getUrl();

						if(title.getRawValue().length==0){
							Ext.Msg.alert("ERROR",OGM.msg.get("msg_mm_error_no_title"));
							return;
						}

						if(address.getRawValue().length==0){
							Ext.Msg.alert("ERROR",OGM.msg.get("msg_mm_error_no_address"));
							return;
						}
					
						OGM.status.mask();
						var conn = new Ext.data.Connection();
						conn.request({
							url		:	"./ogm_js_handler.php",
							params	:	{ 
								type	: "mapmark",
								category: 'create',
								url		: centerUrl,
								title	: title.getRawValue(),
								desc	: desc.getRawValue(),
								address	: address.getRawValue(),
								tags	: tags.getRawValue(),
								pubflag	: flag.getValue()?"on":"off",
								token	: token,
								session	: OGM.status.session_token
							},
							callback:	function(o,s,r){
								OGM.status.unmask();
								if(s){
									var res = r.responseText;
									if(res=="1"){
										sb.buttons[0].purgeListeners();
										sb.buttons[1].purgeListeners();
										cont.remove();
										mapObj.closeInfoWindow();
										mapObj.clearMarkers();
										mapObj.mode="mapmark";
										mapObj.clearAll();
										OGM.data.RetrieveData({category:"mapmark",tag:"__userloc__",box:mapObj.getBox(),canvas:mapObj.canvas});
										Ext.Msg.alert(OGM.msg.get("title_mm_insert_ok"),OGM.msg.get("msg_mm_insert_ok"));
									}else{
										Ext.Msg.alert(OGM.msg.get("title_mm_insert_error"),OGM.msg.get("msg_mm_insert_error"));
									}
								}
							}
						});
					});

					m.openInfoWindowHtml(cont.dom);
					sb.render(cont);										
					address.setRawValue(addr);
					cont.setStyle({wdth:'400px'});
					cont.setWidth(400);
					
					ogmEvent.addListener(m,'click',function(){
						m.openInfoWindowHtml(cont.dom);
					});

					ogmEvent.addListener(m,'dragend',function(){
						m.openInfoWindowHtml(cont.dom);
					});
					
				}else{
					Ext.Msg.alert("ERROR","ERROR! Sorry.");				
				}
			}
		});
	},
	
	edit	: function(tgt_id){
		var conn = new Ext.data.Connection();
		OGM.status.mask();
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type	: "mapmark",
				category: "init_edit",
				lang	: OGM.msg.mode,
				session	: OGM.status.session_token,
				id		: tgt_id
			},
			callback:	function(o,s,r){
				OGM.status.unmask();
				if(s){
					var res = r.responseText.split("::");

					if(!r.responseText || res.length!=6){
						Ext.Msg.alert("ERROR","ERROR. Sorry!");
						return;
					}
				
					var token 			= res[0];
					var title_value  	= res[1];
					var desc_value		= res[2];
					var addr_value		= res[3];
					var tags_value		= res[4];
					var pubflag_value	= res[5];
					
					var m = null;
					for(var i=0; i<mapObj.markers.length; i++){
						if(tgt_id==mapObj.markers[i].id){
							m = mapObj.markers[i];
							m.enableDragging();
							break;
						}
					}

					if(m==null){
						Ext.Msg.alert("ERROR","ERROR. Sorry!");
						return;
					}
										
					var title = new Ext.form.TextField({
		    			fieldLabel	: 	OGM.msg.get("title_mm_title"),
		    			maxLength	:	254,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
		    	    	width		:	200
		    		});		        
					var address = new Ext.form.TextField({
		    			fieldLabel	: 	OGM.msg.get("title_mm_address"),
		    			maxLength	:	254,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
		    	    	width		:	200
		    		});
					var desc = new Ext.form.TextArea({
		    			fieldLabel	: 	OGM.msg.get("title_mm_desc"),
		    			maxLength	:	1000,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
		    	    	width		:	250
		    		});
					var tags = new Ext.form.TextField({
    					fieldLabel	: 	OGM.msg.get("title_mm_tags"),
		    			maxLength	:	254,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
        				width		:	250
    				});		        
					var flag = new Ext.form.Checkbox({
    					fieldLabel	: 	OGM.msg.get("title_mm_public_flag"),
    					boxLabel	: 	OGM.msg.get("msg_mm_public_flag"),
    					checked		:	true    					
    				});		        

					var cont = new Ext.get(document.createElement('DIV'));
									
				    var sb = new Ext.form.Form();
					sb.fieldset({
						legend		:	OGM.msg.get('msg_mm_create'),					
						labelWidth	:	120,
						labelAlign	:	"left",
						style		:	{textAlign : "left", border: "none"}
					},title,address,desc,tags,flag);

					sb.addButton(OGM.msg.get("title_mm_get_address"),function(){					
						OGM.status.mask();
						var pt = m.getPoint();
						var conn = new Ext.data.Connection();
						conn.request({
							url		:	"./ogm_js_handler.php",
							params	:	{ 
								type	: "mapmark",
								category: 'address',
								lat		: pt.lat(),
								lng		: pt.lng(),
								lang	: OGM.msg.mode
							},
							callback:	function(o,s,r){
								OGM.status.unmask();
								if(s){
									var res = r.responseText;
									address.setRawValue(res);
								}
							}
						});
					});
					
					sb.addButton(OGM.msg.get("title_mm_edit"),function(){
						mapObj.setCenter(m.getPoint());
	    				var centerUrl = mapObj.getUrl();

						if(title.getRawValue().length==0){
							Ext.Msg.alert("ERROR",OGM.msg.get("msg_mm_error_no_title"));
							return;
						}

						if(address.getRawValue().length==0){
							Ext.Msg.alert("ERROR",OGM.msg.get("msg_mm_error_no_address"));
							return;
						}
					
						OGM.status.mask();
						var conn = new Ext.data.Connection();
						conn.request({
							url		:	"./ogm_js_handler.php",
							params	:	{ 
								type	: "mapmark",
								category: 'edit',
								url		: centerUrl,
								title	: title.getRawValue(),
								desc	: desc.getRawValue(),
								address	: address.getRawValue(),
								tags	: tags.getRawValue(),
								pubflag	: flag.getValue()?"on":"off",
								token	: token,
								session	: OGM.status.session_token,
								id		: tgt_id
							},
							callback:	function(o,s,r){
								OGM.status.unmask();
								if(s){
									var res = r.responseText;
									if(res=="1"){
										sb.buttons[0].purgeListeners();
										sb.buttons[1].purgeListeners();
										cont.remove();
										mapObj.closeInfoWindow();
										mapObj.clearMarkers();
										mapObj.mode="mapmark";
										mapObj.clearAll();
										OGM.data.RetrieveData({category:"mapmark",tag:"__usertime__",box:mapObj.getBox(),canvas:mapObj.canvas});
										Ext.Msg.alert(OGM.msg.get("title_mm_edit_ok"),OGM.msg.get("msg_mm_edit_ok"));
									}else{
										Ext.Msg.alert(OGM.msg.get("title_mm_edit_error"),OGM.msg.get("msg_mm_edit_error"));
									}
								}
							}
						});
					});

					mapObj.closeInfoWindow();
					m.openInfoWindowHtml(cont.dom);
					
					sb.render(cont);										
					title.setRawValue(title_value);
					address.setRawValue(addr_value);
					desc.setRawValue(desc_value);
					tags.setRawValue(tags_value);
					flag.setValue(pubflag_value=="on"?true:false);
					
					cont.setStyle({wdth:'400px'});
					cont.setWidth(400);
					
					ogmEvent.addListener(m,'dragend',function(){
						m.openInfoWindowHtml(cont.dom);
					});
					
				}else{
					Ext.Msg.alert("ERROR","ERROR! Sorry.");				
				}
			}
		});
	},
	
	remove	: function(tgt_id){
		var conn = new Ext.data.Connection();
		OGM.status.mask();
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type	: "mapmark",
				category: "init_delete",
				lang	: OGM.msg.mode,
				session	: OGM.status.session_token,
				id		: tgt_id
			},
			callback:	function(o,s,r){
				OGM.status.unmask();
				if(s){
					var res = r.responseText;

					if(!res){
						Ext.Msg.alert("ERROR","ERROR. Sorry!");
						return;
					}
				
					var token 			= res;

		       		Ext.Msg.confirm(OGM.msg.get('title_mm_delete'),OGM.msg.get('msg_mm_delete_confirm'),function(id){
	    	   			if(id=="yes"){
							OGM.status.mask();
							var conn = new Ext.data.Connection();
							conn.request({
								url		:	"./ogm_js_handler.php",
								params	:	{ 
									type	: "mapmark",
									category: 'delete',
									token	: token,
									session	: OGM.status.session_token,
									id		: tgt_id
								},
								callback:	function(o,s,r){
									OGM.status.unmask();
									if(s){
										var res = r.responseText;
										if(res=="1"){
											mapObj.closeInfoWindow();
											mapObj.clearMarkers();
											mapObj.mode="mapmark";
											mapObj.clearAll();
											OGM.data.RetrieveData({category:"mapmark",tag:"__usertime__",box:mapObj.getBox(),canvas:mapObj.canvas});
											Ext.Msg.alert(OGM.msg.get("title_mm_delete_ok"),OGM.msg.get("msg_mm_delete_ok"));
										}else{
											Ext.Msg.alert(OGM.msg.get("title_mm_delete_error"),OGM.msg.get("msg_mm_delete_error"));
										}
									}
								}
							});
						}
		       		});
				}else{
					Ext.Msg.alert("ERROR","ERROR! Sorry.");				
				}
			}
		});
	}	
};

OGM.kml = {
	view	: function(url){
		var conn = new Ext.data.Connection();
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type	: "kml",
				category: "view",
				url		: url,
				lang	: OGM.msg.mode
			},
			callback:	function(o,s,r){
				OGM.status.unmask();
				if(s){
					OGM.status.mask();					
					var geoXml = new GGeoXml(url,function(){
						OGM.status.unmask();
						if(geoXml.hasLoaded() && geoXml.loadedCorrectly() &&
						   geoXml.getDefaultCenter()){
							geoXml.gotoDefaultViewport(mapObj.map.getOriginal());
							mapObj.map.getOriginal().addOverlay(geoXml);
							if(geoXml.isHidden()){
								geoXml.show();
							}									
			    			OGM.status.kmlurl = url;
						}else{
							Ext.Msg.alert(OGM.msg.get("title_kml_no_data"),OGM.msg.get("msg_kml_no_data"));
						}
					});
				}
			}
		});		
	},
	
	check	: function(){
		var container = 'div_kml_dialog';
		var dlg = new Ext.BasicDialog(container,{
			autoCreate: false,
	        height: 150,
	   		width: 300,
	   		modal: true,
	   		proxyDrag: true,
	   		shadow: true,
	   		collapsible: false,
	   		resizable: false,
	   		autoScroll: false
		});
		
		var txt_url = new Ext.form.TextField({
	   		fieldLabel	: 	'URL',
	       	width		:	200,
	       	value		:   'http://'	       	
	   	});

	    var sb = new Ext.form.Form();
    
		sb.column({
				width		:	290,
				labelWidth	:	50,
	   			labelAlign	:	"left",
	   			style		:	{textAlign : "left", border: "none", marginTop: "10px", marginBottom: "10px"}
			},
			txt_url
		);
		
		sb.addButton(OGM.msg.get('msg_kml_check'),function(){
			var err_flag = false;
			var urlValue = txt_url.getRawValue();
					
			if(urlValue.length<1){
				err_flag = true;
				txt_url.markInvalid(OGM.msg.get('msg_invalid_url'));
			}
			
			if(err_flag===false){
				mapObj.clearAll();
				OGM.layout.getRegion('south').collapse();
				OGM.layout.getRegion('east').collapse();

				dlg.hide();
				OGM.kml.view(urlValue);
			}
		});
	
		sb.render(dlg.body);
		dlg.setTitle(OGM.msg.get('title_kml_check'));
		dlg.on("hide",function(){
			this.purgeListeners();
			sb.buttons[0].purgeListeners();
			this.destroy();
			Ext.get(container).dom.innerHTML = '';
		});
	
		dlg.on("show",function(){
			txt_url.focus();
		});

	    dlg.show();
	},
	
	createNew:	function(){
		if(OGM.status.kmlurl){
			var url = OGM.status.kmlurl;
		}else{
			return;
		}

		OGM.status.mask();
		var conn = new Ext.data.Connection();
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type	: "kml",
				category: "init",
				lang	: OGM.msg.mode,
				session	: OGM.status.session_token
			},
			callback:	function(o,s,r){
				OGM.status.unmask();
				if(s){
					var res = r.responseText;
					if(!res){
						Ext.Msg.alert("ERROR","ERROR! Sorry.");
						return;
					}
					
					var token = res;

					var container = 'div_kml_dialog';
					var dlg = new Ext.BasicDialog(container,{
						autoCreate: false,
				        height: 260,
				   		width: 400,
				   		modal: true,
				   		proxyDrag: true,
				   		shadow: true,
				   		collapsible: false,
				   		resizable: false,
				   		autoScroll: false
					});
					
					var title = new Ext.form.TextField({
		    			fieldLabel	: 	OGM.msg.get("title_kml_title"),
		    			maxLength	:	254,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
		    	    	width		:	250
		    		});		        
					var desc = new Ext.form.TextArea({
		    			fieldLabel	: 	OGM.msg.get("title_kml_desc"),
		    			maxLength	:	1000,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
		    	    	width		:	250
		    		});
					var tags = new Ext.form.TextField({
    					fieldLabel	: 	OGM.msg.get("title_kml_tags"),
		    			maxLength	:	254,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
        				width		:	250
    				});		        
					var flag = new Ext.form.Checkbox({
    					fieldLabel	: 	OGM.msg.get("title_kml_public_flag"),
    					boxLabel	: 	OGM.msg.get("msg_kml_public_flag"),
    					checked		:	true    					
    				});		        

				    var sb = new Ext.form.Form();
					sb.column({
						width		:	390,
						labelWidth	:	120,
				    	labelAlign	:	"left",
				    	style		:	{verticalAlign:'top', textAlign : "left", border: "none", 'margin-left':"5px",'margin-top':'0',padding:0}
				    	},sb.fieldset({
							style: { border: "none",padding:0,margin:0 }
						},title,desc,tags,flag)
					);
		
					sb.addButton(OGM.msg.get("title_kml_insert"),function(){
	    				var centerUrl = mapObj.getUrl();

						if(title.getRawValue().length==0){
							Ext.Msg.alert("ERROR",OGM.msg.get("msg_kml_error_no_title"));
							return;
						}

						OGM.status.mask();
						var conn = new Ext.data.Connection();
						conn.request({
							url		:	"./ogm_js_handler.php",
							params	:	{ 
								type	: "kml",
								category: 'create',
								url		: centerUrl,
								title	: title.getRawValue(),
								desc	: desc.getRawValue(),
								url		: url,
								tags	: tags.getRawValue(),
								pubflag	: flag.getValue()?"on":"off",
								token	: token,
								session	: OGM.status.session_token
							},
							callback:	function(o,s,r){
								dlg.hide();
		    	   				mapObj.clearAll();
								OGM.status.unmask();
								if(s){
									var res = r.responseText;
									if(res=="1"){
										Ext.Msg.alert(OGM.msg.get("title_kml_insert_ok"),OGM.msg.get("msg_kml_insert_ok"));
									}else{
										Ext.Msg.alert(OGM.msg.get("title_kml_insert_error"),OGM.msg.get("msg_kml_insert_error"));
									}
								}
							}
						});
					});

					sb.render(dlg.body);
					dlg.setTitle(OGM.msg.get('msg_kml_create'));

					dlg.on("hide",function(){
						this.purgeListeners();
						sb.buttons[0].purgeListeners();
						this.destroy();
						Ext.get(container).dom.innerHTML = '';
					});
	
					dlg.on("show",function(){
						title.focus();
					});

				    dlg.show();		
				}else{
					Ext.Msg.alert("ERROR","ERROR! Sorry.");				
				}
			}
		});
	},
	
	edit	: function(tgt_id){
		var conn = new Ext.data.Connection();
		OGM.status.mask();
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type	: "kml",
				category: "init_edit",
				lang	: OGM.msg.mode,
				session	: OGM.status.session_token,
				id		: tgt_id
			},
			callback:	function(o,s,r){
				OGM.status.unmask();
				if(s){
					var res = r.responseText.split("::");

					if(!r.responseText || res.length!=5){
						Ext.Msg.alert("ERROR","ERROR. Sorry!");
						return;
					}
				
					var token 			= res[0];
					var title_value  	= res[1];
					var desc_value		= res[2];
					var tags_value		= res[3];
					var pubflag_value	= res[4];
					
					var container = 'div_kml_dialog';
					var dlg = new Ext.BasicDialog(container,{
						autoCreate: false,
				        height: 260,
				   		width: 400,
				   		modal: true,
				   		proxyDrag: true,
				   		shadow: true,
				   		collapsible: false,
				   		resizable: false,
				   		autoScroll: false
					});
					
					var title = new Ext.form.TextField({
		    			fieldLabel	: 	OGM.msg.get("title_kml_title"),
		    			maxLength	:	254,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
		    	    	width		:	250,
		    	    	value		:	title_value
		    		});		        
					var desc = new Ext.form.TextArea({
		    			fieldLabel	: 	OGM.msg.get("title_kml_desc"),
		    			maxLength	:	1000,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
		    	    	width		:	250,
		    	    	value		:	desc_value
		    		});
					var tags = new Ext.form.TextField({
    					fieldLabel	: 	OGM.msg.get("title_kml_tags"),
		    			maxLength	:	254,
		    			maxLengthText:  OGM.msg.get('msg_max_length_exceeded'),
        				width		:	250,
        				value		:	tags_value
    				});		        
					var flag = new Ext.form.Checkbox({
    					fieldLabel	: 	OGM.msg.get("title_kml_public_flag"),
    					boxLabel	: 	OGM.msg.get("msg_kml_public_flag"),
    					checked		:	pubflag_value=="on"?true:false    					
    				});		        

				    var sb = new Ext.form.Form();
					sb.column({
						width		:	390,
						labelWidth	:	120,
				    	labelAlign	:	"left",
				    	style		:	{verticalAlign:'top', textAlign : "left", border: "none", 'margin-left':"5px",'margin-top':'0',padding:0}
				    	},sb.fieldset({
							style: { border: "none",padding:0,margin:0 }
						},title,desc,tags,flag)
					);
					
					sb.addButton(OGM.msg.get("title_kml_edit"),function(){
						if(title.getRawValue().length==0){
							Ext.Msg.alert("ERROR",OGM.msg.get("msg_kml_error_no_title"));
							return;
						}
					
						OGM.status.mask();
						var conn = new Ext.data.Connection();
						conn.request({
							url		:	"./ogm_js_handler.php",
							params	:	{ 
								type	: "kml",
								category: 'edit',
								title	: title.getRawValue(),
								desc	: desc.getRawValue(),
								tags	: tags.getRawValue(),
								pubflag	: flag.getValue()?"on":"off",
								token	: token,
								session	: OGM.status.session_token,
								id		: tgt_id
							},
							callback:	function(o,s,r){
								dlg.hide();
								OGM.status.unmask();
								if(s){
									var res = r.responseText;
									if(res=="1"){
										sb.buttons[0].purgeListeners();
										mapObj.mode="kml";
										mapObj.clearAll();
										OGM.data.RetrieveData({category:"kml",tag:"__usertime__",box:mapObj.getBox(),canvas:mapObj.canvas});
										Ext.Msg.alert(OGM.msg.get("title_kml_edit_ok"),OGM.msg.get("msg_kml_edit_ok"));
									}else{
										Ext.Msg.alert(OGM.msg.get("title_kml_edit_error"),OGM.msg.get("msg_kml_edit_error"));
									}
								}
							}
						});
					});

					sb.render(dlg.body);		
					dlg.setTitle(OGM.msg.get('msg_kml_create'));

					dlg.on("hide",function(){
						this.purgeListeners();
						sb.buttons[0].purgeListeners();
						this.destroy();
						Ext.get(container).dom.innerHTML = '';
					});
	
					dlg.on("show",function(){
						title.focus();
					});

				    dlg.show();							
				}else{
					Ext.Msg.alert("ERROR","ERROR! Sorry.");				
				}
			}
		});
	},
	
	remove	: function(tgt_id){
		var conn = new Ext.data.Connection();
		OGM.status.mask();
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type	: "kml",
				category: "init_delete",
				lang	: OGM.msg.mode,
				session	: OGM.status.session_token,
				id		: tgt_id
			},
			callback:	function(o,s,r){
				OGM.status.unmask();
				if(s){
					var res = r.responseText;

					if(!res){
						Ext.Msg.alert("ERROR","ERROR. Sorry!");
						return;
					}
				
					var token = res;

		       		Ext.Msg.confirm(OGM.msg.get('title_kml_delete'),OGM.msg.get('msg_kml_delete_confirm'),function(id){
	    	   			if(id=="yes"){
							OGM.status.mask();
							var conn = new Ext.data.Connection();
							conn.request({
								url		:	"./ogm_js_handler.php",
								params	:	{ 
									type	: "kml",
									category: 'delete',
									token	: token,
									session	: OGM.status.session_token,
									id		: tgt_id
								},
								callback:	function(o,s,r){
									OGM.status.unmask();
									if(s){
										var res = r.responseText;
										if(res=="1"){
											mapObj.mode="kml";
											mapObj.clearAll();
											OGM.data.RetrieveData({category:"kml",tag:"__usertime__",box:mapObj.getBox(),canvas:mapObj.canvas});
											Ext.Msg.alert(OGM.msg.get("title_kml_delete_ok"),OGM.msg.get("msg_kml_delete_ok"));
										}else{
											Ext.Msg.alert(OGM.msg.get("title_kml_delete_error"),OGM.msg.get("msg_kml_delete_error"));
										}
									}
								}
							});
						}
		       		});
				}else{
					Ext.Msg.alert("ERROR","ERROR! Sorry.");				
				}
			}
		});
	}	
};

OGM.special = {
	visitors: function(){
   		OGM.layout.getRegion('west').collapse();
   		OGM.layout.getRegion('east').collapse();
   		OGM.layout.getRegion('south').collapse();
			   		
   		mapObj.clearAll();

		mapObj.setZoom(2);
		get_visitor_tracks(1);
				
		var mask_msg = new Ext.get('transparent_mask_msg');
				
		mask_msg.on('click',function(){
			if(OGM.status.flag_intvl){	clearInterval(OGM.status.flag_intvl); }
			if(OGM.status.autoplay && OGM.status.autoplay.isLoading()){
				OGM.status.autoplay.abort();
				OGM.status.autoplay = false;
			}
					
			mask_msg.dom.innerHTML = '';
			OGM.status.unmask();
			OGM.layout.getRegion('west').expand();
		});
				
		function get_visitor_tracks(page_num){
       		OGM.status.mask('body_elem',true);
       		
       		Ext.get('transparent_mask_msg').dom.innerHTML = OGM.msg.get('msg_autoplay_loading');
       		
			var conn = new Ext.data.Connection();
			OGM.status.autoplay = conn;
					
			conn.request({
				url		:	"./ogm_js_handler.php",
				params	:	{ type: "tracks", page:page_num, lang:OGM.msg.mode },
				callback:	function(o,s,r){
					if(s){
			       		Ext.get('transparent_mask_msg').dom.innerHTML = OGM.msg.get('msg_autoplay');
						eval("var res = "+r.responseText);
						var page = res.page;
						var ret = res.data;
						var count = ret.length;
						
						var idx = 0;
						var mrk = new ogmMarker(new ogmLatLng(ret[idx].lat,ret[idx].lng));
						mapObj.addOverlay(mrk);
						var msg = '<img src="./images/icons/flags/'+ret[idx].icon+'" /><br />';
						msg += '<span style="font-size:medium">From '+ret[idx].country+'</span><br />';
						msg += '<span style="font-size:x-small">'+ret[idx].time+'</span><br />';
						mrk.openInfoWindowHtml(msg);
							
						OGM.status.flag_intvl = setInterval(function(){
							mapObj.removeOverlay(mrk);
							idx++;
							if(idx<count){
								mrk = new ogmMarker(new ogmLatLng(ret[idx].lat,ret[idx].lng));
								mapObj.addOverlay(mrk);
									
								var msg = '<img src="./images/icons/flags/'+ret[idx].icon+'" /><br />';
								msg += '<span style="font-size:medium">From '+ret[idx].country+'</span><br />';
								msg += '<span style="font-size:x-small">'+ret[idx].time+'</span><br />';
									
								mrk.openInfoWindowHtml(msg);
							}else{
								clearInterval(OGM.status.flag_intvl);
								get_visitor_tracks(parseInt(page_num)+1);
								}
							},3000);
						}else{
	       					OGM.status.unmask();								
						}
					}
			});
		}
	},
   			
	doodle:	function(id,lat,lng,mode){
		var conn = new Ext.data.Connection();
		OGM.status.mask();
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type	: "search",
				category: "doodle_search_geo",
				id		: id,
				lat		: lat,
				lng		: lng,
				tag		: mode
			},
			callback:	function(o,s,r){
				OGM.status.unmask();
				if(s){
					var res = r.responseText;

					if(res=='N/A'){
						Ext.Msg.alert("Not available","doodle bbs not available");
					}else{
						var loc = new ogmLatLng(lat,lng);
						var mrk = new ogmMarker(loc,{map:mapObj.map});
/*
						var msg = '<div class="infoWindow_body" ';
						msg += 'style="width:325px;height:164px">';
						msg += '<a href="http://doodle.st/" target="_blank"><img src="./images/doodle_pc.gif" /></a><br /><iframe class="doodleBBS" style="margin-bottom: -10px; border: 0; padding: 0; width: 301px; height: 2000px;" src="'+res + '" scrolling="no" frameBorder="0" />';					
						msg += '</div>';
*/
						var msg = '<a href="http://doodle.st/" target="_blank"><img src="./images/doodle_pc.gif" /></a><br /><iframe class="doodleBBS" style="margin-bottom: -10px; border: 0; padding: 0;" src="'+res + '" scrolling="auto" frameBorder="0" />';					
						
						ogmEvent.addListener(mrk,"click",function(){
							mrk.openInfoWindowHtml(msg);
						});
		
						mapObj.setCenter(new ogmLatLng(lat,lng)); 		
						mapObj.addOverlay(mrk);
						mrk.openInfoWindowHtml(msg);
						mapObj.markers.push(mrk); 		
					}
				}else{
					Ext.Msg.alert("ERROR","ERROR. Sorry!");
				}
			}
		});
	}
};

function generalSearch_wrap(opt){
	mapObj.clearAll();
	switch(opt){
		case 'photo_search_geo':
			mapObj.mode=opt;
			generalSearch({type:'image',cat:'photo_search_geo',move:false});
			break;
		case 'news_blogs_search_geo':
			OGM.layout.getRegion('east').expand();
			OGM.data.RetrieveNewsBlogs(OGM.layout.getRegion('east'));
			break;
		case 'wifi_FON':
			mapObj.mode='wifi';
			generalSearch({type:'data',cat:'wifi',tag:'FON',move:false});
			break;
		case 'hotel_search_geo_review':
			mapObj.mode='hotel_search_geo';
			generalSearch({type:'data',cat:'hotel_search_geo',tag:'review',move:false});
			break;
		default:
			mapObj.mode=opt;
			generalSearch({type:'data',cat:opt,move:false});
	}
}

function generalSearch(opt){
	var cat 	= opt.cat;
	var type 	= opt.type;
	
	if(!type || !cat){ return; }

	var params = {};
	params.canvas 	= mapObj.canvas;
	params.box 		= opt.box?opt.box:mapObj.getBox();
	params.category = cat;

	params.page 	= opt.index?opt.index:1;
	if(opt.search){ params.search = opt.search; }
	if(opt.per_page){ params.per_page = opt.per_page; }
	if(opt.overlay){ params.overlay = opt.overlay; }
	if(opt.move === false){ params.move = opt.move; }
	if(opt.tag){ params.tag = opt.tag; }
	if(opt.table !== null){ params.table = opt.table; }

	if(opt.datum=='tky'){
		var sw_tky = Geotool.wgs2tky(params.box.sw.lat,params.box.sw.lng);
		var ne_tky = Geotool.wgs2tky(params.box.ne.lat,params.box.ne.lng);
	
		var tky_box = {
			sw:	{ lat: sw_tky.lat, lng: sw_tky.lng },
			ne:	{ lat: ne_tky.lat, lng: ne_tky.lng },
			zoom:	params.box.zoom,
			range:	params.box.range
		};
		params.box = tky_box;
	}
	
	if(type=='data'){
		OGM.data.RetrieveData(params);
	}else if(type=='image'){
		OGM.data.RetrieveImage(params);		
	}
};

function airlineSearch(from,canvas,opt){
	OGM.data.RetrieveData({
		category:	"airline",
		canvas	:	canvas,
		box		:	mapObj.getBox(),
		search	:	from,
		overlay :	"lines"
	});
};

function createContextMenu(){
	var set_center =  new Ext.menu.Item({
		text	: OGM.msg.get("menu_set_center"),
		handler	: 	function(){
			var target = mapObj.map.getOriginal(); 
			OGM.contextmenu.hide();
			target.panTo(OGM.contextmenu.coord);
			setTimeout(function(){
				GEvent.trigger(target,'dragend');
			},500);
		}
	});

	var mm_create =  new Ext.menu.Item({
		text	: OGM.msg.get("menu_mm_create"),
		handler	: 	function(){
			OGM.contextmenu.hide();
			OGM.mm.createNew();
		}
	});

   	if(!OGM.status.session_token){
   		mm_create.disable();
   	}   		   	

	var kml_check =  new Ext.menu.Item({
		text	: OGM.msg.get("menu_kml_check"),
		handler	: 	function(){
			OGM.contextmenu.hide();
			OGM.kml.check();
		}
	});

	var kml_create =  new Ext.menu.Item({
		text	: OGM.msg.get("menu_kml_create"),
		handler	: 	function(){
			OGM.contextmenu.hide();
			OGM.kml.createNew();
		}
	});

   	if(!OGM.status.session_token || !OGM.status.kmlurl){
   		kml_create.disable();
   	}   		   	
	
	var cont = new Ext.menu.Menu({
		id	:	'ContextMenu',
		items:	[
			set_center,'-',
			mm_create,'-',
			kml_check,
			kml_create,'-',
			new Ext.menu.Item({
				text	: OGM.msg.get("menu_wikipedia_search_geo"),
				handler	: 	function(){
					OGM.contextmenu.hide();
					mapObj.mode="wikipedia_search_geo";
					mapObj.clearAll();
					generalSearch({type:"data",cat:"wikipedia_search_geo"});
				}
			}),		
			new Ext.menu.Item({
				text	: OGM.msg.get("menu_book_search_geo"),
				handler	: 	function(){
					OGM.contextmenu.hide();
					mapObj.mode="book_search_geo";
					mapObj.clearAll();
					generalSearch({type:"image",cat:"book_search_geo"});
				}
			}),		
			new Ext.menu.Item({
				text	: OGM.msg.get("menu_photo_search"),
				handler	: 	function(){
					OGM.contextmenu.hide();
					mapObj.mode="photo_search_geo";
					mapObj.clearAll();
					generalSearch({type:"image",cat:"photo_search_geo"});
				}
			}),
			new Ext.menu.Item({
				text	: OGM.msg.get("menu_video_search"),
				handler	: 	function(){
					OGM.contextmenu.hide();
					mapObj.mode="video_search_geo";
					mapObj.clearAll();
					generalSearch({type:"image",cat:"video_search_geo",per_page:30});
				}
			}),
			new Ext.menu.Item({
				text	: OGM.msg.get("menu_news_blogs_search_geo"),
				handler	: 	function(){
					OGM.contextmenu.hide();
					OGM.layout.getRegion("east").expand();
					OGM.data.RetrieveNewsBlogs(OGM.layout.getRegion("east"));				
				}
			}),
			new Ext.menu.Item({
				text	: OGM.msg.get("menu_wifi_search"),
				handler	: 	function(){
					OGM.contextmenu.hide();
					mapObj.mode="wifi";
					mapObj.clearAll();
					generalSearch({type:"data",cat:"wifi"});
				}
			}),'-',
			new Ext.menu.Item({
				text	: OGM.msg.get("menu_info"),
				handler	: 	function(){
					OGM.contextmenu.hide();
					mapObj.showCurrentMapInfo();	
				}
			}),
			new Ext.menu.Item({
				text	: OGM.msg.get("menu_cropmap"),
				handler	: 	function(){
					OGM.contextmenu.hide();
					OGM.acc_panels[5].expand();
				}
			}),'-',
			new Ext.menu.Item({
				text	: OGM.msg.get("menu_goto_home"),
				handler	: 	function(){
					OGM.contextmenu.hide();
					mapObj.gotoHome();	
				}
			})			
		]
	});
	
	cont.mm = mm_create;
	cont.kml = kml_create;
	return cont;
};

Ext.BLANK_IMAGE_URL = './images/s.gif';
mapObj = new OnGmap();

////////////////////////////////////////////////////////////////////

ogmVideoPlayer = function(opt){
	var cont = new Ext.get(document.createElement('DIV'));
	cont.appendTo(document.body);
	var dialog = new Ext.LayoutDialog(cont,{
    	modal: true,
        width:750,
        height:500,
        shadow:true,
        minWidth:700,
        minHeight:500,
        autoTabs:true,
        proxyDrag:true,
        fixedcenter:true,
		north:	{
       		split:true,
       		autoScroll:false,
       		initialSize: 28,
       		minSize: 28,
       		maxSize: 28,
       		titlebar: false,
     		collapsible: true,
     		collapsed: false,
     		useShim: false,
     		animate: false
		},
			
		center: {
			titlebar:	false,
            tabPosition: 'top',
            alwaysShowTabs: true
		},
			
		east:	{
			split:true,
			autoScroll:true,
			initialSize: 150,
			minSize: 50,
			maxSize: 150,
			titlebar: true,
			collapsible: true,
			collapsed: false,
			useShim: true,
			animate: true
		},
		west:	{
		    split:true,
			autoScroll:true,
			initialSize: 150,
			minSize: 50,
	      	maxSize: 150,
			titlebar: true,
			collapsible: true,
			collapsed: false,
			useShim: true,
  	        animate: true
		},
		south:	{
       		split:true,
       		autoScroll:false,
       		initialSize: 28,
       		minSize: 28,
       		maxSize: 28,
       		titlebar: false,
     		collapsible: false,
     		collapsed: false,
     		useShim: false,
     		animate: false
		}
	});

	dialog.addKeyListener(27, dialog.hide, dialog);
	dialog.on('hide',function(){
		cont.remove();
	});
		
	// Layout handling
	var layout = dialog.getLayout();

	var CP = Ext.ContentPanel;
			
	layout.beginUpdate();
	var west_p = layout.add('west', new CP(Ext.id(), {
		title: 'Category',
		autoScroll: true,
		autoCreate : true,
		fitToFrame:true
	}));

	var north_panel = new CP(Ext.id(), {
		autoCreate : true,
		fitToFrame:true
	});
	var south_panel = new CP(Ext.id(), {
		autoCreate : true,
		fitToFrame:true
	});
	var east_panel = new CP(Ext.id(), {
		title: 'Videos Found',
		autoCreate : true,
		fitToFrame:true
	});
	var center_panel = new CP(Ext.id(), {
		id		:'centerpanel_en',
		autoCreate : true,
		fitToFrame:true
	});

	var east_p = layout.add('east', east_panel);

	if(OGM.msg.mode=='jp'){
		var center_panel_jp = new CP(Ext.id(), {
			id		:'centerpanel_jp',
			autoCreate : true,
			fitToFrame:true
		});
		var center_p_jp = layout.add('center', center_panel_jp);
	}
	var center_p = layout.add('center', center_panel);
	var north_p = layout.add('north', north_panel);
	var south_p = layout.add('south', south_panel);
	
	layout.endUpdate();
						
	var Tree = Ext.tree;
	var tree = new Tree.TreePanel(west_p.getEl(), {
		animate:true, 
		loader: new Tree.TreeLoader({
			dataUrl		: 'ogm_init_handler.php',
			baseParams	: {
				mode	: 'tree',
				lang	: OGM.msg.mode
			}
		}),
		enableDD:true,
		containerScroll: true
	});
			
	// set the root node
	var root = new Tree.AsyncTreeNode({
		text: 'menu',
		draggable:false,
		id:'source/move/direct'
	});
	tree.setRootNode(root);
			
	// render the tree
	tree.render();
	root.expand();

	tree.on('click',function(n,e){
		this.grid = null;
		var en = n.attributes.id.split('/');
		center_panel.setTitle(en[en.length-1]);
		center_panel.getEl().dom.innerHTML = '';
		if(center_panel_jp){
			center_panel_jp.setTitle(n.attributes.text);
			center_panel_jp.getEl().dom.innerHTML = '';
		}
		this.search({
			jp: n.attributes.text,
			en: en[en.length-1]
		});
	},this);
			
	var sorter = new Tree.TreeSorter(tree,{
		folderSort:	true
	});
			
	this.dlg = dialog;
	this.cont = cont;
	this.layout = layout;
	this.center_en = center_panel;
	this.east = east_panel;
	this.north = north_panel;
	this.south = south_panel;

	if(OGM.msg.mode=='jp'){
		this.center_jp = center_panel_jp;
	}
};

ogmVideoPlayer.prototype = {
	show : function(el, callback){
	    this.dlg.show();
	},
	
	search: function(keyword){
		this.cont.mask('loading', 'x-mask-loading');
		var conn = new Ext.data.Connection();
		var dlg = this;
		conn.request({
			url		:	"./ogm_js_handler.php",
			params	:	{ 
				type		: "search",
				category	: "travelVideo",
				search_key_jp	: keyword.jp,
				search_key_en	: keyword.en,
				lang		:	OGM.msg.mode
			},
			callback:	function(o,s,r){
				if(s){
					dlg.cont.unmask();
					eval("var res = "+r.responseText);						
					if(res.en.length==0 && (!res.jp || res.jp.length==0)){
						Ext.Msg.alert(OGM.msg.get('title_not_found_002'), OGM.msg.get('msg_not_found_002'));
					}else{
						if(OGM.msg.mode=='jp'){
							if(res.jp && res.jp.length>0){
								var innerhtml = '<span></span><object width="425" height="350">';
								innerhtml += '<param name="movie" value="';
								innerhtml += res.jp[0].url_r;
								innerhtml += '"></param><param name="wmode" value="transparent"></param><embed src="';
								innerhtml += res.jp[0].url_r;
								innerhtml += '" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>';
	
								dlg.center_jp.getEl().dom.innerHTML = innerhtml;

								var seconds = res.jp[0].length_seconds;
								var northInner = '<div><span class="videoViewer_title">'+res.jp[0].title+'    </span><span class="videoViewer_score">SCORE:'+res.jp[0].score+'</span><span class="videoViewer_views">/VIEWS:'+res.jp[0].views+'</span><span class="videoViewer_length">/LENGTH:'+Math.floor(seconds/60)+'\''+(seconds-Math.floor(seconds/60)*60)+'\'\'</span></div>';
								dlg.north.getEl().dom.innerHTML = northInner;								
								var southInner = '<div><span class="videoViewer_tags">'+res.jp[0].tags+'</span></div>';
								dlg.south.getEl().dom.innerHTML = southInner;								
							}else if((res.jp && res.jp.length==0) || !res.jp){
								var innerhtml = '<span>'+keyword.jp+'ã«é¢ããæè¡é¢é£ã®åç»ã¯è¦ã¤ããã¾ããã§ãã</span>';
								dlg.center_jp.getEl().dom.innerHTML = innerhtml;							
							}
						}

						if(res.en && res.en.length>0){
							var innerhtml = '<span></span><object width="425" height="350">';
							innerhtml += '<param name="movie" value="';
							innerhtml += res.en[0].url_r;
							innerhtml += '"></param><param name="wmode" value="transparent"></param><embed src="';
							innerhtml += res.en[0].url_r;
							innerhtml += '" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>';
							dlg.center_en.getEl().dom.innerHTML = innerhtml;
							var seconds = res.en[0].length_seconds;
							var northInner = '<div><span class="videoViewer_title">'+res.en[0].title+'    </span><span class="videoViewer_score">SCORE:'+res.en[0].score+'</span><span class="videoViewer_views">/VIEWS:'+res.en[0].views+'</span><span class="videoViewer_length">/LENGTH:'+Math.floor(seconds/60)+'\''+(seconds-Math.floor(seconds/60)*60)+'\'\'</span></div>';
							dlg.north.getEl().dom.innerHTML = northInner;								
							var southInner = '<div><span class="videoViewer_tags">'+res.en[0].tags+'</span></div>';
							dlg.south.getEl().dom.innerHTML = southInner;								
						}else if(res.en && res.en.length==0){
							var innerhtml = '<span>No travel videos found for '+keyword.en+'</span>';
							dlg.center_en.getEl().dom.innerHTML = innerhtml;							
						}

						dlg.layout.getRegion('center').on('panelactivated',function(t,p){							
							if(dlg.grid){
								dlg.grid.purgeListeners();
								dlg.grid.destroy();
								dlg.grid = null;
							}
							
							if(p.getId()=='centerpanel_en'){ var flag = 'en'; }
							else if(p.getId()=='centerpanel_jp'){ var flag = 'jp'; }
							else{ alert("ERROR"); }
							var ds = new Ext.data.Store({
								proxy:	new Ext.data.MemoryProxy(res),
								reader:	new Ext.data.JsonReader({root: flag},[
									{name: 'id'},
									{name: 'title'},
									{name: 'url_s'},
									{name: 'url_r'},
									{name: 'score'},
									{name: 'length_seconds'},
									{name: 'tags'},
									{name: 'views'}
								])
							});
						    ds.load();

							var cm = new Ext.grid.ColumnModel([
							    {header: 'Title', width: 130, dataIndex: 'title'}
							]);
	
							cm.defaultSortable = false;

							var sm = new Ext.grid.RowSelectionModel({singleSelect: true});
							sm.on("rowselect",function(sm,ri){
								if(flag=='en'){ var d = res.en; var pnl = dlg.center_en; }
								else{ var d=res.jp; var pnl = dlg.center_jp; }
								
								var inner = '<span></span><object width="425" height="350">';
								inner += '<param name="movie" value="';
								inner += d[ri].url_r;
								inner += '"></param><param name="wmode" value="transparent"></param><embed src="';
								inner += d[ri].url_r;
								inner += '" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>';

								pnl.getEl().dom.innerHTML = inner;
								var seconds = d[ri].length_seconds;
								var northInner = '<div><span class="videoViewer_title">'+d[ri].title+'    </span><span class="videoViewer_score">SCORE:'+d[ri].score+'</span><span class="videoViewer_views">/VIEWS:'+d[ri].views+'</span><span class="videoViewer_views">/LENGTH:'+Math.floor(seconds/60)+'\''+(seconds-Math.floor(seconds/60)*60)+'\'\'</span></div>';
								dlg.north.getEl().dom.innerHTML = northInner;								
								var southInner = '<div><span class="videoViewer_tags">'+d[ri].tags+'</span></div>';
								dlg.south.getEl().dom.innerHTML = southInner;								
							});
							
							// create the grid
							dlg.east.getEl().dom.innerHTML = '';
							var grid = new Ext.grid.Grid(dlg.east.getEl(), {
								ds: ds,
								cm:	cm,
								selModel: sm
							});
							
							grid.render();	
							dlg.grid = grid;
						});
						
						var center_region = dlg.layout.getRegion("center");
						center_region.fireEvent('panelactivated',center_region,dlg.center_en);	
						center_region.showPanel(dlg.center_en);	
					}
				}else{
					dlg.cont.unmask();
					Ext.Msg.alert(OGM.msg.get('title_not_found_002'), OGM.msg.get('msg_not_found_002'));
				}
			}
		});
	}
};
