(function(){
    function round(n, l) {
        var a = 10^l;
        return Math.round(n*a)/a;
    }
    function setNearClinics(map, point, address) {
        var heading;
        if ($('#result-heading').length) {
            heading = $('#result-heading');
            heading.empty();
        }
        else {
            heading = $('<h4 id="result-heading"/>');
            heading.insertBefore('#search-items');
        }
        heading.text('地点:「'+address+'」の周辺クリニック');
        var distances = [];
        $.each(clinics, function(id, clinic){
            if (clinic) {
                var d = clinic.latlng.distanceFrom(point) / 1000;
                distances.push({id: id, distance: d});
            }
        });
        distances.sort(function(a, b){return (a.distance>b.distance)?1:-1});
        var list;
        if ($('#result-list').length) {
            list = $('#result-list');
            list.empty();
        }
        else {
            list = $('<ul id="result-list"/>');
            list.insertBefore('#search-items');
        }
        var bounds = new GLatLngBounds();
        $.each(distances.slice(0,10), function(i, data){
            var clinic = clinics[data.id];
            var marker = new GMarker(clinic.latlng);
            GEvent.addListener(marker, "click",  function(){
                marker.openInfoWindowHtml('<p>'+clinic.name+'</p><p class="text-align-right">距離：約'+round(data.distance,2)+'km</p>');
                $.getJSON('/sm2/getClinicInfo/'+data.id, showDigest);
            });
            list.append('<li id="clinic-'+data.id+'"><a href="#">'+clinic.name+'</a><p class="text-align-right">距離：約'+round(data.distance,2)+'km</p></li>');
            $('#clinic-'+data.id+' a').click(function(){
                marker.openInfoWindowHtml('<a href="#">'+clinic.name+'</a><p class="text-align-right">距離：約'+round(data.distance,2)+'km</p>');
                $.getJSON('/sm2/getClinicInfo/'+data.id, showDigest);
                return false;
            });
            map.addOverlay(marker);
            bounds.extend(clinic.latlng);
        });
        map.setCenter(point, map.getBoundsZoomLevel(bounds));
        var v = [map.fromContainerPixelToLatLng(new GPoint(200,195)), map.fromContainerPixelToLatLng(new GPoint(200,205))];
        var h = [map.fromContainerPixelToLatLng(new GPoint(195,200)), map.fromContainerPixelToLatLng(new GPoint(205,200))];
        map.addOverlay(new GPolyline(v, '#FF0000', 2, 0.7));
        map.addOverlay(new GPolyline(h, '#FF0000', 2, 0.7));
    }
	function setPrefSearched(map, from, count) {
		from = parseInt(from);
		count = parseInt(count);
		map.clearOverlays();
        var heading;
        if ($('#result-heading').length) {
            heading = $('#result-heading');
            heading.empty();
        }
        else {
            heading = $('<h4 id="result-heading"/>');
            heading.insertBefore('#search-items');
        }
        heading.text('検索結果：'+prefSearched.pref+'のクリニック');
        var list;
        if ($('#result-list').length) {
            list = $('#result-list');
            list.empty();
        }
        else {
            list = $('<ul id="result-list"/>');
            list.insertBefore('#search-items');
        }
		if (from > 0) {
			var prevLink = $('<a id="prevClinics" href="#" rel="'+(from-10)+':'+10+'">前の'+10+'件</a>');
		}
		if (prefSearched.clinics.length > from+count) {
			var left = (prefSearched.clinics.length - from - count >= 10) ? 10 : prefSearched.clinics.length - from - count;
			var nextLink = $('<a id="nextClinics" href="#" rel="'+(from+count)+':'+left+'">次の'+left+'件</a>')
		}
		if (prevLink || nextLink) {
			if (!$('#searched-navi').length) {
				$('#result-list').after('<div id="searched-navi"/>');
			}
			else {
				$('#searched-navi').empty();
			}
			$('#searched-navi').css({padding:'5px 0'})
			if (prevLink) {
				$('#searched-navi').append(prevLink);
				prevLink.addClass('text-to-button').css('display','inline').click(function(){
					var p = $(this).attr('rel').split(':');
					setPrefSearched(map, p[0], p[1]);
					return false;
				});
			}
			if (nextLink) {
				$('#searched-navi').append(nextLink);
				nextLink.addClass('text-to-button').css('display','inline').click(function(){
					var p = $(this).attr('rel').split(':');
					setPrefSearched(map, p[0], p[1]);
					return false;
				});
			}
		}
        var bounds = new GLatLngBounds();
        $.each(prefSearched.clinics.slice(from, from+count), function(i, id){
            var clinic = clinics[parseInt(id)];
            var marker = new GMarker(clinic.latlng);
            GEvent.addListener(marker, "click",  function(){
                marker.openInfoWindowHtml('<p>'+clinic.name+'</p>');
                $.getJSON('/sm2/getClinicInfo/'+id, showDigest);
            });
            list.append('<li id="clinic-'+id+'"><span class="counter">'+(from+i+1)+'.</span><a href="#">'+clinic.name+'</a></li>');
            $('#clinic-'+id+' a').click(function(){
                marker.openInfoWindowHtml('<a href="#">'+clinic.name+'</a>');
                $.getJSON('/sm2/getClinicInfo/'+id, showDigest);
                return false;
            });
            map.addOverlay(marker);
            bounds.extend(clinic.latlng);
        });
        map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
	}
    function showDigest(clinic) {
        var tag = '<h2 class="page-heading">選択されたクリニック情報</h2><div class="clinic-digest"><h3 class="clinic-name">'+clinic.clinic_name+'</h3><div class="digest-main"><ul><li><span class="label-text">所 在 地：</span>'+clinic.area_name+'&nbsp;'+clinic.pref+'</li><li><span class="label-text">院 長 名：</span>'+clinic.doctor_name+'</li><li><span class="label-text">最寄り駅：</span>'+clinic.station+'</li><li><span class="label-text">院長からのメッセージ</span></li></ul><p class="message">'+clinic.message+'</p></div><div class="digest-sub"><img src="'+clinic.pic1+'" width="170" /><a class="clinic-detail-link" href="/clinic/clinic-'+clinic.id+'.html">詳細情報はこちら</a></div></div>';
        $('#search-result').html(tag).wrap('<div style="overflow:auto; width:620px;"/>');
    }
    function showDialog(title, message) {
        var tag = '<div title="'+title+'"><p>'+message+'</p></div>';
        $(tag).dialog({
            bgiframe:true,
            modal:true,
            buttons: {
                OK: function(){
                    $(this).dialog('close');
                }
            }
        });
    }
    jQuery(function($){
        if ($.browser.msie && $.browser.version == 6.0) {
            $('#header h1, #page-description').pngfix();
            $('.step-flow-list,.s2g-image-box,.s2g-merit-list,.float-wrapper,.flow-base-box,.form-link-button-wrapper').css('zoom', 1);
            $('.step-flow-list li,.s2g-merit-list li,.ie6-style-patch li').css('display', 'inline');
            $('.ie6-style-patch .floated-box-style-4').flatten();
        }
        $('.sub-content').height($('#contents').height());
        $('.main-navi-children-inner-text').each(function(){
            $(this).text('→'+$(this).text());
        });
        $(window).load(function(){
            $('.sub-content').height($('#contents').height()-14);
        });
        if (!$('body').is('.editable-mode') || !window['ChangeWeb']) {
            $('.sub-content a').each(function(){
                if ($(this).attr('href') == location.pathname) {
                    $(this).addClass('current');
                    return false;
                }
            });
            $('.folder-toggle-button').each(function(){
                $(this).css({position:'relative'}).append('<span class="folding-button"></span>');
                var folder = $(this).parent().next();
                if ($('a', folder).is('.current')) {
                    $(this).addClass('current');
                }
                else {
                    folder.hide();
                    $(this).toggle(
                        function(){
                            folder.show("slide", { direction: "up" }, 500);
                            $(this).addClass('current');
                        },
                        function(){
                            folder.hide("slide", { direction: "up" }, 500);
                            $(this).removeClass('current');
                        }
                    );
                }
            });
            if (location.pathname.match(/clinic.html/)) {
                $('#latests .clinic-digest .folder').hide();
                $('#latests .clinic-digest h3.clinic-name').css({cursor:'pointer'}).toggle(
                    function(){
                        $(this).addClass('opened');
                        $(this).next().css({zoom:1}).show("blind");
                    },
                    function(){
                        $(this).removeClass('opened');
                        $(this).next().hide("blind");
                    }
                );
                if (GBrowserIsCompatible()) {
					$.get('/sm2/searchBox', function(html){
	                    $('#search-box').css({
	                        position: 'relative'
	                    }).append(html);
	                    var map = new GMap2($('#map-pane')[0]);
	                    map.addControl(new GLargeMapControl());
	                    map.addControl(new GMapTypeControl());
	                    map.addControl(new GScaleControl());
	                    map.setCenter(new GLatLng(36.204824, 138.252924), 4);
	                    window['clinics'] = [];
	                    $.getJSON('/sm2/getClinicWithLatLng', function(json){
	                        $.each(json, function(i, clinic){
	                            var latlng = clinic.latlng.split(',');
	                            clinics[clinic.id] = {
	                                latlng: new GLatLng(parseFloat(latlng[0]), parseFloat(latlng[1])),
	                                name: clinic.clinic_name
	                            };
	                        });
	                    });
						$('#pref-selector').change(function(){
							var selected = $(this).val();
							$.getJSON('/sm2/prefsearch', {pref:selected}, function(json){
                                if (json.length) {
                                    prefSearched = {
                                        pref: selected,
                                        clinics: json
                                    };
                                    setPrefSearched(map, 0, 10);
                                }
							});
						});
	                    $('#do-search').click(function(){
	                        map.clearOverlays();
	                        var address;
	                        switch ($('input[name="search-type"]:checked').val()) {
	                            case "address":
	                                var geocoder = new GClientGeocoder();
	                                address = $('#keyword').val();
	                                geocoder.getLatLng(address, function(point){
	                                    if (!point) {
	                                        showDialog('住所で検索', '指定の住所から位置が特定出来ませんでした。');
	                                    }
	                                    else {
	                                        setNearClinics(map, point, address);
	                                    }
	                                });
	                                break;
	                            case "map":
	                                var point = map.getCenter();
	                                var geocoder = new GClientGeocoder();
	                                geocoder.getLocations(point, function(response){
	                                    if (!response || response.Status.code != 200) {
	                                        showDialog('地図で検索', '指定の位置から住所が特定出来ませんでした。');
	                                    }
	                                    else {
	                                        address = response.Placemark[0].address.replace(/^日本/, '');
	                                        setNearClinics(map, point, address);
	                                    }
	                                });
	                                break;
	                        }
	                    });
					});
                }
            }
            if ($('body').is('.clinic-detail') && GBrowserIsCompatible()) {
                var showMap = function(point) {
                    var map = new GMap2($('#map-pane')[0]);
                    map.addControl(new GLargeMapControl());
                    map.addControl(new GMapTypeControl());
                    map.addControl(new GScaleControl());
                    map.setCenter(point, 15);
                    var marker = new GMarker(point);
                    map.addOverlay(marker);
                    marker.openInfoWindowHtml('<p>'+$('.page-heading').text()+'</p><p>'+$('.secondary-heading').text()+'</p><p>住所：'+$('#address').text()+'</p>');
                }
                if ($('#map-pane').attr('rel')) {
                    var ll = $('#map-pane').attr('rel').split(',');
                    showMap(new GLatLng(parseFloat(ll[0]), parseFloat(ll[1])));
                } else {
                    var geocoder = new GClientGeocoder();
                    var address = $('#address').text();
                    geocoder.getLatLng(address, function(point){
                        if (!point) {
                            $('#map-pane').html('<h4 style="color:red;">位置情報が取得出来ません。</p>');
                        }
                        else {
                            showMap(point);
                        }
                    });
                }
            }
            if ($('.implant').length) {
                $('.implant h3.clinic-name').css({cursor:'pointer'}).toggle(
                    function(){
                        $(this).addClass('opened');
                        $(this).next().show("slide", { direction: "up" }, 500);
                    },
                    function(){
                        $(this).removeClass('opened');
                        $(this).next().hide("slide", { direction: "up" }, 500);
                    }
                );
            }
            $('div.clinic-detail .disc-style').next().css('clear', 'left');
            $('.step-flow-list .floated-box-style-1').flatten();
        }
    });
})();
