/* 
 * carnero.cc
 */

var map = null;
var data = null;
var markers = new Array();
markers['bts'] = new Array();
markers['station'] = new Array();
markers['photo'] = new Array();
markers['meteo'] = new Array();
var icons = new Array();

function gmInit() {
    if (GBrowserIsCompatible()) {
        // ikonky
        icons['station-yellow'] = new GIcon(G_DEFAULT_ICON);
        icons['station-yellow'].image = "http://world.carnero.cc/images/station-yellow.png";
        icons['station-yellow'].shadow = "";
        icons['station-yellow'].iconSize = new GSize(22, 22);
        icons['station-yellow'].iconAnchor = new GPoint(11, 11);

        icons['station-red'] = new GIcon(G_DEFAULT_ICON);
        icons['station-red'].image = "http://world.carnero.cc/images/station-red.png";
        icons['station-red'].shadow = "";
        icons['station-red'].iconSize = new GSize(22, 22);
        icons['station-red'].iconAnchor = new GPoint(11, 11);

        icons['station-blue'] = new GIcon(G_DEFAULT_ICON);
        icons['station-blue'].image = "http://world.carnero.cc/images/station-blue.png";
        icons['station-blue'].shadow = "";
        icons['station-blue'].iconSize = new GSize(22, 22);
        icons['station-blue'].iconAnchor = new GPoint(11, 11);

        icons['bts'] = new GIcon(G_DEFAULT_ICON);
        icons['bts'].image = "http://world.carnero.cc/images/bts.png";
        icons['bts'].shadow = "";
        icons['bts'].iconSize = new GSize(16, 16);
        icons['bts'].iconAnchor = new GPoint(8, 8);

        icons['bts-vdf'] = new GIcon(G_DEFAULT_ICON);
        icons['bts-vdf'].image = "http://world.carnero.cc/images/bts-vodafone.png";
        icons['bts-vdf'].shadow = "";
        icons['bts-vdf'].iconSize = new GSize(16, 16);
        icons['bts-vdf'].iconAnchor = new GPoint(8, 8);

        icons['bts-tmo'] = new GIcon(G_DEFAULT_ICON);
        icons['bts-tmo'].image = "http://world.carnero.cc/images/bts-tmobile.png";
        icons['bts-tmo'].shadow = "";
        icons['bts-tmo'].iconSize = new GSize(16, 16);
        icons['bts-tmo'].iconAnchor = new GPoint(8, 8);

        icons['bts-o2'] = new GIcon(G_DEFAULT_ICON);
        icons['bts-o2'].image = "http://world.carnero.cc/images/bts-o2.png";
        icons['bts-o2'].shadow = "";
        icons['bts-o2'].iconSize = new GSize(16, 16);
        icons['bts-o2'].iconAnchor = new GPoint(8, 8);

        icons['photo'] = new GIcon(G_DEFAULT_ICON);
        icons['photo'].image = "http://world.carnero.cc/images/photo.png";
        icons['photo'].shadow = "";
        icons['photo'].iconSize = new GSize(22, 22);
        icons['photo'].iconAnchor = new GPoint(11, 11);

        icons['meteo'] = new GIcon(G_DEFAULT_ICON);
        icons['meteo'].image = "http://world.carnero.cc/images/meteo.png";
        icons['meteo'].shadow = "";
        icons['meteo'].iconSize = new GSize(22, 22);
        icons['meteo'].iconAnchor = new GPoint(11, 11);

        map = new GMap2(document.getElementById('map'));

        var center = new GLatLng(50.0877, 14.4222);
        map.enableGoogleBar();
        map.addControl(new GLargeMapControl());
        map.addControl(new GMenuMapTypeControl());
        map.setMapType(G_SATELLITE_MAP);
        map.setCenter(center, 12);

        var marker = new GMarker(center, {draggable: true});
        GEvent.addListener(marker, "dragend", function() {
            displayPos(marker);
        });

        GEvent.addListener(map, 'moveend', function() { refresh(); });
        GEvent.addListener(map, 'zoomend', function() { refresh(); });
        GEvent.addListener(map, 'resize', function() { refresh(); });
        
        refresh();
    }
}

function createXmlHttp() {
    var xmlHttp;
    try {
        xmlHttp = new XMLHttpRequest();
    } catch(e) {
        var xmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP");
        for (var i=0; i<xmlHttpVersions.length && !xmlHttp; i++) {
            try {
                xmlHttp = new ActiveXObject(xmlHttpVersions[i]);
            } catch(e) {}
        }
    }

    if (xmlHttp) {
        return xmlHttp;
    }

    return false;
}

function refresh() {
    try {
        var params = new Array();

        var loading = document.getElementById('loading');
        loading.innerHTML = '...načítám data...';

        // co chceme videt
        if (document.getElementById('gallery').checked) { params['gallery'] = 1; } else { params['gallery'] = 0; }
        if (document.getElementById('meteo').checked) { params['meteo'] = 1; } else { params['meteo'] = 0; }
        if (document.getElementById('metro').checked) { params['metro'] = 1; } else { params['metro'] = 0; }
        if (document.getElementById('tram').checked) { params['tram'] = 1; } else { params['tram'] = 0; }
        if (document.getElementById('trolej').checked) { params['trolej'] = 1; } else { params['trolej'] = 0; }
        if (document.getElementById('bus').checked) { params['bus'] = 1; } else { params['bus'] = 0; }
        if (document.getElementById('vlak').checked) { params['vlak'] = 1; } else { params['vlak'] = 0; }
        if (document.getElementById('letadlo').checked) { params['letadlo'] = 1; } else { params['letadlo'] = 0; }
        if (document.getElementById('lod').checked) { params['lod'] = 1; } else { params['lod'] = 0; }
        if (document.getElementById('line').checked) { params['line'] = document.getElementById('line').value; } else { params['line'] = -1; clearLine(); }
        if (document.getElementById('bts-today').checked) { params['bts-today'] = 1; } else { params['bts-today'] = 0; }
        if (document.getElementById('bts-vdf').checked) { params['bts-vdf'] = 1; } else { params['bts-vdf'] = 0; }
        if (document.getElementById('bts-tmo').checked) { params['bts-tmo'] = 1; } else { params['bts-tmo'] = 0; }
        if (document.getElementById('bts-o2').checked) { params['bts-o2'] = 1; } else { params['bts-o2'] = 0; }

        if (params['bts-today'] == 1) {
            params['bts-vdf'] = 0;
            params['bts-tmo'] = 0;
            params['bts-o2'] = 0;
        }

        params['rnd'] = Math.floor(Math.random() * 1000);

        // viewport
        var bounds = map.getBounds();
        var boundsSW = bounds.getSouthWest();
        var boundsNE = bounds.getNorthEast();

        params['west'] = boundsSW.x;
        params['south'] = boundsSW.y;
        params['east'] = boundsNE.x;
        params['nord'] = boundsNE.y;

        var i = 0, key, parameterVal, parameterKey;
        var tmpArr = new Array();

        for (key in params) {
            parameterVal = params[key].toString();
            parameterKey = key;

            tmpArr[i++] = parameterKey + '=' + parameterVal;
        }

        var paramsLine = tmpArr.join('&');

        var ajax = createXmlHttp();
        if (ajax) {
            ajax.open('GET', 'http://world.carnero.cc/ajax.php?' + paramsLine, true);
            ajax.onreadystatechange = function() {
                if (ajax.readyState == 4) { if (ajax.status == 200) {
                    try {
                        data = ajax.responseXML.documentElement;
                        displayData();
                    } catch(e) { }
                } }
            };
            ajax.send(null);
        }
    } catch(e) {
        alert('refresh: Vyskytla se chyba.\n\n' + e);
    }
}

function displayData() {
    try {
        var id, pos, x, icon, today;
        var bounds = map.getBounds();
        var transports = new Array(), providers = new Array(), line = '';
        var polyline = new Array();

        var loading = document.getElementById('loading');
        loading.innerHTML = '...zpracovávám data...';

        // co chceme videt
        if (document.getElementById('metro').checked) { transports.push(0); }
        if (document.getElementById('tram').checked) { transports.push(1); }
        if (document.getElementById('trolej').checked) { transports.push(2); }
        if (document.getElementById('bus').checked) { transports.push(3); }
        if (document.getElementById('vlak').checked) { transports.push(4); }
        if (document.getElementById('letadlo').checked) { transports.push(5); }
        if (document.getElementById('lod').checked) { transports.push(6); }

        if (document.getElementById('line').checked) { line = document.getElementById('line').value; } else { line = '-1'; }

        if (document.getElementById('bts-today').checked) {
            providers.push('23001');
            providers.push('23002');
            providers.push('23003');
            providers.push('26202');
            today = true;
        } else {
            if (document.getElementById('bts-vdf').checked) { providers.push('23003'); providers.push('26202'); }
            if (document.getElementById('bts-tmo').checked) { providers.push('23001'); }
            if (document.getElementById('bts-o2').checked) { providers.push('23002'); }
            today = false;
        }

        for (x in markers['bts']) {
            pos = markers['bts'][x]['marker'].getLatLng();
            if(bounds.containsLatLng(pos) == false || in_array(markers['bts'][x]['provider'], providers) == false) {
                map.removeOverlay(markers['bts'][x]['marker']);
                delete(markers['bts'][x]);
            }
        }

        for (x in markers['station']) {
            pos = markers['station'][x]['marker'].getLatLng();
            if(  bounds.containsLatLng(pos) == false
                || (line == '-1' && in_array(markers['station'][x]['transport'], transports) == false)
                || (line != '-1' && in_array(line, markers['station'][x]['lines'].split(',')) == false)
                ) {
                map.removeOverlay(markers['station'][x]['marker']);
                delete(markers['station'][x]);
            }
        }

        for (x in markers['photo']) {
            pos = markers['photo'][x]['marker'].getLatLng();
            if(bounds.containsLatLng(pos) == false || !document.getElementById('gallery').checked) {
                map.removeOverlay(markers['photo'][x]['marker']);
                delete(markers['photo'][x]);
            }
        }

        for (x in markers['meteo']) {
            pos = markers['meteo'][x]['marker'].getLatLng();
            if(bounds.containsLatLng(pos) == false || !document.getElementById('meteo').checked) {
                map.removeOverlay(markers['meteo'][x]['marker']);
                delete(markers['meteo'][x]);
            }
        }

        var y = 0, w = 0;
        var air, road, wind, refresh, photo, taken, source, latitude, longitude, distance, lines, position, provider, providerName, transport, name, width, height, gallery, fat, image;

        // BTS
        var cells = data.getElementsByTagName('cell');
        for(y = 0; y < cells.length; y++) {
            icon = 'bts';

            id = cells[y].getAttribute('id');
            if ('undefined' == typeof(markers['bts'][id])) {
                latitude = cells[y].getAttribute('latitude');
                longitude = cells[y].getAttribute('longitude');
                provider = cells[y].getAttribute('provider');

                position = new GLatLng(latitude, longitude);

                if (provider == '23003' || provider == '26202') {
                    icon = 'bts-vdf';
                    providerName = 'Vodafone';
                } else if (provider == '23001') {
                    icon = 'bts-tmo';
                    providerName = 'T-Mobile';
                } else if (provider == '23002') {
                    icon = 'bts-o2';
                    providerName = 'O2';
                }

                markers['bts'][id] = new Array();
                markers['bts'][id]['marker'] = new GMarker(position, {'title': providerName + ': ' + id, 'icon': icons[icon], 'draggable': false});
                markers['bts'][id]['marker'].value = id;

                markers['bts'][id]['provider'] = providerName;

                GEvent.addListener(markers['bts'][id]['marker'], 'click', function () { infoMeAboutBts(this); });

                map.addOverlay(markers['bts'][id]['marker']);

                if (today) {
                   polyline.push(position);
                }
            }
        }

        if (today && polyline.length > 0) {
            var pl = new GPolyline(polyline, '#000088', 5, 0.75);
	    map.addOverlay(pl);

            polyline = new Array();
        }

        // zastavky a stanice
        var station = data.getElementsByTagName('station');
        for(y = 0; y < station.length; y++) {
            icon = 'station-yellow';

            id = station[y].getAttribute('id');
            if ('undefined' == typeof(markers['station'][id])) {
                latitude = station[y].getAttribute('latitude');
                longitude = station[y].getAttribute('longitude');
                transport = station[y].getAttribute('transport');
                name = station[y].getAttribute('name');
                lines = station[y].getAttribute('lines');
                distance = parseFloat(station[y].getAttribute('distance'));

                position = new GLatLng(latitude, longitude);

                markers['station'][id] = new Array();
                markers['station'][id]['marker'] = new GMarker(position, {'title': name, 'icon': icons[icon], 'draggable': false});
                markers['station'][id]['marker'].value = id;

                markers['station'][id]['transport'] = transport;
                markers['station'][id]['name'] = name;
                markers['station'][id]['lines'] = lines;
                markers['station'][id]['distance'] = distance;
                
                GEvent.addListener(markers['station'][id]['marker'], 'click', function () { infoMeAboutStation(this); });

                map.addOverlay(markers['station'][id]['marker']);
            }
        }

        // galerie
        var group = data.getElementsByTagName('group');
        for(y = 0; y < group.length; y++) {
            icon = 'photo';

            id = group[y].getAttribute('id');
            if ('undefined' == typeof(markers['photo'][id])) {
                latitude = group[y].getAttribute('latitude');
                longitude = group[y].getAttribute('longitude');

                position = new GLatLng(latitude, longitude);

                markers['photo'][id] = new Array();
                markers['photo'][id]['marker'] = new GMarker(position, {'title': name, 'icon': icons[icon], 'draggable': false});
                markers['photo'][id]['marker'].value = id;

                photo = group[y].getElementsByTagName('photo');
                markers['photo'][id]['image'] = new Array();
                for (w = 0; w < photo.length; w ++) {
                    markers['photo'][id]['image'][w] = new Array();

                    image = photo[w].getAttribute('image');
                    name = photo[w].getAttribute('name');
                    width = photo[w].getAttribute('width');
                    height = photo[w].getAttribute('height');
                    gallery = photo[w].getAttribute('gallery');
                    fat = photo[w].getAttribute('fat');
                    taken = photo[w].getAttribute('taken');

                    markers['photo'][id]['image'][w]['name'] = name;
                    markers['photo'][id]['image'][w]['image'] = image;
                    markers['photo'][id]['image'][w]['width'] = width;
                    markers['photo'][id]['image'][w]['height'] = height;
                    markers['photo'][id]['image'][w]['taken'] = taken;
                    markers['photo'][id]['image'][w]['link'] = 'http://gallery.carnero.cc/' + gallery + '/' + fat + '/';
                }

                GEvent.addListener(markers['photo'][id]['marker'], 'click', function () { infoMeAboutPhoto(this); });

                map.addOverlay(markers['photo'][id]['marker']);
            }
        }

        // pocasi
        var meteo = data.getElementsByTagName('meteo');
        for(y = 0; y < meteo.length; y++) {
            icon = 'meteo';

            id = meteo[y].getAttribute('id');
            if ('undefined' == typeof(markers['meteo'][id])) {
                latitude = meteo[y].getAttribute('latitude');
                longitude = meteo[y].getAttribute('longitude');
                name = meteo[y].getAttribute('name');
                air = meteo[y].getAttribute('air');
                road = meteo[y].getAttribute('road');
                wind = meteo[y].getAttribute('wind');
                refresh = meteo[y].getAttribute('refresh');
                source = meteo[y].getAttribute('source');

                position = new GLatLng(latitude, longitude);

                markers['meteo'][id] = new Array();
                markers['meteo'][id]['marker'] = new GMarker(position, {'title': name, 'icon': icons[icon], 'draggable': false});
                markers['meteo'][id]['marker'].value = id;

                markers['meteo'][id]['name'] = name;
                markers['meteo'][id]['air'] = air;
                markers['meteo'][id]['road'] = road;
                markers['meteo'][id]['wind'] = wind;
                markers['meteo'][id]['source'] = source;
                markers['meteo'][id]['refresh'] = refresh;

                GEvent.addListener(markers['meteo'][id]['marker'], 'click', function () { infoMeAboutWeather(this); });

                map.addOverlay(markers['meteo'][id]['marker']);
            }
        }

        loading.innerHTML = '&nbsp;';
    } catch(e) {
        alert('displayData: Vyskytla se chyba.\n\n' + e);
    }
}

function infoMeAboutStation(marker) {
    try {
        var info = '';
        info += '<div class="info-window">';
        info += '<strong>' + markers['station'][marker.value]['name'] + '</strong><br />';
        if (markers['station'][marker.value]['distance'] >= 0) {
            info += 'vzdálenost: ' + markers['station'][marker.value]['distance'] + '&nbsp;km<br />';
        }
        info += '<br />';
        var linesArr = markers['station'][marker.value]['lines'].split(',');
        for (var i = 0; i < linesArr.length; i ++) {
            info += '<a class="line-a" href="#" onclick="selectLine(\'' + linesArr[i] + '\'); return false;">' + linesArr[i] + '</a> ';
        }
        info += '</div>';

        marker.openInfoWindowHtml(info);
    } catch(e) {
        alert('infoMeAboutStation: Vyskytla se chyba.\n\n' + e);
    }
}

function infoMeAboutBts(marker) {
    try {
        var idParts = marker.value.split('-');

        var info = '';
        info += '<div class="info-window">';
        info += '<strong>' + markers['bts'][marker.value]['provider'] + '</strong><br />';
        info += 'lac: ' + idParts[2] + '<br />';
        info += 'cid: ' + idParts[3] + '<br />';
        info += '</div>';

        marker.openInfoWindowHtml(info);
    } catch(e) {
        alert('infoMeAboutBts: Vyskytla se chyba.\n\n' + e);
    }
}

function infoMeAboutPhoto(marker) {
    try {
        var info = '';
        info += '<div class="info-window center">';
        info += '<strong id="photo-title">' + markers['photo'][marker.value]['image'][0]['name'] + '</strong><br />';
        info += '<a id="photo-link" class="img" href="' + markers['photo'][marker.value]['image'][0]['link'] + '" onclick="window.open(\'' + markers['photo'][marker.value]['image'][0]['link'] + '\', \'photo\', \'\'); return false;">';
        info += '<span id="photo-image" style="background: transparent url(' + spaces(markers['photo'][marker.value]['image'][0]['image']) + ') center center no-repeat;"></span><br />';
        info += '</a><br />';
        info += '<small id="photo-taken">' + markers['photo'][marker.value]['image'][0]['taken'] + '</small><br />';
        if (markers['photo'][marker.value]['image'].length > 1) {
            info += '<a id="photo-prev" class="img" href="#" onclick="slideImage(' + marker.value + ', ' + (markers['photo'][marker.value]['image'].length - 1) + '); return false;"><img class="clear icon" src="http://world.carnero.cc/images/prev.png" width="16" height="16" alt="" /></a>&nbsp; ';
            info += ' &nbsp;[ <span id="photo-info">1/' + markers['photo'][marker.value]['image'].length + '</span> ]&nbsp; ';
            info += ' &nbsp;<a id="photo-next" class="img" href="#" onclick="slideImage(' + marker.value + ', 1); return false;"><img class="clear icon" src="http://world.carnero.cc/images/next.png" width="16" height="16" alt="" /></a>';
        }
        info += '</div>';

        marker.openInfoWindowHtml(info);
    } catch(e) {
        alert('infoMeAboutPhoto: Vyskytla se chyba.\n\n' + e);
    }
}

function infoMeAboutWeather(marker) {
    try {
        var info = '';
        info += '<div class="info-window">';
        info += '<strong>' + markers['meteo'][marker.value]['name'] + '</strong><br />';
        if (markers['meteo'][marker.value]['air'].length > 0) {
            info += 'teplota vzduchu: ' + markers['meteo'][marker.value]['air'] + '&nbsp;&deg;C<br />';
        }
        if (markers['meteo'][marker.value]['road'].length > 0) {
            info += 'teplota vozovky: ' + markers['meteo'][marker.value]['road'] + '&nbsp;&deg;C<br />';
        }
        if (markers['meteo'][marker.value]['wind'].length > 0) {
            info += 'rychlost větru: ' + markers['meteo'][marker.value]['wind'] + '&nbsp;m/s<br />';
        }
        info += '<br />';
        info += '<small>poslední obnovení údajů: ' + markers['meteo'][marker.value]['refresh'] + '</small><br />';
        if (markers['meteo'][marker.value]['source'].toLowerCase() == 'dpp') {
            info += '<small>zdroj dat: <a href="http://www.dpp.cz/meteocidla/" onclick="window.open(\'http://www.dpp.cz/meteocidla/\', \'meteo\', \'\'); return false;">Dopravní podnik hlavního města Prahy</a></small><br />';
        } else if (markers['meteo'][marker.value]['source'].toLowerCase() == 'sh') {
            info += '<small>zdroj dat: <a href="http://teplomer.sh.cvut.cz/" onclick="window.open(\'http://teplomer.sh.cvut.cz/\', \'meteo\', \'\'); return false;">strahovský teploměr</a></small><br />';
        }
        info += '</div>';

        marker.openInfoWindowHtml(info);
    } catch(e) {
        alert('infoMeAboutWeather: Vyskytla se chyba.\n\n' + e);
    }
}

function slideImage(id, position) {
    try {
        var title = document.getElementById('photo-title');
        var link = document.getElementById('photo-link');
        var image = document.getElementById('photo-image');
        var info = document.getElementById('photo-info');
        var next = document.getElementById('photo-next');
        var prev = document.getElementById('photo-prev');
        var taken = document.getElementById('photo-taken');

        if ('undefined' == typeof(markers['photo'][id]['image'][position])) {
            position = 0
        }

        image.style.background = 'transparent url(' + spaces(markers['photo'][id]['image'][position]['image']) + ') center center no-repeat';
        title.innerHTML = markers['photo'][id]['image'][position]['name'];
        link.href = markers['photo'][id]['image'][position]['link'];
        info.innerHTML = (position + 1) + '/' + markers['photo'][id]['image'].length;
        link.onclick = function () {
            window.open(markers['photo'][id]['image'][position]['link'], 'photo', '');
            return false;
        };
        taken.innerHTML = markers['photo'][id]['image'][position]['taken'];

        var nextPos = position + 1;
        if (nextPos > markers['photo'][id]['image'].length) {
            nextPos = 0;
        }
        var prevPos = position - 1;
        if (prevPos < 0) {
            prevPos = (markers['photo'][id]['image'].length - 1);
        }

        next.onclick = function () {
            slideImage(id, nextPos);
            return false;
        };
        prev.onclick = function () {
            slideImage(id, prevPos);
            return false;
        };
    } catch(e) {
        alert('slideImage: Vyskytla se chyba.\n\n' + e);
    }
}

function selectLine(line) {
    try {
        var checkLabel = document.getElementById('lbl-line');
        var checkTitle = document.getElementById('lbl-title');
        var checkValue = document.getElementById('line');

        checkLabel.style.display = 'block';
        checkTitle.innerHTML = 'linka: ' + line.toUpperCase();
        checkValue.value = line.toUpperCase();
        checkValue.checked = true;

        refresh();
    } catch(e) {
        alert('selectLine: Vyskytla se chyba.\n\n' + e);
    }
}

function clearLine() {
    try {
        var checkLabel = document.getElementById('lbl-line');
        var checkTitle = document.getElementById('lbl-title');
        var checkValue = document.getElementById('line');

        checkLabel.style.display = 'none';
        checkTitle.innerHTML = 'linka';
        checkValue.value = '-1';
        checkValue.checked = false;
    } catch(e) {
        alert('clearLine: Vyskytla se chyba.\n\n' + e);
    }
}

function in_array(needle, haystack, strict) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: true

    var found = false, key, strict = !!strict;

    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    }

    return found;
}

function spaces(string) {
    var tmp = new Array();

    tmp = string.split(' ');
    string = tmp.join('%20');

    tmp = string.split('(');
    string = tmp.join('%28');

    tmp = string.split(')');
    string = tmp.join('%29');

    return string;
}