var zMap = function(options) {
	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 = {};

	this.__generateMap();
	this.__generateController();
	this.__generateMark();

	this.__configuring();

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

zMap.prototype.__hash = function() {
	return "5365bd86a71b3196c52fc253f997fe845eb770d1";
};

zMap.prototype.moveMark = function(lat, lng) {
	this.coordToAddr(lat, lng);
	this.transCoord(lat, lng);
	var level = this.map.getLevel();
	var map_type = this.map.getMapType();

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

	var point = this.point(lat, lng);
	this.mark.setPoint(point);
	this.map.panTo(point);
};

zMap.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];
};

zMap.prototype.coordToAddr = function(lat, lng) {
	var src = 'http://apis.daum.net/maps/coord2addr?apikey=' + this.__hash() + '&output=json&callback=ZMAP.finalizeCoordToAddr&inputCoordSystem=WGS84&latitude=' + lat + '&longitude=' + lng;
	this.__dScript(src);
};

zMap.prototype.addrToCoord = function() {
	var src = 'http://apis.daum.net/maps/addr2coord?apikey=' + this.__hash() + '&output=json&callback=ZMAP.finalizeAddrToCoord&q=' + encodeURI($('addr').value);	
	this.__dScript(src);
};

zMap.prototype.transCoord = function(lat, lng) {
	var src = 'http://apis.daum.net/maps/transcoord?apikey=' + this.__hash() + '&output=json&callback=ZMAP.finalizeTransCoord&fromCoord=WGS84&toCoord=CONGNAMUL&x=' + lng + '&y=' + lat;
	this.__dScript(src);
};

zMap.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);
};

zMap.prototype.finalizeTransCoord = function(r) {
	this.input("congnamul_x").value = r.x;
	this.input("congnamul_y").value = r.y;
};

zMap.prototype.finalizeCoordToAddr = function(r) {
	this.input("address").value = r.fullName;
};

zMap.prototype.finalizeAddrToCoord = function(r) {
	if(!r.channel || r.channel.item.length <= 0) {
		alert("검색결과가 없습니다.");
	} else {
		this.moveMark(r.channel.item[0].point_y, r.channel.item[0].point_x)
	}
};

zMap.prototype.defaultLatLng = {
	lat: 37.49078590869117,
	lng: 127.03631994382485
};

zMap.prototype.__generateMap = function() {
	var params = {
		point: this.point(),
		contextMenu: false,
		level: 2
	};

	if(this.options.width) params.width = this.options.width
	if(this.options.height) params.height = this.options.height

	this.map = new DMap("map", params)

	this.map.addControl(new DMapTypeControl());
};

zMap.prototype.__generateController = function() {
	this.zoomController = new DZoomControl;
	this.map.addControl(this.zoomController);
};

zMap.prototype.__generateMark = function() {
	this.mark = new DMark(this.point());

	this.map.addOverlay(this.mark);
};

zMap.prototype.__configuring = function() {

	// 맵 타입 설정
	this.map.setMapType("TYPE_SKYVIEW")
	
	// 줌 컨드롤 버티컬 위치 지정
	this.zoomController.setValign("middle");

	// 스크롤 줌 블럭
	this.map.disableScrollWheelZoom();

};

zMap.prototype.__addEvent = function() {
	DEvent.addListener(this.map, "click", Bind(this, function(e) {

		var coordPoint = new DPoint(e.x, e.y);
		// Coord -> Pixel
		var pixByCoord = this.map.getPixByCoordPoint(coordPoint);
		// Pixel -> Coord
		var coordByPix = this.map.getCoordByPixPoint(pixByCoord);

		this.moveMark(coordByPix.y, coordByPix.x);
	}));
};

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