windows-explorer-delete-saved-ftp-password-credentials-userdata
FTP Accounts/Passwörter des Windows Explorers löschen:
Registry (regedit.exe) starten und nach

HKEY_CURRENT_USER/Software/Microsoft/FTP/Accounts/[server]/[account]

ausschau halten.
Für ein Passwort Reset (zum Beispiel wenn „Passwort speichern“ aktiv aber neues Passwort) den „Password“ Datensatz in [account] löschen.
Um den kompletten Account mit allen Daten zu löschen entweder [server] komplett oder [account] löschen.

In Zeiten von NSA Vollüberwachung, BND Zusammenarbeit, „full take“s und weit mehr unfassbarem Bockmist etlicher Geheimdienste und Regierungen, muss man sich über Datenschutz und Verschlüsselung langsam mehr Gedanken machen. Ich danke jedem Entwickler, der den Nutzern dabei hilft, diese zwei wichtigen Ziele zu erreichen.

Also preise ich hier mal die Chrome Erweiterung BlockPRISM deutscher Studenten des Hasso Plattner Instituts und eines Studenten der Stanford University an. Diese Erweiterung verpasst dem Facebook Chat eine PGP Verschlüsselung und macht sie somit unlesbar für alle Fremden „Zuschauer“.

blockprism-facebook-verschlüsselung-chrome-erweiterung-passwordDazu müssen beide Chatpartner das Plugin installieren, sich damit bei Facebook anmelden und ein komplexes Passwort eingeben, mit dem die Verschlüsselung erfolgen soll. An dieser Stelle ist ein wirklich komplexes Passwort sinnvoll. Wichtig aber: merkt euch das Passwort! Ihr müsst an allen Geräten, auf denen ihr die Chats verschlüsseln wollt, das gleiche Passwort eingeben.

Und schon läuft die Verschlüsselung unsichtbar im Hintergrund. Ist das Plugin installiert und aktiv sieht man nur den normalen Text. Deaktiviert man aber die Erweiterung, sieht man nur unlesbaren Text.
blockprism-facebook-verschlüsselung-chrome-erweiterung-sichtbar blockprism-facebook-verschlüsselung-chrome-erweiterung-verschlüsselt

Das rockt und ist ziemlich sicher. Nun kann man also auch privatere Informationen über den Chat austauschen, ohne sich Gedanken machen zu müssen.

Als Hobby-Webentwickler und fanatischer Batch Scripter musste das Thema Batch HTML Reports ja irgendwann mal kommen. Heißt: Batch führt irgendwelche Aktionen aus und visualisiert das Ergebnis in einer schönen HTML Datei.

Eigentlich straight forward: in der Batch Datei wird ein

echo

mit HTML Code in eine .html Datei umgeleitet, fertig. Naja, ganz so einfach ist es leider nicht.
Hier ein Beispiel:

echo "<html><body>" > t.html
echo "Ein Test " >> t.html
echo "<span>Fehlerlevel: %errorlevel%</span>" >> t.html
echo "</body></html>" >> t.html

Ergebnis:
html-berichte-mit-batch-problem-einfaches-beispiel

Der Batch

echo

Befehl würde an eckigen Klammern und Slashes abstürzen, daher muss jeglicher HTML Code in Anführungsstrichen eingebettet werden. Leider schreibt Batch diese Anführungszeichen mit in das Dokument.
Nun gibt es sicherlich einige Lösungsansätze:

1. (nicht empfohlen) Alle Sonderzeichen escapen und Anführungszeichen weglassen:

echo ^<html^>^<body^> > t.html
echo Ein Test  >> t.html
echo ^<span^>Fehlerlevel: %errorlevel%^<^/span^> >> t.html
echo ^<^/body^>^<^/html^> >> t.html

Alle Sonderzeichen, die den Batch

echo

Befehl in die Knie zwingen würden, werden mit dem Escapezeichen ^ neutralisiert. Funktioniert, but… seriously? Ich hoffe aber niemand denkt ernsthaft darüber nach diese Technik zu verwenden…

2. (nicht empfohlen) HTML Code nicht über das Batch sondern über eine externe Komponente schreiben:
Wenn Batch ungern HTML schreibt könnte man auch ein externes Programm oder Script aufrufen und den gewünschten HTML String irgendwie übergeben. Klingt aber schon im Ansatz irgendwie uncool.

3. HTML mit Anführungszeichen schreiben und diese dann rausfiltern:
Also so mache ich das zumindest!
Der HTML Code wird wie im Beispiel oben geschrieben und danach nutze ich mein Zeichen-suchen-und-ersetzen-vbs-Script aus dem letzten Artikel und filtere die Anführungszeichen raus.
Batch:

echo "<html><body>" > t.html
echo "Ein Test " >> t.html
echo "<span>Fehlerlevel: %errorlevel%</span>" >> t.html
echo "</body></html>" >> t.html

cscript //nologo deleteChar.vbs "t.html" "t-neu.html"

deleteChar.vbs:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForWriting = 2
' Parameter einlesen
inputFile = WScript.Arguments(0)
outputFile = WScript.Arguments(1)

' Datei öffnen und Text einlesen und schließen
Set objFile = objFSO.OpenTextFile(inputFile, ForReading)
strText = objFile.ReadAll
objFile.Close

' Anführungszeichen rauslöschen
strNewText = Replace(strText, """", "")

' Neue Datei erstellen mit neuen Inhalten füllen
set resultFile = objFSO.CreateTextFile(outputFile, true)
resultFile.WriteLine strNewText
resultFile.Close

Resultat:
html-berichte-mit-batch-vbs-workaround


Ping Test HTML Report

Nun kann ich also HTML schreiben. Der Weg zum schönen HTML Bericht ist aber noch nicht geschafft. Ich empfehle einen gewissen Projekt-Aufbau um bessere HTML Berichte zu erstellen.
Vorschlag:

  • vorlage.html – enthält bereits ein halbes HTML Gerüst
  • style.css – für das Design
  • script.bat – das Script
  • deleteChar.vbs – siehe oben, löscht die Anführungszeichen
  • temp.html – temporär für die Batch
  • report.html – fertiger Report nachdem deleteChar.vbs die temp.html bearbeitet hat

Batch:

Color 9f
@echo on
setlocal

REM Vorlage nach temp.html kopieren, damit der HTML Code nicht jedes Mal komplett
REM geschrieben werden muss. Vor allem wenn der <head> und der Aufbau größer ist.
REM Kann alles schon fertig in die vorlage.html geschrieben werden.
cmd /c echo d | xcopy "vorlage.html" "temp.html" /c /v /i /y

REM optionaler Timestamp
echo "<span id="timestamp">%date% %time%</span>" >> "temp.html"

REM Bericht füllen, Code from: http://stackoverflow.com/a/3870183/516047
for /f "tokens=1,2 delims=[]" %%a IN ('ping -n 1 www.google.de') DO (
 if "%%b" NEQ "" set ip=%%b
)
echo "<div class='computer'><span class='name'>www.google.de</span><span class='comment'>IP: %ip%</span></div>" >> temp.html

for /f "tokens=1,2 delims=[]" %%a IN ('ping -n 1 www.microsoft.com') DO (
 if "%%b" NEQ "" set ip=%%b
)
echo "<div class='computer'><span class='name'>www.microsoft.com</span><span class='comment'>IP: %ip%</span></div>" >> temp.html

for /f "tokens=1,2 delims=[]" %%a IN ('ping -n 1 www.facebook.de') DO (
 if "%%b" NEQ "" set ip=%%b
)
echo "<div class='computer'><span class='name'>www.facebook.de</span><span class='comment'>IP: %ip%</span></div>" >> temp.html

for /f "tokens=1,2 delims=[]" %%a IN ('ping -n 1 www.hannes-schurig.de') DO (
 if "%%b" NEQ "" set ip=%%b
)
echo "<div class='computer'><span class='name'>www.hannes-schurig.de</span><span class='comment'>IP: %ip%</span></div>" >> temp.html

for /f "tokens=1,2 delims=[]" %%a IN ('ping -n 1 http://studium.hannes-schurig.de') DO (
 if "%%b" NEQ "" set ip=%%b
)
echo "<div class='computer'><span class='name'>http://studium.hannes-schurig.de</span><span class='comment'>IP: %ip%</span></div>" >> temp.html

echo "</div><!--#wrapper--></body></html>" >> "temp.html"

REM Anführungszeichen aus der temp.html löschen und in report.html schreiben
cscript //nologo "deleteChar.vbs" "temp.html" "report.html"

REM temp.html löschen
if exist temp.html del /f /q temp.html

:end
endlocal

vorlage.html:

<!DOCTYPE html>
<html lang='de'>
  <head><title>PC Monitor</title><link rel='stylesheet' type='text/css' href='style.css' /></head>
  <body>
  <div id='wrapper'>

Ergebnis:
html-berichte-mit-batch-fertiger-bericht

Download

Ping HTML Report Beispiel herunterladen
html-berichte-mit-batch-aufbau

Hier ein weiteres Beispiel, wie ich mit einigen zusätzlichen Programmierungen (Download gibts auf Anfrage) die Konnektivität von Arbeitsrechnern überprüfe und anzeigen lasse:
html-bericht-mit-batch-computer-status-report

Progress Bars, also Fortschrittsanzeigen, sind eine gute Möglichkeit zur Visualisierung von Fortschritten. Eine datumsbasierte Progress Bar, die den Fortschritt von einem Startdatum zum Enddatum visualisiert, habe ich auf meiner neuen Studienseite eingebaut.

datumsbasierte-fortschrittsanzeige-mit-jquery-screen

Demo

DEMO

HTML:

<progress id="progressbar" value="" max="100"></progress>
<div class="progress-value"></div>
<div class="clear"></div>
<div id="progress-days">
  <p>Vergangene Tage:  <span id="days-spend"></span></p>
  <p>Verbleibende Tage: <span id="days-left"></span></p>
  <p>Tage gesamt:  <span id="days-total"></span></p>
</div>

HTML spielt also nur den Platzhalter für die wichtigen Elemente. Wichtig ist nur, dass der max Wert der Progress Bar auf den gewünschten Wert gesetzt ist. Dieser wird von Javascript ausgelesen.

Apropos, Javascript:

$(document).ready(function() {

/**
 * #########################
 *  Time-Based Progress Bar
 * #########################
 * @name	Time-Based Progress Bar
 * @desc	Datumsbasierte Fortschrittsanzeige 
 * @author	Hannes Schurig
 * @date	2013-06-27
 * @lastmodified	2013-06-30
 * @version	0.1
 *
 * @ref http://studium.hannes-schurig.de
 * @see http://studium.hannes-schurig.de
 */

	// Progress Bar Management
	// nice short introduction: http://www.hongkiat.com/blog/html5-progress-bar/
	var progressbar = '#progressbar',
		startDate = [2012,04,01], endDate = [2015,04,01],
		max = $(progressbar).attr('max'),
		finishedSeconds = 0, finishedPercent = 0, finishedPercentRound = 0,
		daysSpend = daysSince(startDate[0],startDate[1],startDate[2]), 
		daysLeft = daysUntil(endDate[0],endDate[1],endDate[2]),
		daysTotal = daysSpend + daysLeft;

	function calculateProgressedPercent() {
		finishedSeconds = ((new Date() - new Date(startDate[0],startDate[1]-1,startDate[2])) / 1000);
		totalSeconds = daysTotal * 86400; // days total to seconds
		finishedPercentRound = Math.round(((finishedSeconds * 100) / totalSeconds) * 10000) / 10000;
		$(progressbar).val(finishedPercentRound);
		$('.progress-value').html(finishedPercentRound + '%');
		return finishedPercentRound;
	}	
	
	calculateProgressedPercent();
	
	// setting up timer for recalculating the progressbar
	var animate = setInterval(function() {
	    var finishedPercentRound = calculateProgressedPercent();
	    if (finishedPercentRound >= max) {
	        clearInterval(animate);			           
	    }
	}, 5000);
	
	// days until... adapted the following function:
	// see: http://stackoverflow.com/questions/1854410/shopping-days-till-christmas-counter-jquery
	function daysUntil(year, month, day) {
	  var now = new Date(),
		  dateEnd = new Date(year, month - 1, day), // months are zero-based
		  days = (dateEnd - now) /1000/60/60/24;   // convert milliseconds to days
	
	  return Math.round(days);
	}
	// adapted for own daysSince function
	function daysSince(year, month, day) {
	  var now = new Date(),
		  dateStart = new Date(year, month - 1, day), // months are zero-based
		  days = (now - dateStart) /1000/60/60/24;   // convert milliseconds to days
	
	  return Math.round(days);
	}
	
	// dates to html and update
	$('#days-spend').html(daysSpend);
	$('#days-left').html(daysLeft);
	$('#days-total').html(daysTotal);

});

Okay, let’s go through:
In den Zeilen 20 und 21 müsst ihr die ID der Progress Bar und das gewünschte Start- und Enddatum eintragen; der Rest läuft dann von selbst.
Die Zeilen 22 bis 26 errechnen ein paar initiale Werte, die später noch gebraucht werden.
In der Funktion

calculateProgressedPercent()

wird der Prozentwert der bereits verstrichenen Zeit angezeigt. Dieser wird auch direkt als Wert der Progress Bar in Inhalt des Overlays gesetzt und dann zurückgegeben. Funktionalität und Anzeige könnte man hier natürlich trennen.
Die Zeile 31 bestimmt übrigens am Ende die Anzahl der Nachkommastellen des Prozentwertes. An der Stelle

* 10000) / 10000

könnt ihr also Nullen entfernen oder anhängen um den Prozentwert zu verändern.
Zeile 37 führt diese Funktion beim Seitenaufruf ein Mal initial auf.
Zeile 40 bis 45 setzen einen Timer, der alle 5 Sekunden diese Funktion aufruft; bis der Prozentwert den max Wert der Progress Bar überschreitet.
Die 2 Datumsfunktionen errechnen die Anzahl der Tage von 2 Szenarien: Startdatum bis heute und heute bis Enddatum.
Und die letzten 3 Zeilen schreiben diese Tagesanzahl einfach nur zur Übersicht auf die Seite.

Sicherlich lassen sich die Berechnungen und der Code an sich noch optimieren. Aber die Sache läuft ganz rund.

In eigener Sache möchte ich heute kurz den Dienst servercheck24.de unter die Lupe nehmen. Der Dienst ist einer von vielen kostenpflichtigen Server Monitoring Diensten, kann sich in dem Preissegment aber sehen lassen. Im Gegensatz zu vielen Server Monitoring Anbietern hat Servercheck24 gleich 3 Preismodelle und ist somit für viele Anwendungsbereiche geeignet. Es gibt zwar leider kein kostenloses Angebot (was ich definitiv empfehlen würde), eine 14-tägige Testphase kann jedoch einen guten Einblick in die Features geben.
Ich habe mir das mal angesehen.

Coolerweise haben die Betreiber von servercheck24.de direkt nach der Veröffentlichung meines Tests einige angemerkte Stellen ausgebessert und mich informiert. Entsprechende Stellen habe ich im Beitrag angepasst.

Die Registrierung ist schnell gemacht und unkompliziert. Nach der Registrierung bekommt man direkt einen Überblick über die Features. Der „Server“ Menüpunkt ist natürlich die erste Station; hier kann man seinen ersten Server erstellen, bzw. dessen Überwachung. Die Eingabe einer URL ist erforderlich und ein Name wird vergeben.

Vorher: Die Eingabe kann anfangs knifflig werden. Meine ersten Versuche mit http:// am Anfang schlugen direkt fehl, egal welche Kombinationen ich probierte. Viel Hilfe gibt es beim Eingeben auch nicht, so eine Art Formatbeschreibung wie www.[name].[tld] hätte mir ja gereicht. Die URL Eingabe soll nämlich ohne Protokoll sein, nur www. am Anfang. Etwas ungewöhnlich aber verständlich, denn erst im nächsten Schritt wird erst das Protokoll gewählt, dass überwacht werden soll.
Nachher: Die Eingabe der URL sollte problemloser verlaufen, seit dem nun ein kleiner Hinweis unter dem Eingabefeld auf das Format hinweist.
serverueberwachung-uptimechecks-und-mehr-servercheck24-url-neu

serverueberwachung-uptimechecks-und-mehr-servercheck24-overview serverueberwachung-uptimechecks-und-mehr-servercheck24-protocols

Die Protokolle, die man überwachen kann, sind zahlreich. HTTP(S), SSH, FTP, DNS, Mailsprotokolle, TCP, PING, MYSQL, Domains, da ist alles wichtige mit dabei. Von normalen HTTP Abfragen bis hin zu stark modifizierten HTTPS Requests mit Suchbegriffen, Login Credentials, User-Agents, modifiziertem Header und POST Parametern ist da alles einstellbar. Die Möglichkeiten reichen also auch tief in interne, abgesicherte Webbereiche.

Vorher: Traurig: sowohl bei der Eingabe als auch in der Übersicht wird das Passwort der Login Credentials als Klartext dargestellt. C’mon, r’lly? Wenn ein

type="password"

im Eingabefeld schon zu viel Code ist, möchte ich nicht wissen wie die Passwörter in der Datenbank gespeichert sind. Unbedingt ändern!
Nachher: Die Passwörter werden nun maskiert angezeigt, so wie es sich gehört. Die erhöhte Sicherheit wird hoffentlich in der gesamten Programmierung des Dienstes so angestrebt wie bei den Textfeldern.
serverueberwachung-uptimechecks-und-mehr-servercheck24-password1-neu serverueberwachung-uptimechecks-und-mehr-servercheck24-password2-neu

Nach der Eingabe erscheint die Übersicht der Einstellungen, mit den Einstellungen für die Benachrichtigung und den Kontakten, die Benachrichtigungen erhalten sollen. Benachrichtigungen können entweder als E-Mail oder als SMS rausgehen, abhängig vom Status der Webseite. Eine Pager Nachricht ist ebenfalls möglich, sollte jemand noch einen Pager haben.
serverueberwachung-uptimechecks-und-mehr-servercheck24-new-http-pro-server serverueberwachung-uptimechecks-und-mehr-servercheck24-server-overview

Vorher: Leider scheinen SMS bisher nur in den USA möglich zu sein, deutsche Mobilfunkbetreiber sucht man vergeblich.
Nachher: Zugegeben, an dieser Stelle habe ich vermutlich nicht aufmerksam genug geschaut. Die Landesvorwahl +49 für Deutschland ist vorhanden und enthält auch die größeren hiesigen Netzbetreiber. Neu ist jetzt, dass sowohl beim Erstellen eines Accounts als auch beim Bearbeiten von Kontakteinstellungen automatisch die passende Landesvorwahl ausgewählt wird. Ich musste also +49 nicht einmal auswählen; das geschieht jetzt automatisch. Es funktioniert alles problemlos, TOP!
serverueberwachung-uptimechecks-und-mehr-servercheck24-sms serverueberwachung-uptimechecks-und-mehr-servercheck24-sms2

Weitere Protokolle und Server sind schnell erstellt und die eigene Weblandschaft in wenigen Minuten zur Überwachung konfiguriert. Dabei werden alle Protokolle eines Servers in eine „Gruppierung“ gesteckt. Ein neuer Server ist mit seinen Protokollen eine neue Gruppe. Mehrere logisch zusammengehörige Server zu einer Gruppe oder Art Kategorie zusammenzufügen geht leider nicht.
Für die Übersicht aller Server gibt es sowohl eine ausführliche und eine kurze Version.
serverueberwachung-uptimechecks-und-mehr-servercheck24-short-overview serverueberwachung-uptimechecks-und-mehr-servercheck24-detailed-overview

Zwei weitere nette Features sind der grafische Verlauf und der Auswertungsversand.
Ersteres zeigt den Status eines Servers in einem bestimmten Zeitraum grafisch an. Leider lassen sich hier nicht mehrere Protokolle oder Server in eine Grafik packen. Die Daten lassen sich in typische Dateiformate exportieren. Und die Auswertungen sind konfigurierbare regelmäßige Reports per E-Mail.
serverueberwachung-uptimechecks-und-mehr-servercheck24-daily-report serverueberwachung-uptimechecks-und-mehr-servercheck24-grafic-status

Fazit? Servercheck24 bietet ein recht angenehmes Preis-Leistungs-Verhältnis. Wer nicht viele Seiten zu überwachen hat kann mit 5€/Monat schon alle Features nutzen, mit einem 10 Minuten Intervall allerdings. Ich habe mal nach der Konkurrenz gesehen und nur sehr wenige (und auch wenig brauchbare) kostenlose Angebote, dafür aber auch viele recht teure Angebote gefunden.

Vorher: Wenn Servercheck24 jetzt noch die paar Kinderkrankheiten (ich glaube der Dienst ist erst vor ca 2, 3 Jahren online gegangen) ausbessern kann, sehe ich große Chancen in dem Markt.
Nachher: Innerhalb von 1 Tag haben die Entwickler einige Punkte ausgebessert und ich habe das Gefühl, dass in diesen Dienst noch sehr viel Energie fließen wird. Hut ab, Daumen hoch, go for it!

Interessiert? Einfach für einen Tarif registrieren und den Testzeitraum nutzen.

jquery-animationen-zeitversetzt-mit-callback-delay-queue

jQuery Animationen sind einfach:

animation()

,

fadeToggle()

und

slideToggle()

erledigen die Arbeit schnell und unkompliziert. Es kann jedoch kompliziert werden, wenn man Animationen nacheinander abarbeiten möchte.
Generell werden Animationen „gleichzeitig“ ausgeführt, außer sie betreffen das selbe Objekt.
Verschiedene Objekte zeitverzögert zu animieren kann schon schwierig werden.

Ausgangssituation

2 Objekte mit je einer Animation:

$('#a').animate({
	width: '-=10px',
	height: '-=10px'
}, 2000, function() {
	// callback
});
$('#b').animate({
	width: '-=20px',
	height: '-=20px'
}, 2000, function() {
	// callback
});

2 Objekte, die gleichzeitig animiert werden obwohl der Code dies nicht vermuten lässt.

Demo

DEMO

Es gibt verschiedene Herangehensweisen für dieses Problem.

Lösung? callback()!

callback()

‚, oder auch

complete()

in der jQuery API Doc (Beispiel

animate()

), ist eine Funktion, die beim erfolgreichen Beenden einer Animation ausgeführt wird.
Ein Beispiel:

$('#b').animate({
	width: '-=10px',
	height: '-=10px'
}, 2000, function() {
	$('#a').animate({
		width: '-=20px',
		height: '-=20px'
	}, 2000, function() {
		// callback
	});
});

In der

callback()

Funktion können weitere Befehle folgen, die nach der beendeten Animation ausgeführt werden sollen.

Demo

DEMO

Alternative? delay()!

Den meisten jQuery Animationen kann man durch die Verwendung von

delay()

eine Pause anhängen. Die folgenden Befehle beziehen sich somit auf das selbe Objekt, sind aber zeitlich verzögert. Diese Methode ist nur auf Animationen anwendbar, die die Browser ‚effects queue‘ (auch ‚fx-queue‘ genannt) verwenden.

$('#a')
 .animate({
	width: '-=20px',
	height: '-=20px'
 }, 2000)
 .delay(2000)
 .fadeToggle()
 .delay(2000)
 .fadeToggle();
$('#b')
 .animate({
	width: '-=10px',
	height: '-=10px'
 }, 500)
 .delay(500)
 .slideToggle()
 .delay(500)
 .slideToggle();

Die verschiedenen Animationen sind nun zeitlich verzögert.

Demo

http://public.hannes-schurig.de/LocationMapDemo/map.php
Nach einem

objectA.delay()

Befehle folgen zu lassen, die auf ein anderes Objekt wirken sollen, geht meines Wissens nach nicht. Zwei Objekte zeitlich verzögert animieren geht damit also nicht. Dafür hilft aber die nächste Lösung!

Nun kommt es in jQuery jedoch oft vor, dass Befehle keine Animationen sind und somit weder ein callback besitzen noch ein delay verstehen. Solche Funktionen sind beispielsweise

html()

,

append()

,

css()

,

addClass()

oder

removeClass()

. Mit der folgenden Lösung lassen sich auch solche Funktionen zeitlich verzögert abarbeiten!

Lösung? queue()!

Die Funktion

queue()

erstellt eine ‚effects queue‘ Befehlskette, die beliebig gefüllt und dann abgearbeitet werden kann. Wie oben erklärt kann man das Ausführen von Befehlen innerhalb einer ‚effects queue‘ durch Anwendung von

delay()

zeitlich verzögern.

queue().delay()

ermöglicht es damit beliebige Befehle zeitlich verzögert auszuführen.

Der grobe Aufbau sieht wie folgt aus:

$(object).queue(function(param) {
	// Befehle
$(param).dequeue();
}).delay(1000).queue(function(param) {
	// Befehle nach 1 Sekunde Pause
$(param).dequeue();
});

Das Finale!

Hier das obrige Beispiel leicht angepasst: erst verändert sich Block #a in mehreren Schritten und erst danach Block #b:

$('#a').queue(function(next) {
	// 2 Sekunden Pause vor dem ersten Befehl
	$(next).dequeue();
}).delay(1000).queue(function(next) {
	$(this).css("background-color", "red");
	$(next).dequeue();
}).delay(1000).queue(function(next) {
	$(this).addClass("test");
	$(next).dequeue();
// block #b wird nun verändert:
}).delay(1000).queue(function(next) {
	$('#b').css("background-color", "red");
	$(next).dequeue();
}).delay(1000).queue(function(next) {
	$('#b').addClass("test");
	$(next).dequeue();
}).delay(1000).queue(function(next) {
	$('#b').animate({
		top: '+=150px'
	}, 1000);
	$(next).dequeue();
});
Demo

DEMO
BHAM! Zeitlich verzögerte Verarbeitung von beliebigen Befehlen von mehreren Objekten!

Update:
Mit der Javascript Funktion

setTimeout()

lassen sich auch extrem easy beliebige Elemente/Befehle zeitversetzt ausführen:

$("#signup-form input").addClass("success");
setTimeout(function (){
	$('#signup-carousel').carousel("next");
}, 2000);

Schande auf mein Haupt, dass ich das damals nicht schon kannte.

Die

queue()

Funktion kann man dabei direkt von dem Element aufrufen, dass animiert oder verändert werden soll, und innerhalb der

queue()

dann

$(this)

benutzen. Alternativ kann man auch ein globaleres Objekt benutzen, zum Beispiel

$(window).queue()

.

Damit sollte ich das Thema zeitverzögerte Animationen zu genüge beleuchtet haben. Bei meinem letzten Webprojekt spielte dieses Thema eine große Rolle und ich musste viel rumprobieren und testen bis ich die richtigen Einsatzgebiete und teils seltsamen Verhalten dieser Funktionen erkannt hatte. Wer sich also mit dem Thema auskennt, Fehler findet, weitere Möglichkeiten kennt, immer her damit!

Vor langer Zeit suchte ich eine Möglichkeit coole Locations und besuchenswerte Orte gut sichtbar „anpinnen“ zu können, auf einer großen Karte wie der Google Map. Warum das nicht selber entwickeln? 😉

Mit der „Location Map“ habe ich versucht diesen Gedanken umzusetzen. Auf der Google Map kann man mit Hilfe eines Formulars neue Locations mit einem Icon anpinnen, und noch eine Beschreibung hinzufügen. Die Beschreibung kann bequem mit einem Editor bearbeitet werden. Ebenso lassen sich die Einträge natürlich nachträglich bearbeiten und löschen.
location-map-interaktive-google-maps-webapplication-banner
location-map-interaktive-google-maps-webapplication-tooltip location-map-interaktive-google-maps-webapplication-editform

Der größte Knackpunkt des Projekts bestand darin die in der Datenbank gespeicherten Locations dynamisch auf die Google Map laden zu lassen und jeder Location ein eigenes Icon, ein Klick Event und ein Info Window zu geben. Diesen schweren Part würde ich hier kurz veröffentlichen. Ich gehe davon aus, dass ihr schon mit der Google Map hantiert und sie am besten auch schon lauffähig realisiert habt. Hier geht es jetzt nur noch im die Location Marker mit Icon, Klick Event und Info Box.

Hinweis: Dieser Code und die folgenden Anmerkungen beziehen sich auf eine veraltete Version der Location Map, zeigen aber die Grundfunktionalität der Map mit den Locations. Der Aufbau zeigt also eine Art Minimalgerüst. Für weitere Features bitte den Code aus der Demo Page (siehe unten) benutzen.
Code

map.php:

<body onload="initialize()" onunload="GUnload()">
<div id="map_canvas"></div>

In der Webseite wird beim onload die initialize Funktion aufgerufen, in der die Google Map initialisiert und zusammengebastelt wird.

locations-main.js:

/* GMaps v3 !!! */				
function initialize() {
	
	// map initialisieren
	map = new google.maps.Map(document.getElementById("map_canvas"), 
	{
		zoom: 11,
		center: new google.maps.LatLng(52.510788, 13.426666),
		mapTypeId: google.maps.MapTypeId.HYBRID
	}); 
	 
	// marker
	$.ajax({
		type: 'POST',
		url: 'locationmgr.php',
		dataType: 'json',
		data: 'action=get',
		success: function(data) {
			for (loca in data) {
				setMarkers( map, 
					data[loca]['XKoord'], 
					data[loca]['YKoord'],
					data[loca]['Titel'],
					data[loca]['Icon'],
					data[loca]['Inhalt'],
					data[loca]['EventID']
					);
			}
			infowindow = new google.maps.InfoWindow({
				content: "loading...",
				maxWidth: 300
			});
		}
	});
}

function setMarkers(map, XKoord, YKoord, Titel, Icon, Inhalt, ID) {
	var marker = new google.maps.Marker({
		position: new google.maps.LatLng(XKoord, YKoord),
		map: map,
		title: Titel,
		html: generateInfoWindowHtml(Titel, Icon, Inhalt, ID),
		icon: new google.maps.MarkerImage("img/"+ Icon +".png")
	});

	google.maps.event.addListener(marker, "click", function () {
		infowindow.setContent(this.html);
		infowindow.open(map, this);
		$('div.infowindow').css({
			'height':'+=3px'
		});
	});
}

function generateInfoWindowHtml(Titel, Icon, Inhalt, ID) {
	var html = "\
	<div class='infowindow'>\
		<img class='infowindowmoodicon' src='img/"+Icon+".png' alt='"+Icon+"' />\
		<h5>"+Titel+"</h5>\
		<div class='fulltext'>"+decodeHtml(Inhalt)+"</div>\
		<span class='edit' onclick='javascript:editLocation("+ID+");'>(edit)</span>\
	</div>";
	return html;
}

function decodeHtml(encodedHtml) {
  return encodedHtml
      .replace(/&amp;/g, '&')
      .replace(/&lt;/g, '<')
      .replace(/&gt;/g, '>')
      .replace(/&quot;/g, '"')
      .replace(/&#039;/g, "'");
}

Anmerkungen:
Wie in Zeile 1 schon gesehen, ist der Code nach dem aktuelleren Google Maps API v3 Standard programmiert. Irgendwann während meiner Entwicklung stellte Google von v2 auf v3 um und ich programmierte ebenso mein halbes Projekt um, man möchte ja mit dem Fortschritt mithalten.
In den Zeilen 4-10 wird die Google Map im div initialisiert, das Zentrum auf den Berlin Alexanderplatz gesetzt, Zoom und MapType gesetzt.
Nun werden in 12-19 die Locations mit der locationmgr.php aus der Datenbank geladen und für Javascript aufbereitet. Die Daten werden entgegengenommen und eine Schleife durchläuft nun in Zeile 19 jeden Locationdatensatz. setMarkers wird aufgerufen und erzeugt in den Zeilen 38-44 ein Marker Objekt. Dieses wird mit map: map direkt auf die Google Map gepinnt.
Hier erfolgt noch der Aufruf der generateInfoWindowHtml. Diese bastelt ein optisch etwas angepasstes InfoWindow mit der Beschreibung und gibt das komplette HTML Paket zurück an das Marker Objekt, welches daraus das Info Window baut.
In den Zeilen 46-52 wird ein Listener auf das soeben erstellte Marker Objekt gelegt.
Diese 3 Schritte – Marker erstellen, InfoWindow generieren, Listener zuweisen – werden für jede Location ausgeführt und in die Map integriert.


Demo

http://public.hannes-schurig.de/LocationMapDemo/map.php
Demo Version: 0.16


Changelog

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

Changelog (08.04.2013)

  • v0.1: Event Map zeigt Events an, Events können erstellt und gelöscht werden, 2 Icons stehen zur Verfügung
  • v0.2: Events lassen sich anklicken, ein kleines Popup mit Zusatzinformationen erscheint, Eingabe der Zusatzinformationen bei neuen Events möglich
  • v0.3: Statt getrennter X und Y Koordinaten kann jetzt ein Koordinatenstring, der sich aus Google Maps extrahieren lässt, eingeben
  • v0.4: Statische Icons in eine Datenbank übertragen, die möglichen Icons werden jetzt direkt beim Erstellen neuer Events angezeigt und können somit ausgewählt werden
  • v0.5: Infofenster für das Koordinatentextfeld, komplette Umbenennung in Location Map inklusive aller Codeverweise
  • v0.6: Locations löschen jetzt via selektieren, mit Suchfunktion
  • v0.7: etliche Designverbesserungen und Fixes
  • v0.8: komplette Umprogrammierung: Umstieg von Maps API v2 auf Maps API v3
  • v0.9: komplette Umprogrammierung: Umstieg von HTML Forms auf AJAX
  • v0.10: kleine Informationsfenster als Feedback für den User am unteren Bildschirmrand
  • v0.11: 2 Events mit gleichem Namen verboten, doppelte Überprüfung
  • v0.12: Edititeren von bestehenden Locations
  • v0.12.1: Löschen aus dem Update Dialog
  • v0.12.2: Umstrukturierung des HTML Codes, neuer Formularaufbau
  • v0.13: Dialog Manager kürzt den Code um ca 20%
  • v0.14: verbesserte Unterstützung von Auflösungen kleiner als 1280px
  • v0.14.1: Fehler im Dialog Manager, wenn der zu öffnende Dialog schon geöffnet ist, behoben
  • v0.15: für die Veröffentlichung vorbereitet: Read-Only-Modus, Read-Only-Designset
  • v0.15.1: neuer HTML Head, Meta Tags, see/ref ergänzt, CSSDOC DocBlock erweitert
  • v0.16: Maus-Features: Linksklick auf die Map -> fügt automatisch die Koordinaten des Klicks in das „Neue Location“ Koordinatenfeld ein, Rechtsklick auf die Map -> Management Menü (noch ungenutzt)

To-Do:
Rechte- & Usermanagement
Zuklappen der rechten Seite zulassen
Größen der Map und Formulare dynamisch ändern
Mehr Icons
fehlerhaften Login optisch hervorheben
Unterstützung für mobile Geräte und kleinere Auflösungen einbauen/verbessern


Download

Ich habe schon ein Paket fertig geschnürt, dass die komplette Entwicklung in wenigen Minuten auf dem eigenen Server einrichten lässt, werde das aber erstmal nur auf Anfrage herausgeben. Die Entwicklung hat noch einige Macken und vermisst noch viele Features. Vorerst werde ich selber an dem Projekt weiterarbeiten und es dann in einem reiferen Zustand veröffentlichen.