/*
    All rights reserved by Autonotes.pl Team and so called Kluch Team
*/

// TRANSLATIONS
_ = {'title':gettext('Title:'),
     'description':gettext('Description:'),
     'apply':gettext('Apply changes'),
     'point_del':gettext('Remove point'),
     'point_ins':gettext('Insert point'),
     'point':gettext('Point: '),
     'obj_del':gettext('Remove object')}

// Permissions
// EDIT
var rights={'route_add':true,  // route add
               'rp_add':true,  // route point add
               'rp_del':true,  // route point del
               'rp_edit':true, // route point edit and drag&drop
               'ob_add':true,  // object add
               'ob_edit':true, // object edit and drag&drop
               'ob_del':true};

// READONLY
var rightsr={'route_add':false,
            'rp_add':false,
            'rp_del':false,
            'rp_edit':false,
            'ob_add':false,
            'ob_edit':false,
            'ob_del':false};

function perm(id){
    if (MODE=='READ' || MODE=='EMBED' || MODE=='MAPSAVED')
        return rightsr[id];
    return rights[id];
}

SAVE_DIALOG_OPENED = false;

// Permissions

var baseurl = ''+document.location;
baseurl = baseurl.substring(0, baseurl.indexOf('index.html'));


/* KLUCH BASEMARKER */
function KluchBaseMarker(point, opcje, parent){
    GMarker.call(this, point, opcje);
    this._index = 0;
    this._kluch_data = {};
    this.setUpEventHandlers(parent);
}


KluchBaseMarker.prototype = new GMarker(new GLatLng(0,0));

KluchBaseMarker.prototype.setUpEventHandlers = function(parent){}

KluchBaseMarker.prototype.setIndex = function(idx, nohtml){
    this._index = idx;
    if (!nohtml){
        this.genHtml();
    }
}

KluchBaseMarker.prototype.setKluchData = function(data){
    this._kluch_data = data;
    this.genHtml();
    this.ttSize = this.computeTTSize();
}

KluchBaseMarker.prototype.genHtml = function(){}

KluchBaseMarker.prototype.computeTTSize = function(){
    /* Przeliczenie wysokosci i szerofkosci dla tooltipa
       zaleznie od wyswietlanego w nim tekstu
    */
    var text = this._kluch_data['title'];
    var tmp = document.createElement('span');
    tmp.setAttribute('id','tmp');
	tmp.innerHTML = text;

	var dbody = document.body;
    dbody.appendChild(tmp);
	var width = tmp.offsetWidth;
	var height = tmp.offsetHeight;
	dbody.removeChild(tmp);
    return {'width':width, 'height':height};
}


KluchBaseMarker.prototype.showTooltip = function() {
    var text = this._kluch_data['title'];
    if (text=='') return;
	var gap = 5;
	var point = this.getPoint();
    var toolPos = map.fromLatLngToDivPixel(point);
	var ico = this.getIcon();

    toolPos.y -= Math.floor(ico.iconAnchor.y/2);

	var rightSide = true;
	var bounds = map.getBounds();
	var boundsSpan	= bounds.toSpan();
	var longSpan = boundsSpan.lng();
	var mapWidth = map.getSize().width;
    var permitLeft=true;
    var ttSize = this.ttSize;


	var tooltipWidthInDeg = (ttSize['width'] + ico.iconSize.width + 6) / mapWidth * longSpan;
	if (point.lng() + tooltipWidthInDeg > bounds.getNorthEast().lng() && permitLeft)
		rightSide = false;
	if (rightSide){
		toolPos.y -= Math.floor(ttSize['height']/2);
		toolPos.x += (ico.iconSize.width - ico.iconAnchor.x) + gap;
	}
	else{
		toolPos.y -= Math.floor(ttSize['height']/2);
		toolPos.x -= (ico.iconAnchor.x + ttSize['width']+ gap);
	}
	//theObj.ttLeft = ttPos.x;
	//theObj.ttTop  = ttPos.y;
	if (kluchtt)
	{
		kluchtt.style.left = toolPos.x + "px";
		kluchtt.style.top  = toolPos.y + "px";
        kluchtt.style.width = ttSize['width']+'px';
        kluchtt.style.height = ttSize['height']+'px';

        kluchtt.innerHTML=text;
        kluchtt.style.display="block";
    }
}


KluchBaseMarker.prototype.hideTooltip = function() {
    kluchtt.style.display="none";
}




/* KLUCH MARKER */
function KluchMarker(point, idx, icon, parent){
    /* @point - wspolrzedne
       @idx - numer kolejny znacznika
       @icon - ikonka
       @parent - KluchRouteManager zarzadzajacy znacznikiem
    */
    if (perm('rp_edit')){
        var opcje = {'dragCrossMove':true,
                     'draggable':true,
                     'bouncy':false,
                     'icon':icon
                    }
    }
    else {
        var opcje = {'dragCrossMove':false,
                     'draggable':false,
                     'bouncy':false,
                     'icon':icon
                    }
    }
    KluchBaseMarker.call(this, point, opcje, parent);
    this._kluch_data = {'title':_['point']+(1*idx+1),
                        'desc':''}
    this.setIndex(idx);
    this.ttSize = this.computeTTSize();
}

KluchMarker.prototype = new KluchBaseMarker(new GLatLng(0,0));

KluchMarker.prototype.setUpEventHandlers = function(parent){
    if (perm('rp_edit')){
        GEvent.addListener(this, "dragend", function() {
            parent.relocateMarker(this);
        });

        GEvent.addListener(this, "dragstart", function() {
            this.hideTooltip();
        });
    }
    else{
        GEvent.addListener(this, "mouseover", function() {
            this.showTooltip();
        });

        GEvent.addListener(this, "mouseout", function() {
            this.hideTooltip();
        });
    }

    GEvent.addListener(this, "click", function() {
        this.hideTooltip();
        this.openInfoWindowTabsHtml([new GInfoWindowTab(this._kluch_data['title'],this._kluch_data['html'])]);
    });
}

KluchMarker.prototype.genHtml = function(){
    this._kluch_data['html'] = '<div class="kluch_infowindow"><form name="iw_kluch">'+
                 '<table><tr><th>'+_['title']+'</th><td>'+
                 '<input type="text" name="iw_title" maxlength="50" id="iw_title" value="'+this._kluch_data['title']+'"';
    if (!perm('rp_edit'))
       this._kluch_data['html']+= ' readonly="readonly"';

    this._kluch_data['html']+=' /></td></tr>'+
                 '<tr><th>'+_['description']+'</th><td><input type="hidden" name="iw_idx" id="iw_idx" value="'+this._index+'" />'+
                 '<textarea cols="20" rows="5" name="iw_desc" id="iw_desc"';

    if (!perm('rp_edit'))
       this._kluch_data['html']+= ' readonly="readonly" ';

    this._kluch_data['html'] += '>'+this._kluch_data['desc']+'</textarea></td></tr>';

    if (perm('rp_edit') || perm('rp_edit')){
        this._kluch_data['html']+= '<tr><td colspan="2" class="iw_actions">';
        if (perm('rp_edit'))
            this._kluch_data['html']+= '&nbsp;&nbsp;<a href="javascript:saveMarker(this)">'+_['apply']+'</a>';
        if (perm('rp_del'))
            this._kluch_data['html']+= '&nbsp;&nbsp;<a href="javascript:removeMarker(this)">'+_['point_del']+'</a>';
        if (this._index!=0 && perm('rp_add'))
            this._kluch_data['html'] += '&nbsp;&nbsp;<a href="javascript:addBeforeMarker(this)">'+_['point_ins']+'</a>';
    }
    this._kluch_data['html'] += '</td></tr></table></form></div>';
}


/* KLUCH OBJECT MARKER */
function KluchObjectMarker(point, idx, icon, parent){
    /* @point - wspolrzedne
       @idx - numer kolejny znacznika
       @icon - ikonka
       @parent - KluchRouteManager zarzadzajacy znacznikiem
    */
    if (perm('ob_edit')){
        var opcje = {'dragCrossMove':true,
                     'draggable':true,
                     'bouncy':false,
                     'icon':icon
                    }
    }else{
        var opcje = {'dragCrossMove':false,
                     'draggable':false,
                     'bouncy':false,
                     'icon':icon
                    }
    }
    KluchBaseMarker.call(this, point, opcje, parent);
    this._kluch_data = {'title':_['point']+(1*idx+1),
                        'desc':''}
    this.ttSize = this.computeTTSize();
    this.setIndex(idx);
}

KluchObjectMarker.prototype = new KluchBaseMarker(new GLatLng(0,0)); //new GMarker(new GLatLng(0,0));

KluchObjectMarker.prototype.setUpEventHandlers = function(parent){
    GEvent.addListener(this, "click", function() {
        this.openInfoWindowTabsHtml([new GInfoWindowTab(this._kluch_data['title'],this._kluch_data['html'])]);
    });

    if (!perm('ob_edit')){
        GEvent.addListener(this, "mouseover", function() {
            this.showTooltip();
        });

        GEvent.addListener(this, "mouseout", function() {
            this.hideTooltip();
        });
    }
}

KluchObjectMarker.prototype.genHtml = function(){
    this._kluch_data['html'] = '<div class="kluch_infowindow"><form name="iw_kluch">'+
                 '<table><tr><th>'+_['title']+'</th>'+
                 '<td><input type="text" name="iw_title" maxlength="50" id="iw_title" value="'+this._kluch_data['title']+'"';
    if (!perm('ob_edit')){
        this._kluch_data['html'] += ' readonly="readonly" ';
    }

    this._kluch_data['html'] += '/></td></tr>'+
                 '<tr><th>'+_['description']+'</th><td><textarea cols="20" rows="5" name="iw_desc" id="iw_desc" ';

    if (!perm('ob_edit')){
        this._kluch_data['html'] += ' readonly="readonly" ';
    }

    this._kluch_data['html'] += '>'+this._kluch_data['desc']+'</textarea>'+
                 '<input type="hidden" name="iw_idx" id="iw_idx" value="'+this._index+'" /></td></tr>';

    if (perm('ob_edit') || perm('ob_del')){
        this._kluch_data['html'] += '<tr><td colspan="2" class="iw_actions">';
        if (perm('ob_edit'))
            this._kluch_data['html'] += '&nbsp;&nbsp;<a href="javascript:saveObjectMarker(this)">'+_['apply']+'</a>';
        if (perm('ob_del'))
            this._kluch_data['html'] += '&nbsp;&nbsp;<a href="javascript:removeObjectMarker(this)">'+_['obj_del']+'</a>';
        this._kluch_data['html'] += '</td></tr>';
    }
    this._kluch_data['html'] += '</table></form></div>';
}


/* KLUCH ROUTE MANAGER */
function KluchRouteManager(idx, name, distBox){
    this.route_points = [];
    this.route_markers = [];
    this.route = '';
    this.name = name?name:'';
    this._index = idx;
    this.distBox = distBox;
}

KluchRouteManager.prototype.relocateMarker = function(marker){
    // Event handler for marker dragging
    if (!perm('rp_edit')) return;
    this.route_points[marker._index]=marker.getPoint();
    if (this.is_last_marker(marker)){
        this.refreshMarker(marker._index-1);
    }
    else{
        this.refreshMarker(marker._index);
        if (!this.is_first_marker(marker)){
            this.refreshMarker(marker._index-1);
        }
    }
    this.computeDistance();
    this.draw_route();
}


KluchRouteManager.prototype.getIcon = function(idx){
    var icon = '';
    if (idx==0){
       icon = 'start2';
    }
    else if (idx==this.route_points.length-1){
        icon = "end2";
    }
    else{
        icon = "start";
        var this_point=this.route_points[idx];
        var next_point=this.route_points[idx+1];
        var angle = this.bearing( this_point, next_point );
        var icons = [0, 45, 90, 135, 180, 225, 270, 315, 360];
        var chosen = 0;
        for (i=0;i<icons.length;i++){
            var ic = icons[i];
            if (angle<ic){
                var ic_prev = icons[i-1];
                var up = ic - angle;
                var down = angle - ic_prev;
                if (up>down){
                    chosen = ic_prev;
                }
                else{
                    chosen = ic;
                }
                break;
            }
        }
        if (chosen==360) chosen = 0;
        icon = 'arrow2_'+chosen;
        //GLog.write(icon);
    }

    var f = new GIcon();
    f.image = MEDIA_URL+"guide/img/"+icon+".png";
    f.iconSize = new GSize(13,20);
    f.shadowSize = new GSize(15,20);
    f.iconAnchor = new GPoint(6,16);
    f.infoWindowAnchor = new GPoint(6,13);
    f.infoShadowAnchor = new GPoint(6,13);
    return f;
}

KluchRouteManager.prototype.createMarker = function(point, idx, data){
    var icon = this.getIcon(idx);
    var marker = new KluchMarker(point, idx, icon, this);
    if (data){
        marker.setKluchData(data);
    }
    mgr.addMarker(marker, 3);
    return marker;
}

KluchRouteManager.prototype.refreshMarker = function(idx){
    if (idx<0){ //jesli nie ma markerow lub jest tylko startowy to nic nie robimy
        return;
    }
    var marker = this.route_markers[idx];
    var icon = this.getIcon(idx);
    //marker.setImage(icon.image);

    mgr.removeMarker(marker);
    var old_point = marker.getPoint();
    var old_data = marker._kluch_data;
    var new_marker = this.createMarker(old_point, idx);
    new_marker.setKluchData(old_data);
    this.route_markers[idx] = new_marker;
}

KluchRouteManager.prototype.removeMarker = function(idx){
    var marker = this.route_markers[idx];
    var is_last = this.is_last_marker(marker);
    // usuniecie markera z listy punktow i listy markerow
    this.route_points.splice(idx, 1);
    this.route_markers.splice(idx, 1);
    // usuniecie markera z MarkerManager
    mgr.removeMarker(marker);

    if (!this.is_first_marker(marker)){
        // usuniecie ostatniego znacznika wiec ustawiamy ikone poprzedniego jako ostatnią
        this.refreshMarker(idx-1);
    }
    if(!is_last) {
        //zmieniamy tytuly itp. kolejnym markerom
        for (var i=idx;i<this.route_markers.length; i++){
            this.refreshMarker(i);
        }
    }
    this.computeDistance();
    this.draw_route();
};

KluchRouteManager.prototype.addRoutePoint = function(point, idx){
    var rpl = this.route_markers.length;
    if (!idx){
        idx = rpl;
        this.route_points[idx] = point;
    }
    // jesli wstawiamy marker w miejsce innego
    // to updateujemy indeksy kolejnych markerow
    else if (idx<rpl){
        for(var i=idx;i<rpl;i++){
            this.route_markers[i].setIndex(i+1);
        }
    }
    var marker = this.createMarker(point, idx);

    this.route_markers.splice(idx,0,marker);

    // jesli dodajemy marker to sprawdzamy poprzedni i jesli byl oznaczony
    // jako ostatni to zmieniamy mu ikone
    this.refreshMarker(idx-1);
    this.computeDistance();
    this.draw_route();
    return marker;
}

KluchRouteManager.prototype.is_last_marker = function(marker){
    return marker._index == this.route_points.length-1;
}

KluchRouteManager.prototype.is_first_marker = function(marker){
    return marker._index == 0;
}

KluchRouteManager.prototype.draw_route = function(i){
    if (this.route){
        map.removeOverlay(this.route);
    }

    if (this.route_points.length>1){
        this.route = new GPolyline(this.route_points, '#FF0000', 3);
        map.addOverlay(this.route);
    }
}

KluchRouteManager.prototype.saveMarker = function(idx, data){
    this.route_markers[idx].setKluchData(data);
}

KluchRouteManager.prototype.insertMarkerBefore = function(idx){
    if (!perm('rp_edit')) return;
    var prev_point = this.route_points[idx-1];
    var curr_point = this.route_points[idx];

    var pl = prev_point.lat();
    var cl = curr_point.lat();
    var pln = prev_point.lng();
    var cln = curr_point.lng();

    var new_point = new GLatLng(cl - (cl - pl)/2, cln - (cln - pln)/2);
    this.route_points.splice(idx,0,new_point);
    this.addRoutePoint(new_point, idx);
}


KluchRouteManager.prototype.bearing = function(from, to){
   var lat1 = from.latRadians();
   var lon1 = from.lngRadians();
   var lat2 = to.latRadians();
   var lon2 = to.lngRadians();

   // Compute the angle.
   var angle = - Math.atan2( Math.sin( lon1 - lon2 ) * Math.cos( lat2 ), Math.cos( lat1 ) * Math.sin( lat2 ) - Math.sin( lat1 ) * Math.cos( lat2 ) * Math.cos( lon1 - lon2 ) );
   if ( angle < 0.0 )
      angle  += Math.PI * 2.0;

    // And convert result to degrees.
    angle = angle * 180.0 / Math.PI;

    return angle;
}

KluchRouteManager.prototype.distance = function(point1, point2, unit){
    var lat1 = point1.lat();
    var lon1 = point1.lng();
    var lat2 = point2.lat();
    var lon2 = point2.lng();
    var rad = 180 / Math.PI;
    distmiles = 3960 * Math.acos(Math.cos((90 - lat1)/rad) * Math.cos((90 - lat2)/rad) + Math.sin((90 - lat1)/rad) * Math.sin((90 - lat2)/rad) * Math.cos((lon1 - lon2)/rad));
    if (unit=='km') {
        return Math.round(100*distmiles * 1.609344)/100;
    }
    else{
        return Math.round(100*distmiles)/100;
    }
}

KluchRouteManager.prototype.computeDistance = function(){
    if (!this.distBox){
        return;
    }
    var total_dist = 0;
    var distmode = this.getDistMode();
    for (var i=0; i<this.route_points.length; i++){
        var rp = this.route_points[i];
        var rm = this.route_markers[i];
        if (i==0) {
            rm.dist_to_prev = 0;
            continue;
        }
        var dist=this.distance(rp, this.route_points[i-1], distmode);
        this.route_markers[i].dist_to_prev = dist;
        total_dist += dist;
    }
    total_dist = Math.round(total_dist*100)/100;
    this.distBox.innerHTML=''+total_dist+' '+distmode;
}

KluchRouteManager.prototype.getDistMode = function(){
    var kmmode = document.getElementById('kluch'+this._index+'_dist_mode_km');
    if (kmmode && kmmode.checked){
        return gettext('km');
    }
    return gettext('miles');
}



/* KLUCH MANAGER */
function KluchManager(){
    this.routes = [];
    this.objects = [];
    this.current_route=null;
}

KluchManager.prototype.add_route = function(name){
    var idx = this.routes.length;
    var distBox = document.getElementById('kluch'+idx+'_dist_box');
    this.routes[idx] = new KluchRouteManager(idx, name, distBox);
    this.current_route = this.routes[idx];

    var kmbox = document.getElementById('kluch'+idx+'_dist_mode_km');
    var milesbox = document.getElementById('kluch'+idx+'_dist_mode_miles');
    if (kmbox){
        GEvent.addDomListener(kmbox,  'change',  function(){kluchmgr.current_route.computeDistance()});
    }
    if (milesbox){
        GEvent.addDomListener(milesbox,  'change',  function(){kluchmgr.current_route.computeDistance()});
    }

    return this.routes[idx];
}

KluchManager.prototype.addObjectPoint = function(point, map){
    var idx = this.objects.length;
    var marker = this.createMarker(point, idx);
    this.objects[idx] = marker;
    return marker;
}

KluchManager.prototype.createMarker = function(point, idx, kluch_data){
    var icon = this.getIcon()
    var marker = new KluchObjectMarker(point, idx, icon, this);
    if (kluch_data){
        marker.setKluchData(kluch_data);
    }
    mgr.addMarker(marker, 3);
    return marker;
}

KluchManager.prototype.getIcon = function(){
    var f = new GIcon();
    f.image = MEDIA_URL+"guide/img/building.png";
    f.iconSize = new GSize(20,16);
    f.shadowSize = new GSize(15,20);
    f.iconAnchor = new GPoint(10,16);
    f.infoWindowAnchor = new GPoint(10,16);
    f.infoShadowAnchor = new GPoint(10,16);

    return f;
}

KluchManager.prototype.saveMarker = function(idx, data){
    this.objects[idx].setKluchData(data);
}

KluchManager.prototype.removeMarker = function(idx){
    var marker = this.objects[idx];
    mgr.removeMarker(marker);
    this.objects.splice(idx, 1);
};

KluchManager.prototype.exportData = function(){
    var edata = {'objects':[],
                 'routes':[]};
    // OBJECTS
    for (var i=0; i<this.objects.length; i++){
        var obj = this.objects[i];
        var out = {'lat':''+obj.getPoint().lat(),
                   'lng':''+obj.getPoint().lng(),
                   'title':obj._kluch_data['title'],
                   'desc':obj._kluch_data['desc']
                  }
        edata['objects'][i] = out;
    }

    // ROUTES
    for (var i=0; i<this.routes.length; i++){
        var route = this.routes[i];
        var points = [];

        var out = {'name':route.name,
                   'points':[]};

        for (var j=0; j<route.route_markers.length; j++){
            var marker = route.route_markers[j];
            var r_marker = {'lat':''+marker.getPoint().lat(),
                            'lng':''+marker.getPoint().lng(),
                            'title':marker._kluch_data['title'],
                            'desc':marker._kluch_data['desc']
                           }
            out['points'][out['points'].length] = r_marker;
        }
        edata['routes'][edata['routes'].length] = out;
    }

    var mapname = document.getElementById('sd_name');
    var mapdesc = document.getElementById('sd_description');
    var captcha = document.getElementById('sd_captcha');
    var zoom_obj = document.getElementById('sd_zoom');
    var email_obj = document.getElementById('sd_email');
    edata['map_data']={'name':mapname.value, 'description':mapdesc.value,
                       'zoom':zoom_obj.value, //map.getZoom(),
                       'email':email_obj.value,
                       'captcha':captcha.value, 'mode':MODE}
    return edata;
};


KluchManager.prototype.populateData = function(data){
    var data = {'objects':[{'lat':49.82109574033279,
                            'lng':19.0351438522387,
                            'data':{'title':'Dworzec PKP',
                                    'desc':'Tu jeżdżą pociągi, chyba że się wykoleją'}
                           },
                           {'lat':49.82115111623757,
                            'lng':19.04276132583618,
                            'data':{'title':'Sklep Jaś Fasola',
                                    'desc':'Najlepszy sex shop w okolicy'}
                           }
                           ],
                'routes':[{'name':'Route 1',
                           'points':[{'lat':49.82209574033279,
                                      'lng':19.035143852233887,
                                      'data':{'title':'Punkt z',
                                              'desc':'Opis'}
                                     },
                                     {'lat':49.82215111623757,
                                      'lng':19.04276132583618,
                                      'data':{'title':'Punkt w',
                                              'desc':'Opis'}
                                     }
                                    ]
                          }],
                'map_data':{'name':'Testowa',
                           'description':'To jest testowa mapa do sprawdzania dzialania'}
                };

    var kmapname = document.getElementById('kluch_mapname');
    if (kmapname){
        kmapname.innerHTML = read_data['map_data']['name'];
    }

    var kmapdesc = document.getElementById('kluch_map_desc_box');
    if (kmapdesc){
        kmapdesc.innerHTML = read_data['map_data']['description'];
    }

    var obs = read_data['objects'];
    for (var i=0; i<obs.length; i++){
        var obj = obs[i];
        var point = new GLatLng(obj['lat'], obj['lng']);
        var marker = kluchmgr.createMarker(point, i, obj['data']);
        kluchmgr.objects[i]=marker;
    }
    var routes = read_data['routes'];
    for (var i=0; i<routes.length; i++){
        var route = routes[i];
        var points = route['points'];

        var routemgr = kluchmgr.add_route(route['name']);
        for (var j=0; j<points.length; j++){
            var point=points[j];
            var coords = new GLatLng(point['lat'], point['lng']);
            routemgr.route_points[j] = coords;
            var marker = routemgr.createMarker(coords, j, point['data']);
            routemgr.route_markers.splice(j,0,marker);
            if (j>1)
                routemgr.refreshMarker(j-1);
        }
        routemgr.computeDistance()
    }
    routemgr.draw_route();
};




/* Globalne funkcje */

/* handler zdarzenia 'usun' pokazywanego w infowindow */
function removeMarker(iw_a){
    var idx = document.getElementById('iw_idx').value;
    map.closeInfoWindow();
    kluchmgr.current_route.removeMarker(1*idx);
}

/* handler zdarzenia 'zapisz' pokazywanego w infowindow */
function saveMarker(iw_a){
    var idx = document.getElementById('iw_idx').value;
    var desc = document.getElementById('iw_desc').value;
    var title = document.getElementById('iw_title').value;
    kluchmgr.current_route.saveMarker(1*idx, {'idx':idx, 'desc':desc, 'title':title});
    map.closeInfoWindow();
}

/* handler zdarzenia 'wstaw punkt przed' pokazywanego w infowindow */
function addBeforeMarker(iw_a){
    var idx = document.getElementById('iw_idx').value;
    kluchmgr.current_route.insertMarkerBefore(1*idx);
    map.closeInfoWindow();
}

/* handler zdarzenia 'usun obiekt' pokazywanego w infowindow */
function removeObjectMarker(iw_a){
    var idx = document.getElementById('iw_idx').value;
    map.closeInfoWindow();
    kluchmgr.removeMarker(1*idx);
}

/* handler zdarzenia 'zapisz obiekt' pokazywanego w infowindow */
function saveObjectMarker(iw_a){
    var idx = document.getElementById('iw_idx').value;
    var desc = document.getElementById('iw_desc').value;
    var title = document.getElementById('iw_title').value;
    kluchmgr.saveMarker(1*idx, {'idx':idx, 'desc':desc, 'title':title});
    map.closeInfoWindow();
}


/* pobranie trybu dzialania */
function getMode(){
    var route = document.getElementById('kluch_route');
    if (route && route.checked){
        return 'route';
    }
    return 'objects';
}

function kluchSaveMap(){
    var data = kluchmgr.exportData();
    kluchDialogYUI.hide();
    //
    //alert(''+data.toJSONString());
    var handleSuccess = function(o){
      closeDialogWindow();
      if(o.responseText !== undefined){
        var ret = o.responseText.parseJSON();
        if (ret.status=='OK'){
            document.location='/mapsavedinfo';
        }
        else {
            alert(gettext('Error:')+ret.data);
        }
        return;
      }
    }

    var handleFailure = function handleFailure(o){
        closeDialogWindow();
        if(o.responseText !== undefined){
            //alert('aaa', o.responseText);
            openSaveDialog(null, o.responseText);
        }
        else{
            alert(gettext('No connection to server!'));
        }
    }

    var callback = {
      success:handleSuccess,
      failure: handleFailure,
      argument: {}
    };

    //YAHOO.util.Connect.asyncRequest('POST', '/kguide/savedata/', callback, 'mapdata='+data.toJSONString());
    var request = GXmlHttp.create();
    request.open('POST', '/savedata/', true);
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            if (request.status==200){
                handleSuccess(request);
            }
            else{
                handleFailure(request);
            }
        }
    }
    request.send('mapdata='+data.toJSONString());
    openInfoWindow('Zapisywanie...', 1)
    //openInfoWindow(gettext('Saving...'));
}

function openSaveDialog(e, errobj){
    if (kluchmgr.routes[0].route_points.length==0 && kluchmgr.objects.length==0){
        openInfoWindow(gettext('Nothing to save!'));
        return;
    }
    var sd_content_info = document.getElementById('sd_content_info');
    var captcha_img_cont = document.getElementById('captcha_img_cont');
    var tmpcic = captcha_img_cont.innerHTML;
    var now = new Date();

    // rotacja captchy przy kazdym otwarciu okna
    var newcaptcha = '/show_captcha?'+now.getTime();
    captcha_img_cont.innerHTML='<img id="captcha_img" alt="captcha" width="150" height="45" src="'+newcaptcha+'" alt="captcha" />';

    // wyzerowanie tekstu captchy
    var captcha = document.getElementById('sd_captcha');
    captcha.value='';
    
    // ustawienie zooma na biezacy
    var zoom_ob = document.getElementById('sd_zoom');
    var zoom_label = document.getElementById('sd_current_zoom');
    zoom_label.innerHTML=map.getZoom();
    
    var save_btn = document.getElementById('kluch_sd_save_map');
    var kd_error = document.getElementById('kluch_dialog_error');
    if (errobj){
        kd_error.innerHTML = errobj;
        kd_error.style.display='block';
    }
    else{
        kd_error.innerHTML = '';
        kd_error.style.display='none';
    }

    kluchDialogYUI.setBody(sd_content_info);
    kluchDialogYUI.render();
    
    // dane do edycji
    if (MODE=='EDIT' && !SAVE_DIALOG_OPENED){
        var kmapname = document.getElementById('sd_name');
        if (kmapname){
            kmapname.value = read_data['map_data']['name'];
        }

        var kmapdesc = document.getElementById('sd_description');
        if (kmapdesc){
            kmapdesc.value = read_data['map_data']['description'];
        }
        SAVE_DIALOG_OPENED=true;
    }
    kluchDialogYUI.show();
    kluchDialogYUI.focusFirst();
    document.getElementById('sd_zoom').value=map.getZoom();
}

function openInfoWindow(text, nobuttons){
    if (nobuttons){
        kluchSimpleWindowYUI.setHeader("Ostrzeżenie!");
	    kluchSimpleWindowYUI.setBody(text);
	    kluchSimpleWindowYUI.cfg.setProperty("icon",YAHOO.widget.SimpleDialog.ICON_WARN);
        kluchSimpleWindowYUI.render();
        kluchSimpleWindowYUI.show();
    }
    else {
        kluchSimpleDialogYUI.setHeader("Ostrzeżenie!");
	    kluchSimpleDialogYUI.setBody(text);
	    kluchSimpleDialogYUI.cfg.setProperty("icon",YAHOO.widget.SimpleDialog.ICON_WARN);
        kluchSimpleDialogYUI.render();
        kluchSimpleDialogYUI.show();
    }
}

function closeDialogWindow(){
    kluchSimpleDialogYUI.hide();
    kluchSimpleWindowYUI.hide();
}


function createGeoCookie() {
    // utworzenie cookie zapisujacego informacje o biezacej lokacji
    var name = 'kluch_geolocation';
    var mc = map.getCenter();
    var value = ''+mc.lat()+','+mc.lng()+','+map.getZoom();
    var days = 0;
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "; expires=Mon, 21 May 2017 18:47:08 GMT";
    // jesli ktos ustawia domyslny punkt startowy to raczej na
    // dlugo tzn. do 2017 roku
	document.cookie = name+"="+value+expires+"; path=/";
    openInfoWindow(gettext('Default map position has been changed!'));
}

function setupMap() {
  // konfiguracja mapy itp
  if (GBrowserIsCompatible()) {
    // Utworzenie mapy
    mapdiv = document.getElementById("mapcnt");
    if (perm('rp_edit')||perm('ob_edit'))
        var opts = {draggableCursor: 'crosshair', draggingCursor: 'pointer'};
    else
        var opts = {};
    map = new GMap2(mapdiv, opts);
    map.enableContinuousZoom();
    // Kontrolki na mapie
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.enableScrollWheelZoom();
    kluchtt= document.getElementById('kluchtooltip');
    map.getPane(G_MAP_FLOAT_PANE).appendChild(kluchtt);
    kluchmgr = new KluchManager();

    // Zdarzenia
    if (perm('rp_edit')||perm('ob_edit')){
      GEvent.addListener(map, "click", function(overlay, point) {
        if (point && getMode()=='route' && perm('rp_add')){
          kluchmgr.current_route.addRoutePoint(point);
          //map.addOverlay(marker);
        }
        else if (point && perm('ob_add')){
          kluchmgr.addObjectPoint(point, map);
        }
        else if (overlay){
          //GLog.write('Kliknales na obiekcie');
        }
      });
    }

    if (MODE=='READ' || MODE=='EMBED'){
        var zm = read_data['map_data']['zoom'];
        map.setCenter(START_POINT, zm);
        mgr = new MarkerManager(map, {trackMarkers:false});
        kluchmgr.populateData();
        map.setCenter(START_POINT, zm);
    }
    else if (MODE=='EDIT') {
        var zm = read_data['map_data']['zoom'];
        map.setCenter(START_POINT, zm);
        mgr = new MarkerManager(map, {trackMarkers:true});
        kluchmgr.populateData();
        var savemap = document.getElementById('save_map');
        GEvent.addDomListener(savemap,  'click',  openSaveDialog);

        var def_p = document.getElementById('def_pos');
        GEvent.addDomListener(def_p,  'click',  createGeoCookie);
    }
    else {
        map.setCenter(START_POINT, ZOOM);
        var savemap = document.getElementById('save_map');
        GEvent.addDomListener(savemap,  'click',  openSaveDialog);

        var def_p = document.getElementById('def_pos');
        GEvent.addDomListener(def_p,  'click',  createGeoCookie);

        mgr = new MarkerManager(map, {trackMarkers:true});
        kluchmgr.current_route = kluchmgr.add_route('default');
    }
    mgr.refresh();

    if (MODE=='EDIT' || MODE=='CREATE'){
        var handleCancel = function() {
	        this.cancel();
        };
        kluchDialogYUI = new YAHOO.widget.Dialog("kluchDialogDiv",
              { width : "550px",
	            fixedcenter : true,
	            visible : false,
	            constraintoviewport : true,
                modal:true,
	            buttons : [ { text:gettext("Save"), handler:kluchSaveMap, isDefault:true },
                {text:gettext('Cancel'), handler:handleCancel}]
              });

        var handleOK = function() {
    	    this.hide();
    	};

        kluchSimpleDialogYUI = new YAHOO.widget.SimpleDialog("kluchSimpleDialogDiv",
              {width: "20em",
	           fixedcenter:true,
    	       modal:true,
	           draggable:true,
               buttons: [ { text:"OK", handler:handleOK, isDefault:true },
 	                    ]
              });

        kluchSimpleWindowYUI = new YAHOO.widget.SimpleDialog("kluchSimpleWindowDiv",
              {width: "20em",
	           fixedcenter:true,
    	       modal:true,
	           draggable:true
              });

        geocoder = new GClientGeocoder(new GGeocodeCache());
        GEvent.addDomListener(document.getElementById('address_locate'),  'click',  locate_address);
    }
    //var dirdiv = document.getElementById('directionsdiv');
    //dir = new GDirections(map, dirdiv);
    //GEvent.addListener(dir, "load", mywaypoints);
    //kluchSimpleDialogYUI.render();
    preload_icons();
  }
}

function adrr_located(point){
    if (point){
        map.setCenter(point);
    }
    else{
        alert(gettext('We\'re sorry but this location was not found...'));
    }
}

function locate_address(lt){
    var adr = document.getElementById('address_input');
    geocoder.getLatLng(adr.value,  adrr_located);
}

function cb(response) {
  //map.clearOverlays();
  if (!response || response.Status.code != 200) {
    alert("address not found");
  } else {
    place = response.Placemark[0];
    alert(place.address + ' ' + 'Country code: ' + place.AddressDetails.Country.CountryNameCode);
  }
}

function mywaypoints(){
    alert(dir.getSummaryHtml());
    for (var i=0;i<dir.getNumRoutes();i++){
        var route = dir.getRoute(i);
        //alert(route.getSummaryHtml());
        alert(dir.getGeocode(i).AddressDetails.Accuracy);
    }
}

function get_icon_images(){
    return {a0:MEDIA_URL+"guide/img/arrow2_0.png",
            a1:MEDIA_URL+"guide/img/arrow2_135.png",
            a2:MEDIA_URL+"guide/img/arrow2_180.png",
            a3:MEDIA_URL+"guide/img/arrow2_225.png",
            a4:MEDIA_URL+"guide/img/arrow2_315.png",
            a5:MEDIA_URL+"guide/img/arrow2_45.png",
            a6:MEDIA_URL+"guide/img/arrow2_90.png",
            a7:MEDIA_URL+"guide/img/building.png",
            a8:MEDIA_URL+"guide/img/start.png",
            a9:MEDIA_URL+"guide/img/start2.png",
            a10:MEDIA_URL+"guide/img/end.png",
            a11:MEDIA_URL+"guide/img/end2.png"};
}
    
function preload_icons(){
    var imgs = this.get_icon_images();
    var pic1 = new Image(13,20); 
    pic1.src = imgs.a0;
    pic1.src = imgs.a1;
    pic1.src = imgs.a2;
    pic1.src = imgs.a3;
    pic1.src = imgs.a4;
    pic1.src = imgs.a5;
    pic1.src = imgs.a6;
    pic1.src = imgs.a7;
    pic1.src = imgs.a8;
    pic1.src = imgs.a9;
    pic1.src = imgs.a10;
    pic1.src = imgs.a11;
}
    


function testowa(){
    var geocoder = new GClientGeocoder();
    var ad = ''+kluchmgr.routes[0].route_points[0].lat()+','+kluchmgr.routes[0].route_points[0].lng();
    alert(ad);
    geocoder.getLocations(ad, cb)
    return
    dir.clear();
    var x = dir.loadFromWaypoints(kluchmgr.routes[0].route_points,
                                  {getPolyline:true,
                                   preserveViewport:true,
                                   getSteps:true
                                   });
}

/* ------------ geolokacja ajaxowa */



// -------------------*/

function KluchUnload(){
    kluchmgr = null;
    GUnload();
}

function load() {
    if (GBrowserIsCompatible()) {
        //behaviour_rules();
        if (MODE!='MAPSAVED'){
            setupMap();
        }
    }
}
window.onload=load;