// ==UserScript==
// @name DC_time_updated
// @author Ianouf, Ladoria
// @version 0.3
// @grant none
// @description Display DC's date, hour, min & sec on top of the screen.
// @match http://www.dreadcast.net/Main
// @copyright 2015+, Ladoria
// @namespace InGame
// ==/UserScript==
var server_date = undefined;
var old_server_date = undefined;
var handled_seconds = 0;
var first_sync = true;
var debugDeck = true;
$(document).ready( function() {
// All glory to Ianouf
//Affichage de la date
$('#bandeau ul.menus').eq(0)
.prepend('<li id="affichageDateDC" class="couleur5" ></li>'
+'<li class="separator"></li>'
+'<li id="affichageDate" class="couleur5" ></li>'
+'<li class="separator"></li>');
// End of glory
// Get and store the server date
$(document).ajaxComplete( function(a,b,c) {
server_date = new Date(b.getResponseHeader('Date'));
if(first_sync)
old_server_date = server_date;
first_sync = false;
});
// Display DC's server date
function handle_DC_date() {
if(undefined == server_date)
return;
// server_date's refreashing all 3s, need to handle secondes between refreahs.
if(server_date.getTime() != old_server_date.getTime()) {
old_server_date = server_date;
handled_seconds = 0;
}
else
handled_seconds++;
var server_seconds = server_date.getSeconds() + handled_seconds;
// seconds handled.
// display hour & DC's date
date_to_display = new Date(server_date.getTime());
date_to_display.setSeconds(server_seconds);
// All glory to Ianouf
$('#affichageDate').html(date_to_display.toLocaleString());
$('#affichageDateDC').html(get_DC_date(server_date));
// End of glory
}
// All glory to Ianouf
// input : Date
function get_DC_date(date) {
var server_day = date.getDate();
var server_month = date.getMonth() + 1; // 0-11
var server_year = date.getYear() - 100;
var dc_hep = Math.floor(server_day / 7) + 1; //heptade
var dc_day = (server_day % 7); //jour de l'heptade
var dc_year = 70 + (server_year * 12) + server_month; //année, basé sur le fait que janvier 2000 est l'an 70 de DC.
//le jour 0 est plutot le dernier jour de l'heptade précédente!
if (dc_day == 0) {
dc_hep--;
dc_day=7;
}
return dc_day+'/'+dc_year+'.'+dc_hep;
}
// End of glory
// input format : ddmmyyyy
// throw dummy exception
function cast_date(text) {
var date;
var day = text.substring(0,2);
var month = text.substring(2,4) - 1; // 0-11
var year = text.substring(4);
if(isNaN(day) || isNaN(month) || isNaN(year)
|| day > 31 || month > 11 || year.length != 4)
throw true;
date = new Date(year, month, day, 0, 0, 0, 0);
return date;
}
// Uunimplemented
// input format : x/xxx.x whatever those x can mean
function get_date_form_DC(date) {
return "unimplemented";
}
handle_DC_date();
setInterval(function() { handle_DC_date(); }, 1000);
// CommandLine 'Object'
var CommandLine_DC_time = function (command_line) {
this.command_line = command_line;
this.argument = '';
this.parameter = '';
if(/\-/gi.test(command_line)) { // argument given
this.argument = command_line.trim().split("-")[1];
if(/ /gi.test(this.argument)) { // parameter given
this.argument = command_line.trim().split("-")[1].split(" ")[0];
this.parameter = command_line.trim().split("-")[1].split(" ")[1];
}
}
this.enabledArguments = ['d', // display converted standard date to DC's date
't', // display converted DC's date to standard date
'a']; // display the manual
// processing the command
// input : Deck object
this.execute = function(deck) {
switch (this.argument) {
case '' : // display DC's server date
var deckLine = Deck.getHTMLElementLineTab(["span", "armakit", get_DC_date(server_date)]);
deck.putResultsLines([deckLine]);
break;
case 'd' : // display converted standard date to DC's date
var date;
try {
date = get_DC_date(cast_date(this.parameter));
}
catch (e) {
date = 'Date ancienne invalide (ddmmyyyy) dd : 00 - 31, mm 00 - 12, yyyy : 0000 - 9999';
}
var deckLine = Deck.getHTMLElementLineTab(["span", "armakit", date]);
deck.putResultsLines([deckLine]);
break;
case 't' : // display converted DC's date to standard date
var deckLine = Deck.getHTMLElementLineTab(["span", "armakit", get_date_form_DC(this.parameter)]);
deck.putResultsLines([deckLine]);
break;
default : // display the manual
deck.putResultsLines(this.getManualLines());
break;
}
};
this.getManualLines = function() {
manualLines = new Array();
manualLines[manualLines.length] = Deck.getHTMLElementLineTab(["span", "armakit","*** Aide ***"]);
manualLines[manualLines.length] = Deck.getHTMLElementLineTab(
["span", "armakit","- Commande : "],
["span", "armakit important_data","date"],
["span", "armakit"," [- d | t | a]"]);
manualLines[manualLines.length] = Deck.getHTMLElementLineTab(
["span", "armakit", "- "],
["span", "armakit important_data", "d"],
["span", "armakit", " : Convertir une "],
["span", "armakit important_data", "D"],
["span", "armakit", "-ate ancienne."]);
manualLines[manualLines.length] = Deck.getHTMLElementLineTab(
["span", "armakit", "- "],
["span", "armakit important_data", "t"],
["span", "armakit", " : Convertir un point "],
["span", "armakit important_data", "T"],
["span", "armakit", "-emporel Impérial."]);
manualLines[manualLines.length] = Deck.getHTMLElementLineTab(
["span", "armakit", "- "],
["span", "armakit important_data", "a"],
["span", "armakit", " : Afficher l'"],
["span", "armakit important_data", "A"],
["span", "armakit", "-ide."]);
return manualLines;
};
}
var Deck = function (id) {
this.id = id;
// Use it with result of Deck.getHTMLElementLineTab() (see below)
// input : lines[]
this.putResultsLines = function (lines) {
for(var i = 0; i < lines.length; i++) {
var resultsDiv = document.createElement('div');
resultsDiv.className = "ligne_resultat_fixed";
for(var j = 0; j < lines[i].length; j++) {
var domElement = document.createElement(lines[i][j]['type']);
domElement.className = lines[i][j]['class'];
domElement.appendChild(document.createTextNode(lines[i][j]['text']));
resultsDiv.appendChild(domElement);
}
$("#" + this.id).find(".zone_ecrit").last().append(resultsDiv);
}
}
}
// Start to fuck the DOM
// DO NOT USE, NEVER, I WARNED YOU FOOL
Deck.getHtmlElementTab = function(type, elementClass, text) {
anElement = new Array();
anElement["type"] = type;
anElement["class"] = elementClass;
anElement["text"] = text;
return anElement;
}
// input : [ [type_of_dom_element, class, text_node], ... ]
Deck.getHTMLElementLineTab = function() {
var lineTab = new Array();
for(var i = 0; i < arguments.length; i++) {
lineTab[lineTab.length] = Deck.getHtmlElementTab(arguments[i][0],arguments[i][1],arguments[i][2]);
}
return lineTab;
}
// Dom fucked
$(document).ajaxComplete( function(a,b,c) {
// Get and store the server date
server_date = new Date(b.getResponseHeader('Date'));
if(first_sync)
old_server_date = server_date;
first_sync = false;
// Handle custom deck command
if(/Command/.test(c.url)) {
var deckId = 'db_deck_' + c.data.match(/[0-9]*$/)[0];
var commandLine_text = $('#' + deckId + ' .ligne_ecrite_fixed').last().find('input').val();
// Handle Date command
if(/date/gi.test(commandLine_text)) {
// Bind Command and Deck objects
var deck = new Deck(deckId);
var commandLine = new CommandLine_DC_time(commandLine_text);
commandLine.execute(deck);
}
}
});
});
console.log('DC - Time Updated started');