function insertAfter(/* Node */node, /* Node */ref, /* boolean? */force) {
    var pn = ref.parentNode;
    if (ref == pn.lastChild) {
        if ((!force) && (node === ref)) {
            return false;
        }
        pn.appendChild(node);
    } else {
        return insertBefore(node, ref.nextSibling, force);
    }
    return true;
}

function insertBefore(/* Node */node, /* Node */ref, /* boolean? */force) {
    if (!force && (node === ref || node.nextSibling === ref)) {
        return false;
    }
    var parent = ref.parentNode;
    parent.insertBefore(node, ref);
    return true;
}

function getById(id, parentNode) {
    if (isAppleWebKit()) {
        var result = null;
        var childNodes = parentNode.childNodes;
        for (var i = 0; i < childNodes.length; i++) {
            if (result != null) return result;
            var childNode = childNodes[i];
            if (childNode && childNode.childNodes && childNode.childNodes.length > 0) {
                var temp = getById(id, childNode);
                if (temp != null) {
                    result = temp;
                }
            }
            if (childNode && childNode.id == id) {
                result = childNode;
            }
        }

        return result;
    } else {
        var result = null;
        var childNodes = parentNode.childNodes;
        for (var i in childNodes) {
            if (result != null) return result;
            var childNode = childNodes[i];
            if (childNode && childNode.childNodes && childNode.childNodes.length > 0) {
                var temp = getById(id, childNode);
                if (temp != null) {
                    result = temp;
                }
            }
            if (childNode && childNode.id == id) {
                result = childNode;
            }
        }
        return result;
    }
}

function byId(id, doc) {
    if ((id) && ((typeof id == 'string') || (id instanceof String))) {
        doc = document;
        var ele = doc.getElementById(id);
        if (ele && (ele.id != id) && doc.all) {
            ele = null;
            var eles = doc.all[id];
            if (eles) {
                if (eles.length) {
                    for (var i = 0; i < eles.length; i++) {
                        if (eles[i].id == id) {
                            ele = eles[i];
                            break;
                        }
                    }
                } else {
                    ele = eles;
                }
            }
        }
        return ele;
    }
    return id;
}

function replaceAll(str, searchValue, replaceValue) {
    var idx = str.indexOf(searchValue);

    while (idx > -1) {
        str = str.replace(searchValue, replaceValue);
        idx = str.indexOf(searchValue);
    }
    return str;
}

var msie;
function isMSIE() {
    if (typeof msie == 'undefined') {
        msie = navigator.userAgent.toLowerCase().indexOf('msie') > 0;
    }
    return msie;
}

var safari;
function isAppleWebKit() {
    if (typeof safari == 'undefined') {
        safari = navigator.userAgent.toLowerCase().indexOf('applewebkit') > 0;
    }
    return safari;
}

function initOnloadFunctions() {
    if (typeof(window.addEventListener) != 'undefined') {
        window.addEventListener('load', main, false);
    } else if (typeof window.attachEvent != 'undefined') {
        window.attachEvent('onload', main);
    } else {
        var oldOnload = window.onload;
        window.onload = function (elm) {
            oldOnload(elm);
            main();
        };
    }
}

function calcContrastColor(colorInHex) {
    function f(c, n) {
        return parseInt(c.substr(n, 2), 16);
    }
    var av = (f(colorInHex, 1) + f(colorInHex, 3) + f(colorInHex, 5)) / 3;
    av += (av >= 100)?-100:100;
    return "rgb(" + av + "," + av + "," + av + ")";
}

function createPopupTile(record) {
    var res = '';
    var imgURL = record['ImageUrl'];
    var imgWidth = record['ImageWidth'];
    var imgHeight = record['ImageHeight'];
    var placeName = record['PlaceName'];
    var state = record['State'];
    var description = record['Description'];
    var googleMaps = record['GoogleMaps'];

    res += '<div class="madwho_tl">';
    res += '<img src="' + imgURL + '" width="' + imgWidth + '" height="' + imgHeight + '" class="madwho_img" alt="No image found"/>';
    res += '<div class="madwho_h1">' + placeName + '</div>';
    res += '<div class="madwho_h2">' + state + '</div>';
    res += '<div class="madwho_h3">';
    res += '<a href="' + googleMaps + '">View in GoogleMaps</a>';
    res += '</div>';
    res += '<div class="madwho_cmnt">' + description + '</div>';
    res += '</div>';
    return res;
}

function getImageMapArea(record) {
    var popUpTile = escape(createPopupTile(record));
    return '<area style=\'cursor:pointer\' href=\'#\' shape=\'circle\' coords=\'' + record['CoordX'] + ',' + record['CoordY'] + ',' + record['Radius'] + '\''
            + 'onmouseover=\'_a=this; _madwho_popup.showpreview("' + popUpTile + '", _a, event, 50);\' />';
}

function doOnLoad() {
    createImageMap();

    var settings = {
        tl: { radius: 20 },
        tr: { radius: 20 },
        bl: { radius: 20 },
        br: { radius: 20 },
        antiAlias: true,
        autoPad: true,
        validTags: ["div"]
    }

    if (isMSIE()) {
        var headerNode = byId("header", document);
        headerNode.style.height = 60 + 'px';
        headerNode.style.borderBottom = "none";
        var footerNode = byId("footer", document);
        footerNode.style.height = 50 + 'px';
        footerNode.style.borderTop = "none";
        deleteNodeById("filler1");
        deleteNodeById("filler2");
    } else {
        new curvyCorners(settings, "header").applyCornersToAll();
        new curvyCorners(settings, "content").applyCornersToAll();
        new curvyCorners(settings, "footer").applyCornersToAll();
    }
}

function deleteNodeById(nodeId) {
    var node = byId(nodeId);
    node.parentNode.removeChild(node);
}

function createImageMap() {
    var divToBeFilled = byId("mapGoesHere", document);
    var res = '';
    res += '<map name="mymap" id="mymap">';
    for (var i in places) {
        var place = places[i];
        res += getImageMapArea(place);
    }
    res += '</map>';
    res += '<IMG Src="route_map.png" Width="600" Height="679" Alt="Route Map" Usemap="#mymap" Ismap/>'
    divToBeFilled.innerHTML = res;
}