function StopsInfo() {}

/* show GInfoWindow [stopid, ...] */
StopsInfo.show = function(point, stopids) {
	StopsInfo.stopids = stopids;

	if (StopsInfo.areaPoly) {
		StopsInfo._map.removeOverlay(StopsInfo.areaPoly);
		delete StopsInfo.areaPoly;
	} 

	if (stopids.length > 1) {	
		var bounds = new GLatLngBounds();
		
		for (var i = stopids.length; --i >=0;) {
	        bounds.extend(StopsInfo._stopsHash[stopids[i]].point);
		}

		var ne = bounds.getNorthEast();
		var sw = bounds.getSouthWest();
		var se = new GLatLng(sw.lat(), ne.lng());
		var nw = new GLatLng(ne.lat(), sw.lng());
    
		StopsInfo.areaPoly = new GPolyline([nw, ne, se, sw, nw], "black", 1, 0.8);
		StopsInfo._map.addOverlay(StopsInfo.areaPoly);
    }
	
	StopsInfo._map.openInfoWindowHtml(point, StopsInfo.getInfoWindowHTML(stopids)); 
	return 0;
}

StopsInfo.getTransportInStops = function(stopids) {
	var all_transport = {}; //StopsInfo.newTransTemplate();

	for (var i = stopids.length; --i >=0;) {
	    var id = stopids[i];
		var stop_data = StopsInfo._stopsHash[id];
		
	    for (var tt in _transport_types) {
		    if (!(tt in stop_data.transport)) continue; // such transport doesn't stops in this stop
			if (!(tt in all_transport)) all_transport[tt] = {};
			
			for (var num in stop_data.transport[tt]) {
				var directions = stop_data.transport[tt][num];
				for (var j=0; j<directions.length; j++) {
				    var direction_id = directions[j];
				    
					if (!(num in all_transport[tt])) { // first time
					    all_transport[tt][num] = {};
				    }
				    all_transport[tt][num][direction_id] = id; 
					// jeigu turim klasteri, tai gali buti kad tas pats marsrutas stoja keliose stotelese - cia isiminsime tik paskutine is tokiu stoteliu
				}
			}
		}
	}
    return all_transport;
};

function ShowStopsInArea(map, bounds) {
    var markersInBounds = [];
	
	for (i = arrayOfMarkers.length; --i >=0;)	{
	    if (bounds.containsLatLng(arrayOfMarkers[i].getLatLng())) {
		    markersInBounds.push(arrayOfMarkers[i]);
		}
	}
	if (markersInBounds.length == 0) { return; }

    var ne = bounds.getNorthEast();
    var sw = bounds.getSouthWest();
    var se = new GLatLng(sw.lat(), ne.lng());
    var nw = new GLatLng(ne.lat(), sw.lng());
    
	var areaPoly = new GPolyline([nw, ne, se, sw, nw], "black", 1, 0.8);
	map.addOverlay(areaPoly);
	
    StopsInfo.show(bounds.getCenter(), markersInBounds.map(function(marker){return marker.stopid}));
	DragZoomControl.selected_area = areaPoly;
}

StopsInfo.zoom = function() {
	if (StopsInfo.stopids.length <=0) return;
	
	if (StopsInfo._map.getZoom() <15) {
		StopsInfo.iw_zoomout_center = StopsInfo._map.getCenter(); //store current zoom level and center for zoom out
		StopsInfo.iw_zoomout_level = StopsInfo._map.getZoom();

		var	el = document.getElementById("imgZoomOut");
		
		if (el) {
			el.style.display = "";
		}
	}
	
	if (StopsInfo.stopids.length == 1) {
   		StopsInfo._map.setCenter(StopsInfo._stopsHash[StopsInfo.stopids[0]].point, 15);
	}
	else if (StopsInfo.stopids.length > 1) {
		var bounds = new GLatLngBounds();
		
		for (var i = StopsInfo.stopids.length; --i >=0;) {
	        bounds.extend(StopsInfo._stopsHash[StopsInfo.stopids[i]].point);
		}
   		
		StopsInfo._map.setCenter(bounds.getCenter(), Math.min(15, StopsInfo._map.getBoundsZoomLevel(bounds)));
 	}
}

StopsInfo.zoomout = function() {
    if (StopsInfo.iw_zoomout_center && StopsInfo.iw_zoomout_level) {
	   StopsInfo._map.setCenter(StopsInfo.iw_zoomout_center, StopsInfo.iw_zoomout_level);
    
		el = document.getElementById("imgZoomOut");
		if (el) {
			el.style.display = "none";
		}
	}
}

StopsInfo.getInfoWindowHTML = function(stopids) {
	var all_transport = StopsInfo.getTransportInStops(stopids);
	//all_transport[transport][number][direction_id] = stop_id
	StopsInfo.iw_transport = all_transport;
	
	var transport_all_info_HTML = "", text_length = 0;
	
	for(var tt in _transport_types) {
	    var title = _transport_types[tt][Language];
		var color = _transport_types[tt].color;
		
		var numspan_array = []; // [ [num, html] ] // for sorting
		
		if(!(tt in all_transport)) continue; 
		var transport_obj = all_transport[tt];
				
	    for (var num in transport_obj) {
	        numspan_array.push([parseInt("0"+num, 10), "<span class='number_inv' style='background-color:" + color + "' onmouseover=\"StopsInfo.showTransport('" + tt + "','" + num + "', '" + color +"',this, event)\" onmouseout='delayhidetip()'>" + num + "</span> "]);
			text_length += num.length;	
		}
		
		if (numspan_array.length != 0) {
		    numspan_array.sort(function(x,y) {return (x[0] - y[0]);});
			var num_html = numspan_array.map(function(x) {return x[1];}).join("");
		    transport_all_info_HTML += "<span class='transport_spn'>" + title + ": </span> " + num_html + "<br/>";
		}
	}
	
	StopsInfo.iw_allStopsIds = [];
    var stopnames = [];
    for(var i=0; i<stopids.length; i++) {
	   var stopname = StopsInfo._stopsHash[stopids[i]].name;
	   if (stopnames.indexOf(stopname) == -1) {
           stopnames.push(stopname);
		   StopsInfo.iw_allStopsIds.push([stopname, stopids[i]]);
	   }
    }
	
	return "<div class='IWCaption'>" + ((stopnames.length == 1) ? stopnames[0] : StopsInfo.allStopsHtml(stopnames)) 
		+ "<img src='"+ ApplicationPath +"images/zoom.gif' border='0' onclick='StopsInfo.zoom()' style='margin-left:5px;cursor:pointer'/>" 
		+ "<img id='imgZoomOut' src='"+ ApplicationPath +"images/zoomout.gif' border='0' onclick='StopsInfo.zoomout()' style='" 
		+ ( (StopsInfo.iw_zoomout_level && StopsInfo.iw_zoomout_level < StopsInfo._map.getZoom()) ? "": "display:none;") + "margin-left:5px;cursor:pointer'/>"
		+ "</div><div class='IWContent' style='width:" + (text_length>150 ? 400: 250) + "px'>" + transport_all_info_HTML + "</div>";
}


/* init stops data */
StopsInfo.init = function(map, routes_filename, stopsHash) {
    StopsInfo._map = map;

	GDownloadUrl(routes_filename, function (doc) {
      var lines = doc.split("\n"); // split the document into lines

	  var prev_city = "";
	  var prev_transport = "", transport = "";
	  var prev_org = "";
	  function prev(_val, _var) {if(_val==""){return eval(_var);}else{eval(_var+"=\""+_val+"\";");return _val;}};
	  
	  var routesHash = {};

	  for (var i=0; i<lines.length; i++) {
        if (lines[i].length > 1) {
			var parts = lines[i].split(';');
			
			//var city = prev(parts[0], "prev_city");
			
			transport = parts[1];
			if (transport != "") {
				//if (city == 'Harju') {
				//	transport = 'harju_' + transport; // FIXME temporary Harju hack to differentiate between Tallinn and Harju transport types
				//}						
				prev_transport = transport;
			}
			else {
				transport = prev_transport;
			}	
			
			//var org = prev(parts[2], "prev_org");
			
			var route_nmb = parts[3];
			var direction_id = parts[4];
			//var direction_type = parts[5];
			var direction_name = parts[5];
			
			var stops = [];
			for (var j=6; j<parts.length;j++) {
			    stops.push(parts[j]);
			}
			
			routesHash[direction_id] = [transport, route_nmb, direction_name, stops];
			//arrayOfDirections.push([city, transport, org, route_nmb, direction_id, direction_name, stops]);
		}
      }
	  
      for(var direction_id in routesHash) {
	    var route = routesHash[direction_id];
		var transport_type = route[0].toLowerCase();
	    var num = route[1];
		var stops = route[3];
		
		for(var j=0; j<stops.length; j++) {
		    var id = stops[j];
			
			if ((!(transport_type in stopsHash[id].transport))) {
			   stopsHash[id].transport[transport_type] = {};
			}
			if (!(num in stopsHash[id].transport[transport_type])) { stopsHash[id].transport[transport_type][num] = [];}
			
			stopsHash[id].transport[transport_type][num].push(direction_id);
		}
	  }

      StopsInfo._stopsHash = stopsHash;
	  StopsInfo._routesHash = routesHash;
	});
}


StopsInfo.getRoutesHTML = function(transport_type, tnumber, color) {
////StopsInfo.iw_transport = [transport][number][direction_id] = stop_id
	var transport_obj = StopsInfo.iw_transport[transport_type];

	var directionsHTML = "";
    for (var routeid in transport_obj[tnumber]) {
	     var stopid = transport_obj[tnumber][routeid];
		 var direction_name = StopsInfo._routesHash[routeid][2];
         directionsHTML += "<span class='number_small' style='background-color:" + color + "'>" + tnumber + "</span><a style='color:" + color + ";' href='?a=p.frameset&direction_id=" + routeid + "&stop_id=" + stopid+ "&l=" + Language + "' target='_blank'>" + direction_name + "</a><br/>";
	}
	return directionsHTML;
}


StopsInfo.tooltipHtml = function(head, body, width) {
    return "<div class='bcontainer' style='width:" + width + "px'><div class='bholder'><b class='xb1'></b><b class='xb2'></b><b class='xb3'></b><b class='xb4'></b>"
		+ ((head != "") ? "<table cellspacing='0' cellpadding='0' border='0' bgcolor='white' style='border-right:1px solid #aaa; border-left:1px solid #aaa; width:100%'><tr><td style='padding-left:5px;'>" + head + "</td><td align='right' style='padding-right:3px;'>"
		//+ "<img onclick='hidetip();' border='0' src='http://www.google.com/intl/en_ALL/mapfiles/iw_close.gif' style='cursor:pointer;'/>"
		+ "</td></tr></table>" : "")
		+ ((body != "") ? "<div class='bcontent'>" + body + "</div>" : "")
		+ "<b class='b4'></b><b class='b3'></b><b class='b2'></b><b class='b1'></b></div></div>";
}


StopsInfo.showTransport = function(transport_type, number, color, obj, event) {
    var directionsHTML = StopsInfo.getRoutesHTML(transport_type, number, color);
	var html = StopsInfo.tooltipHtml(directionsHTML,"", 250);
    fixedtooltip(html, obj, event);
}


StopsInfo.showStops = function(obj, event, hoffset) {
    if(typeof(hoffset)=='undefined') { hoffset=0; }
	
	StopsInfo.iw_allStopsIds.sort();
	var stopslist = StopsInfo.iw_allStopsIds.map(function(data) {
	    var sdata = StopsInfo._stopsHash[data[1]];
		return "<a href='#' onclick='StopsInfo.show(new GLatLng(" + sdata.point.lat() + "," + sdata.point.lng() + "), [" + data[1] + "]);delayhidetip();'>" + sdata.name + "</span>";
		}
	);
	
    var html = StopsInfo.tooltipHtml("<span style=\"color:#336699;font-size:10pt;font-weight:bold;\">" + _txt[3] +"</span>",  "<span class='stopslist'>" + stopslist.join("<br/>") + "</span>", 150);

    fixedtooltip(html, obj, event, hoffset);
}


StopsInfo.allStopsHtml = function(stopnames) {
   return "<span onmouseover=\"StopsInfo.showStops(this, event, 55)\" onmouseout=\"delayhidetip()\">" + _txt[4] +" " + stopnames.length + "</span>";
}

	  // IE has no Array.map
if (typeof Array.prototype.map == "undefined") {
    Array.prototype.map = function(fn, thisObj) {
        var scope = thisObj || window;
        var a = [];
        for ( var i=0, j=this.length; i < j; ++i ) {
            a.push(fn.call(scope, this[i], i, this));
        }
        return a;
    };
}

if (typeof Array.prototype.indexOf == "undefined") {
    Array.prototype.indexOf = function(el, start) {
        var start = start || 0;
        for ( var i=0; i < this.length; ++i ) {
            if ( this[i] === el ) {
                return i;
            }
        }
        return -1;
    };
}
