var geocoder = new GClientGeocoder();

(function($){
	var el = {
  	submit: '#submit',
  	box: '#box',
  	map: '#map',
		result: '#result',
		type: 'input.type',
		key: '#key',
		tableHeader: '.header',
		close: '#close'
  };
	var settings = {
		API: 'search.php',
		resultNum: 100,
		slideSpeed: 'middle',
		loadingHTML: '<img src="/images/loadinfo.net.gif" alt="loading..." width="16" height="16" />loading...',
		boxSize: [300, 200],
		boxMargin: [20, 6],
		closeButton: '<span id="close">×</span>',
		leftArrow: '&#9664;',
		rightArrow: '&#9654;',
		mapZoom: 14,
		address: '',
		choiceTr: -1
	};
	
	$('body').append('<div id="' + el.box.substr(1, el.box.length) + '"></div>');
	
	function display(e, address){
		if(!address.length) return;
		geocoder.getLatLng(address, 
		function(latlng){
			if (latlng){
				
				var y = (document.documentElement.scrollTop)? document.documentElement.scrollTop: document.body.scrollTop;
				var x = (document.documentElement.scrollLeft)? document.documentElement.scrollLeft: document.body.scrollLeft;
				
				var map = document.createElement('div');
				map.id = el.map.substr(1, el.map.length);
				$(el.box).html('');
				$(el.box).removeClass('grip');

				if (e.pageY + settings.boxSize[1] + settings.boxMargin[1] > (window.innerHeight || document.body.parentElement.offsetHeight) + y) {
					$(el.box).css('top', e.pageY - (settings.boxSize[1] + settings.boxMargin[1]));
					$(el.box).append([map, document.createElement('h2')]);
				}
				else {
					$(el.box).css('top', e.pageY - settings.boxMargin[1]);
					$(el.box).append([document.createElement('h2'), map]);
				}
				
				if(settings.address.length > 20){
					settings.address = settings.address.substr(0, 20) + '...';
				}
				if (e.pageX + settings.boxSize[0] + settings.boxMargin[0] > (window.innerWidth || document.body.parentElement.offsetWidth) + x) {
					$(el.box).css('left', e.pageX - (settings.boxSize[0] + settings.boxMargin[0]));
					$(el.box).children('h2').html(settings.address + ' ' + settings.closeButton + ' ' + settings.rightArrow);
					$(el.box).children('h2').css('text-align', 'right');
				}
				else {
					$(el.box).css('left', e.pageX + settings.boxMargin[0]);
					$(el.box).children('h2').html(settings.leftArrow + ' ' + settings.closeButton + ' ' + settings.address);
					$(el.box).children('h2').css('text-align', 'left');
				}
				
				$(el.box).slideDown(settings.slideSpeed, function(){
					$(this).children('h2').hover(function(){ $(this).parent().addClass('over'); }, function(){ $(this).parent().removeClass('over'); });
					$(this).draggable({opacity: 0.5});
				});
				$(el.close).click(function(){
					$(el.box).slideUp(settings.slideSpeed);
				})
				$(el.close).hover(function(){
					$(this).addClass('over');
				}, function(){
					$(this).removeClass('over');
				});

				gMap = new GMap2(map);
				gMap.addControl(new GSmallMapControl());
				gMap.setCenter(latlng, 14);
				var marker = new GMarker(latlng);
				gMap.addOverlay(marker);
				
			}else{
				display(e, address.substr(0, address.length - 1));
			}
		});
	}

	function tableAction(){
		$('tr').not(el.tableHeader).hover( function(){ 
			settings.choiceTr = -1;
			$('tr.over').removeClass('over');
			$(this).addClass('over'); 
		}, function(){ 
			$(this).removeClass('over'); 
		});
		
		if (GBrowserIsCompatible()) {
			$('tr').not(el.tableHeader).click(function(e){
				settings.address = '';
				$(this).children().each(function(i){ if(i > 3 && i < 7){ settings.address += $(this).text() }});
				if($(el.box).css('display') == 'block'){
					$(el.box).slideUp(settings.slideSpeed, function(){
						display(e, ((settings.address.match(/[\(（]/))? settings.address.substr(0, settings.address.match(/[\(（]/).index): settings.address));
					})
				}
				else{
					display(e, ((settings.address.match(/[\(（]/))? settings.address.substr(0, settings.address.match(/[\(（]/).index): settings.address));
				}
			});
		}
	}
	
	$(el.submit).click(function(){
		$(el.result).html(settings.loadingHTML);
		$(el.box + ':visible').slideUp(settings.slideSpeed);
		var type = $(el.type).filter(function(){ if($(this).attr('checked')) return $(this).val()});
		settings.resultType = type.val();
		
		$.get(settings.API, 'r=' + settings.resultType + '&n=' + settings.resultNum + '&q=' + $(el.key).val(),
		function(html, status){
			$(el.result).html(html);
			tableAction();
		});
		return false;
	});
	
	$(el.key).keypress(function(e){
		switch(e.which){
			case 13:
				$(el.result).html(settings.loadingHTML);
				$(el.box + ':visible').slideUp(settings.slideSpeed);
				var type = $(el.type).filter(function(){ if($(this).attr('checked')) return $(this).val()});
				settings.resultType = type.val();
				
				$.get(settings.API, 'r=' + settings.resultType + '&n=' + settings.resultNum + '&q=' + $(el.key).val(),
				function(html, status){
					$(el.result).html(html);
					tableAction();
				});
				return false;
		}
	});
	
	if($(el.result + ' table').html() != null){
		tableAction();
	}

})(jQuery);

