var budnibranchdb_googlemaps = new Class ({

    gmMap : null,
    gmMarker : [],
    bounds : null,

    init : function(map, width, height, searchMode){

        this.gmMap = new GMap2(map, { size: new GSize(width, height) });

        this.gmMap.addControl(new GLargeMapControl3D());
        this.gmMap.addControl(new GMapTypeControl());
        this.gmMap.addControl(new GScaleControl());

        this.bounds = new GLatLngBounds();

        if(searchMode){
            var lat = Cookie.read("budnibranchdb_lat");
            var lng = Cookie.read("budnibranchdb_lng");

            this.gmMap.setCenter(new GLatLng(lat, lng),0);

            //Add search position
            if(lat != 0 && lng != 0){
                this.createMarker(lat, lng, null, "/typo3conf/ext/budni_branchdb/Resources/Images/budni_gmap_icon_search_pos.png",15,15);
            }

            //Add all branch markers
            this.createBranchMarkers();

            this.gmMap.setZoom(this.gmMap.getBoundsZoomLevel(this.getBounds()));
            this.gmMap.setCenter(this.getBounds().getCenter());
        }
    },

    addBound : function(point){
        this.bounds.extend(point);
    },

    getBounds : function(){
        return this.bounds;
    },

    createMarker : function(lat, lng, html, image, image_width, image_height){

        var point = new GLatLng(lat, lng);

        var Icon = new GIcon(G_DEFAULT_ICON, image, {
            'anchor': new GLatLng(0,0),
            'size': new GSize(image_width,image_height)
        });
        Icon.iconSize = new GSize(image_width,image_height);
        Icon.shadowSize = new GSize(0,0);
        Icon.imageMap = [0,0, image_width,0, image_width,image_height, 0,image_height];

        var marker = new GMarker(point,Icon);

        if(html){
	    marker.INFOHTML = html;

            GEvent.addListener(marker,'click', function(){
                this.openInfoWindowHtml(this.INFOHTML);
            });
        }

        this.gmMap.addOverlay(marker);

        this.gmMarker.push(marker);
        this.addBound(point);
    },

    createBranchMarkers : function(){

        $$("#store-finder-results address.adr").each(function(item, index, array){

            var lat = item.getElement("span.latitude").get("text");
            var lng = item.getElement("span.longitude").get("text");
            var sundayHtml = "";
            var height = 186;
			/* only add sunday opening times if they are set */
			if(item.getElement('span.opening-times-so') && item.getElement("span.opening-times-so").get("text").length > 0) {
				sundayHtml = "<tr><td class=\"day\">Sonntag</td><td>" + item.getElement("span.opening-times-so").get("text") + "</td></tr>";
				height = 200;
			}

            var html = "";

            html += "<div style=\"height:" + height + "px;width:180px;\" class=\"map-bubble\" >";
            html += "<span>"
            html +=     item.getElement("span.street-address").get("text");
            html += "</span><br />";
            html += "<span>"
            html +=     item.getElement("span.postal-code").get("text")+" "+item.getElement("span.locality").get("text");
            html += "</span>";
            html += "<br /><br /><strong>Öffnungszeiten:</strong>";
            html += "<table>"
            html += "   <tr>";
            html += "       <td class=\"day\">Montag</td><td>"+item.getElement("span.opening-times-mo").get("text")+"</td>";
            html += "   </tr>";
            html += "   <tr>";
            html += "       <td class=\"day\">Dienstag</td><td>"+item.getElement("span.opening-times-tu").get("text")+"</td>";
            html += "   </tr>";
            html += "   <tr>";
            html += "       <td class=\"day\">Mittwoch</td><td>"+item.getElement("span.opening-times-we").get("text")+"</td>";
            html += "   </tr>";
            html += "   <tr>";
            html += "       <td class=\"day\">Donnerstag</td><td>"+item.getElement("span.opening-times-th").get("text")+"</td>";
            html += "   </tr>";
            html += "   <tr>";
            html += "       <td class=\"day\">Freitag</td><td>"+item.getElement("span.opening-times-fr").get("text")+"</td>";
            html += "   </tr>";
            html += "   <tr>";
            html += "       <td class=\"day\">Samstag</td><td>"+item.getElement("span.opening-times-sa").get("text")+"</td>";
            html += "   </tr>";
            html += sundayHtml;
            html += "</table>";
            html += item.getElement("span.link-detail-page").get("html");
            html += "</div>";

			var branchIcon = "/typo3conf/ext/budni_branchdb/Resources/Images/budni_gmap_icon_branch.png";
			if(item.getProperty('budni_branch:specialBranch').toInt() > 0) {
				branchIcon = "/typo3conf/ext/budni_branchdb/Resources/Images/budni_gmap_icon_specialBranch.png";
			}

            //Add branch marker
            this.createMarker(lat, lng, html, branchIcon,33,41);

        }, this);
    },

    // ============ custom direction panel ===============
    customPanel :  function(map,mapname,dirn,div) {
        var html = "";

        // ===== local functions =====

        // === waypoint banner ===
        function waypoint(point, type, address) {
            var target = '"' + mapname+".showMapBlowup(new GLatLng("+point.toUrlValue(6)+"))"  +'"';
            html += '<table style="margin: 10px 0px; background-color: #e9f2f9; color: #414548;height:35px">';
            html += '  <tr style="cursor: pointer;" onclick='+target+'>';
            html += '    <td style="padding: 7px 20px 5px 14px; vertical-align: middle;">';
            html += '      <img src="typo3conf/ext/budni_branchdb/Resources/Images/gmap_icon_table_'+type+'.png">'
            html += '    </td>';
            html += '    <td style="vertical-align: middle; width: 100%;">';
            html +=        address;
            html += '    </td>';
            html += '  </tr>';
            html += '</table>';
        }

        // === route distance ===
        function routeDistance(dist) {
            html += '<div style="text-align: right; padding-bottom: 0.3em;">' + dist + '</div>';
        }

        // === step detail ===
        function detail(point, num, description, dist) {
            var target = '"' + mapname+".showMapBlowup(new GLatLng("+point.toUrlValue(6)+"))"  +'"';
            html += '  <tr style="cursor: pointer;" onclick='+target+'>';
            html += '    <td style="border-top: 1px solid rgb(205, 205, 205); margin: 0px; padding: 0.3em 3px 0.3em 21px; vertical-align: top; text-align: right;">';
            html +=       num+'.';
            html += '    </td>';
            html += '    <td style="border-top: 1px solid rgb(205, 205, 205); margin: 0px; padding: 0.3em 3px 0.3em 27px; vertical-align: top; width: 100%;">';
            html +=        description;
            html += '    </td>';
            html += '    <td style="border-top: 1px solid rgb(205, 205, 205); margin: 0px; padding: 0.3em 3px 0.3em 0.5em; vertical-align: top; text-align: right;">';
            html +=        dist;
            html += '    </td>';
            html += '  </tr>';
        }

        // === Copyright tag ===
        function copyright(text) {
            html += '<div style="font-size: 0.86em;">' + text + "</div>";
        }


        // === read through the GRoutes and GSteps ===

        var geocode;
        var point;

        for (var i=0; i<dirn.getNumRoutes(); i++) {
            if (i==0) {
                var type="a";
            } else {
                var type="2";
            }
            var route = dirn.getRoute(i);
            geocode = route.getStartGeocode();
            point = route.getStep(0).getLatLng();
            // === Waypoint at the start of each GRoute
            waypoint(point, type, geocode.address);
            //routeDistance(route.getDistance().html+" (about "+route.getDuration().html+")");

            html += '<table style="margin: 0px; padding: 0px; border-collapse: collapse;">';
            for (var j=0; j<route.getNumSteps(); j++) {
                var step = route.getStep(j);
                // === detail lines for each step ===
                detail(step.getLatLng(), j+1, step.getDescriptionHtml(), step.getDistance().html);
            }
            html += '</table>';
        }

        // === the final destination waypoint ===
        geocode = route.getEndGeocode();
        point = route.getEndLatLng();
        waypoint(point, "b", geocode.address);

        // === the copyright text ===
        copyright(dirn.getCopyrightsHtml());

        // === drop the whole thing into the target div
        //div.innerHTML = html;
        new Element(div).set('html', html);

    } // ============ end of customPanel function ===========
});

