var gMap = function(options) {
	this.id = "gmap";
	this.options = options || {};

	if(this.options.lat) this.defaultLatLng.lat = this.options.lat;
	if(this.options.lng) this.defaultLatLng.lng = this.options.lng;

	this.__zunk = {};

	if (GBrowserIsCompatible()) {
		this.__generateMap();
		this.__generateController();
		this.__generateMark();
		this.__generateGeocoder();

		this.__configuring();

		this.try_count = 0;

		if(!this.options.readonly) this.__addEvent();

		// wait for GMAP has constructed.
		if(!this.options.lat && !this.options.lng) {
			this.findCoordIfLocationInputed();
		}
	}
};

gMap.prototype.findCoordIfLocationInputed = function() {
	var addr = $('card_location').value;
	if(addr) {
		$('addr').value = addr;
		this.worker = this.timer().setInterval(Bind(this, this.waitConstructionCompleteAndDo), 500);
	}
};

gMap.prototype.waitConstructionCompleteAndDo = function() {
	if(GMAP) {
		this.timer().clearInterval(this.worker);
		try {
			this.addrToCoord();
		} catch(e) {
			this.timer().clearInterval(this.worker);
		}
	} else {
		if(this.try_count > 30) this.timer().clearInterval(this.worker);
		else this.try_count++;
	}
};

gMap.prototype.timer = function() {
	if(!this.factory_timer) this.factory_timer = window;
	return this.factory_timer;
};

gMap.prototype.addrToCoord = function(addr) {
	if(!addr) var addr = $('addr').value;
	this.geocoder.getLatLng(addr, Bind(this, this.finalizeAddrToCoord));
};

gMap.prototype.coordToAddr = function(latlng) {
	this.geocoder.getLocations(latlng, Bind(this, this.finalizeCoordToAddr));
};

gMap.prototype.finalizeAddrToCoord = function(r) {
	resetForm("search_coord")
	if(!r) alert("검색결과가 없습니다.");
	else this.moveMark(r);
};

gMap.prototype.finalizeCoordToAddr = function(r) {
	if(r.Status.code == "200" && r.Placemark.length > 0) this.input("address").value = r.Placemark[0].address;
}

gMap.prototype.__dScript = function(src) {
	var _obsolete = $('dScript');
	if(_obsolete) _obsolete.remove();

	var s = document.createElement('script');
	s.id = "dScript";
	s.type ='text/javascript';
	s.charset ='utf-8';		  
	s.src = src;
	document.getElementsByTagName('head')[0].appendChild(s);
};

gMap.prototype.__addEvent = function() {
	GEvent.addListener(this.map, "click", Bind(this, function() {
		this.moveMark(arguments[1]);
	}))

	GEvent.addListener(this.mark, "dragend", Bind(this, function() {
		this.moveMark(arguments[0]);
	}))
};

gMap.prototype.moveMark = function(latlng) {
	this.coordToAddr(latlng);
	// this.transCoord(lat, lng);
	var level = this.map.getZoom();
	var map_type = this.map.getCurrentMapType();

	this.input("lat").value = latlng.lat();
	this.input("lng").value = latlng.lng();
	this.input("level").value = level;
	this.input("map_type").value = map_type;
	// this.input("desc")

	this.map.panTo(latlng);
	this.mark.setLatLng(latlng);
}

gMap.prototype.input = function(name) {
	if(!this.__zunk[name]) {
		var _name = "map_" + name
		var _input = document.getElementById(_name);
		this.__zunk[name] = _input;
	}

	return this.__zunk[name];
};

gMap.prototype.__generateMap = function() {
	var params = {};
	if(this.options.width && this.options.height) params.size = new GSize(parseInt(this.options.width), parseInt(this.options.height));

	this.map = new GMap2(document.getElementById("map"), params);
	this.map.setCenter(this.point(), this.level());
};

gMap.prototype.__generateController = function() {
	this.map.setUIToDefault();
};

gMap.prototype.__generateMark = function() {
	var params = {}
	if(!this.options.readonly) params["draggable"] = true
	this.mark = new GMarker(this.point(), params);
	this.map.addOverlay(this.mark);
};

gMap.prototype.__generateGeocoder = function() {
	this.geocoder = new GClientGeocoder;
};

gMap.prototype.point = function(lat, lng) {
	if(!lat) var lat = this.defaultLatLng.lat
	if(!lng) var lng = this.defaultLatLng.lng
	return new GLatLng(lat, lng);
};

gMap.prototype.level = function(level) {
	if(!level) var level = this.defaultLevel;
	return Number(level)
}

gMap.prototype.__configuring = function() {
	// 하이브리드 맵
	// this.map.setMapType(G_HYBRID_MAP)

	this.map.disableScrollWheelZoom();
	// this.map.enableGoogleBar();
}

gMap.prototype.defaultLatLng = {
	lat: 35.693687,
	lng: 139.797224
};

gMap.prototype.defaultLevel = 15;

