function parseCSV(data) {
    const lines = data.split(/\r\n|\n|\r/); // parse by \n and/or by \n
    const headers = lines[0].split(',');
    return lines.slice(1).map(line => { // lines.slice(1) creates a new array that excludes the first line (headers)
        const values = line.split(','); // splits the line into an array of values
        return headers.reduce((object, header, index) => {
            object[header] = values[index];
            return object;
        }, {});
    });
}

/**
 * Function to parse shapes.txt file, add the shape geometries to the shapes["routes"] dictionary
 * and draw the shapes on the map.
 */
function parseShapesFile(file) {
    const reader = new FileReader();
    reader.onload = function(event) {
        const text = event.target.result;
        const lines = text.split('\n');
        const headers = lines[0].split(',');
        const shapeIdIndex = headers.indexOf('shape_id');
        const shapePtSequenceIndex = headers.indexOf('shape_pt_sequence');
        const shapePtLatIndex = headers.indexOf('shape_pt_lat');
        const shapePtLonIndex = headers.indexOf('shape_pt_lon');

        for (let i = 1; i < lines.length; i++) {
            const line = lines[i].trim();
            if (line) {
                const columns = line.split(',');
                const shape_id = columns[shapeIdIndex];
                const shape_pt_sequence = parseInt(columns[shapePtSequenceIndex], 10);
                const shape_pt_lat = parseFloat(columns[shapePtLatIndex]);
                const shape_pt_lon = parseFloat(columns[shapePtLonIndex]);

                if (!shapes["routes"][shape_id]) {
                    shapes["routes"][shape_id] = [];
                }
                shapes["routes"][shape_id].push({
                    sequence: shape_pt_sequence,
                    lat: shape_pt_lat,
                    lon: shape_pt_lon
                });
            }
        }

        // Sort the shape points by sequence and draw them with click listeners
        for (let shape_id in shapes["routes"]) {
            if (shapes["routes"].hasOwnProperty(shape_id)) {
                shapes["routes"][shape_id].sort((a, b) => a.sequence - b.sequence);
                const latlngs = shapes["routes"][shape_id].map(point => [point.lat, point.lon]);
                
                addClickableShape (latlngs, shape_id)
            }
        }
    };
    reader.readAsText(file);
}