function getPosition (element) {
    var result = {};
    if (element.ownerDocument && element.ownerDocument.documentElement && element.getBoundingClientRect) {
        var box = element.getBoundingClientRect ();
        var doc = element.ownerDocument;
        var docElem = doc.documentElement;
        
        var clientTop = docElem.clientTop || 0;
        var clientLeft = docElem.clientLeft || 0;
        result.x = box.left + (self.pageXOffset || docElem.scrollLeft) - clientLeft;
        result.y = box.top  + (self.pageYOffset || docElem.scrollTop ) - clientTop;
    } else {
        var x = 0;
        var y = 0;
        var obj = element.offsetParent;
        while (obj != null){
            x += obj.offsetLeft;
            y += obj.offsetTop;
            obj = obj.offsetParent;
        }
        result.x = x;
        result.y = y;
    }
    return result;
}

var onLoaded = new Array ();

function monochromeOnLoad () {
    for (var n = 0; n < onLoaded.length; ++n) {
        onLoaded[n]();
    }
}

function monochromeAddOnLoad (callback) {
    onLoaded.push (callback);
}

function flowPlayerConfig () {
    return { 
        plugins:  { 
            gatracker: {
                url: "flowplayer.analytics.swf",
                trackingMode: "Bridge",
                // flowplayer.org uses and older version of the Analytics JS code, 
                // we need to modify the name of the tracker object accordingly
                bridgeObject: "_tracker"
            },
            
            controls: {             
                backgroundGradient: 'none', 
                backgroundColor: "#303030",
                bufferColor: '#111111', 
                progressColor: '#404040',             
                buttonColor: '#020202', 
                buttonOverColor: '#606060', 
                timeColor: '#c0c0c0', 
                durationColor: '#a0a0a0', 
                timeBgColor: '#020202', 
                progressGradient: 'none',
                volumeColor : '#020202',
                volumeSliderColor : '#000000',
                opacity: 0.80,
                hideDelay: 1000,
                width: '95%',  
                bottom: 5, 
                left: '50%', 
                borderRadius: 15,
                height: 24,
                autoHide: 'always',
                tooltipColor: '#020202',
                tooltipTextColor: '#a0a0a0',
                tooltips: { 
                    buttons: true, 
                    fullscreen: 'Fullscreen'
                } 
            }
        }
    };
}

function centerWindow (width) {
    var pos = (width - document.documentElement.clientWidth) / 2;
    if (pos > 0) {
        window.scrollTo (pos, 0);
    }
}

function showBigImageMarker (x, y, w, h, text) {
    var mainDocument = document;
    if (!mainDocument.getElementById ("big_image_marker")) {
        mainDocument = document.getElementById ("big_image_iframe").contentWindow.document;
    }
    var marker = mainDocument.getElementById ("big_image_marker");
    var markerFrame = mainDocument.getElementById ("big_image_marker_frame");
    var markerText = mainDocument.getElementById ("big_image_marker_text");
    var image = mainDocument.getElementById ("big_image");
    
    var p = null;
    if (image) {
        p = getPosition (image);
    } else {
        p = { x:0, y:0 };
    }
    
    markerText.innerHTML = text.replace (/[ ]/g, "&#160;");
    
    if (markerText.offsetWidth > w) {
        x -= (markerText.offsetWidth - w) / 2;
    }
    
    marker.style.top = (p.y + y) + "px";
    marker.style.left = (p.x + x) + "px";
    markerFrame.style.width = (w - 6) + "px";
    markerFrame.style.height = (h - 6) + "px";
    
    marker.style.visibility = '';
}

function hideBigImageMarker () {
    var mainDocument = document;
    if (!mainDocument.getElementById ("big_image_marker")) {
        mainDocument = document.getElementById ("big_image_iframe").contentWindow.document;
    }
    
    var marker = mainDocument.getElementById ("big_image_marker");
    marker.style.visibility = 'hidden';
}

// ENTRY MAP

function entryMapDistance (md1, md2) {
    return (
        Math.abs (md1.pos[0] - md2.pos[0]) +
        Math.abs (md1.pos[1] - md2.pos[1])
    );
}

var ENTRY_MAP_BASE_THRESHOLD = 0.00008;

function entryMapMerge (md, markerData, _threshold) {
    var threshold = _threshold;
    if (!threshold) {
        threshold = ENTRY_MAP_BASE_THRESHOLD;
    }
    var merged = false;
    for (var i = 0; i < markerData.length; ++i) {
        var md2 = markerData[i];
        if (entryMapDistance (md, md2) < threshold) {
            md2.images = md2.images.concat (md.images);
            md2.index = md2.index.concat (md.index);
            md2.icons = md2.icons.concat (md.icons);
            merged = true;
            break;
        }
    }
    if (!merged) {
        markerData.push ({
                pos : md.pos,
                images : md.images,
                index : md.index,
                icons : md.icons
            });
    }
}

function entryMapCreateMarker (md, basePath) {
    var icon = new GIcon (G_DEFAULT_ICON, md.icons[0]);
    icon.shadow = "map-image-shadow.png";
    if (md.images.length > 1) {
        icon.shadow = "map-image-shadow-multiple.png";
    }
    icon.iconSize = new GSize (62, 62);
    icon.iconAnchor = new GPoint (30, 61);
    icon.shadowSize = new GSize (120, 62);
    icon.infoWindowAnchor = new GPoint (30, 0);
    icon.imageMap = [ 4,4, 4,57, 26,57, 30,61, 34,57, 57,57, 57,4 ];
    
    var marker = new GMarker(new GLatLng (md.pos[0], md.pos[1]), icon);
    GEvent.addListener (marker, "click", function() {
            var text = '<div style="height: 196px; margin: 0px; margin-right: 12px; padding:0px; overflow-x:hidden; overflow-y: auto;">';
            for (var i = 0; i < md.images.length; ++i) {
                text += '<table cellspacing="0" cellpadding="0" border="0" width="196" height="196"><tr><td style="text-align:center" valign="center"><a target="_parent" href="' + basePath + '.image.' + md.index[i] + '.html"><img class="thumbnail" src="';
                text += md.images[i];
                text += '"/></a></td></tr></table>';            
            }
            text += '</div>';
            marker.openInfoWindowHtml(text, { maxWidth : 240 });
        });
    return marker;
}

function entryMapCreateEntryMarker (name, lat, lon) {
    var marker = new GMarker(new GLatLng (lat, lon));
    GEvent.addListener (marker, "click", function() {
            var text = '<div style="text-align:center; margin: 0px; margin-right: 12px; padding:0px; overflow:auto;">';
            text += '<p style="font-weight:bold;">';
            text += name;
            text += '</p>';            
            text += '</div>';
            marker.openInfoWindowHtml(text, { maxWidth : 80 * map.getSize ().width / 100 });
        });
    return marker;
}

function entryMapInitMap () {
    var map = new GMap2(document.getElementById("map"));
    map.enableDoubleClickZoom();
    map.enableContinuousZoom();
    map.addControl(new GLargeMapControl3D());
    map.addControl(new GHierarchicalMapTypeControl());
    map.addControl(new GScaleControl ());
    map.setCenter(new GLatLng(0,0), 1);
    return map;
}

function entryMapCreateAggregate (markerData, mgr, basePath, zoom, minZoom, maxZoom) {
    var aggregateMarkers = [];
    var newMarkerData = [];
    var threshold = ENTRY_MAP_BASE_THRESHOLD * (Math.pow (2, (17 - zoom)));
    for (var i = 0; i < markerData.length; ++i) {
        entryMapMerge (markerData[i], newMarkerData, threshold);
    }
    for (var i = 0; i < newMarkerData.length; ++i) {
        var md = newMarkerData[i];
        aggregateMarkers.push (entryMapCreateMarker (md, basePath));
    }
    mgr.addMarkers(aggregateMarkers, minZoom, maxZoom);
}

function entryMapCreateMap (markerData, markers, bounds, mgr, map, basePath) {
    mgr.addMarkers(markers, 0, 17);
    
    markers = [];
    
    for (var i = 0; i < markerData.length; ++i) {
        var md = markerData[i];
        markers.push (entryMapCreateMarker (md, basePath));
        bounds.extend (new GLatLng(md.pos[0], md.pos[1]));
    }
    
    mgr.addMarkers(markers, 16, 17);
    
    entryMapCreateAggregate (markerData, mgr, basePath, 15, 15, 15);
    entryMapCreateAggregate (markerData, mgr, basePath, 14, 14, 14);
    entryMapCreateAggregate (markerData, mgr, basePath, 12, 11, 13);
    entryMapCreateAggregate (markerData, mgr, basePath, 9, 8, 10);
    entryMapCreateAggregate (markerData, mgr, basePath, 8, 0, 8);
    
    map.setZoom(Math.max (map.getBoundsZoomLevel (bounds) - 1, 0));
    map.setCenter(bounds.getCenter()); 
    
    mgr.refresh ();
}

function entryMapAddMapTrackMarkers (polyline, mgr, name) {
    entryMapAddMapTrackMarker (polyline.getVertex(0), mgr, name, "Start");
    entryMapAddMapTrackMarker (polyline.getVertex(polyline.getVertexCount() - 1), mgr, name, "End");
}

function entryMapAddMapTrackMarker (position, mgr, name, waypointName) {
    var marker = new GMarker (position);
    GEvent.addListener (marker, "click", function() {
            var text = '<div><p><b>' + name + '</b> (' + waypointName + ')</p></div>';
            marker.openInfoWindowHtml(text);
        });
    mgr.addMarker (marker, 0, 17);
}

//-----------------

delayImages = {};

function addDelayLoadImage (id, image, src) {
    if (!delayImages[id]) {
        delayImages[id] = {};
    }
    delayImages[id][image] = src;
}

function loadDelayedImages (id) {
    var images = delayImages[id];
    if (images) {
        for (var k in images) {
            var img = document.getElementById (k);
            img.src = images[k];
        }
    }
}

function openMobileEntry (entry) {
    loadDelayedImages (entry);
    
    var div = document.getElementById (entry + "_body");
    div.style.display='block'; 
    
}

//---------------------

function resizeFullEntryMap (id) {
    var mf = document.getElementById (id);
    if (mf) {
        mf.style.height = (window.innerHeight - mf.offsetTop - 52) + "px";
    }
}

function monochromeOnResize () {
    resizeFullEntryMap ('bigphotomapframe'); 
    resizeFullEntryMap ('bigmapframe');
}
