(function () {
        "use strict";

        var utils = (function() {
            var boundingPrefs = {CENTER: 0, BOTTOM_CENTER: 1};
            var LABEL_OFFSET = {0};
            var INFO_OFFSET = {1};
            
            function displayElementText(centerX, centerY, id) {
                var labelContainer = document.getElementsByClassName("himc-label")[0];
                var label = document.createElement("himc-label");
                label.className = "himc-label";
                label.innerHTML = labels[id];
                labelContainer.appendChild(label);
                styleElement(label, centerX - (label.offsetWidth / 2), centerY);
            }

            function getOffsets() {
                var mapContainer = document.getElementById("himc-map-container");
                return {top: mapContainer.offsetTop, left: mapContainer.offsetLeft};
            }
            
            function styleElement(element, left, top) {
                element.style.left = left + "px";
                element.style.top = top + "px";
            }
            
            function getBoundingCenter(minX, maxX, minY, maxY, pref) {
                var x = parseInt((minX + maxX) / 2, 10);
                var y;
                if (pref === boundingPrefs.CENTER) {
                    y = parseInt((minY + maxY) / 2, 10) + INFO_OFFSET;
                } else {
                    y = parseInt(maxY, 10) + LABEL_OFFSET;
                }
                return {x: x, y: y};
            }
            
            function getAreaCenter(coords, pref) {
                var coordsArray = coords.split(","),
                    center = [];
                var coord, maxX, maxY, minX = maxX = parseInt(coordsArray[0], 10),
                    minY = maxY = parseInt(coordsArray[1], 10);
                for (var i = 0; i < coordsArray.length; i++) {
                    coord = parseInt(coordsArray[i], 10);
                    if (i % 2 === 0) {
                        if (coord < minX) {
                            minX = coord;
                        } else if (coord > maxX) {
                            maxX = coord;
                        }
                    } else {
                        if (coord < minY) {
                            minY = coord;
                        } else if (coord > maxY) {
                            maxY = coord;
                        }
                    }
                }
                return getBoundingCenter(minX, maxX, minY, maxY, pref);
            }
  
            return {boundingPrefs: boundingPrefs,
                    displayElementText: displayElementText,
                    getOffsets: getOffsets,
                    styleElement: styleElement,
                    getAreaCenter: getAreaCenter};
        })();
        
        var box = (function() {
            var INFOBOX_POINTER_HEIGHT = 15;
            
            function displayBox(centerX, centerY, id) {
                var infoBox = document.getElementById("himc-info-box");
                infoBox.innerHTML = infoBoxes[id];
                infoBox.className = "himc-visible";
                utils.styleElement(infoBox, centerX - (infoBox.offsetWidth / 2), centerY - infoBox.offsetHeight - INFOBOX_POINTER_HEIGHT);
            }

            function hideBox() {
                document.getElementById("himc-info-box").className = "himc-hidden";
            }
            
            return {display: displayBox, hide: hideBox};
        })();

        var controller = (function() {
        
            document.getElementById("himc-map-container").onload = function () {
                var areas = document.querySelectorAll("area");
                for (var i = 0; i < areas.length; i++) {
                    var centroid = utils.getAreaCenter(areas[i].getAttribute("coords"), utils.boundingPrefs.BOTTOM_CENTER);
                    utils.displayElementText(centroid.x, centroid.y, i);
                }
            };
            
            document.addEventListener("click", function (e) {
                if (e.target.tagName === "AREA") {
                    var centroid = utils.getAreaCenter(e.target.getAttribute("coords"), utils.boundingPrefs.CENTER);
                    var offsets = utils.getOffsets();
                    var computedX = centroid.x + offsets.left;
                    var computedY = centroid.y + offsets.top;
                    box.display(computedX, computedY, Number(e.target.getAttribute("data-info-id")));
                } else {
                    box.hide();
                }
            });
            
            return { };
        })();