﻿function TaStops(mapObject)
{
    TaStops.map = mapObject;
    //aktualnie "kliknięty" marker
    //TaStops.selectedStop = null;
    //opóźnienie zamykania infoWindow - potrzebne do menu kontekstowego, gdzie niestety mapa wcześniej wyłapuje zdarzenie niż menu
    GEvent.addListener(mapObject, "click", function(overlay) { if(overlay==null && Stop.selected && Stop.selected.IsOnMap){Stop.selected.setBlurStyle_();} /*if(overlay==null && Stop.selected!=null)window.setTimeout(function(){Stop.selected.closeInfoWindow();},30);*/});   
    
   // GEvent.addListener(mapObject, "infowindowbeforeclose", function(overlay) {var iw = TaStops.map.getInfoWindow(); GEvent.clearListeners(iw,"maximizeend");});   
   // GEvent.addListener(mapObject.getInfoWindow(), 'maximizeend', function(){
     // TaStops.map.panDirection(-0.5,0.3);
    //});
   // GEvent.addListener(mapObject,"zoomend",function(){Stop.selected=false;});//clusterManager czyści mapę z markerów po każdym zoomie stąd czyszczenie referencji
    
    //tablica przytanków/markerów
    TaStops.arrayOfStops = [];
    //tablica konwersji, wartość pod indexem id przystanku odpowiada, indeksowi markera w  arrayOfStopsLevels
    TaStops.arrayOfStopsIds = []; 
    //tablica używana przy zmianie położenia przystanku
    TaStops.arrOfUpdates = new Array();
       
    TaStops.isRouteDrawed  = false; 
    //trasa danej lini
    TaStops.routeDirection = new RouteDirection(mapObject);
    //zarządzanie autobusami
    TaStops.vehicleManager = null;  
    //klaster grupujący przystanki w zależności od Zooma
    TaStops.cluster=null;
    //plik xml z informacjami o liniach
    TaStops.xmlRoutesInfo = null;
    //plik xml z informacjami o przytankach(pozycje,nazwy,linie)
    TaStops.xmlStopsInfo = null;
    
    TaStops.isStopsVisible = false;
    TaStops.isDragDropEnabled = false;
    
    
    TaStops.routeManager = null;    
        
            
}

TaStops.prototype.enableCluster = function()
{
    if(TaStops.cluster!=null){
        TaStops.cluster.clusteringEnabled=true;
        TaStops.cluster.refresh(true);
        }
}

TaStops.prototype.getStopsNames= function(){

    var tmp = new Array();
    
    for (var i = 0;i<TaStops.arrayOfStops.length;++i)
           tmp.push(TaStops.arrayOfStops[i].getTitle());
    return tmp.RemoveDuplicatesStr();
}


TaStops.prototype.disableCluster = function()
{
    if(TaStops.cluster!=null){
        TaStops.cluster.clusteringEnabled=false;
        TaStops.cluster.refresh(true);
        }
}


TaStops.prototype.initialize = function(opt_opts)
{
 
    var markers = TaStops.prototype._parseXML(TaStops.xmlStopsInfo);
    TaStops.arrayOfStops = markers;
    
    
    TaStops.cluster=new ClusterStop(TaStops.map,{ClusterStopClick:TaStops.prototype._clusterStopClick});
    TaStops.prototype.initializeVariables(opt_opts);
}

TaStops.prototype.initializeVariables = function(opt_opts)
{
    
    //inicjalizacja zmiennych globalnych
    //var resp = document.getElementById('db2Resp');
    //TaStops.routeDirection = new RouteDirection(TaStops.map);
    TaStops.routeManager = new RouteDirectionManager(TaStops.map);
    VehicleManager.routeManager = TaStops.routeManager;
    //TaStops.routeDirection.setRespCont(resp);   
    //ZMIANA
    Vehicle.routeDirection = TaStops.routeDirection;
    RouteDirection.arrOfStopsIds = TaStops.arrayOfStopsIds;
    RouteDirection.arrOfStops   =  TaStops.arrayOfStops;
    //inicjalizacja managera pokazującego pojazdy
    TaStops.vehicleManager = new VehicleManager(TaStops.map,{vehPosType: opt_opts.vehPosType || 2,isNbLabels:opt_opts.isNbLabels,isNrLabels:opt_opts.isNrLabels,isDmLabels:opt_opts.isDmLabels,isVarLabels:opt_opts.isVarLabels,isKrLabels:opt_opts.isKrLabels});


}
    
TaStops.prototype.showSelectedStops = function(stops)
{
       if(!TaStops.isStopsVisible){
            TaStops.cluster.intersectPadding=10;
            TaStops.cluster.addMarkers(stops);
            TaStops.cluster.fitMapToMarkers();
            TaStops.isStopsVisible = true;
            }

}    
    
TaStops.prototype.showAllStops=function ()
{
       if(!TaStops.isStopsVisible){
        TaStops.cluster.addMarkers(TaStops.arrayOfStops);
        TaStops.cluster.intersectPadding=5;
        //TaStops.cluster.fitMapToMarkers();
        TaStops.cluster.refresh();
        TaStops.isStopsVisible = true;
        }
}
TaStops.prototype.enableDragDrop=function()
{
     for(var i =0;i<TaStops.arrayOfStops.length;++i)
        TaStops.arrayOfStops[i].enableDragging();
     
     TaStops.isDragDropEnabled = true;
        
}
TaStops.prototype.disableDragDrop=function()
{
     for(var i =0;i<TaStops.arrayOfStops.length;++i)
        TaStops.arrayOfStops[i].disableDragging();
        
       TaStops.isDragDropEnabled = false;
}



TaStops.prototype.hideAllStops=function ()
{
   TaStops.map.closeInfoWindow();//wyrzuca błąd gdy usunie się markery przy otwartej chmurce
   TaStops.cluster.removeMarkers();
   TaStops.isStopsVisible = false;
}


TaStops.prototype.getMap=function()
{
return TaStops.map;
}


TaStops.prototype._parseXML = function(xmlObject,opt_opts)
{ 
    var arrayOfMarkers = [];
    var marker;
    var allstops =null;
    var bounds = new GLatLngBounds();
    TaStops.isDragDropEnabled = opt_opts && opt_opts.draggable || false;
    
    allstops=xmlObject.getElementsByTagName('S');
   
    var arrayOfids = new Array(allstops.length +1);
    
    var c =0;
    for(var i=0; i<allstops.length ; i++)  
    {  
       var id =  allstops[i].getAttribute("id");
       var nr =  allstops[i].getAttribute("nr"); //numer
       var nrs =  allstops[i].getAttribute("sl"); //slupek
       var lat = parseFloat(allstops[i].getAttribute("y"));  
       var lon = parseFloat(allstops[i].getAttribute("x"));  
       var mark_title = allstops[i].getAttribute("n");
       marker = new Stop(new GLatLng(lat,lon),{title:mark_title,id: id,nr:nr,nrs:nrs,draggable:TaStops.isDragDropEnabled});
      marker.initListeners();
     
      var tmp = allstops[i].firstChild.nodeValue.split('&');
      marker.setRouteInfo(tmp);
      
     // alert(tmp);

      arrayOfids[id] = arrayOfMarkers.length;
      arrayOfMarkers.push(marker);
      bounds.extend(new GLatLng(lat,lon));
    }
    
    TaStops.arrayOfStopsIds=arrayOfids;
    TaStops.map.CenterPoint = bounds.getCenter();
    TaStops.map.CenterPointZoomLevel = TaStops.map.getBoundsZoomLevel(bounds);
    
    TaStops.map.setCenter(TaStops.map.CenterPoint ,TaStops.map.CenterPointZoomLevel);
    
    
    bounds = null;
    arrayOfids = null;
   
    return arrayOfMarkers;
}

TaStops.prototype._clusterStopClick = function(args)
{
   args.ClusterStop._clustreInfoRoutes(args.clusteredMarkers);
   args.ClusterStop._openInfoWindow();
   TaStops.cluster.zoomIn = function(){var bounds=args.ClusterStop.clusterGroupBounds;TaStops.map.savePosition();TaStops.map.setCenter(TaStops.map.setCenter(bounds.getCenter(),TaStops.map.getBoundsZoomLevel(bounds)));TaStops.cluster.triggerClick(args.clusteredMarkers[0].index); }
   args.clusteredMarkers[0].zoomOut = function(){TaStops.map.returnToSavedPosition();args.ClusterStop.openExtInfoWindowHtml( headerHTML + bodyHTML+footHTML,{noCloseOnClick:true});}
}

/*************************************************************************************/
/*************************************************************************************/



TaStops.prototype.drawRoute = function (routeNr,trackType,vehType)
{
   
/************************************************************/
   //ZMIANA
   //RouteDirection.isStopsDrawed = true;
   //RouteDirection.isPolylineDrawed = true; 
   //usunięcie z mapy starej trasy
   if(TaStops.routeDirection!=null)
        TaStops.routeDirection.removeFromMap();
  
   var ev = GEvent.addListener(TaStops.routeManager,"load",function(route,fromCache){
                        if(route._routeNr == routeNr && route._trackT == trackType){
                            TaStops.routeDirection = route;
                            route.isStopsDrawed = true;
                            route.isPolylineDrawed = true;
                            
                            if(!TaStops.routeDirection._trackCreated)
                                TaStops.routeDirection.refreshInNMode();//utworzenie trasy
                            else
                                TaStops.routeDirection.addToMap();
                            GEvent.removeListener(ev);
                        }
                });
                
     TaStops.routeManager.loadRouteInNMode(routeNr,trackType,{color:vehType.routeColor,stopIcon:vehType.stopIcon,stopShineIcon:vehType.stopShineIcon,stopClickedIcon:vehType.stopClickedIcon});
   
   
   
   /*
   TaStops.routeDirection.dataLoaded = function(){
     TaStops.routeDirection.refreshInNMode();//utworzenie trasy
   }
   
   TaStops.routeDirection.clearInNMode(true);
   TaStops.routeDirection.loadInNMode(routeNr,trackType);
    */
   
   //ZMIANA
   //TaStops.prototype.refreshCheckboxes();
//****************************************************************************/
}

TaStops.prototype.getVehiclesBRoute = function(route)
{ 
   TaStops.vehicleManager.refresh2(route,"");
   TaStops.vehicleManager.startRefreshing2(route,"");
}



TaStops.prototype.showVehicles = function()
{
    TaStops.vehicleManager.clear();
    //ZMIANA
    if(TaStops.routeDirection != null)
        TaStops.vehicleManager.addRoute(TaStops.routeDirection._routeNr);
    TaStops.vehicleManager.startRefreshing2();//pobranie informacji o pojazdach
    //TaStops.routeDirection.isStopsDrawed = false;//domyślnie dla pojazdow nie powinna byc wyswietlana linia
    //TaStops.routeDirection.isPolylineDrawed = false;
    //TaStops.prototype.refreshCheckboxes();
}

TaStops.prototype.hideVehicles = function()
{
    TaStops.vehicleManager.clear();
    //ZMIANA
     TaStops.routeDirection.isStopsDrawed = true;
    TaStops.routeDirection.isPolylineDrawed = true;
    //sManag.showRoutesInfo(TaStops.xmlRoutesInfo);
    //sidebar.openTab(sidebar.ROUTES);
}


Array.prototype.clearObjects = function()
{
    for(var i=0;i<this.length;++i)
        delete this[i];
}




function findNode(arrayNode,atName,atVal)
{
   for (var i = 0;i<arrayNode.length;++i){
         if (arrayNode[i].nodeType != 1)  continue;
         if (arrayNode[i].getAttribute(atName) == atVal)
            break;
   }
   
        
   if (i>=arrayNode.length)
    return null; 
   
   return arrayNode[i];
}


Array.prototype.RemoveDuplicates = function()
   {
    //usówanie duplikatów z tablicy.
    var result=new Array();
    var lastValue=[];
    this.sort();
    for (var i=0; i<this.length; i++)
    {
  var curValue=this[i];
  if (compare(lastValue,curValue)==false)
  {
result[result.length] = curValue;
  }
  lastValue=curValue;
    }
    return result;
   }

Array.prototype.RemoveDuplicatesStr = function()
   {
    //usówanie duplikatów z tablicy stringów
    var result=new Array();
    var lastValue="";
    this.sort();
    for (var i=0; i<this.length; i++)
    {
  var curValue=this[i];
  if (lastValue!=curValue)
  {
result[result.length] = curValue;
  }
  lastValue=curValue;
    }
    return result;
   }
   


   
compare = function(testArr,testArr2) {
    if (testArr2.length != testArr.length) return false;
   
   for (var i=0;i<testArr.length;++i)
        if (testArr[i]!=testArr2[i]) return false;
   
    return true;
}



TaStops.prototype.hideDirection = function()
{
    TaStops.routeDirection.hide();
}

TaStops.prototype.showDirection = function()
{
    TaStops.routeDirection.show();

}
TaStops.prototype.getRouteDirection = function()
{
    return TaStops.routeDirection;
}

/*
TaStops.prototype.addNew = function()
{
    var html = 'Id:<input type="text" id="nstopId"><br/><input type="button" onclick="javascript:TaStops.prototype.newStopId()" value="OK">';

    if(TaStops.newStop ==null || TaStops.newStop.getId()!=-1)
    {
        TaStops.newStop = new Stop(TaStops.map.getCenter(),{title:"Nowy",id:-1,draggable:true});
        TaStops.newStop.txt = html;
        TaStops.map.addOverlay(TaStops.newStop);
        TaStops.newStop.openInfoWindow(TaStops.newStop.txt);
        TaStops.newStop.onclick_=function(){this.openInfoWindow(this.txt)};
        TaStops.newStop.disableDragging();
    }   
}
TaStops.prototype.deleteNew = function()
{

    if (TaStops.newStop != null){
        TaStops.map.removeOverlay(TaStops.newStop);
        if(TaStops.newStop.getId() != -1){
            TaStops.arrayOfStops[TaStops.arrayOfStopsIds[TaStops.newStop.getId()]] = null;
            TaStops.arrayOfStopsIds[TaStops.newStop.getId()] = null;
            }
        TaStops.newStop = null
        };
}

TaStops.prototype.newStopId = function()
{
    var id = document.getElementById('nstopId').value;
    if(id!=null && id!='')
    {
        if(TaStops.arrayOfStops[TaStops.arrayOfStopsIds[parseInt(id)]]!=null)
        {
            TaStops.newStop.openInfoWindow("<span style='color:red'>Taki ID juz istnieje, zmien id, w przeciwnym wypadku nie bedzie mozliwosci zmiany pozycji przystanku,ani dodania go do bazy</span><br/>"+TaStops.newStop.txt);
            return;
        }
        else
        {
            TaStops.newStop.id_=parseInt(id);
            TaStops.arrayOfStops.push(TaStops.newStop);
            TaStops.arrayOfStopsIds[parseInt(id)]=TaStops.arrayOfStops.length - 1;
            TaStops.newStop.enableDragging();
            TaStops.newStop.onclick_ = TaStops.prototype._markerEventClick;
            TaStops.newStop.closeInfoWindow();
        }      
    }
}


TaStops.prototype.save = function(respContainer)
{
    var exp = 1000000;
    var infoResp;
    
    if(respContainer==null){//gdzie wyświetlić komunikat poprawnego zakończenia operacji
        infoResp = new InfoContainer(document.getElementById('db2Resp')); infoResp.clear();}
    else
        infoResp = respContainer;    
  
   
   if(!TaStops.isDragDropEnabled){
        infoResp.append("<strong><span style='color:blue'>Nie zapisano</span> pozycji przystanków.</strong><br></br><span>Jeśli chcesz zapisać nowe pozycje zaznacz opcje <b>Przenoszenie przystanków</b>, nastepnie kliknij \"Zapisz\" w polu <b>Edycja przystanków</b></span>");
        infoResp.show();
        return;
    }
  
    var auth = new  Authorization();
    if(auth.authorize()){//jeśli autoryzacja się powiodła
      var wbs = new WebServiceClient("EAktPrzystanki");
      wbs.appendProperty("username",auth.getLogin());
      wbs.appendProperty("password",auth.getPass());
      wbs.addPropertyString("<data>")
    
    for(var i=0;i<TaStops.arrOfUpdates.length;++i)
        if(TaStops.arrOfUpdates[i]!=null)
            wbs.appendProperty("string"," "+i+"%"+Math.round(exp*TaStops.arrOfUpdates[i].lat())+"%"+Math.round(exp*TaStops.arrOfUpdates[i].lng()));
    wbs.addPropertyString("</data>")
    
    infoResp.append('Czekaj trwa aktualizacja przystankow...');
    infoResp.show();
    wbs.send(function(re){
      infoResp.append(re.getElementsByTagName('Updation')[0].firstChild.nodeValue);
      infoResp.show();
      
      TaStops.arrOfUpdates = new Array();
    });
 }
}

*/





/*****************************************************************************/
//extensions

Array.prototype.eJoin=function(arrOfSeparators)
{
    buffer = new StringBuffer();
 //   return '';
   if(arrOfSeparators.length<1) return '';
    
    for (var i=0;i<this.length;++i){
         var j=0;
         for (j=0;j<arrOfSeparators.length-1;++j) {buffer.append(arrOfSeparators[j]+this[i])}
         buffer.append(arrOfSeparators[j]);
        }
    
    return buffer.toString();
    
}

String.prototype.trim=function()
{
    return this.replace(/^\s+|\s+$/g, '');   
}


function write(str)
{
document.getElementById('divxml').innerHTML+=str;

}


GMap2.prototype.showLoading = function(top){
    this.progress  = new ProgressBar({image:(typeof(PATH)!='undefined'?PATH:'')+'img/ajax_loader_2.gif',opacity:'0.2',text:' ',background:'#555555',paddingTop:top || '10%'});
    this.progress.initOnContainer(this.getContainer());
}

GMap2.prototype.hideLoading = function(){
    this.progress.remove();
}
//centrowanie mapy na podstawie współrzędnych pobranych z bazy -- średnia położeń wszystkich przystanków
GMap2.prototype.loadCentreMap= function(){
      this.showLoading('50%');
      var me = this;
      var wbs = new WebServiceClient("DajCentrumMapy");
      wbs.send(function(data){
                var c = data.getElementsByTagName("Center")[0];
               var pozx = parseFloat(c.getAttribute("pozx"));
               var pozy = parseFloat(c.getAttribute("pozy"));
               me.setCenter(new GLatLng(pozy,pozx),10);
               
               me.hideLoading();
               me.centreMapLoaded();
     },function(){throw ("Nie udało się wycentrować mapy, błąd połączenia z serwerem");});
}
//odpalane gdy mapa zostanie wycentrowana na podstawie współrzędnych pobranych  z bazy
GMap2.prototype.centreMapLoaded = function(){}
GLatLng.prototype.toDms=function()
{
    return GLatLng.toDms(this.x,this.y);
}

//zmiana współrzędnych decymalnych na godziny/minuty/sekundy
GLatLng.toDms=function(x,y) { 
        var lat = y;
        var lng = x;
        var dirLat;
        var dirLng;
       
        var degLat = Math.floor(lat);        var degLng = Math.floor(lng);                    
        var decLat = lat - degLat;           var decLng = lng - degLng;
        var dmnLat = 60.0 * decLat;          var dmnLng = 60.0 * decLng;
        var minLat = Math.floor(dmnLat);     var minLng = Math.floor(dmnLng);          
        var dscLat = dmnLat - minLat;        var dscLng = dmnLng - minLng;
        var secLat = Math.round(60 * dscLat);  var secLng = Math.round(60 * dscLng);     
      
        minLat = minLat<0?-minLat:minLat;     minLng = minLng<0?-minLng:minLng;
        secLat = secLat<0?-secLat:secLat;     secLng = secLng<0?-secLng:secLng;
      
        return {lat:{deg:degLat,min:minLat,sec:secLat,
                toHtmlString:function(){return this.deg + "&deg; "+this.min +"' "+this.sec +"\" " + (lat>=0?"N":"S")}
                },
                lng:{deg:degLng,min:minLng,sec:secLng,
                 toHtmlString:function(){return  this.deg + "&deg; "+this.min +"' "+this.sec +"\" " + (lng>=0?"E":"W")}
                },
                toHtmlString:function(){return  this.lng.toHtmlString() +'&nbsp;&nbsp;' +this.lat.toHtmlString()}
                };
} 

GLatLng.dmsToDec = function(pnt) {//zmiana godzin/minut/sekund na współrzędne decymalne
        var fLng =  (pnt.lng.sec + pnt.lng.min*60) / 3600;
        var lng = pnt.lng.deg<0?(pnt.lng.deg-fLng):(pnt.lng.deg+fLng);         

        var fLat =  (pnt.lat.sec + pnt.lat.min*60) / 3600;
        var lat = pnt.lat.deg<0?(pnt.lat.deg-fLat):(pnt.lat.deg+fLat);         

        return new GLatLng(lat,lng); 
}