Wiking.tools = {};

Wiking.tools.searcher = new function(){
    var directions = false;
    var directionsObject;
    var searchMarkers = [];
    var clearMarkers = function(){
        var map = Wiking.getMap();
        for (var i=0,l=searchMarkers.length;i<l;i++){
            map.removeOverlay(searchMarkers[i]);
        }
        searchMarkers = [];
    }
    this.clear = function(){
        clearMarkers();
        var s = document.getElementById('searchContainer')
        s.innerHTML="";
        s.style.height="auto";
    }
    this.doSearch = function(){
        if (directions){
            searchForDirections();
        }else{
            searchForAddress();
        }
    }
    var searchForAddress = function(){    
        var
          addressfield = document.getElementById('addressfield'),
          searchcontainer = document.getElementById('searchContainer');   
        if (addressfield==null || addressfield.value==""){     
            return;
        }
        searchcontainer.innerHTML='<p style="margin:5px 10px;">Wyszukiwanie...</p>';
        searchcontainer.style.height="auto";
        Geocoder.getLocations(
            addressfield.value,
            function(json){
				console.debug(json);
                if (!json || json.Status.code != 200){
                    searchcontainer.innerHTML='<p style="margin:5px 10px;">Nie odnaleziono podanej frazy.</p>'
                    return;
                }
                clearMarkers();
                var html = '';
                var bounds = new GLatLngBounds();
                for (var i=0, l=json.Placemark.length;i<l;i++){
                    var place = json.Placemark[i];
                    var point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);
                    bounds.extend(point);
                    
                    var details = place.AddressDetails.Country.AdministrativeArea;
                    var subadm = ', ' + (details.SubAdministrativeArea ? details.SubAdministrativeArea.SubAdministrativeAreaName : '');
                    html+='<div style="padding:5px 10px">'+
                            '<a href="javascript:Wiking.getMap().setCenter(new GLatLng('+place.Point.coordinates[1]+','+place.Point.coordinates[0]+'),13)">'+place.address+'</a>'+
                            '<p style="margin:0;">'+details.AdministrativeAreaName+subadm+'</p>'+
                          '</div>';
                    var tmpMarker = new GMarker(point,{title:place.address+', '+details.AdministrativeAreaName+subadm});
                    Wiking.getMap().addOverlay(tmpMarker);
                    searchMarkers.push(tmpMarker);
                    GEvent.addListener(tmpMarker,'click',function(){
                        showContent(point,tmpMarker);
                    });
                }
                html+='<p style="padding-top:7px;background:#f0f8fe;text-align:center;font-size:12px;padding-bottom:7px;border-top:1px solid #ddd;"><a href="#" onclick="Wiking.tools.searcher.clear()">Wyszyść mapę z wyników wyszukiwania</a></p>';
                searchcontainer.innerHTML=html;
                var size = Wiking.getMap().getSize();
                if (searchcontainer.getHeight() > (size.height-270)){
                    searchcontainer.style.height=(size.height-270)+'px';
                }
                var map = Wiking.getMap();
                var zoom = searchMarkers.length==1 ? 13 : map.getBoundsZoomLevel(bounds)-1;
                map.setCenter(bounds.getCenter(),zoom);
            }
        );
    }
    var searchForDirections = function(){
        if (document.getElementById('addressfield2').value=='' || document.getElementById('addressfield').value==''){
            return;
        }
        var searchcontainer = document.getElementById('searchContainer');
        if (!directionsObject)
            directionsObject = new GDirections(Wiking.getMap(), searchcontainer);
        
        GEvent.addListener(directionsObject,'addoverlay',function(){
            var size = Wiking.getMap().getSize();
            if (searchcontainer.getHeight() > (size.height-305)){
                searchcontainer.style.height=(size.height-305)+'px';
            }
        });
        GEvent.addListener(directionsObject,'error',function(){
            searchcontainer.innerHTML='<p style="margin:5px 10px;">Nie udało się wyznaczyć trasy :-(</p>';
        });
        searchcontainer.innerHTML='';
        directionsObject.load("from: "+document.getElementById('addressfield2').value+
                        " to: "+document.getElementById('addressfield').value,
                        {locale:"pl_PL"});
        

    }
    this.setupDirections = function(){
        this.clear();
        directions = true;
        document.getElementById('searchnavi').innerHTML='Wyszukaj: <a href="javascript:Wiking.tools.searcher.setupAddress()">adres</a>, <strong>trasę</strong>'
        document.getElementById('searchExtended').style.display='block';
        document.getElementById('searchComment').style.display='none';
        document.getElementById('addressSearchButton').style.marginTop="39px";
        document.getElementById('searchContainer').style.width="300px";
        var af = document.getElementById('addressfield');
        document.getElementById('addressfield2').value = af.value;
        af.value='';
    }
    this.setupAddress = function(){
        try{directionsObject.clear()}catch(e){}
        this.clear();
        directions = false;
        document.getElementById('searchnavi').innerHTML='Wyszukaj: <strong>adres</strong>, <a href="javascript:Wiking.tools.searcher.setupDirections()">trasę</a>';
        document.getElementById('searchExtended').style.display='none';
        document.getElementById('searchComment').style.display='block';
        document.getElementById('addressSearchButton').style.marginTop="12px";
        document.getElementById('searchContainer').style.width="310px";
        document.getElementById('addressfield').focus();
        
    }
    var showContent = function(point,tmpMarker){
        alert('content!');
    }
};

Wiking.tools.searchMarker= Class.create(TMapMovableLayer,
{
    initialize:function($super,g,t,data)
    {
        var options=
        {
            'point':g,
            'displacement':new TPoint(16, 37),
            'size':new TSize(33,37),
            'clickable':true
        }
        this.data=data;
        this.t=t;
        this.g=g;
        this.div = Element.extend(document.createElement('div'));
        this.div.style.cssText = AlphaImage.create('/wimg/marker1.png')+';width:33px;height:37px;cursor:pointer;';
        this.div.innerHTML='<div style="filter:alpha(opacity=65);font-size:12px;font-family:Verdana;font-weight:bold;text-align:center;padding-top:7px;margin-left:-6px">'+t+'</div>';
        $super(options,this.div,Wiking.getMap())
        this.draw();
        this.div.observe('click',this.showContent.bind(this));
    },
    showContent:function()
    {
        var width = 260;        
        var height = 160;
        var options=
        {
            'point':this.g,
            'displacement':new TPoint(30,height+5),
            'size':new TSize(width,height),
            'clickable':true
        }
        //json.c + ", "+ json.s +json.n+"<br /><span style="color:#aaa;font-size:10px;">#{w}, #{p}
        if(!this.data.s)
        {
            this.data.s="";
        }
        if(!this.data.n)
        {
            this.data.n="";
        }
        var obj = Wiking.getObjects();
        var len = obj.length;
        var distarray = [];
        var tmp;
        while(len--)
        {
            if (tmp=obj[len].getPosition())
            {
                distarray.push({dist:(Math.round(tmp.getDistance(this.g)*100)/100),name:obj[len].getName()});
            }
        }
        distarray.sort(function(a,b){if (a.dist > b.dist){return 1}
                                     if (a.dist < b.dist){return -1}
                                     else return 0});
        var len2 = distarray.length;
        if (len2 > 5) {len2=4}
        var distance="";
        for (var i=0,l=len2;i<l;i++)
        {
            distance+= distarray[i].name + " - ~" + distarray[i].dist + " km<br />";
        }
        if (distarray.length>5)
        {
            distance+='<a href="#" id="searchmore">więcej...</a>';
        }
        var html = '<div id="searchcloudx" style="cursor:pointer;position:absolute;left:'+(width-17)+'px;top:-9px;width:27px;height:27px;background: url(\'wimg/x.png\')"></div>'+
                '<div>'+
                  '<div style="float:left;width:8px;height:8px;background:url(\'wimg/clefttop.png\')"></div>'+
                  '<div style="float:left;background:url(\'wimg/ctop.png\');height:8px;width:'+(width-16)+'px">'+

                  '</div>'+
                  '<div style="float:left;width:8px;height:8px;background:url(\'wimg/crighttop.png\')"></div>'+
                 
                  '<div style="clear:left;float:left;width:8px;background:url(\'wimg/cleft.png\');height:'+(height-16)+'px"></div>'+
                  '<div style="float:left;background:#fff;height:'+(height-16)+'px;width:'+(width-16)+'px">'+
                    //TREŚĆ
                     '<div style="padding:10px">'+
                        "<strong>"+this.data.c + ", " + this.data.s + " " + this.data.n + "</strong>"+
                        "<br /><small>"+this.data.w+", "+this.data.p+"</small>"+
                        '<div style="height:1px;background:#ccc;margin-top:5px;"></div><p>'+
                        '<div id="distancespan" style="height:80px;overflow:auto;">'+distance+"</div>"+
                     '</p></div>'+
                  '</div>'+
                  '<div style="float:left;width:8px;background:url(\'wimg/cright.png\');height:'+(height-16)+'px"></div>'+
               
                  '<div style="float:left;width:8px;height:8px;background:url(\'wimg/cleftbottom.png\')"></div>'+
                  '<div style="float:left;background:url(\'wimg/cbottom.png\');height:8px;width:'+(width-16)+'px"></div>'+
                  '<div style="float:left;width:8px;height:8px;background:url(\'wimg/crightbottom.png\')"></div>'+
                '</div>';
        this.window = new this.content(options,html,Wiking.getMap());
        this.window.draw();
        var s = $('searchcloudx')
            s.observe('click',this.window.clear.bind(this.window));
            s.id="";
        if ((s = $('searchmore')) != null)
        {
            s.observe('click',this.window.fullContent.bind(this.window,distarray));
            s.id="";
        }
    },
    content:Class.create(TMapMovableLayer,
    {
        draw:function($super)
        {
            $super();
            this.distancespan = $('distancespan');
            this.distancespan.id=""; 
            Wiking.Event.bindAsEventListener(this,'newpos',this.generateDistance);
            Wiking.Event.bindAsEventListener(this,'dataload',this.generateDistance);
        },
        fullContent:function(distarray)
        {
            var len2 = distarray.length;
            var distance="";
            for (var i=0,l=len2;i<l;i++)
            {
                distance+= distarray[i].name + " - ~" + distarray[i].dist + " km<br />";
            }
            this.distancespan.innerHTML=distance;
        },
        clear:function($super)
        {
            Wiking.Event.unBindEventListener(this,'newpos');
            Wiking.Event.unBindEventListener(this,'dataload');
            $super();
        },
        generateDistance:function()
        {
            var obj = Wiking.getObjects();
            var len = obj.length;
            var distance="";
            var tmp;
            while(len--)
            {
                if (tmp=obj[len].getPosition())
                {
                    distance+= obj[len].getName() + " - ~" + Math.round(tmp.getDistance(this.options.get('point'))*100)/100 + " km<br />"
                }
            }
            this.distancespan.innerHTML=distance;
        }
    }),
    clear:function($super)
    {
        try
        {
            this.window.clear();
        }catch(e){}
        $super();
    }
});

/*
 * Manager divów z obiektami, obecnych na liście w głównym menu.
 */
Wiking.tools.ObjDivManager = new function()
{
    /*
     * template div'a
     */
    var plus = !Prototype.Browser.IE ? 'background:url(\'wimg/plus.png\') no-repeat;' : "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=wimg/plus.png,sizingMethod='scale');";

    var template = new Template('<div class="objectslistdiv" id="obj#{imei}">'+
                             '<div class="showhidebox">'+
                               '<input type="checkbox" checked="true" class="showhide" /> Widoczny'+
                               '<br /><input type="checkbox" class="follow" /> Śledzony'+
                             '</div>'+
                             '<div class="markersign" id="markersign#{imei}"></div>'+
                             '<div style="'+plus+'" class="more"></div>'+
                             '<div class="name">#{name}</div>'+
                             '<div class="height"></div>'+
                           '</div>');
    /*
     * funkcja tworząca divy dla obiektów
     */
    var morefuns = [];
    this.create = function()
    {
        var obj = Wiking.getObjects();
        if (obj.length == 0)
        {
            document.getElementById('obiektyContainer').innerHTML='<div style="border-bottom:1px solid #ccc;padding:10px;">Nie posiadasz zarejestrowanych urządzeń. Możesz je dodać w zakładce <a href="javascript:Wiking.widgets.ShowMyAccount()">Moje konto</a>.</div>';
            Wiking.tools.zoomToObjects(); //by ustawić mapę;
            return           
        }
        var html = "";
        var active = "";
        for (var i=0, l=obj.length; i<l; i++)
        {
            if (!obj[i].isActive()){
                active='<br /><span class="bad">Wyrejestrowane</span>';
            }
            else if (obj[i].getPaymentCode()){
                var paystr = "Nieopłacone!";
                if (obj[i].renew){
                    paystr = "Przedłuż abonament!";
                }
                active='<br /><span class="bad"><a href="javascript:Wiking.widgets.ShowMyAccount().goNav(3);" style="font-weight:bold;color:red;">'+paystr+'</a></span>';
            }
			else if (!Wiking.widgets.MainMenu.isHistory()){
				active='<br /><span id="lastdata'+obj[i].getImei()+'" title="Data ostatniego odczytu"></span>';
			}
            data = {'i':i,'imei':obj[i].getImei(),'name':obj[i].getName()+active};
            html += template.evaluate(data);
            active = '';
        }
        document.getElementById('obiektyContainer').innerHTML=html;
    }
    /*
     * podpinamy eventy pod diva
     */
    this.bindEvents = function()
    {
        morefuns = [];
        var obj = Wiking.getObjects();
        var markersign = $$('.markersign');
        var more = $$('.more');
        var objlist = $$('.objectslistdiv');
        for (var i=0,l=obj.length;i<l;i++)
        {
            // apendowanie markera

            var child = obj[i].Pojazd.cloneNode(); // TODO -> dirty access

            child.style.position="static";
            child.style.top = 'auto';
            child.style.left = 'auto';
            child.style.display="block";
            
            markersign[i].appendChild(child);      
            markersign[i].observe('click',zoomin.bind(obj[i]));
            // szczegóły obiektu
            objlist[i].more=false;
            var bind = {object:obj[i],div:objlist[i],morediv:more[i],model:this};
            more[i].observe('click',funmore.bind(bind));
            morefuns.push(bind);
        }
        Wiking.Event.bindAsEventListener(this,'dataload',refreshMore);
		Wiking.Event.bindAsEventListener(this,'change_object_name',ChangeName);
    }
    /* 
     * funkcja odświeżająca szczegóły na evencie 'dataload'
     */
    var refreshMore = function()
    {
        for (var i = 0,l = morefuns.length;i<l; i++)
        {
            if (morefuns[i]['div'].more)
            {
                Element.remove(morefuns[i]['div'].more);
                var div = morefuns[i]['model'].createMoreDiv(morefuns[i]['object']);          
                morefuns[i]['div'].appendChild(div);
                morefuns[i]['div'].more=div;
            }
        }
    }
    /*
     * funkcja zoomująca na klika na marker w divie
     */
    var zoomin = function()
    {
        if (this.getPosition())
        {
            Wiking.getMap().setCenter(this.getPosition(),15);
        }
    }
    /*
     * bardzo zamieszana funkcja tworząca diva z more
     */
    this.createMoreDiv = function(obj)
    {
        var div = document.createElement("div");
			div.className = 'morediv';
            div.innerHTML="Nazwa: ";
        
        var saveinput = $(document.createElement('input'));
            saveinput.type="text";
            saveinput.value=obj.getName();
        div.appendChild(saveinput);
        
        var save = $(document.createElement('button'));
            save.innerHTML="Zapisz";
            save.observe('click',saveNewName.bind({object:obj,input:saveinput}));
        div.appendChild(save);     
        
        var imeispan = document.createElement('div');
            imeispan.innerHTML="Imei: "+obj.getImei();
        div.appendChild(imeispan);
            
        var a = $(document.createElement("a"));
            a.href="#" //tmp;
            a.innerHTML="Konfiguruj wygląd obiektu";
            GEvent.addDomListener(a,'click',function(){
                Wiking.widgets.LookConfig.runConfig(obj);
            });
        div.appendChild(a);
        
        var html="";
        if (Wiking.widgets.MainMenu.isHistory() && obj.getFlag('data'))
        {// tylko dla historii
            var params = Wiking.DataLoader.getPeriod();           
            html+="<strong>Statystyki:</strong><br />"+
      /* TODO temp # */            //'<a href="#" onClick="Wiking.widgets.Charts.show('+obj.getImei()+');">Wykres prędkości</a><br />'+
                  "Długość trasy: ~"+Math.round(routelen(obj.getImei())*100)/100+" km"+
                  '<br />Największa prędkość: '+obj.getData()[2].max()+" km/h<br />";
            html+='<a href="/thingy/geo2.kml?dev='+obj.getImei()+"&from="+params[0]+"&to="+params[1]+'">Pobierz trasę w formacie KML</a>';
        }
        var helperdiv = document.createElement("div");
        helperdiv.innerHTML = html;
        div.appendChild(helperdiv);

        return div;
    }
    var saveNewName = function()
    {// TODO czy to napewno powinno być w tym obiekcie ?
		this.object.setName(this.input.value);
    }
	var ChangeName = function(e)
	{
		$('obj'+e.imei).select('.name')[0].update(e.name);
		var obj = Wiking.getObjectByImei(e.imei);
		obj.Label.setLabel(e.name);
	}
    /*
     * funkcja odpowiadająca za ograniczanie rozrostu menu
     */
    this.plusMenuSize = function()
    {
        var menuminus = Wiking.widgets.MainMenu.isHistory() ? 322 : 285;

        if ($('obiektyContainer').getHeight() >= ($('mapa').clientHeight-menuminus)) //TODO zmienić tego client na metode mapy
        {
            $('obiektyContainer').style.height=($('mapa').clientHeight-menuminus)+'px'; //TODO jw
            $('obiektyContainer').style.cssText+=";overflow-y:scroll;";
        }
        else
        {
            $('obiektyContainer').style.height="auto";
            $('obiektyContainer').style.cssText+=";overflow-y:hidden;"; // first semicolon is important!
        }
    }
    /*
     * funkcja odpowiadająca za pomniejszanie menu gdy trzeba
     */
    this.minusMenuSize = function()
    {
        var t = $$('.objectslistdiv');
        var acc = 0;
        for (var i=0,l=t.length;i<l;i++)
        {
            acc+=t[i].getHeight();
        }
        if ($('obiektyContainer').getHeight() > acc)
        {
            var cont = document.getElementById('obiektyContainer');
            cont.style.height = (acc+10)+"px";
            cont.style.cssText+="overflow-y:auto";
        }
    }
    /*
     * funkcja odpowiadająca za pokazywanie i ukrywanie "szczegółów" obiektu
     */
    var funmore = function()
    {
        if (!this['div'].more)
        {
            var div = this.model.createMoreDiv(this.object);          
            this.div.appendChild(div);
            this.div.more=div;
            this.div.style.background="#f5dc9f";
            if (!Prototype.Browser.IE)
            {
                this.morediv.style.background="url('wimg/minus.png') no-repeat";
            }
            else
            {
                this.morediv.filters[0].src='wimg/minus.png'
            }
            this.model.plusMenuSize();
        }
        else
        {
            Element.remove(this.div.more);
            this.div.style.background="#FFF"
            this.div.more=false;
            if (!Prototype.Browser.IE)
            {
                this.morediv.style.background="url('wimg/plus.png') no-repeat";
            }
            else
            {
                this.morediv.filters[0].src='wimg/plus.png'
            }
            this.model.minusMenuSize();
        }
    }
    this.toString = function()
    {
        return "Wiking Object Div Manager";
    }
    /*
     * inicjalizacja
     */
    this.init = function()
    {
        //delete $('obiektyContainer').style.height;
        this.create();
        this.bindEvents(); 
        
        this.plusMenuSize(); // dostosowanie rozmiaru
    }
}

Wiking.tools.createObjectsView = function()
{ // TRZEBA KONIECZNIE POSRZĄTAĆ TEN BAŁAGAN -> TODO
    if (Wiking.widgets.MainMenu.isHistory())
    { // ah ten bałagan... ;-)
        Wiking.DataLoader.update(); //ładujemy dane na dzień dzisiejszy :-)
    }
    Wiking.tools.ObjDivManager.init();

    //inicjujemy kontrolery checkboxów przy obiektach z template
    Wiking.tools.allController.init();
}

/*
 * kontroler selecta w menu dla historii
 */
Wiking.tools.historySelect = new function()
{
    this.init = function()
    {
        // ustawiamy odopowiednie values dla opcji        
        var opt = $('historySelect').options;
        var c = Wiking.DataLoader.getPeriod();
        opt[0].value=String(c[0])+"x"+String(c[1])+"xtoday" //dziś
        opt[1].value=String(c[0]-86400)+"x"+String(c[0])+"xyesterday" //wczoraj
        var day = new Date().getDay()-1;
        if (day==-1)
        {
            day = 7;
        }
        opt[2].value=String(c[0]-(86400*day))+"x"+String(c[1]); // ten tydzień
        opt[3].value=String(c[0]-(86400*7))+"x"+String(c[1]);
        // pobieramy i dodajemy opcje zapisane w cookies
           /* TODO na przyszłość */
        // bindujemy się na event zmiany
        $('historySelect').observe('change',this.handle.bind(this));
        // ustawiamy odpowiedni text
        var v = $('historySelect').value.split('x');
        $('dateFrom').innerHTML="Od: "+this.parseDate(v[0]);

        $('dateTo').innerHTML='<a href="#" onclick="Wiking.tools.historySelect.actualize();">Aktualizuj</a> '+
                              "Do: "+this.parseDate(v[1]);
        
        delete this.init;
    }
    this.actualize = function()
    {
        var d = new Date();
        var dto = Math.round(d.getTime()/1000);
        d.setHours(0);
        d.setMinutes(0);
        d.setSeconds(0);
        var dfrom = Math.round(d.getTime()/1000);
        Wiking.DataLoader.setPeriod(dfrom,dto,"today");
        
        $('dateFrom').innerHTML="Od: "+this.parseDate(dfrom);
        $('dateTo').innerHTML='<a href="#" onclick="Wiking.tools.historySelect.actualize();">Aktualizuj</a> '+
                              "Do: "+this.parseDate(dto);
        Wiking.DataLoader.update();
    }
    this.handle = function()
    {
        var v = $('historySelect').value.split('x');
		var refresh = "";
        if (v.length == 2) //jeśli to nie custom date
        {
            $('dateFrom').innerHTML="Od: "+this.parseDate(v[0]);
            $('dateTo').innerHTML="Do: "+this.parseDate(v[1]);

            Wiking.DataLoader.setPeriod(v[0],v[1]);
            Wiking.DataLoader.update();
        }
        else if (v.length == 3)
        {
            if ($('historySelect').value.endsWith("xtoday"))
            {
                refresh = '<a href="#" onclick="Wiking.tools.historySelect.actualize();">Aktualizuj</a> ';    
            }   
            $('dateFrom').innerHTML="Od: "+this.parseDate(v[0]);
            $('dateTo').innerHTML=refresh+"Do: "+this.parseDate(v[1]);
            
            Wiking.DataLoader.setPeriod(v[0],v[1],v[2]);
            Wiking.DataLoader.update();        
        }
        else
        { // custom date handler, tj dodawanie customowej daty
            new Wiking.widgets.DatePicker()
        }
    }
    /*
     * funkcja która robi z jedno cyfrowych dwucyfrowe :-)
     */
    this.intExtend = function(s)
    {
        s = String(s);
        if (s.length==1)
        {
            s = "0"+s;
        }
        return s
    }
    /*
     * millisekundy do formatu  "01-01-2000, 11:11"
     */
    this.parseDate = function(ms)
    {
        var d = new Date(ms*1000); // i mamy date w naszym czasie ;-
        datestring = this.intExtend(d.getDate())+"-"+this.intExtend(d.getMonth()+1)+"-"+d.getFullYear()+", "+this.intExtend(d.getHours())+":"+this.intExtend(d.getMinutes());
        return datestring;
    }
}
/*
 * kontroler przycisków 'widoczne wszystkie', 'sledź wszystkie', oraz pojedynczych takich diabłów ;-)
 */
Wiking.tools.allController = new function() // WICKED! ;-)
{
    var binded = false;
    this.init = function()
    {
        if (!binded)
        {
            $('showall').observe('click',handleClickShowAll.bind(this));
            $('followall').observe('click',handleClickFollowAll.bind(this));
            binded=true;
        }
        this.showall = true;
        this.followall = false;
        $('followall').src="wimg/sledz_wszystkie_passive.png";   
        var s = $$('.showhide');
        var f = $$('.follow');
        var obj = Wiking.getObjects();
        for (var i=0,l=s.length;i<l;i++)
        {
            s[i].observe('click',checkboxShowHideClick.bind({'object':obj[i],'checkbox':s[i],'follow':f[i],'controller':this}))
            f[i].observe('click',checkboxFollowClick.bind({'object':obj[i],'checkbox':f[i],'show':s[i],'controller':this}));
        }
    }
    var checkboxFollowClick = function()
    {
        if (this['checkbox'].checked)
        {
            if (this['object'].getFlag('data'))
            {
                this['object'].setFlags({'follow':1,'visible':1});
                this['show'].checked=true;
            }
            else
            {
                this['checkbox'].checked=false;
            }
        }
        else
        {
            this['object'].setFlags({'follow':0});
        }
        this['controller'].allFollowCheck();
        this['controller'].allCheck();
    }
    var checkboxShowHideClick = function()
    {
        if (this['checkbox'].checked)
        {
            if (!this['object'].show())
            {
                this['checkbox'].checked=false;
                this['follow'].checked=false;
            }
        }
        else
        {
            this['object'].hide();
            this['follow'].checked=false;
        }
        this['controller'].allCheck();
        this['controller'].allFollowCheck();
    }
    this.allCheck = function()
    {
        var s = Wiking.getObjects();
        for (var i=0,l=s.length,j=0;i<l;i++)
        {
            if(s[i].getFlag('visible') || !s[i].getFlag('data'))
            {
                j++;
            }
        }
        if(j==l)
        {
            this.showall=true;
            $('showall').src="wimg/widoczne_wszystkie_active.png";
        }
        else
        {
            this.showall=false;
            $('showall').src="wimg/widoczne_wszystkie_passive.png";        
        }
    }   
    this.allFollowCheck = function()
    {
        var s = Wiking.getObjects();
        for (var i=0,l=s.length,j=0;i<l;i++)
        {
            if(s[i].getFlag('follow') || !s[i].getFlag('data'))
            {
                j++;
            }
        }
        if(j==l)
        {
            this.followall=true;
            $('followall').src="wimg/sledz_wszystkie_active.png";
        }
        else
        {
            this.followall=false;
            $('followall').src="wimg/sledz_wszystkie_passive.png";        
        }
    }   
    var handleClickShowAll = function()
    {
        if (this.showall)
        {
            this.showall=false;
            $('showall').src="wimg/widoczne_wszystkie_passive.png";
            this.followall=false;
            $('followall').src="wimg/sledz_wszystkie_passive.png";
        }
        else
        {
            this.showall=true;
            $('showall').src="wimg/widoczne_wszystkie_active.png"; 
        }
        var obj=Wiking.getObjects();
        for (var i=0,l=obj.length;i<l;i++)
        {
            if (this.showall && obj[i].show())
            {
                if (!$('obj'+obj[i].getImei()).childNodes[0].childNodes[0].checked)
                {
                    $('obj'+obj[i].getImei()).childNodes[0].childNodes[0].checked=true; //TODO: to jest erroro genne
                }
            }
            else
            {
                obj[i].hide();
                $('obj'+obj[i].getImei()).childNodes[0].childNodes[0].checked=false; // jw
                $('obj'+obj[i].getImei()).childNodes[0].childNodes[3].checked=false;
            }
        }      
    }
    var handleClickFollowAll = function()
    {
        if (this.followall)
        {
            this.followall=false;
            $('followall').src="wimg/sledz_wszystkie_passive.png";
        }
        else
        {
            this.followall=true;
            $('followall').src="wimg/sledz_wszystkie_active.png"
        }
        var obj=Wiking.getObjects();
        var test = false;
        for (var i=0,l=obj.length;i<l;i++)
        {
            obj[i].setFlags({'follow':this.followall});
            if (obj[i].getFlag('follow'))
            {
                $('obj'+obj[i].getImei()).childNodes[0].childNodes[3].checked=true; //TODO: to jest erroro genne
                test = true;
            }
            else
            {
                $('obj'+obj[i].getImei()).childNodes[0].childNodes[3].checked=false;
            }
        }
        if (!test)
        {
            this.followall=false;
            $('followall').src="wimg/sledz_wszystkie_passive.png";        
        }
    }
}

/*
 * runnery :D
 */
Wiking.tools.runHistory=function()
{
    Wiking.tools.LiveLog.stop();
    Wiking.PositionUpdater.stop();
	Wiking.Event.bindAsEventListener(this,'dataload',this.resetLabelPositions);
 
    /* g */ //TODO: Wiking.getMap().clearByClass(WObj.Info,WObj.MarkerInfo);
    
    var oldp = Wiking.DataLoader.getPeriod();
    if (oldp[0] == 0 && oldp[1] == 0)
    {
        var d = new Date();
        var dto = Math.round(d.getTime()/1000);
        d.setHours(0);
        d.setMinutes(0);
        d.setSeconds(0);
        var dfrom = Math.round(d.getTime()/1000);
        Wiking.DataLoader.setPeriod(dfrom,dto,"today");
    }
    Wiking.setObjectType(HistoriaObiekt); // ustwiam typ obiektu
    Wiking.createObjects(); // tworzymy obiekty
    document.title="Geo2 - Historia"
}

Wiking.tools.runLive=function()
{
    Wiking.tools.LiveLog.start();
	Wiking.Event.bindAsEventListener(this,'newpos',this.resetLabelPositions);
    /* g */ //TODO: Wiking.getMap().clearByClass(WObj.Info,WObj.MarkerInfo);
    
    Wiking.setObjectType(LiveObject); // ustwiam typ obiektu
    Wiking.createObjects(); // tworzymy obiekty
    Wiking.PositionUpdater.start()
    document.title="Geo2 - Na żywo"
}

Wiking.tools.logout=function()
{
    document.cookie="ta=log#$#out"; //TODO UNSET, EXPIRES
    document.location.href="/"
}

Wiking.tools.resetLabelPositions=function()
{
	var obj = Wiking.getObjects();
	var positions = new Array();
	var pos;
	for (var i=0, l=obj.length; i<l; i++) {
		if (pos=obj[i].getPosition()) {
			obj[i].Label.setPosition(Wiking.getMap().fromLatLngToDivPixel(pos));
			positions.push(obj[i].recalculateLabelPos(positions));
		}
	}
}

Wiking.tools.breaks=function(data,starttime,endtime,len)
{
    var
      t, t2,
	  breaks = [],
      tmp = data[3][0],
      tmpbreaks = [[0,1]];
    
    //last stop
    //TODO limit endtime to realtime
	data[3][0] = starttime;
    data[3][data[3].length-1] = endtime;
    // end last stop
    for (var i = 1, l = data[0].length; i<l; i++){
        t = data[3][i];
        if (t-tmp > len){
            tmpbreaks.push([i-1,i]);
        }
        tmp = t;
    }
    //scalanie
    t = tmpbreaks.shift();
    t2 = tmpbreaks.shift();
    while(true){
        if (t==undefined) break;
		if (t2==undefined){
            breaks.push(t);
            break;
        }
        if (t2[0] - t[1] < 4){
            var last = new GLatLng(data[1][t[1]],data[0][t[1]]);
            var first = new GLatLng(data[1][t2[0]],data[0][t2[0]]);
            if (last.distanceFrom(first) < 500){
                //console.debug('scalenie');
                t = [t[0],t2[1]];
                t2 = tmpbreaks.shift();
			} else {
	            breaks.push(t);
				t = t2;
				t2 = tmpbreaks.shift();
			}
        }else{
            breaks.push(t);
            t = t2;
            t2 = tmpbreaks.shift();
        }
    }

	return breaks;
}


if(!(new Date().toLocaleFormat)) {
	Date.prototype.toLocaleFormat = function(format) {
		function extend(str){
			return (String(str).length == 1) ? "0"+String(str) : String(str);
		}
		return format
			.replace('%Y', this.getFullYear())
			.replace('%m', extend(this.getMonth()+1))
			.replace('%d', extend(this.getDate()))
			.replace('%H', extend(this.getHours()))
			.replace('%M', extend(this.getMinutes()))
			.replace('%S', extend(this.getSeconds()));
	}
}

/**
 * @description Zamiana formatu koloru
 * @param rgb Kolor w formacie rgb(r,g,b)
 * @return Kolor w formacie #rrggbb
 * @static
 * @example Wiking.tools.colorToHex('rgb(255,0,0)')
 */
Wiking.tools.colorToHex = function(rgb)
{
	rgb = rgb.substring(4,rgb.length-1).split(',');
	var hexColor = '#';
	var chara = "0123456789ABCDEF";
	for (var i=0;i<rgb.length;i++){
		hexColor += chara.charAt(Math.floor(rgb[i] / 16)) + chara.charAt(rgb[i] - (Math.floor(rgb[i] / 16) * 16));
	}
	return hexColor;
}

/**
 * @description Przeszukuje tablicę points w poszukiwaniu punktu najbliższego dla punktu point
 * @param point GLatLng
 * @param points array[GLatLng]
 * @return identyfikator z tablicy points najbliższego znalezionego punktu
 * @static
 */
Wiking.tools.getNearestPointIndex = function(point, points)
{
	var i, dist = points[0].distanceFrom(point), tmpDist, idx = 0;
	for(i=1; i<points.length; i++) {//TODO potrzebujemy lepszy algorytm ;-)
		tmpDist = points[i].distanceFrom(point);
		if (dist > tmpDist) {
			dist = tmpDist;
			idx = i;
		}
	}
	return idx;
}

Wiking.tools.LiveLog = new function()
{
    var binded = false; 
    var one;
    var two;
    var positions = {};
    
    this.start = function()
    {
        if (!binded)
        {
            var nodes = document.getElementById('liveLog').childNodes;
            one = nodes[0];
            two = nodes[2];
            binded = true;
        }
        positions = {};
        // czyścimy log:
        one.innerHTML="";
        two.innerHTML="";
        // trzeba by się podbindować do eventów;
        Wiking.Event.bindAsEventListener(this,'GotPositions',gotPositions);    
    }
    this.stop = function()
    {
        Wiking.Event.unBindEventListener(this,'newpos',newPosition);
        Wiking.Event.unBindEventListener(this,'GotPositions',gotPositions);    
    }
    this.centerTo = function(imei)
    {
        Wiking.getMap().setCenter(Wiking.getObjectByImei(imei).getPosition(),Wiking.getMap().getZoom());
    }
    var newPosition = function()
    {
        var
          obj = Wiking.getObjects(),
          len = obj.length,
          
          tmpImei,
          tmpData,
          tmpLastDate,
          date,
          kat,
          tLen,
          tmp;
          
        while(len--)
        {
            tmpImei = obj[len].getImei();
            tmpData = obj[len].getData();
            tLen = tmpData[0].length
            if (tLen==0)
            {
                continue
            }
            if ((tmpLastDate=tmpData[3].last()) != positions[tmpImei]) // moze wystąpic error! TODO
            {
                tmp = '';
                if (tLen>1)
                { // 0 stopni SOUTH, 180 stopni NORTH, 90 - WEST, 270 - EAST
                    kat = Math.atan2(tmpData[0][tLen-2]-tmpData[0][tLen-1],tmpData[1][tLen-2]-tmpData[1][tLen-1]) * 180 / Math.PI;
                    // TODO: przepiać poniższe na ładnego arraya z sortem i indexOf
                    if (kat < 20)
                    {
                        tmp = 'S';
                    }
                    else if (kat < 70)
                    {
                        tmp = 'SW';
                    }
                    else if (kat < 110)
                    {
                        tmp = 'W';
                    }
                    else if (kat < 160)
                    {
                        tmp = 'NW';
                    }
                    else if (kat < 200)
                    {
                        tmp = 'N';
                    }
                    else if (kat < 250)
                    {
                        tmp = 'NE';
                    }
                    else if (kat < 290)
                    {
                        tmp = 'E';
                    }
                    else if (kat < 340)
                    {
                        tmp = 'SE';
                    }
                    else
                    {
                        tmp = 'S';
                    }
                }                
                
                var spd = parseInt(tmpData[2].last());

                positions[tmpImei] = tmpLastDate;
                date = new Date(tmpLastDate*1000);
                pushToLog(date.toLocaleFormat('%H:%M:%S')+' '+tmp+' <a href="#" onClick="Wiking.tools.LiveLog.centerTo('+tmpImei+');">'+obj[len].getName()+'</a> '+spd+' km/h');
                //to nie powinno być tu ale tu jest, mowa o highlighotowaniu divów:
                document.getElementById('obj'+tmpImei).highlight();
				updateTS(tmpImei, tmpLastDate);
            }
        }
    }
    var gotPositions = function()
    {
		console.debug('live log gotpositions');
        var date = new Date();
		pushToLog(date.toLocaleFormat("%H:%M")+' Pobrano pozycje obiektów');
        //dopiero tutaj bindujemy się na newpos;
        Wiking.Event.bindAsEventListener(this,'newpos',newPosition);
        //budujemy liste ostatnich pozycji
        var obj = Wiking.getObjects();
        var len = obj.length;
        var tmpImei;
        var tmpData;
        while(len--)
        {
            tmpData = obj[len].getData();
            if (tmpData[0].length==0)
            {
                continue
            }
            tmpImei = obj[len].getImei();
            positions[tmpImei] = tmpData[3].last();
			updateTS(tmpImei, positions[tmpImei]);
        }
    }
	/**
	 * Aktualizacja czasu ostatniej aktualizacji na liście urządzeń
	 * @param string imei
	 * @param integer ts
	 */
	var updateTS = function(imei, ts)
	{
		var date = new Date(ts*1000), now = Date.now()/1000;
		document.getElementById('lastdata'+imei).innerHTML=date.toLocaleFormat("%d-%m-%Y %H:%M");
		document.getElementById('lastdata'+imei).className=Math.abs(now-ts) > 60*60*24 ? 'bad' : '';
		if (!Prototype.Browser.IE){
			document.getElementById('markersign'+imei).style.opacity=Math.abs(now-ts) > 60*60*24 ? 0.4 : 1;
			document.getElementById('objectmarker'+imei).style.opacity=Math.abs(now-ts) > 60*60*24 ? 0.8 : 1;
		}else{
			document.getElementById('markersign'+imei).style.filter=Math.abs(now-ts) > 60*60*24 ? 40 : 100;
			document.getElementById('objectmarker'+imei).style.filter=Math.abs(now-ts) > 60*60*24 ? 80 : 100;
		}
		document.getElementById('markerlabel'+imei).childNodes[0].setAttribute('fill-opacity', Math.abs(now-ts) > 60*60*24 ? 0.7 : 1);
	}
    var pushToLog = function(text)
    {
        if (one.innerHTML!="" && two.innerHTML=="")
        {
            two.innerHTML=text;
        }
        else if (one.innerHTML!="")
        {
            one.innerHTML=two.innerHTML;
            two.innerHTML=text;
        }
        else
        {
            one.innerHTML=text;
        }
    }
}


// EXPERIMENTAL:

var routelen = function(imei)
{
    var arr = Wiking.getObjectByImei(imei).getData();
    var s = new TLngLat(arr[0][0],arr[1][0]);
    var d = 0;
    for (var i=0, l=arr[0].length;i<l;i++)
    {
        c = new TLngLat(arr[0][i],arr[1][i]);
        d+= TLngLat.getDistance(s,c);
        s = c;
    }
    return d;
}

