Transalvador Improver

Adiciona a quantidade de horários e a frequência média entre as linhas no site da Transalvador; possibilita a busca pelas linhas apertando ENTER; faz com que apareça o número das linhas filhas ao exibir o resultado da pesquisa.

目前為 2021-10-24 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        Transalvador Improver
// @namespace   none
// @version     1.0.14
// @author	Roger Pestana ([email protected])
// @grant       none
// @description Adiciona a quantidade de horários e a frequência média entre as linhas no site da Transalvador; possibilita a busca pelas linhas apertando ENTER; faz com que apareça o número das linhas filhas ao exibir o resultado da pesquisa.
// @include	*http://www.transalvadorantigo.salvador.ba.gov.br/*
// @date	29/mar/2014
// @rewrite	16/apr/2016
// @update	24/oct/2021
// ==/UserScript==

/* jshint expr: true, laxbreak: true, esversion: 6, multistr: true */
/* global $, buscar_linha, buscar_codigo, change_busca */

( function() {
'use strict';

// CSS
$qs( 'head' ).innerHTML += '<style>\
	.schedule_float { float: right; }\
	.schedule_padding { padding: 0px 5px 0px 0px; }\
	#schedule_amount, #schedule_average { font-weight: bold; font-family: Tahoma; }\
</style>';

// Format the hours
// @param {number} Time in seconds
// @return {string}
function format_time( time ) {
	let hour = Math.floor( time / 60 ),
		minutes = Math.floor( time % 60 );

	return ( hour > 0 ? ( ( hour < 10 && '0' ) + hour + 'h' ) : '' ) + ( ( minutes < 10 && '0' ) + minutes + 'min' );
}

// document.querySelector reduction
function $qs( el ) {
	return document.querySelector( el );
}

// document.querySelectorAll reduction
function $qsa( el ) {
	return document.querySelectorAll( el );
}

// Shows the number of trips and the averages between them
// @return {undefined}
function schedule_features() {
	let hour_part, prev_minutes, current_minutes, average_increment,
		hours_day = 0,
		hours_afternoon = 0,
		hours_night = 0,
		hours_total = 0,
		average_day = 0,
		average_afternoon = 0,
		average_night = 0,
		average_general = 0;

	if ( !$qsa( '#schedule_amount' ).length ) {
		$qsa( '.tit02' )[ 0 ].innerHTML += '<div id="schedule_amount" class="schedule_float schedule_padding">Quantidade de viagens</div>';

		$qsa( '.tit02' )[ 1 ].innerHTML +=
			'<div id="schedule_amount_total_text" class="schedule_float schedule_padding"> - Total: <div id="schedule_amount_total" class="schedule_float"></div></div>\
			 <div id="schedule_amount_night_text" class="schedule_float"> - Noite: <div id="schedule_amount_night" class="schedule_float"></div></div>\
			 <div id="schedule_amount_afternoon_text" class="schedule_float"> - Tarde: <div id="schedule_amount_afternoon" class="schedule_float"></div></div>\
			 <div id="schedule_amount_day_text" class="schedule_float">Manhã: <div id="schedule_amount_day" class="schedule_float"></div></div>';

		$qsa( '.tit02' )[ 1 ].parentNode.parentNode.nextElementSibling.innerHTML =
			'<div id="schedule_average" class="schedule_float schedule_padding">Média entre as saídas</div><br />\
			<div id="schedule_average_general_text" class="schedule_float schedule_padding"> - Geral: <div id="schedule_average_general" class="schedule_float"></div></div>\
			<div id="schedule_average_night_text" class="schedule_float"> - Noite: <div id="schedule_average_night" class="schedule_float"></div></div>\
			<div id="schedule_average_afternoon_text" class="schedule_float"> - Tarde: <div id="schedule_average_afternoon" class="schedule_float"></div></div>\
			<div id="schedule_average_day_text" class="schedule_float">Manhã: <div id="schedule_average_day" class="schedule_float"></div></div>';
	}

	// Gets the data
	$qsa( '#content table' )[ 0 ].querySelectorAll( 'td div' ).forEach( function( currentEl, i ) {
		if ( currentEl.innerHTML.search( /\d{2}:\d{2}/ ) === -1 )
			return;

		hour_part = currentEl.innerHTML.split( ':' );
		current_minutes = parseInt( hour_part[ 0 ] ) * 60 + parseInt( hour_part[ 1 ] );

		if ( i === 3 || !prev_minutes )
			prev_minutes = current_minutes;

		if ( i > 3 ) {
			average_increment = current_minutes < prev_minutes ? 60 - hour_part[ 1 ] + current_minutes : current_minutes - prev_minutes;
			prev_minutes = current_minutes;

			if ( currentEl.parentNode.getAttribute( 'bgcolor' ) === '#6699CC' )
				average_day += average_increment;
			else if ( currentEl.parentNode.getAttribute( 'bgcolor' ) === '#eaedf4' )
				average_afternoon += average_increment;
			else
				average_night += average_increment;
		}

		if ( currentEl.parentNode.getAttribute( 'bgcolor' ) === '#6699CC' )
			hours_day++;
		else if ( currentEl.parentNode.getAttribute( 'bgcolor' ) === '#eaedf4' )
			hours_afternoon++;
		else
			hours_night++;
	} );

	// Sets the averages
	hours_total = ( hours_day + hours_afternoon + hours_night );
	average_general = average_day + average_afternoon + average_night;
	average_general = ( hours_total > 2 ) ? average_general / ( hours_total - 1 ) : average_general;
	average_day = ( hours_day > 2 ) ? average_day / ( hours_day - 1 ) : average_day;
	average_afternoon = ( hours_afternoon > 2 ) ? average_afternoon / hours_afternoon : ( ( average_afternoon === average_general ) ? average_afternoon : average_afternoon / 2 );
	average_night = ( hours_night > 2 ) ? average_night / hours_night : ( ( average_night === average_general ) ? average_night : average_night / 2 );

	// Shows the data on screen
	$qs( '#schedule_amount_day' ).innerHTML = hours_day;
	$qs( '#schedule_amount_afternoon' ).innerHTML = hours_afternoon;
	$qs( '#schedule_amount_night' ).innerHTML = hours_night;
	$qs( '#schedule_amount_total' ).innerHTML = hours_total < 0 ? 0 : hours_total;
	$qs( '#schedule_average_day' ).innerHTML = format_time( average_day );
	$qs( '#schedule_average_afternoon' ).innerHTML = format_time( average_afternoon );
	$qs( '#schedule_average_night' ).innerHTML = format_time( average_night );
	$qs( '#schedule_average_general' ).innerHTML = format_time( average_general );

	hours_day = hours_afternoon = hours_night = average_day = average_afternoon = average_night = average_general = 0;
}

// Puts the child track number in data callback
// @return {undefined}
function child_set() {
	let $this, childcode;

	// Waits the data loads
	setInterval( function() {
		$( '#dados tbody tr' ).each( function( index ) {
			if ( index > 0 ) {
				$this = $( this ).find( 'td' )[ 0 ];
				childcode = /\'(\d{2})\'/.exec( $( this ).html() )[ 1 ];
				$this.textContent = $this.textContent.substr( 0, 4 ) + ( childcode !== '00' ? '-' + childcode : '' );
			}
		} );
	}, 10 );
}

// Main function
// @return {undefined}
function main() {
	let wait_load, wait_modal_load;

	// Enables search with ENTER button
	$( '#itemBusca' ).change( function() {
		child_set();

		if ( $( this ).val() == '3' ) {
			$( document ).on( 'keydown click', '#codigoBusca, #consulta_linha img', function( event ) {
				if ( ( event.type === 'keydown' && event.key === "Enter" )
					|| ( event.type === 'click' && event.target.tagName === 'IMG' )
				) {
					event.preventDefault();
					buscar_codigo( '3' );
				}
			} );
		}

		if ( $( this ).val() == '4' ) {
			$( document ).on( 'keydown', '#linhaBusca', function( event ) {
				if ( ( event.type === 'keydown' && event.key === "Enter" )
					|| ( event.type === 'click' && event.target.tagName === 'IMG' )
				) {
					event.preventDefault();
					buscar_linha();
				}
			} );
		}
	} );

	$( document ).on( 'click', 'img[alt="Horário"]', function() {
		wait_load = setInterval( function() {
			if ( !!$( '#cboxContent #content' ).length ) {
				clearInterval( wait_load );
				schedule_features();
			}
		}, 10 );
	} );

	$( document ).on( 'click', '#frmHorario img[height="20"]', function() {
		wait_modal_load = setInterval( function() {
			if ( !$( 'img[src="images/load.gif"]' ).length ) {
				clearInterval( wait_modal_load );
				schedule_features();
			}
		}, 10 );
	} );

	$( '#itemBusca' ).find( 'option[value="3"]' ).attr( 'selected', true ).trigger( 'change' );
	change_busca();
}

// Inits
if ( location.href === 'http://www.transalvadorantigo.salvador.ba.gov.br/homologacao/?pagina=onibus/onibus' )
	window.onload = main;
else
	window.onload = schedule_features;

}() );