Wiking.reports = {};

Wiking.reports.showWidget = function(){
    new Wiking.reports.Container()
};

Wiking.reports.Container = (function(){
    function Reports(){
        Wiking.widgets.BlackScreen.draw();
        Wiking.getMap().addControl(this);
		this.groupImeis = [];
    }
    Reports.prototype = new GControl();
    Reports.prototype.selectable = function(){return true;}
    Reports.prototype.printable = function(){return true;}
    Reports.prototype.initialize = function(map){ 
        var
          mapsize = map.getSize(),
          width = mapsize.width - 100,
          height = mapsize.height - 90,  
          select_devices = [],
		  select_groups = [],
          obj = Wiking.getObjects(),
          periods = Wiking.DataLoader.getPeriod(),
          from = new Date(periods[0]*1000).toLocaleFormat('%d-%m-%Y 00:00'),
          to = new Date(periods[1]*1000).toLocaleFormat('%d-%m-%Y 23:59');
        for (var i=0, l = obj.length; i<l; i++){
            var
              o = obj[i],
              imei = o.getImei(),
              oname = o.getName()==imei ? imei : o.getName()+" ("+imei+")",
			  gname = o.getGroup(),
			  tmp = '<option value="group_'+gname+'">'+gname+"</option>";
            select_devices.push('<option value="'+imei+'">'+oname+"</option>");
			if(gname!='' && select_groups.join('').search(tmp) == -1) {
				select_groups.push(tmp);
			}
        }
        var html = '<div id="closeHelp" 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:39px;background:url(\'wimg/eclefttop.png\')"></div>'+
                   '<div style="float:left;background:url(\'wimg/ectop.png\');height:39px;width:'+(width-16)+'px">'+
                      '<p style="font-size:14px;font-weight:bold;margin-top:12px;margin-left:5px;">Raporty</p>'+
                   '</div>'+
                 '<div style="float:left;width:8px;height:39px;background:url(\'wimg/ecrighttop.png\')"></div>'+
             
                 '<div style="clear:left;float:left;width:8px;background:url(\'wimg/cleft.png\');height:'+(height-47)+'px"></div>'+
                 '<div style="overflow:auto;float:left;background:#fff;height:'+(height-47)+'px;width:'+(width-16)+'px">'+
                    '<div style="padding:0 10px;">'+
                        '<p>Obiekt: <select id="reportsObject">'+
						//'<optgroup style="display:none;" label="-- Grupy --">'+select_groups.join("")+'</optgroup>'+
						'<optgroup label="-- Obiekty --">'+select_devices.join("")+'</optgroup></select></p>'+
                        '<p>od <input type="text" id="reportFrom" style="width:120px;" value="'+from+'"> <img style="vertical-align:-10px;" src="/wimg/calendar.png" style="cursor:pointer;" id="reportsCalFrom"></p>'+
                        '<p>do <input type="text" id="reportTo" style="width:120px;" value="'+to+'"> <img style="vertical-align:-10px;" src="/wimg/calendar.png" style="cursor:pointer;" id="reportsCalTo"></p>'+      
                        '<p><button id="reportsGenerate">Generuj raport</button></p>'+
                    '</div>'+
                    '<div id="report_container" style="padding:0 10px;">'+
                    '</div>'+
                 '</div>'+
                 '<div style="float:left;width:8px;background:url(\'wimg/cright.png\');height:'+(height-47)+'px"></div>'+
               
                 '<div style="float:left;clear: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>';
              
        var div = document.createElement('div');
        div.innerHTML=html;
        div.style.zIndex="300";
        map.getContainer().appendChild(div);
        
        
        GEvent.bindDom(document.getElementById('closeHelp'),'click',this,this.clear_);
        GEvent.bindDom(document.getElementById('reportsGenerate'),'click',this,this.generate_);
        
        //calendar
        GEvent.bindDom(document.getElementById('reportsCalFrom'),'click',this,this.openFromCal);
        GEvent.bindDom(document.getElementById('reportsCalTo'),'click',this,this.openToCal);
        
        //errors corrector
        var self = this;
        GEvent.addDomListener(document.getElementById('reportFrom'),'blur',function(){
            if (!self.timestampFromText(document.getElementById('reportFrom').value)){
                document.getElementById('reportFrom').value=new Date(Wiking.DataLoader.getPeriod()[0]).toLocaleFormat('%d-%m-%Y %H:%M');
            }
        });
        GEvent.addDomListener(document.getElementById('reportTo'),'blur',function(){
            if (!self.timestampFromText(document.getElementById('reportTo').value)){
                document.getElementById('reportTo').value=new Date(Wiking.DataLoader.getPeriod()[1]).toLocaleFormat('%d-%m-%Y %H:%M');
            }
        });
        
        return div;
    }
    Reports.prototype.openFromCal = function(){
        new Wiking.reports.Calendar(new Date(this.timestampFromText(document.getElementById('reportFrom').value)),'reportFrom');
    }
    Reports.prototype.openToCal = function(){
        new Wiking.reports.Calendar(new Date(this.timestampFromText(document.getElementById('reportTo').value)),'reportTo');
    }
    Reports.prototype.generate_ = function(){ //uwaga podłe hacki, TODO zrobić to po ludzku
        var
          self = this,
          tmp = Wiking.DataLoader.load,
          from = this.timestampFromText(document.getElementById('reportFrom').value),
          to = this.timestampFromText(document.getElementById('reportTo').value),
          periods = [from,to],
          oldperiod = Wiking.DataLoader.getPeriod();
        if (!from){
            //TODO
            return;
        }else if(!to){
            //TODO
            return;
        }
        
        var replacer = function(self,tmp){
              return function(data){self.do_generate_(data,periods);Wiking.DataLoader.load = tmp;Wiking.DataLoader.setPeriod(oldperiod[0],oldperiod[1]);}
          };
        
        //parse from & to
        
        Wiking.DataLoader.load = replacer(self,tmp);
        Wiking.DataLoader.setPeriod(Math.round(from/1000),Math.round(to/1000));
        Wiking.DataLoader.update();
        Wiking.widgets.BlackScreen.setZ(300);
    }
    Reports.prototype.timestampFromText = function(txt){try{
        var
          d = txt.split(' '),
          date = d[0].split('-'),
          hour = d[1].split(':'),
          ob = new Date(); 
        ob.setHours(hour[0]);
        ob.setMinutes(hour[1]);
        ob.setFullYear(date[2]);
        ob.setMonth(date[1]-1);
        ob.setDate(date[0]);
        if (String(ob) == "Invalid Date") return false;
        return ob.getTime();
      }catch(e){return false}    
    }
    Reports.prototype.do_generate_ = function(indata,periods){
        Wiking.widgets.BlackScreen.setZ(100);
        Wiking.Event.trigger({'e':'force_clear_only_waiter'});   
        var
		  imei = document.getElementById('reportsObject').value,
          container = document.getElementById('report_container'),
		  isGroup = imei.search('group_') == 0,
		  obj = [],
		  data = [];
		if(isGroup) {
			var gname = imei.substring(6);
			var objs = Wiking.getObjects();
			for(var i=0; i<objs.length; i++) {
				if(objs[i].getGroup() == gname) {
					obj.push(objs[i]);
					data.push(indata[objs[i].getImei()]);
				}
			}
		} else {
			obj.push(Wiking.getObjectByImei(imei)),
			data.push(indata[imei]);
		}
        
        container.innerHTML="";

		var ok = false;
        var endtime = periods[1] > new Date().getTime() ? new Date().getTime() : periods[1];

		for(i=0; i<data.length; i++) {
			if(data[i] != undefined) ok = true;
		}
        if (!ok){
            container.innerHTML="<p>Brak danych do raportu.</p>";
            return;
        }

		if(isGroup) {
			container.innerHTML='<p style="font-size:20px;">Raport dla grupy '+gname+' <span style="font-size:18px;">(od '+$('reportFrom').value+' do '+$('reportTo').value+')</span></p>';
			container.appendChild( Wiking.reports.generators.mbreaks(obj, data, Math.round(periods[0]/1000), Math.round(endtime/1000)) ); //bo timestamp timestampowi nie równy
		} else {
			container.innerHTML='<p style="font-size:20px;">Raport dla obiektu '+obj[0].getName()+' <span style="font-size:18px;">(od '+$('reportFrom').value+' do '+$('reportTo').value+')</span></p>';
	        container.appendChild( Wiking.reports.generators.breaks(obj[0], data[0], Math.round(periods[0]/1000), Math.round(endtime/1000)) ); //bo timestamp timestampowi nie równy
		}
        
        container.appendChild( Wiking.reports.generators.hoursDistanceChart(data) );
    }
    Reports.prototype.clear_ = function(){
        Wiking.widgets.BlackScreen.clear();
        Wiking.getMap().removeControl(this);
    }
    Reports.prototype.getDefaultPosition = function(){
        return new GControlPosition(G_ANCHOR_TOP_LEFT,new GSize(30,60));
    };
    return Reports;
})();

Wiking.reports.generators = {};
Wiking.reports.generators.geof = function(li,lats){//geocoder clousure
	return function(){
		Geocoder.getLocations(lats,function(response){
			if (!response || response.Status.code != 200){
				li.innerHTML='Nieznany adres';
			} else {
			   var place = response.Placemark[0];
			   li.innerHTML=place.address;
			}
		});
	}
};
Wiking.reports.generators.table = function(title, headers, rows){ //TODO add first & last!
	var
		div = document.createElement('div'),
		table = document.createElement('table'),
		p = document.createElement('p'),
		i, j;

	p.innerHTML=title;
	p.style.cssText="font-weight:bold;"
	div.appendChild(p);

	// nagłówki
	var h = '<tr style="height:35px;"><td style="width:10px;background:url(\'wimg/ltable.png\');"></td>';
	for(i=0; i<headers.length; i++) {
	    var align = i == 3 ? 'padding-left:12px;text-align:left' : '';
		h += '<td style="'+align+';background:url(\'wimg/'+(i%2?'dark':'white')+'tablebg.png\')">'+headers[i]+'</td>';
		if(i < headers.length-1) h += '<td style="width:1px;background:url(\'wimg/jointable.png\')"></td>';
	}
	h += '<td style="width:10px;background:url(\'wimg/rtable.png\')"></td></tr>';
	table.innerHTML = h;

	table.style.cssText="width:100%;text-align:center;margin-bottom:15px;";
	table.cellPadding="0";
	table.cellSpacing="0";
    div.appendChild(table);

	for(i=0; i<rows.length; i++) {
		var tr = document.createElement('tr');
		for(j=0; j<rows[i].length; j++) {
			var td = rows[i][j];
			td.colSpan = 2;
			td.style.padding = "4px 4px 4px 8px";
			td.style.textAlign = 'center';
			tr.appendChild(td);
        }
        rows[i][3].style.textAlign="left";
        rows[i][3].style.paddingLeft="12px";
        rows[i][2].style.textAlign="right";
		table.appendChild(tr);
	}

	return div;
}
Wiking.reports.generators.breaks = function(obj,data,starttime,endtime,len){ //TODO add first & last!
    if (len==undefined) len = 600; //seconds
	var breaks = Wiking.tools.breaks(data, starttime, endtime, len);
    //view
    var
	  headers = ['Typ','Godzina','Czas trwania','Adres postoju / długość trasy'],
	  rows = [];
    
    //podsumowanie
    var
      total_km = 0,
      total_moving_time = 0,
      total_stop_time = 0;
    
    var al = data[2].length, avg_speed =0;   
    while(al--){
        avg_speed += data[2][al];
    }
    avg_speed = Math.round(avg_speed / data[2].length * 100)/100;
    
    function przejazd(from,to){
        var
          td0 = document.createElement('td'),
          td1 = document.createElement('td'),
          td2 = document.createElement('td'),
          td3 = document.createElement('td');
        td0.colSpan = td1.colSpan = td2.colSpan = 2
        td3.colSpan = 3;
        td0.style.padding = '4px 4px 4px 14px';
		td1.style.padding = td2.style.padding = td3.style.padding = "4px 4px 4px 8px";
		td1.style.textAlign = td2.style.textAlign = td3.style.textAlign = 'left';
		td0.style.background = td1.style.background = td2.style.background = td3.style.background = '#ddd';
		//td1.style.color = td2.style.color = td3.style.color = obj.getColor();
		
		var arr = [data[0].slice(from,to),
		           data[1].slice(from,to),
		           data[2].slice(from,to),
		           data[3].slice(from,to)];
		
		var sl = new TLngLat(arr[0][0],arr[1][0]);
        var d = 0;
        for (var i=0, l=arr[0].length;i<l;i++)
        {
            var c = new TLngLat(arr[0][i],arr[1][i]);
            d+= TLngLat.getDistance(sl,c);
            sl = c;
        }
        
        var
        s = data[3][to] - data[3][from],
        d1 = new Date(data[3][from]*1000),
        d2 = new Date(data[3][to]*1000);
        
		td1.innerHTML = d1.toLocaleFormat('od %d/%m <strong>%H:%M</strong>')+d2.toLocaleFormat(' do %d/%m <strong>%H:%M</strong>');
        
        if (s/60 < 60){
            td2.innerHTML = Math.round(s/60)+" min";
        }else {
            td2.innerHTML =  Math.floor(s/60/60)+" godz "+ Math.round((s-(Math.floor(s/60/60)*60*60))/60)+" min";
        }
        
        //global
        total_moving_time += s;
        total_km += d; 
        //end
        
        td0.innerHTML="T";
        td3.innerHTML=(Math.round(d*100)/100)+" km";
		td3.style.fontWeight="bold";
		
		return [td0,td1,td2,td3];
    }
    
    var tout = 0;
    for (var j = 0, k = breaks.length; j<k; j++){
        var
          b = breaks[j],
          s = data[3][b[1]] - data[3][b[0]],
          d1 = new Date(data[3][b[0]]*1000),
          d2 = new Date(data[3][b[1]]*1000),
          td0 = document.createElement('td'),
          td1 = document.createElement('td'),
          td2 = document.createElement('td'),
          td3 = document.createElement('td');
        
        td0.innerHTML="P";
        
        td0.colSpan = td1.colSpan = td2.colSpan = 2
        td3.colSpan = 3;
        td0.style.padding = '4px 4px 4px 14px';
		td1.style.padding = td2.style.padding = td3.style.padding = "4px 4px 4px 8px";
		td1.style.textAlign = td2.style.textAlign = td3.style.textAlign = 'left';
		//td1.style.color = td2.style.color = td3.style.color = obj.getColor();
        //if (d1.getDate() == d2.getDate() && d1.getMonth() == d2.getMonth()){
			td1.innerHTML = d1.toLocaleFormat('od %d/%m <strong>%H:%M</strong>')+d2.toLocaleFormat(' do %d/%m <strong>%H:%M</strong>');
       // }else{
		//	td1.innerHTML = d1.toLocaleFormat("od %d-%m-%Y %H:%M")+d2.toLocaleFormat(" do %d-%m-%Y %H:%M");
        //}
        if (s/60 < 60){
            td2.innerHTML = Math.round(s/60)+" min";
        }else {
            td2.innerHTML =  Math.floor(s/60/60)+" godz "+ Math.round((s-(Math.floor(s/60/60)*60*60))/60)+" min";
        }
        total_stop_time += s;
        
        window.setTimeout(new Wiking.reports.generators.geof(td3,new GLatLng(data[1][b[0]],data[0][b[0]])),tout);
		rows.push([td0,td1, td2, td3]);
		try{rows.push( przejazd(b[1],breaks[j+1][0]) );}catch(e){}
        tout += 500;
    }
	//DOM
    var div = document.createElement('div'), pd = document.createElement('div');
    pd.innerHTML='<p><strong>Podsumowanie:</strong></p>'+
                 '<p style="margin-bottom:25px;">W ruchu łącznie: '+Math.floor(total_moving_time/60/60)+" godz "+ Math.round((total_moving_time-(Math.floor(total_moving_time/60/60)*60*60))/60)+" min"+'<br />'+
                 "Postoje łącznie: "+Math.floor(total_stop_time/60/60)+" godz "+ Math.round((total_stop_time-(Math.floor(total_stop_time/60/60)*60*60))/60)+" min<br />"+
                 "Przejechane: "+(Math.round(total_km*100)/100)+" km<br />"+
                 "Średnia prędkość: "+avg_speed+" km/h</p>";
    div.appendChild(Wiking.reports.generators.table('Tabela postojów i tras:<br>', headers, rows));
    div.appendChild(pd);
    return div;
};


Wiking.reports.generators.mbreaks = function(objs,data,starttime,endtime,len){ //TODO add first & last!
    if (len==undefined) len = 600; //seconds
	var breaks = [],i,j,k,l;

	// Pobieramy postoje
	for(i=0; i<data.length; i++) {
		if(data[i]==undefined) continue;
		l = Wiking.tools.breaks(data[i], starttime, endtime, len);
		for(j=0; j<l.length; j++) {
			breaks.push([l[j][0], l[j][1], i]);
		}
	}

	// Sortowanie po czasie
	breaks.sort(function(a,b) {
		return data[a[2]][3][a[0]] - data[b[2]][3][b[0]];
	});

    //view
    var
	  headers = ['Obiekt', 'Godzina','Długość','Adres'],
	  rows = [];

    var tout = 0;
    for (j = 0, k = breaks.length; j<k; j++){
        var
          b = breaks[j],
          s = data[b[2]][3][b[1]] - data[b[2]][3][b[0]],
          d1 = new Date(data[b[2]][3][b[0]]*1000),
          d2 = new Date(data[b[2]][3][b[1]]*1000),
          td1 = document.createElement('td'),
          td2 = document.createElement('td'),
          td3 = document.createElement('td'),
          td4 = document.createElement('td');

        td1.colSpan = td2.colSpan = td3.colSpan = 2
        td4.colSpan = 3;
        td1.style.padding = '4px 4px 4px 14px';
		td2.style.padding = td3.style.padding = td4.style.padding = "4px 4px 4px 8px";
		td1.style.textAlign = td2.style.textAlign = td3.style.textAlign = td4.style.textAlign = 'left';
		td1.style.color = td2.style.color = td3.style.color = td4.style.color = objs[b[2]].getColor();
		td1.innerHTML = objs[b[2]].getName();
        if (d1.getDate() == d2.getDate() && d1.getMonth() == d2.getMonth()){
			td2.innerHTML = d1.toLocaleFormat("od %H:%M")+d2.toLocaleFormat(" do %H:%M");
        }else{
			td2.innerHTML = d1.toLocaleFormat("od %d-%m-%Y %H:%M")+d2.toLocaleFormat(" do %d-%m-%Y %H:%M");
        }
        if (s/60 < 60){
            td3.innerHTML = Math.round(s/60)+" minut";
        }else {
            td3.innerHTML =  Math.floor(s/60/60)+" godzin "+ Math.round((s-(Math.floor(s/60/60)*60*60))/60)+" minut";
        }
        window.setTimeout(new Wiking.reports.generators.geof(td4,new GLatLng(data[b[2]][1][b[0]],data[b[2]][0][b[0]])),tout);
		rows.push([td1, td2, td3, td4]);
        tout += 500;
    }
    return Wiking.reports.generators.table('Tabela postojów:', headers, rows);
};
Wiking.reports.generators.hoursDistanceChart = function(data){
    var g, d;
    var a = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
	var i, j, l;
	for (j=0; j<data.length; j++){
		if(data[j]==undefined) continue;
		for (i=0, l=data[j][0].length; i<l; i++){
			if(g==undefined) {
				g = new GLatLng(data[j][1][i],data[j][0][i]);
				d = new Date(data[j][3][i]*1000);
				continue;
			}
			var
			  gtmp = new GLatLng(data[j][1][i],data[j][0][i]),
			  dtmp = new Date(data[j][3][i]*1000),
			  dist = g.distanceFrom(gtmp),
			  dh = d.getHours(),
			  dth = dtmp.getHours();
			if (dh == dth){
				a[dh] += dist;
			}else if(dth-dh == 1){
				a[dh] += dist/2;
				a[dth]+=dist/2;
			}else{
				//console.debug('problemmo'); //TODO
			}
			g = gtmp;
			d = dtmp;
		}
	}
    var
      div = document.createElement('div'),
      p = document.createElement('p'),
      table = document.createElement('table');
    table.style.cssText="width:100%;text-align:center;margin-bottom:15px";
    table.cellPadding="0"; 
    table.cellSpacing="0";
    table.innerHTML = '<tr style="height:35px;">'+
                                    '<td style="width:10px;background:url(\'wimg/ltable.png\');"></td>'+
                                    '<td style="background:url(\'wimg/whitetablebg.png\')">Godziny</td>'+
                                    '<td style="width:1px;background:url(\'wimg/jointable.png\')"></td>'+
                                    '<td style="background:url(\'wimg/darktablebg.png\')">Kilometry</td>'+
                                    '<td style="width:1px;background:url(\'wimg/jointable.png\')"></td>'+
                                    '<td style="background:url(\'wimg/whitetablebg.png\');width:510px;">Wykres</td>'+
                                    '<td style="width:10px;background:url(\'wimg/rtable.png\')"></td>'+
                                '</tr>';
    p.innerHTML="Aktywność w danych godzinach:";
    p.style.cssText="font-weight:bold;"
    div.appendChild(p); 
    function extend(s){
        var str = String(s);
        return (str.length === 1 ? "0"+str : str);
    }
    var mv = a.max() //max val
    for(i = 0; i<24;i++){
        var
          tr = document.createElement('tr'),
          td1 = document.createElement('td'),
          td2 = document.createElement('td'),
          td3 = document.createElement('td');
        
        td1.colSpan = td2.colSpan = 2
        td3.colSpan = 3;
        td1.style.padding = td2.style.padding = td3.style.padding = "4px";
        td3.style.textAlign="left";
        
        td1.innerHTML = extend(i)+" - "+extend(i+1)
        td2.innerHTML = (a[i]/1000).toFixed(2)+" km"
        td3.innerHTML = '<div style="display:inline-block;width:'+Math.round(a[i]*500/mv)+'px;background:#ccc;height:10px;vertical-align:middle;"></div>';
        
        tr.appendChild(td1);
        tr.appendChild(td2);
        tr.appendChild(td3);
        table.appendChild(tr);
    }
    div.appendChild(table);
    return div;
};

Wiking.reports.Calendar = (function(){//import z innego miejsca trochę, trzeba to potem zunifikować
    function Calendar(basedate,eid,parent){
        Wiking.widgets.BlackScreen.setZ(301);
        this.eid_ = eid;
        this.date_ = basedate;
        Wiking.getMap().addControl(this);
    }
    Calendar.prototype = new GControl(); 
    Calendar.prototype.selectable = function(){return true;}
    Calendar.prototype.printable = function(){return true;}
    Calendar.prototype.initialize = function(map){
        var height = 298;
        var width = 240;
        var html='<div id="calendarx" 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:39px;background:url(\'wimg/eclefttop.png\')"></div>'+
                 '<div style="float:left;background:url(\'wimg/ectop.png\');height:39px;width:'+(width-16)+'px">'+
                    '<p style="font-size:14px;font-weight:bold;margin-top:12px;margin-left:5px;">Kalendarz</p>'+
                 '</div>'+
                 '<div style="float:left;width:8px;height:39px;background:url(\'wimg/ecrighttop.png\')"></div>'+
                 
                 '<div style="clear:left;float:left;width:8px;background:url(\'wimg/cleft.png\');height:'+(height-47)+'px"></div>'+
                 '<div style="float:left;background:#fff;height:'+(height-47)+'px;width:'+(width-16)+'px">'+
                    //TREŚĆ
                   '<div style="padding:10px;">'+
                      '<div style="text-align:center;color:#666;padding-bottom:6px;border-bottom:1px solid #eee;font-size:10px;font-family:Arial;"><span id="calprevious" style="cursor:pointer;">Poprzedni</span> <span style="font-size:13px;padding:0 4px;font-weight:bold;color:#000;" id="currentMonth"></span> <span style="cursor:pointer;" id="calnext">Następny</span></div>'+
                   '<table id="calendartable" border="0" style="text-align:center;padding-top:29px;margin-top:5px;width:204px; height:204px; background: url(\'/wimg/calendarbg.png\') no-repeat;" cellpadding="0" cellspacing="1">'+
                     '<tr height="28">'+
                        '<td width="28"></td>'+
                        '<td width="28"></td>'+
                        '<td width="28"></td>'+
                        '<td width="28"></td>'+
                        '<td width="28"></td>'+
                        '<td width="28"></td>'+
                        '<td width="28"></td>'+
                     '</tr>'+
                     '<tr height="28">'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                     '</tr>'+
                     '<tr height="28">'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                     '</tr>'+
                     '<tr height="28">'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                     '</tr>'+
                     '<tr height="28">'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                     '</tr>'+
                     '<tr height="28">'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                        '<td></td>'+
                     '</tr>'+                     
                   '</table>'+
                   '</div>'+
                 '</div>'+
                 '<div style="float:left;width:8px;background:url(\'wimg/cright.png\');height:'+(height-47)+'px"></div>'+
               
                 '<div style="float:left;clear: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>';
        var div = document.createElement('div');
        div.innerHTML = html;
        div.style.zIndex="400";
        
        map.getContainer().appendChild(div);
        
        var self = this;
        GEvent.addDomListener(document.getElementById('calendarx'),'click',function(){
            map.removeControl(self);
            Wiking.widgets.BlackScreen.setZ(100);
        });
        
        
        this.setCurrentMonth(this.date_);
        this.fill_(this.date_,true);
        this.bind_();
        
        this.prebind = this.previous_.bind(this);
        this.nexbind = this.next_.bind(this);
        $('calprevious').observe('click',this.prebind);
        $('calnext').observe('click',this.nexbind);
        
        this.div_ = div;
        return div;
    };
    Calendar.prototype.setCurrentMonth = function(date)
    {
        var m = date.getMonth(), month;
        switch (m)
        {
            case 0:month = "Styczeń";break;
            case 1:month = "Luty";break;
            case 2:month = "Marzec";break;
            case 3:month = "Kwiecień";break;
            case 4:month = "Maj";break;
            case 5:month = "Czerwiec";break;
            case 6:month = "Lipiec";break;
            case 7:month = "Sierpień";break;
            case 8:month = "Wrzesień";break;
            case 9:month = "Październik";break;
            case 10:month = "Listopad";break;
            case 11:month = "Grudzień";break;
        }
        month += " " + String(date.getFullYear()).substring(2);
        document.getElementById('currentMonth').innerHTML=month;
    }
    Calendar.prototype.previous_ = function()
    {
        this.date_.setMonth(this.date_.getMonth()-1);
        this.setCurrentMonth(this.date_);
        this.fill_(this.date_,false); // todo -> gubiony highlight
    }
    Calendar.prototype.next_ = function()
    {
        this.date_.setMonth(this.date_.getMonth()+1);
        this.setCurrentMonth(this.date_);
        this.fill_(this.date_,false); // todo -> gubiony highlight 
    }
    Calendar.prototype.bind_ = function()
    {
        var tds = $$("#calendartable td");
        for (var i=0,l=tds.length; i<l; i++)
        {
            GEvent.addDomListener(tds[i],'click',GEvent.callbackArgs(this,this.pickDate,tds[i].innerHTML));
        }
    }
    Calendar.prototype.fill_ = function(indate,fill)
    {
        var date = new Date(indate.getTime());
        this.rest_ = date.toLocaleFormat("-%m-%Y");
        var tds = $$("#calendartable td");
        var day = date.getDate();
        date.setDate(1);
        var start = date.getDay()-1;
        if (start==-1)
        {
            start=6;
        }       
        date.setDate(32);
        
        if (fill)
        {
            tds[start+day-1].style.backgroundColor="#d69036";
        }
        else
        {
            tds[start+day-1].style.backgroundColor="#fff";
        }
        
        
        for (var j=0, k=start; j<k; j++)
        {
            tds[j].innerHTML="";
        }
        for (var i=start, l=32-date.getDate(), a=1; a<=l; i++, a++)
        {
            tds[i].innerHTML=a;
        }
        for (var h=start+32-date.getDate(), m=tds.length; h<m; h++)
        {
            tds[h].innerHTML="";
        }
    }
    
    Calendar.prototype.extend_ = function(i){
        i = String(i);
        return i.length == 1 ? "0"+i : i;
    }
    Calendar.prototype.pickDate = function(td)
    {
        if (td!="")
        {
            var d = document.getElementById(this.eid_).value.split(' ')[1];
            document.getElementById(this.eid_).value=this.extend_(td)+this.rest_+' '+d;
            Wiking.getMap().removeControl(this);
            Wiking.widgets.BlackScreen.setZ(100);
        }
    }
    
    Calendar.prototype.getDefaultPosition = function(){
        var size = Wiking.getMap().getSize();
        return new GControlPosition(G_ANCHOR_TOP_LEFT,new GSize(size.width/2-259,size.height/2-149));
    };    
    return Calendar;
})();
