//*********************************************************************
// Author:	Michal Popiolek
// Date:    28.6.2009
// Desc.: Knihovna skriptu pro kooperaci s google maps / trial verze pro EAGO Systems
//        Parsovani pozadavku z URL, provedeni pozadavku, ziskani odpovedi serveru na request a jeho zpracovani
// Request: pozaduje také google_maps.js
// 
// Použité funkce:
//  function parseLocation()                              ziskani pozadavku z URL
//  function doRequest(command, option, value)            rozcestnik pro provadeni pozadavku
//  function visibleLayer(layerName:String, show:Boolean) zapnuti/vypnuti vrstvy pro zobrazeni
//  funkce parseResponse(doc:XMLObj)                      parsuje obsah odpovedi serveru, rozcestnik pro volani parseru dle typu odpovedi
//        funkce TrafficResponse_parse(xmlDoc)            parsuje TrafficInfo
//        funkce ObjResponse_parse(xmlDoc)                parsuje ObjResponse
//        funkce RouteResponse_parse(xmlDoc)              parsuje RouteResponse
//        funkce TrafficStatResponse_parse(xmlDoc)        parsuje TrafficStat
// funkce showFeaturesInSelectedLayers(featureID)         po parsovani requestu pridava do mapy nove vynikle objekty (z nove iterace), stare objekty byly z mapy vyjmuty pred zacatkem zpracovani nove odpovedi 
// funkce getDirectChildren(node, tagNameRegexp)          funkce zjistovani potomku definovaneho jmena v konkretnim nodu
// funkce float2gps(sour:float;kladne,zaporne)            pro formatovani WGS souradnic z tvaru 49,343535 do tvaru 49°XX'XX.X"
// function Browser()                                     informace o browseru, jez jsou potrebne pro volbu parseru
// funkce removeLineById(string:featureId)                odstranuje z pole prvni nalezenou linii s vlastnosti fid = featureId, tedy linii konkretniho Requestu, odstranuje objekty line z mapy
// funkce removeMarkerById(string:featureId)              odstranuje z pole prvni nalezeny marker s vlastnosti fid = featureId, tedy markery konkretniho Requestu, odstranuje objekty line z mapy
//*********************************************************************

// var browser = new Browser();  //identifikuje browser

//nastaveni parametru pro parsovani pro rozdilnost pristupu IE a FF k XML
var _add, _molt;
if ( browser.isIE ){
    _add = 0; // pro parsovani v IE
    _molt = 1;
} else {
    _add = 1; // pro parsovani v FF ajn
    _molt = 2;
}

var SITE_ID = '';

//*********************************************************************
//function parseLocation() 
//  desc.:  pro parsovani pozadavku z url, tedy i pozadavku externich aplikaci
//  pozn.:  nemá smysl volat HIDE pro inicializaci stránky !! ta je nyní defaultně bez zobrazených vrstev !!
// 
// Priklad:
//?command=zoom&option=box&value=Xmin;Ymin;Xmax;Ymax      ?command=zoom&option=box&value=49.330492;16.704712;50.220852;20.220337
//            &option=level&value=Xcenter;Ycenter;Level   ?command=zoom&option=level&value=43.907787;-79.359741;9
//?command=layer&option=show&value=QUEUE     || value=poi,kolony..  ?command=layer&option=show&value=di,kolony
//              &option=hide&value=QUEUE     || value=poi,kolony..  ?command=layer&option=hide&value=ALL
//?command=request&option=&value=request_id1;..;request_idN
//*********************************************************************

function parseLocation(){
    
    var query = location.search.substring(1);
    if (query!="")
    {
        // split the rest at each "&" character to give a list of  "argname=value"  pairs
        var pairs = query.split("&");
        
        var command="";
        var option="";
        var hodnota="";
        
        //sekundarni fce urcena pro zoom nalezene zaznamy, nebo replikaci zobrazeni v novem okne
        var command_sec="";
        var option_sec="";
        var hodnota_sec="";
        
        for (var i=0; i<pairs.length; i++) {
            
            // break each pair at the first "=" to obtain the argname and value
            var pos = pairs[i].indexOf("=");
            var argname = pairs[i].substring(0,pos).toUpperCase();
            //alert(argname);
            var value = pairs[i].substring(pos+1).toUpperCase();
    
            // process each possible argname
            if (argname == "ID" && !site_found) {
                try {
                    if (browser.isFF || browser.isIE || browser.isNS || browser.isOP) {
                        SITE_ID = top.location.hostname + '_' + value.toLowerCase();
                    } else {
                        SITE_ID = '0_' + value.toLowerCase();
                    }
                } catch (exception) {
                    SITE_ID = '0_' + value.toLowerCase();
                }
                if (SITE_ID.search(/^undefined_/) != -1) {
                    SITE_ID = '0_' + value.toLowerCase();
                }

                site_found = true;
                invokeInitializationRequest(serviceURL+SITE_ID);
                return;
            }
            if (argname == "COMMAND") {
                command = value;
            }
            if (argname == "OPTION") {
                option = value;
            }
            if (argname == "VALUE") {
                hodnota = value;
            }
          
            //doplnek volani,povoleno pouze ZOOM
            if (argname == "COMMAND_SEC") {
                command_sec = value;
            }
            if (argname == "OPTION_SEC") {
                option_sec = value;
            }
            if (argname == "VALUE_SEC") {
                hodnota_sec = value;
            }
            if (argname == 'NOPOPUP' && value == 'TRUE') {
                nopopup = true;
            }
          
            //doplneni CODE objektu na nejy byl proveden click v male mape
            if (argname == "INITOBJCODE") {
                initObjCode = value;
            }
        }

        if (SITE_ID.search(/_/) != -1) {
            //volani rozcestniku volanych fci
            //alert(command + option + hodnota);
            if (command!="") doRequest(command,option,hodnota);
            if (command_sec =="ZOOM") doRequest(command_sec,option_sec,hodnota_sec);
        }

    }
}

//*********************************************************************
// funkce doRequest(command, option, value)
// rozcestnik rozlisuje dosle pozadavky na aplikaci z vnejsiho prostredi
//
//params:	  command - prikaz (zoom, layer)
//			   option - nazev udalosti, typ udalosti ([zoom] box,level)
//			   value - upresneni pozadavku, pripadne povinne parametry
//
//!POZOR! Skript predpoklada inicializaci Google Maps v objektu "map."
//!POZOR! Skript vyuziva fci Google API
//priklad:  ?command=request&option=&value=saf5423554sdff;dsafdgf325435gsdfgs;agsag34r32345
//          ?command=zoom&option=box&value=Xmin;Ymin;Xmax;Ymax : BottomLeft>SouthWest> Xmin;Ymin;  TopRight>NorthEast> Xmax;Ymax
//          ?command=layer&option=show&value=QUEUE,ACCIDENT  : DI : ALL :
//*********************************************************************

function doRequest(command, option, value)
{
    var vrstvy = [];
    var i=0;
    var id;  //identifikator checboxu pro zapnuti pri inicializci

    switch (command) {
        //request, zoom, layer
        case "REQUEST":
            //prevezme request id pro dotazovani se na sluzbu
            //option=&value=saf5423554sdff;dsafdgf325435gsdfgs;agsag34r32345;
            // var request_iss = [];
            request_IDs = value.toLowerCase().split(";");
	      
            if (request_IDs.length>0)
            {
                //pro kazde z request_id proved ziskani XML ze serveru
                for (i=0; i<request_IDs.length; i++) {
                    //alert("vytvarim novy objekt");
                    wrapper = new RequestWrapper(i+1, SITE_ID+'_'+request_IDs[i], serviceURL, i == 0);
                    wrapper.check();
                }
            }else{
                if (debugOn) alert('ERR: Chybný požadavek - definice request_id / Wrong request_id');
            }
            break;
        case "ZOOM":
            /*  box
          level
      */
            switch (option) {
                //box,level
                case "BOX":
                //value=Xmin;Ymin;Xmax;Ymax : BottomLeft>SouthWest> Xmin;Ymin;  TopRight>NorthEast> Xmax;Ymax
                {
                    var box = [];
                    box = value.split(";");
                    var Xmin =  parseFloat(box[0]);
                    var Ymin =  parseFloat(box[1]);
                    var Xmax =  parseFloat(box[2]);
                    var Ymax =  parseFloat(box[3]);
                    if (box.length==4)
                    {
                        var bounds = new GLatLngBounds(new GLatLng(Xmin, Ymin),new GLatLng(Xmax, Ymax));
                        map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds));
                    } else {
                        if (debugOn) alert('ERR: Chybný požadavek - definice okna přiblížení / Wrong box definition');
                    }
                }
                break;
                case "LEVEL":
                //value: X;Y;level
                {
                    var XYlevel = [];
                    XYlevel = value.split(";");
                    if (XYlevel.length>1)
                    {
                        map.setCenter(new GLatLng(parseFloat(XYlevel[0]),parseFloat(XYlevel[1])),parseInt(XYlevel[2]));
                    } else {
                        if (debugOn) alert('ERR: Chybný požadavek - definice bodu přiblížení / Wrong point definition');
                    }
                }
                break;
            }
            break;
        case "LAYER":
            // název vrstvy / id vrstvy
            /*	QUEUE / QUEUE
          ACCIDENT / ACCIDENT
          Uzavírka / CLOSURE
          Srážky a viditelnost / WEATHER
          RADAR / RADAR
          Ostatní / COMMON
          Nadměrný náklad / EXTRA_LOAD
          Hustota TRAFFIC_DENSITYu / TRAFFIC_DENSITY
          Sjízdnost / WEATHER
      */
            switch (option) {
                //show, hide
                case "SHOW":
                    switch (value) {
                        //ALL, nehody,zimni_info,uzavirky,prace,d1
                        case "DI":
                        {
                            doRequest(command, option, "QUEUE");
                            doRequest(command, option, "ACCIDENT");
                            doRequest(command, option, "CLOSURE");
                            doRequest(command, option, "WEATHER");
                            doRequest(command, option, "RADAR");
                            doRequest(command, option, "COMMON");
                            doRequest(command, option, "EXTRA_LOAD");
                            doRequest(command, option, "TRAFFIC_DENSITY");
                            doRequest(command, option, "WEATHER");
                            doRequest(command, option, "CONGESTION");
                        }
                        break;
                        case "ALL":
                        //mozno pouzit rekurzni volani pro nastaveni vsech vrstev
                        {
                            doRequest(command, option, "DI");
                            doRequest(command, option, "POI");
                            doRequest(command, option, "ROUTE");
                        }
                        break;
                        case "QUEUE":
                            visibleLayer(value,true);
                            break;
                        case "ACCIDENT":
                            visibleLayer(value,true);
                            break;
                        case "CLOSURE":
                            visibleLayer(value,true);
                            break;
                        case "RADAR":
                            visibleLayer(value,true);
                            break;
                        case "WEATHER":
                            visibleLayer(value,true);
                            break;
                        case "COMMON":
                            visibleLayer(value,true);
                            break;
                        case "EXTRA_LOAD":
                            visibleLayer(value,true);
                            break;
                        case "TRAFFIC_DENSITY":
                            visibleLayer(value,true);
                            break;
                        case "WEATHER":
                            visibleLayer(value,true);
                            break;
                        case "POI":
                            visibleLayer(value,true);
                            break;
                        case "ROUTE":
                            visibleLayer(value,true);
                            break;
                        case "CONGESTION":
                            visibleLayer(value,true);
                            break;
                        default:
                        {
                            vrstvy = value.split(",");
                            //je-li ve value ulozeno vice vrtev oddelenych carkou
                            if (vrstvy.length>1)
                            {
                                for (i = 0; i < vrstvy.length; i++)
                                {
                                    //pak rekuzne volam vsechny parsovane vrstvy
                                    doRequest(command, option, vrstvy[i]);
                                }
                            } else {
                                //pokud je jen jedna vrstva a neni nalezena ve SWITCH pak je chybna
                                if (debugOn) alert("ERR: Tato volba není implementována / This case is not implemented");
                            }
                        }
                        break;
                    } //end show> switch value
                    break;
                case "HIDE":
                    switch (value) {
                        case "DI":
                        {
                            doRequest(command, option, "QUEUE");
                            doRequest(command, option, "ACCIDENT");
                            doRequest(command, option, "CLOSURE");
                            doRequest(command, option, "WEATHER");
                            doRequest(command, option, "RADAR");
                            doRequest(command, option, "COMMON");
                            doRequest(command, option, "EXTRA_LOAD");
                            doRequest(command, option, "TRAFFIC_DENSITY");
                            doRequest(command, option, "WEATHER");
                            doRequest(command, option, "CONGESTION");
                        }
                        break;
                        case "ALL":
                        //mozno pouzit rekurzni volani pro nastaveni vsech vrstev
                        {
                            doRequest(command, option, "DI");
                            doRequest(command, option, "POI");
                            doRequest(command, option, "ROUTE");
                        }
                        break;
                        case "QUEUE":
                            visibleLayer(value,false);
                            break;
                        case "ACCIDENT":
                            visibleLayer(value,false);
                            break;
                        case "CLOSURE":
                            visibleLayer(value,false);
                            break;
                        case "RADAR":
                            visibleLayer(value,false);
                            break;
                        case "WEATHER":
                            visibleLayer(value,false);
                            break;
                        case "COMMON":
                            visibleLayer(value,false);
                            break;
                        case "EXTRA_LOAD":
                            visibleLayer(value,false);
                            break;
                        case "TRAFFIC_DENSITY":
                            visibleLayer(value,false);
                            break;
                        case "WEATHER":
                            visibleLayer(value,false);
                            break;
                        case "POI":
                            visibleLayer(value,false);
                            break;
                        case "ROUTE":
                            visibleLayer(value,false);
                            break;
                        case "CONGESTION":
                            visibleLayer(value,false);
                            break;
                        default:
                        {
                            vrstvy = value.split(",");
                            //je-li ve value ulozeno vice vrtev oddelenych carkou
                            if (vrstvy.length>1)
                            {
                                for (i = 0; i < vrstvy.length; i++)
                                {
                                    //pak rekuzne volam vsechny parsovane vrstvy
                                    doRequest(command, option, vrstvy[i]);
                                }
                            } else {
                                //pokud je jen jedna vrstva a neni nalezena ve SWITCH pak je chybna
                                if (debugOn) alert("ERR: Tato volba není implementována / This case is not implemented");
                            }
                        }
                        break;
                    } //end hide> switch value
                    break;
            }
            break;
        default:
            if (debugOn) alert("ERR: Toto rozhraní není implementováno / This interface is not implemented");
            break;
    }
}

//*********************************************************************
// funkce visibleLayer(type:String, show:Boolean)
// zapina/vypina zobrazeni dane skupiny vsech znacek, pridava/odebira z google
//
//params:	 type - nazev vrstvy dle ciselniku ALERTC
//			   show - true ma byt viditelna, false - vypnout vrstvu
//*********************************************************************
function visibleLayer(type, show) {
    var n;
    if (show)
    {
        //zapinani bodu dle jejich typu
        if (gmarkers && gmarkers.length)
        {
            //alert("yobrayuji data" + type + " " + show + " celkem pro " + gmarkers.length + " typ prvniho " + getType(gmarkers[i]));
            for ( n = 0 ; n < gmarkers.length ; n++ ) {
                if (gmarkers[n].getType()== type) map.addOverlay(gmarkers[n]);
            }
        }
        //zapinani linii dle jejich typu
        if (glines && glines.length)
        {
            for ( n = 0 ; n < glines.length ; n++ ) {
                if (glines[n].getType()== type) map.addOverlay(glines[n]);
            }
        }
    //alert(gmarkers[0].getType());
    }else{
        //vypinani bodu dle jejich typu
        if (gmarkers && gmarkers.length)
        {
            for ( n = 0 ; n < gmarkers.length ; n++ ) {
                if (gmarkers[n].getType()== type) map.removeOverlay(gmarkers[n]);
            }
        }
        //vypinani linii dle jejich typu
        if (glines && glines.length)
        {
            for ( n = 0 ; n < glines.length ; n++ ) {
                if (glines[n].getType()== type) map.removeOverlay(glines[n]);
            }
        }
    }
}

//*********************************************************************
// funkce parseResponse(doc:XMLObj)
// parsuje obsah odpovedi serveru, rozcestnik pro volani parseru dle typu odpovedi
//
//params:	xmlDoc - objekt typu XML dokument obsahujici odpoved serveru
//*********************************************************************
function parseResponse(xmlDoc, reqWrapper)
{
    if (xmlDoc == null) {
        return;
    }
    var response = xmlDoc.documentElement;//xmlDoc.getElementsByTagName('response'); //tag response
    var response_state = response.getAttribute("response-state"); //state zpracovani, musi byt done
    var response_type = response.getAttribute("xsi:type")||response.getAttribute("type"); //typ response: TrafficResponse, RouteResponse, TrafficStatResponse, ObjResponse

    if (response_state=="DONE") {
        switch (response_type) {
            case "TrafficResponse":
                //parsuji odpoved serveru a vytvorim grafiku
                TrafficResponse_parse(xmlDoc,reqWrapper.featureId);

                break;
            case "CongestionResponse":
                //parsuji odpoved serveru a vytvorim grafiku
                CongestionResponse_parse(xmlDoc,reqWrapper.featureId);

                break;
            case "RouteResponse":
                //elementy> edge
                //          point
                //          road-info
                //          ref-obj
              
                //pred zpracovanim odpovedi je potreba vycistit vrstvy
                //doRequest("LAYER", "HIDE", "ROUTE");
                RouteResponse_parse(xmlDoc,reqWrapper.featureId);
                break;
            case "TrafficStatResponse":
                //elementy> extent<stat>
                //TrafficStatResponse_parse(xmlDoc);
                break;
            case "ObjResponse":
                //elementy> extent<stat>
                ObjResponse_parse(xmlDoc, reqWrapper.featureId, reqWrapper.isFirst);
                break;
            default:
                //odchyceni nepredvidanych response
                break;
        }
    
    } else {
        //je-li stav LATER, tak se bezprostredne ptam znovu, dokud nedostanu odpoved ze serveru
        if (response_state=="LATER") {
            reqWrapper.ajax()
        } else {
            // UNKNOWN_REQUEST,ERROR,NOT_IMPLEMENTED
            if (debugOn) alert("Tento REQUEST je chybný, nebo nezpracovany, se stavem: " + response_state);
        }
    }
}

function findFirstNode(parentNode, nodeName) 
{
    if (nodeName == null) {
        return null;
    }
    nodeName = nodeName.toLowerCase();
    if (parentNode && parentNode.childNodes && parentNode.childNodes.length) {
        for (var j = 0; j < parentNode.childNodes.length; j++) {
            if (parentNode.childNodes[j] && parentNode.childNodes[j].nodeName.toLowerCase() == nodeName) {
                return parentNode.childNodes[j];
            }
        }
    }
    return null;
}

function getNodeText(node) {
    if (node && node.childNodes && node.childNodes.length) {
        return node.childNodes[0].nodeValue;
    } else {
        return '';
    }
}

function objValuesToJsObject(obj) {
    var o = {};
    if (obj) {
        var vals = getDirectChildren(obj, /^value$/i);
        for (var i=0; i<vals.length; i++) {
            //window.alert(vals[i].nodeValue);
            o[vals[i].getAttribute('name')] = getNodeText(vals[i]);
        }
    }
    return o;
}

function poiToHtml(poi) {
    var name = poi.getAttribute('name');
    var poitype = poi.getAttribute('poi-type');
    var html = '<div><div style="font-weight:bold;">'+name+'<\/div>';
    var values = objValuesToJsObject(poi);
    if (poitype == 'PHM') {
        html += '<div style="font-size:.9em;font-style:italic;">čerpací stanice<\/div>';
    }
    if (values.company) {
        html += '<div style="font-size:.9em;">provozovatel <span style="color:blue">' + values.company + '<\/span><\/div>';
    }
    html += '<table border="1" cellspacing="0" cellpadding="2" style="border-collapse:collapse" bordercolor="silver"><tbody>';
    if (values.n95) {
        html += '<tr><td>Natural 95:<\/td><td> '+values.n95+' Kč<\/td><\/tr>';
    }
    if (values.n98) {
        html += '<tr><td>Natural 98:<\/td><td> '+values.n98+' Kč<\/td><\/tr>';
    }
    if (values.diesel) {
        html += '<tr><td>Diesel:<\/td><td> '+values.diesel+' Kč<\/td><\/tr>';
    }
    if (values.s91) {
        html += '<tr><td>Special 91:<\/td><td> '+values.s91+' Kč<\/td><\/tr>';
    }
    html += '<\/tbody><\/table>';
    if (values.updated) {
        var dt = new Date(parseInt(values.updated));
        html += '<div style="font-size:.9em;text-align:right;"><span style="color:blue">aktualizováno ' + formatDate(dt,true) + '<\/span><\/div>';
    }
    html += '<\/div>';
    return html;
}
function poiToText(poi) {
    var text = poi.getAttribute('name');
    var values = objValuesToJsObject(poi);
    if (values.n95) {
        text += ', n95: '+values.n95;
    }
    if (values.n98) {
        text += ', n98: '+values.n98;
    }
    if (values.diesel) {
        text += ', diesel: '+values.diesel;
    }
    if (values.s91) {
        text += ', s91: '+values.s91;
    }
    return text;
}

function objToString(objInfo) {
    var objName = objInfo.getAttribute('name');
    if (objName == null) {
        objName = objInfo.getAttribute('code');
    }
	
    var retval = "";
	
    var type = objInfo.getAttribute('type');
    if (type != null && (type = type.toLowerCase()) == 'city') {
        var cityBase = objName.toLowerCase().replace(/([^\s])[aeiouyáéíóúůý]+/ig, "$1");
        retval = objName;
        var okr = findFirstNode(objInfo, 'parent');
        if (okr != null) {
            var okrName = okr.getAttribute('name');
            if (okrName != null) {
                var okrBase = okrName.toLowerCase().replace(/([^\s])[aeiouyáéíóúůý]+/ig, "$1");
                if (okrBase.indexOf(cityBase) < 0 && cityBase.indexOf(okrBase) < 0) {
                    retval = retval + " " + objToString(okr);
                }
            }
        }
    } else if (type != null && type == 'okres') {
        retval = "okres " + objName;
    } else if (type != null && type == 'kraj') {
        retval = "kraj " + objName.replace(/[\s]*kraj[\s]*/ig, "");
    } else if (type != null && type == 'street') {
        var parent = findFirstNode(objInfo, 'parent');
        if (parent != null) {
            retval = objToString(parent) + ", " + objName;
        }
    } else {
        retval = objName;
    }
	
    return retval;
}

//alert ("'" + "Ostrava nad Porubou".replace(/([^\s])[aeiouyáéíóúůý]+/ig, "$1") + "'");

//*********************************************************************
// funkce ObjResponse_parse(doc:XMLObj,string:featureID)
// parsuje obsah odpovedi serveru laden pro ObjResponse
//
//params:	xmlDoc - objekt typu XML dokument obsahujici odpoved serveru
//        featureID - identifikator requestu, tedy pro markery 
//*********************************************************************
function ObjResponse_parse(xmlDoc,featureID,isFirst)
{
    /* vzorove XML
    <objs type="CITY" name="Opava" code="505927">
        <parent type="OKRES" name="Opava" code="CZ0805">
            <parent type="KRAJ" name="Moravskoslezský kraj" code="CZ080"/>
        </parent>
        <extent>
            <bl y="49.8469" x="17.78477"/>
            <tr y="49.99524" x="18.00256"/>
        </extent>
        <coord y="49.9356" x="17.90276"/>
    </objs>
    
    
    <objs type="KRAJ" name="Moravskoslezský kraj" code="CZ080">
        <extent>
            <bl y="49.37963" x="17.12627"/>
            <tr y="50.33754" x="18.91965"/>
        </extent>
    </objs>
    */
    var xcoor, ycoor;               //souradnice X,Y
    var xMin,xMax,yMin,yMax;        //souradnice extentu
    var type, name, code;                 //typ objektu, nazev objektu, kod objektu
    var extent = [];       //pole tagu XML extent

    removeMarkerById(featureID);  //odstraneni markeru requestu z predchozi iterace
    removeMarkerById(featureID+'_geom');  //odstraneni markeru requestu z predchozi iterace
  
    var obj_info = xmlDoc.getElementsByTagName('objs');

    var routePoints;
    var rt_points, coord;
    var marker_point;
    var marker;

    try
    {
        var objToZoomTo = null;
        for (var idx=0; idx < obj_info.length; idx++) {
            name = obj_info[idx].getAttribute('name'); //jmeno objektu
            code = obj_info[idx].getAttribute('code'); //code
            type = obj_info[idx].getAttribute('type'); //code


            if (type != 'KRAJ' && type != 'POI') {
                extent = findFirstNode(obj_info[idx], 'extent');
                var bl = findFirstNode(extent, 'bl');
                var tr = findFirstNode(extent, 'tr');
                if (bl && tr) {
                    var x1 = parseFloat(bl.getAttribute('x'));
                    var y1 = parseFloat(bl.getAttribute('y'));
                    var x2 = parseFloat(tr.getAttribute('x'));
                    var y2 = parseFloat(tr.getAttribute('y'));

                    if (isFirst) {
                        xMin = Math.min(xMin||x1, x1);
                        xMax = Math.max(xMax||x2, x2);
                        yMin = Math.min(yMin||y1, y1);
                        yMax = Math.max(yMax||y2, y2);
                    }
        		
                    xcoor = (x1 + x2) / 2;
                    ycoor = (y1 + y2) / 2;
                    //                alert(ycoor + ' , ' + xcoor);
        		
                    //if (type == 'STREET') {
                    coord = findFirstNode(obj_info[idx], 'coord');
                    if (coord) {
                        xcoor = parseFloat(coord.getAttribute('x'));
                        ycoor = parseFloat(coord.getAttribute('y'));
                    }
                    //}
                    marker_point = new GLatLng(ycoor,xcoor);
                
                    //        		var html= "Název objektu: " + name + "<br/>Kód objektu: " + code;
                    var html= objToString(obj_info[idx]);
                    var label= objToString(obj_info[idx]);
                    //        		var label = name;
                    var _type = "OBJECT";
                    if (type == "OKRES" || type == "KRAJ" || type == 'STREET' || type == 'CITY') {
                        _type = "CENTER";
                    }
                    marker = createMarker(marker_point,label,html,featureID,_type,"");
                    gmarkers.push(marker);
                    map.addOverlay(marker);
                    if (!nopopup && obj_info.length == 1 && initObjCode=="") {
                        GEvent.trigger(marker, "click");
                    }
                }
                if (type == "OKRES" || type == "CITY") {
                    if (obj_info.length == 1) {
                        objToZoomTo = obj_info[idx];
                    }
                    routePoints = [];
                    rt_points = obj_info[idx].getElementsByTagName('geom');
                    for (var rti=0; rti < rt_points.length; rti++)
                    {
                        routePoints[rti]= new GLatLng(parseFloat(rt_points[rti].getAttribute('y')),parseFloat(rt_points[rti].getAttribute('x')));
                    }
                    if (routePoints.length > 1)
                    {
                        var line = createLine(routePoints,region_color,region_weight,region_alfa,featureID+'_geom');
                        map.addOverlay(line);
                    }
                }
            } else if (type == 'POI') {
                coord = findFirstNode(obj_info[idx], 'coord');
                if (coord) {
                    xcoor = parseFloat(coord.getAttribute('x'));
                    ycoor = parseFloat(coord.getAttribute('y'));
                    marker_point = new GLatLng(ycoor,xcoor);
                    label = poiToText(obj_info[idx]);
                    html = poiToHtml(obj_info[idx]);
                    marker = createMarker(marker_point,label,html,featureID,'PHM',"");
                    gmarkers.push(marker);
                    map.addOverlay(marker);
                    if (!nopopup && obj_info.length == 1 && initObjCode=="") {
                        GEvent.trigger(marker, "click");
                    }
                }
            // window.alert('poi: ' + name);
            }

        }
        if ((useFirstZoom || objToZoomTo != null) && !FirstZoomDone && (type == "KRAJ" || type=="OKRES" || type=="CITY")) //ma se provadet prvotni zoom na kraj
        {
            extent = null;
            if (objToZoomTo != null) {
                extent = objToZoomTo.getElementsByTagName('extent');
            }
            // extent = objToZoomTo == null? xmlDoc.getElementsByTagName('extent') : objToZoomTo.getElementsByTagName('extent');
            if (extent && extent.length > 0)
            {
                extent = extent[0];
            }
            if (extent) {
                var bl2 = findFirstNode(extent, 'bl');
                var tr2 = findFirstNode(extent, 'tr');
                if (bl2 && tr2)
                {
                    yMin = parseFloat(bl2.getAttribute('y'));
                    xMin = parseFloat(bl2.getAttribute('x'));
                    yMax = parseFloat(tr2.getAttribute('y'));
                    xMax = parseFloat(tr2.getAttribute('x'));
                    doRequest("ZOOM", "BOX", yMin+";"+xMin+";"+yMax+";"+xMax);
                    FirstZoomDone = true;
                }
            } else if (xMin && xMax && yMin && yMax) {
                doRequest("ZOOM", "BOX", yMin+";"+xMin+";"+yMax+";"+xMax);
                FirstZoomDone = true;
            }
        }
      
    } catch (err) {
        if (debugOn) alert(err);
    }
  
    showFeaturesInSelectedLayers(featureID);
}


//*********************************************************************
// funkce RouteResponse_parse(doc:XMLObj)
// parsuje obsah odpovedi serveru laden pro RouteResponse
//
//params:	xmlDoc - objekt typu XML dokument obsahujici odpoved serveru
//*********************************************************************
function RouteResponse_parse(xmlDoc,featureID)
{
    /* vzorove XML
  <response xmlns="http://xsd.eago.cz/schema/di-service-schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="RouteResponse"
  response-time="2009-06-21T07:14:38.825Z" response-state="DONE" request-time="2009-06-21T07:14:35.799Z" map-version="gnet0710" language="cs"
  coord-system="WGS84" assigned-request-id="32e77958-d73b-4e68-bb6c-283c7e9cb3fa">
      <extent>
          <bl y="49.2171" x="16.58257"></bl>
      <edge edge-id="475880" edge-dir="POS"></edge>
      <edge edge-id="476097" edge-dir="POS"></edge>
  ..........................
      <point y="49.75192" x="18.08332"></point>
      <point y="49.75457" x="18.05169"></point>
  .................
      <road-info street="Zkrácená" road-id="475529" dir="BOTH" cat="OTHER"
  type="ROAD_INFO">
          <value name="ROUTE_KM_ON_ROUTE">0.3994</value>
          <point y="49.80381" x="18.25159"></point>
          <point y="49.80241" x="18.2531"></point>
          <obj-ref-index>0</obj-ref-index>
          <obj-ref-index>1</obj-ref-index>
      </road-info>
  .........................
  </extent></response>
  */
  
    //odstraneni route z mapy
    if (groute.length) map.removeOverlay(groute[0]);
    removeMarkerById(featureID);  //odstraneni markeru requestu z predchozi iterace
  
    //pred novou route mazu starou i z pole
    groute = [];
    var routePoints = [];  //kolik bodu je v dane ROUTE
    var xcoor, ycoor;               //souradnice X,Y
    var rt_points = xmlDoc.getElementsByTagName('point');

    try {
        var root = xmlDoc.documentElement;
        if (root.attributes) {
            routeRequestUuid = root.attributes.getNamedItem('assigned-request-id').value;
        }
    } catch (exception) {}

  
    try
    {
        //zoom na objekt route pokud pri prvnim parsovani requestu
        if (useFirstZoom && !FirstZoomDone) //ma se provadet prvotni zoom
        {
            var extent = xmlDoc.getElementsByTagName('extent');
            if (extent.length)
            {
                yMin = parseFloat(extent[0].childNodes[0*_molt+_add].getAttribute('y'));
                xMin = parseFloat(extent[0].childNodes[0*_molt+_add].getAttribute('x'));
                yMax = parseFloat(extent[0].childNodes[1*_molt+_add].getAttribute('y'));
                xMax = parseFloat(extent[0].childNodes[1*_molt+_add].getAttribute('x'));
                //alert( xMin+";"+yMin+";"+xMax+";"+yMax);
                doRequest("ZOOM", "BOX", yMin+";"+xMin+";"+yMax+";"+xMax);
                FirstZoomDone = true;
            }
        }

        //pridani symbolu pocatku trasy
        ycoor = parseFloat(rt_points[0].getAttribute('y'));
        xcoor = parseFloat(rt_points[0].getAttribute('x'));
        var marker_point = new GLatLng(ycoor,xcoor);
        var marker = createMarker(marker_point,"","",featureID,"START",""/*,{draggable: true}*/);
        gmarkers.push(marker);
        map.addOverlay(marker);
    
        //prochazim pole bodu celeho dokumentu
        for (var i=0; i < rt_points.length; i++)
        {
            //pokud se zmeni parent requestu point pak se jedna o hranu a dale jiz body nevykresluji
            if (rt_points[i].parentNode.nodeName == "response")
            {
                ycoor = parseFloat(rt_points[i].getAttribute('y'));
                xcoor = parseFloat(rt_points[i].getAttribute('x'));
                routePoints[i]= new GLatLng(ycoor,xcoor);
            } else {
                break;
            }
        }
    
        //pridani symbolu konce trasy
        marker_point = new GLatLng(ycoor,xcoor);
        marker = createMarker(marker_point,"","",featureID,"CIL",""/*,{draggable: true}*/);
        gmarkers.push(marker);
        map.addOverlay(marker);
    
        //pridani route do mapy
        if (routePoints.length > 1) //je vice bodu tudiz znich vytvarim linii
        {
            var line = createLine(routePoints,route_color,route_weight,route_alfa,featureID);
            if (!groute) {
                groute = [];
            }
            groute.push(line);
            map.addOverlay(groute[0]);
        }
    
    } catch (err) {}
}

//balast / docasna pomocna fce
/*var $ = function(eid) {
    return document.getElementById(eid);
}
*/



function CongestionResponse_parse(xmlDoc, featureID) {
    /*
<congestion-info updated="2010-06-23T07:16:17.000Z" place-name="Vltavská směr Hořejší nábřeží" place-id="25" level-grow-by="0" level-grow-age-millis="732890" level="5" name="Vltavská směr Hořejší nábřeží" code="25">
    <extent>
        <bl y="50.06951" x="14.40564"/>
        <tr y="50.07003" x="14.4104"/>
    </extent>
    <coord y="50.06983273155333" x="14.408005245560934"/>
    <geom y="50.06951" x="14.40564"/>
    <geom y="50.07003" x="14.4104"/>
</congestion-info>
*/
    removeMarkerById(featureID);
    removeLineById(featureID);

    var cg_list = xmlDoc.getElementsByTagName('congestion-info');

    try {
        for (var i=0; i < cg_list.length; i++) {
            var cg = cg_list[i];
            var points = getDirectChildren(cg, /^geom$/i);
            var coord = getDirectChildren(cg, /^coord$/i);
            if (coord.length > 0) {
                coord = coord[0];
            } else {
                coord = null;
            }

            var place = cg.getAttribute("place-name");
            var code = cg.getAttribute("place-id");
            var level = cg.getAttribute("level");

            var line_def = cg_line_def.get(level);
            if (line_def) {
                var coords = [];
                if (points && points.length) {
                    if (points.length == 1) {
                    //                        ycoor = parseFloat(points[0].getAttribute('y'));
                    //                        xcoor = parseFloat(points[0].getAttribute('x'));
                    //                        marker_point = new GLatLng(ycoor,xcoor);
                    } else {
                        //jinak umistuji MARKER doprostred linie
                        //pole bodu pro generovani linie
                        //stred linie pro umisteni symbolu
                        //                        var middle_point = parseInt(points.length/2);

                        for (var j=0; j < points.length; j++) { //dokud jsou body tak je parsuji
                            ycoor = parseFloat(points[j].getAttribute('y'));
                            xcoor = parseFloat(points[j].getAttribute('x'));
                            coords[j]= new GLatLng(ycoor,xcoor);
                        //                            if (middle_point==j+1) {
                        //                                marker_point = new GLatLng(ycoor,xcoor); //ve stredu linie bude symbol udalosti
                        //                            }
                        }
                    }
                }
                // html = trafficInfoToHtml(ti_info);
                // label = trafficInfoToLabel(ti_info);
                // var marker = createMarker(marker_point,label,html,featureID,type,code);
                // gmarkers.push(marker);

                if (coords.length > 1) { //je vice bodu tudiz znich vytvarim linii
                    var line = createLine(coords,line_def.color,line_def.weight,line_def.alfa,featureID,"CONGESTION");
                    glines.push(line);
                }
                if (coord) {
                    var html = congestionInfoToHtml(cg);
                    var label = congestionInfoToLabel(cg);
                    //                    var html = "<div style=\"width:200px;font-size:8pt;text-align:center\"><b>" + place + "</b><br/>stupeň: <span style=\"font-weight:bold;font-size:20px\">" + level + "</span><br/>aktualizováno " + updated + "</div>";
                    var marker_point = new GLatLng(parseFloat(coord.getAttribute('y')),parseFloat(coord.getAttribute('x')));
                    var params = {
                        icon:gicons[line_def.type]
                    };
                    if (zIndexMap[line_def.type]) {
                        params.zIndexProcess = zIndexMap[line_def.type];
                    }
                    var marker = createMarker(marker_point,label,html,featureID,"CONGESTION","place_"+code,params);
                    gmarkers.push(marker);
                }
            }
        }

        showFeaturesInSelectedLayers(featureID);
        
    } catch (ex) {
        window.alert(ex);
    }


}

//*********************************************************************
// funkce TrafficResponse_parse(doc:XMLObj)
// parsuje obsah odpovedi serveru laden pro TrafficResponse
//
//params:	xmlDoc - objekt typu XML dokument obsahujici odpoved serveru
//        featureID - identifikator requestu, tedy pro markery 
//*********************************************************************
function TrafficResponse_parse(xmlDoc, featureID)
{
    //vzorove XML
    /*
  <traffic-info valid-to="2009-04-07T14:40:00.000Z" valid-from="2009-04-07T07:40:23.842Z" urg="NORMAL" type="RADAR" to-km="0.0" sit="FREE" from-km="0.0" cat="I">
    <point y="5535335" x="709319"/>
    <point y="3235335" x="609319"/>
    <text>blabla</text>
    <alertc-text>policejní kontrola</alertc-text>
    <location-text>V Opavě</location-text>
    <start-edge edge-id="757104" edge-dir="POS"/>
  </traffic-info>
  */
  
    //musis vymazat markery daneho objektu z pole vsech objektu dane vrtvy dle predchozi iterace,
    //a to dle priznaku objektu od ktereho requestu vynikl
    removeMarkerById(featureID);
    removeLineById(featureID);

    var xcoor, ycoor, last_point_pos; // souradnice X, souradnice Y, podledni pozice nodu v XML po zpracovani bodu
    //var points = []; //kolik bodu je v danem TI
    var types = [];  //pole parsovanych typu objektu pouzite nakonec parsovani pro optimalizovane nacteni vrstev do mapy dle aktualne zapnutych vrstev
    var text = "";
    var alertc = "";
    var location = "";
    var time_from = "";
    var time_to = "";
    var rok_from, mesic_from, den_from, date_from;
    var rok_to, mesic_to, den_to, date_to;
    var html = "";
    var label = "";
   
    var tr_info = xmlDoc.getElementsByTagName('traffic-info');
  
    try {
        for (var i=0; i < tr_info.length; i++) {
            //vlastnisti hlavniho tagu traffic-info
            var valid_from = parseXmlDate(tr_info[i].getAttribute("valid-from"));
            var valid_to = parseXmlDate(tr_info[i].getAttribute("valid-to"));
            var urg = tr_info[i].getAttribute("urg");
            var type = tr_info[i].getAttribute("typ");  //chodi type CLOSURE,RADAR,ACCIDENT,EXTRA_LOAD,COMMON,QUEUE,TRAFFIC_DENSITY,WEATHER
            var to_km = tr_info[i].getAttribute("to-km");
            var from_km = tr_info[i].getAttribute("to-km");
            var sit = tr_info[i].getAttribute("sit");
            var cat = tr_info[i].getAttribute("cat");

            //   var type = tr_info[i].getAttribute("typ");
            //       types[i] = type;
            var code = tr_info[i].getAttribute("code");
            var marker_point;
  
            var points = getDirectChildren(tr_info[i],/^point$/i);
            //pole bodu pro generovani linie
            var coords = [];
        
            //pokud existuje pouze jeden point v traffic info pak je to marker
            if (points && points.length) {
                if (points.length == 1)
                {
                    ycoor = parseFloat(points[0].getAttribute('y'));
                    xcoor = parseFloat(points[0].getAttribute('x'));
                    marker_point = new GLatLng(ycoor,xcoor);
                    last_point_pos=_add;
                }else{
                    //jinak umistuji MARKER doprostred linie
                    //stred linie pro umisteni symbolu
                    var middle_point = parseInt(points.length/2);
                  
                    for (var j=0; j < points.length; j++) //dokud jsou body tak je parsuji
                    {
                        ycoor = parseFloat(points[j].getAttribute('y'));
                        xcoor = parseFloat(points[j].getAttribute('x'));
                        coords[j]= new GLatLng(ycoor,xcoor);
                    
                        if (middle_point==j+1) marker_point = new GLatLng(ycoor,xcoor); //ve stredu linie bude symbol udalosti
                    }
  
                }
            }
            var tags = getDirectChildren(tr_info[i],/^text$/i);
            text = tags[0].firstChild.nodeValue;
            tags = getDirectChildren(tr_info[i],/^alertc-text$/i);
            alertc = tags[0].firstChild.nodeValue;
        
            tags = getDirectChildren(tr_info[i],/^location-text$/i);
            location = tags.length > 0 && tags[0].firstChild ? tags[0].firstChild.nodeValue : '?';
        
            //parsovani casu ze stringu casu ze tvaru 2009-11-29T23:00:00.000Z
            time_from = formatTime(valid_from);//substr(valid_from.indexOf("T")+1,5);
            time_to = formatTime(valid_to);//valid_to.substr(valid_to.indexOf("T")+1,5);
  
            //parsovani datumu ze stringu casu
            //            rok_from= valid_from.substr(0,4);
            //            mesic_from= valid_from.substr(5,2);
            //            den_from= valid_from.substr(8,2);
            //            date_from = den_from + "." + mesic_from +"."+ rok_from;
            date_from = valid_from.getDate() + "." + valid_from.getMonth() +"."+ valid_from.getFullYear();
          
            //            rok_to= valid_to.substr(0,4);
            //            mesic_to= valid_to.substr(5,2);
            //            den_to= valid_to.substr(8,2);
            //            date_to = den_to + "." + mesic_to +"."+ rok_to;
            date_to = valid_to.getDate() + "." + valid_to.getMonth() +"."+ valid_to.getFullYear();

            var ti_info = {
                valid_to: valid_to,
                valid_from: valid_from,
                type: type,
                urg: urg,
                sit: sit,
                cat: cat,
                to_km: to_km,
                from_km: from_km,
                code: code,
                texts: {
                    text: text,
                    alertc: alertc,
                    location: location,
                    time_from: time_from,
                    time_to: time_to,
                    date_from: date_from,
                    date_to: date_to
                }
            };
            html = trafficInfoToHtml(ti_info);
            label = trafficInfoToLabel(ti_info);
            var marker = createMarker(marker_point,label,html,featureID,type,code);
            gmarkers.push(marker);
          
            if (coords.length > 1) //je vice bodu tudiz znich vytvarim linii
            {
                var line = createLine(coords,line_color,line_weight,line_alfa,featureID,type);
                glines.push(line);
            }
        }
    } catch (err) {
    //  alert(err + "\n request" + featureID + ", typ" + type + "\n testovaci marker: " + gmarkers[0].getType() + " \n velikost pole markeru: " + gmarkers.length + "\n idcko markeru:" + gmarkers[0].getFid());
    }

    //po zpracovani pridam nove objekty mapy dle vrstev, ktere jsou v zatrzeny pro zobrazeni, a prida jen nove vynikle prvky tedy vysledek teto iterace
    showFeaturesInSelectedLayers(featureID);

    //doplnek pro zoom to a openInfoWindow nad objektem urcenym pro inicializaci mapy (klikem v male mape)
    if (!initObjShow && initObjCode != "")
    {
        if (gmarkers.length)
        {
            var delkaPole = gmarkers.length;
            for (i=0; i<delkaPole; i++) //prohleda pole markeru
            {
                if (gmarkers[i].getCode().toUpperCase() == initObjCode) //pokud ma nektery marker CODE stejny jako inicializacni pak udela zoom
                {
                    map.setCenter(gmarkers[i].getLatLng(),map.getZoom());   //centruje mapu na nalezeny objekt
                    GEvent.trigger(gmarkers[i], "click");   //musi byt volano az po zobrazeni ikon
                    break;  //vyskoci z cyklu
                }
            }
        }
        //proveden inicializacni zoom na objekt se zobrazenim infookna (byl/li objekt s danym CODE nalezen nalezen)
        initObjShow = 1;
      
      
    //FirstZoomDone = true; //uyivam pokud nechci delat zoom na route zaroven se zoomem na objekt udalosti
    }

} //end function TrafficResponse_parse


//*********************************************************************
// funkce showFeaturesInSelectedLayers(featureID)
// po parsovani requestu pridava do mapy nove vynikle objekty (z nove iterace),
// stare objekty byly z mapy vyjmuty pred zacatkem zpracovani nove odpovedi 
//
//params:   featureID - je featureId jako fid kazdeho objektu ktery pridal do pole dany request
//*********************************************************************
function showFeaturesInSelectedLayers(featureID)
{
    //po parsovani odpovedi musim odstranit vsechny symboly z mapy a nacist znovu jen ty pole (vrstvy) ktere jsou urceny pro zobrazeni (checked)
    var i = 1;
    var n;
  
    var obj = document.getElementById('vr_' + i);
  
    while (obj) {
        i++;
        if (obj.checked) {
            //zapinani bodu dle jejich typu  a featureId
            if (gmarkers && gmarkers.length) {
                for (n = 0 ; n < gmarkers.length ; n++ ) {
                    if (gmarkers[n].getType()== obj.value && gmarkers[n].getFid()== featureID) map.addOverlay(gmarkers[n]);
                }
            }
            //zapinani linii dle jejich typu a featureId
            if (glines && glines.length) {
                for ( n = 0 ; n < glines.length ; n++ ) {
                    if (glines[n].getType()== obj.value && glines[n].getFid()== featureID) map.addOverlay(glines[n]);
                }
            }
        }
     
        obj = document.getElementById('vr_' + i);
    }
}

//try {
//    if (browser.isFF || browser.isIE || browser.isNS || browser.isOP) {
//        SITE_ID = top.location.hostname + '_';
//    } else {
//        SITE_ID = '0_';
//    }
//} catch (exception) {
//    SITE_ID = '0_';
//}


//*********************************************************************
// funkce getDirectChildren(node, tagNameRegexp)
// funkce zjistovani potomku definovaneho jmena v konkretnim nodu
//
//params:	node - konkretni NODE dokumentu
//        tagNameRegexp - vyhledanavy tag v syntaxi regularniho vyrazu (/^location-text$/i)
//*********************************************************************

function getDirectChildren(node, tagNameRegexp) 
{
    var result = [];
    for (var i = 0; i < node.childNodes.length; i++) {
        if (node.childNodes[i].nodeType == 1 && node.childNodes[i].tagName.search(tagNameRegexp) != -1) {
            result.push(node.childNodes[i]);
        }
    }
    return result;
}

//*********************************************************************
// funkce float2gps(sour:float;kladne,zaporne)
// pro formatovani WGS souradnic z tvaru 49,343535 do tvaru 49°XX'XX.X"
//
//params:   sour - WGS souradnice ve tvaru 49,343535 tedy float
//          kladne - znak jez bude dosazen v pripade kladneho cisla
//          zaporne - znak jez bude dosazen v pripade zaporneho cisla
//*********************************************************************
function float2gps(sour,kladne,zaporne)
{
    souradnice = Math.abs(sour);
    var stupne = Math.floor(parseFloat(souradnice));
    var min_sec = (souradnice - stupne) * 60;
    var min = Math.floor(min_sec);
    var sec = Math.round((min_sec - min) * 60 * 10)/10 //na 1 desetinne misto
    var oznaceni;

    if (sour >= 0) oznaceni = kladne;
    else oznaceni = zaporne;

    return oznaceni + stupne + "°" + min + "'" + sec + "\"";
}


//*********************************************************************
// funkce removeMarkerById(string:featureId)
// odstranuje z pole prvni nalezeny marker s vlastnosti fid = featureId, tedy markery konkretniho Requestu
// odstranuje objekty line z mapy
//
//params:	featureId - string featureId podle nehoz odstranujeme dany marker (prvni nalezeny) z pole gmarkers
//*********************************************************************
function removeMarkerById(featureId)
{
    var i;
    if (gmarkers.length)
    {
        var delkaPole = gmarkers.length;
        for (i=0; i<delkaPole; i++)
        {
            if (gmarkers[i].getFid() == featureId)
            {
                map.removeOverlay(gmarkers[i]);   //odstrani z mapy nalezeny objekt daneho requestu
                gmarkers.splice(i,1);             //odstrani prvni nalezeny v poli, tim se zmeni delka pole
                delkaPole = gmarkers.length;
                i=i-1;  //skoci o pozici dozadu, aby protestoval dalsi objekt, diky zkraceni pole
            }
        }
    }
}

//*********************************************************************
// funkce removeLineById(string:featureId)
// odstranuje z pole prvni nalezenou linii s vlastnosti fid = featureId, tedy linii konkretniho Requestu
// odstranuje objekty line z mapy
//
//params:	featureId - string featureId podle nehoz odstranujeme danou linii (prvni nalezenou) z pole glines
//*********************************************************************
function removeLineById(featureId)
{
    var i;
    if (glines.length)
    {
        var delkaPole = glines.length;
        for (i=0; i<delkaPole; i++)
        {
            if (glines[i].getFid() == featureId)
            {
                map.removeOverlay(glines[i]);   //odstrani z mapy nalezeny objekt daneho requestu
                glines.splice(i,1);             //odstrani prvni nalezeny v poli, tim se zmeni delka pole
                delkaPole = glines.length;
                i=i-1;  //skoci o pozici dozadu, aby protestoval dalsi objekt, diky zkraceni pole
            }
        }
    }
}

/**
 * var ti_info = {
 *     valid_to: valid_to,
 *     valid_from: valid_from,
 *     type: type,
 *     urg: urg,
 *     sit: sit,
 *     cat: cat,
 *     to_km: to_km,
 *     from_km: from_km,
 *     code: code,
 *     texts: {
 *         text: text,
 *         alertc: alertc,
 *         location: location,
 *         time_from: time_from,
 *         time_to: time_to,
 *         date_from: date_from,
 *         date_to: date_to
 *     }
 * };
 */
var trafficInfoToHtml = function(ti_info) {
    var html = "<DIV id='infowindow'>" +
    "<table border='0' cellspacing='0' cellpadding='0' width='100%'>"+
    "<tr><td class='icon'><img src='"+iconpath[ti_info.type]+"' alt='Ikona události' width='30px' height='30px'></td><td class='alertc'>" + ti_info.texts.alertc + "<br>"+
    "<span class='datumcas'> Od " + ti_info.texts.time_from + " " + ti_info.texts.date_from + "<br>"+
    "Do " + ti_info.texts.time_to + " " + ti_info.texts.date_to + "</span></td></tr>"+
    "<tr><td colspan='2'><hr class='split'></td></tr>"+
    "<tr><td width='30px'>&nbsp;</td><td class='text'>" + ti_info.texts.text + "</td></tr>"+
    "<tr><td colspan='2'><hr class='split'></td></tr>"+
    "<tr><td colspan='2' class='objednej'>Volejte <span class='msisdn'>12900<\/span> pro přehled o dopravní situaci.</td></tr>"+
    "</table>" +
    "</div>";
    return html;
}
var trafficInfoToLabel = function(ti_info) {
    var label = ti_info.texts.alertc + " | \n" + ti_info.texts.location;
    return label;
}
var congestionInfoToLabel = function(cg) {
    var label = 'stupeň '+cg.getAttribute("level")+' | '+cg.getAttribute("place-name")+' | aktualizace '+formatTime(parseXmlDate(cg.getAttribute("updated")));
    return label;
}
var congestionInfoToHtml = function(cg) {
    var html = "<DIV id='infowindow'>" +
    "<table border='0' cellspacing='0' cellpadding='0' width='100%'>"+
    "<tr><td class='icon'><div style=\"text-align:center\">stupeň</div><div style=\"font-weight:bold; font-size:20pt;text-align:center\">"+cg.getAttribute("level")+"</div></td><td class='alertc' style=\"text-align:center;vertical-align:middle;padding:2px\">" + cg.getAttribute("place-name") + "<br>"+
    "<span class='datumcas'> Aktualizováno " + formatTime(parseXmlDate(cg.getAttribute("updated"))) + "<br>"+ "</span></td></tr>"+
    //    "<tr><td colspan='2'><hr class='split'></td></tr>"+
    //    "<tr><td width='30px'>&nbsp;</td><td class='text'> stupeň <span style=\"font-weight:bold; font-size:12pt\">" + cg.getAttribute("level") + "</span></td></tr>"+
    "<tr><td colspan='2'><hr class='split'></td></tr>"+
    "<tr><td colspan='2' class='objednej'>Volejte <span class='msisdn'>12900<\/span> pro přehled o dopravní situaci.</td></tr>"+
    "</table>" +
    "</div>";
    //    var html = "<div style=\"width:200px;font-size:8pt;text-align:center\"><b>" + cg.getAttribute("place-name") + "</b><br/>stupeň: <span style=\"font-weight:bold;font-size:20px\">" + cg.getAttribute("level") + "</span><br/>aktualizováno " + formatTime(parseXmlDate(cg.getAttribute("updated"))) + "</div>";
    return html;
}

