PDF-Icon in Sharepoint Foundation einbinden

Im Geschäft bin ich gerade ein SharePoint Foundation am installieren bzw. konfigurieren. Eines (der vielen) Probleme ist, dass bei PDF-Dokumenten kein Icon angezeigt wird, was das ganze etwas unübersichtlich macht. Das ganze kann aber recht schnell lösen. Dazu muss man das Icon für auf den Server kopieren und eine XML-Datei anpassen.
http://images.t-error.ch/blog/1379/sharepoint_vorher.jpg

Als erstes kopiert man dazu das PDF-Icon in einer Grösse von 16x16 Pixel auf den Server. Bei meinem Windows 2008 R2 Server, war das der folgende Ordner:
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\TEMPLATE\IMAGES

Dazu kann man das Icon benutzen: http://images.t-error.ch/blog/1379/icpdf.gif

Jetzt muss man noch die Datei DOCICON.XML anpassen, welche in diesem Ordner liegt:
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\TEMPLATE\XML

Der macht fügt man im Abschnitt ByExtension die folgende Zeile hinzu.
<Mapping Key="pdf" Value="icpdf.gif" OpenControl=""/>
Wichtig ist, dass der Dateiname gleich ist, wie der vom Bild.

Nun muss man auf dem Server mit dem Befehl iisreset noch den Webserver neustarten und dann werden die Icons schon angezeigt.
http://images.t-error.ch/blog/1379/sharepoint_nachher.jpg

Das ganze funktioniert natürlich auch mit den Icons von anderen Dateiendungen.

Howto: Wartung der Kindshock i900

An meinem Chameleon fahre ich nun seit über einem Jahr eine Kindshock i900 Sattelstütze und bin damit sehr zufrieden und möchte sie auch nicht mehr hergeben. Seite kurzen schmückt ja auch eine KS i900R mein Fully. Seit dem ich die Sattelstütze habe, hat sie aber noch kein bisschen Pflege, dafür aber umso mehr Dreck, Wasser, Schlamm, Schnee usw. gesehen. Das Absenken der Stütze ging in der letzten Zeit immer etwas schlecht und so habe ich mir für heute Abend vorgenommen der Stütze etwas Pflege zu kommen zu lassen. Kindshock beschreibt im Benutzerhandbuch ja wie man die Stütze wartet und diese Beschreibung gibts auch im Internet. Hier Teil 1 und Teil 2.

Als erstes muss man die Sattelstütze vom Bike entfernen und idealerweise auch den Sattel abschrauben, das macht die Sache etwas einfacher. Nun entfernt man auf der unteren Seite die blaue Schraube mit einem 11mm Innensechskant und löst danach die rote Schraube. Das geht mit einer spitzen Zange am einfachsten.


Nun löst man die rote Manschette auf der oberen Seite und schiebt diese am besten gleich ganz nach oben. Hier sieht man nun auch schön ob, und wie fest die Stütze schon gelitten hat. Meine hat auf der Rückseite auch schon leichte Riefen, aber solange die Stütze noch funktioniert ist das kein Problem. Ich konnte bei mir die Dichtungen die in der roten Manschette drin sind nicht von der Manschette trennen und so leider auch nicht richtig reinigen. Ich hoffe, der Entfetter hat seine Arbeit recht gemacht. Jetzt putzt man den Schaft und die Dichtungen mit einem Entfetter. Wichtig ist, dass dieser Entfetter die Dichtungen nicht angreift, sonst funktioniert die Sattelstütze nach der Wartung noch schlechter als vorher. Wenn der obere Teil geputzt ist senkt man die Stütze ab und kann nun den Schaft auf der unteren Seite putzen.
Ist alles sauber kommt Fett drauf, zuerst unten und danach auf der oberen Seite. Ich habe eine rechte Packung fett drauf gehauen, damit das auch noch etwas abdichtet. Ist alles gefettet bewegt man die Sattelsütze am besten einige male hoch und runter um das Fett gut zu verteilen.


Zum Schluss schraubt man unten die rote und die blaue Schraube wieder drauf und oben auch die rote Manschette. Und das wars schon. Eigentlich recht simpel und wenn man es schon ein, zwei mal gemacht hat ist das auch recht zügig erledigt. Ich empfehle das regelmässig zu machen und nicht so wie ich erst nach einem Jahr. Man sieht ja wie die Stütze innen aussieht.

Ich hatte hier nur recht dickes Fett zur Verfügung, ich denke am besten ist Fett, das etwas weich ist. Meine Stütze funktioniert nun wieder viel besser als vorhin und meiner anderen Stütze werde ich etwas mehr Pflege zukommen lassen.

Excel Dateien mit PHPExcel erstellen

Letzte Woche habe ich hier bereits darüber geschrieben, wie man mit dem MS-Excel Stream Handler Excel Dateien erstellen kann, nun habe ich hier noch eine andere, viel umfangreichere Lösung.
Die Lösung nennt sich PHPExcel und kommt von CodePlex. Die "Installation" ist sehr simpel, ZIP Datei herunterladen und die PHP-Dateien auf dem Server speichern. Im Script, das die Excel Datei schreiben soll dann die Dateien PHPExcel.php und PHPExcel/IOFactory.php einbinden.
<?
require_once("includes/PHPExcel.php");
require_once(
"includes/PHPExcel/IOFactory.php");
?>

Die ganze Klasse ist viel zum Umfangreich um hier komplet beschrieben zu werden, ich beschränke mich lediglich auf das schreiben eines Excel Files ohne Formatierung. Wer etwas Farbe ins speil bringen will, oder Formeln, Rahmen usw. benutzen will führt sich am besten die sehr ausführliche Dokumentation zu gemüte.

Wenn die beiden Dateien eingebunden sind, muss man als erstes eine Instanz der Klasse erstellen und kann danach gewisse Dokumenteigenschaften wie den Ersteller Titel usw. schreiben.
<?
// neue instanz erstellen
$xls=new PHPExcel();

// dokumenteigenschaften schreiben
$xls->getProperties()->setCreator("David Lienhard")
                     ->
setLastModifiedBy("David Lienhard")
                     ->
setTitle("Test")
                     ->
setSubject("Test");
?>


Beim nächsten Schritt definiert man, in welches Worksheet man schreiben will. Ich habe bei diesem Beispiel nur ein Sheet und so kann ich auch nur das anwählen.
<?
// das erste worksheet anwaehlen
$sheet=$xls->setActiveSheetIndex(0);
?>


Nun kann man die gewünschten Daten in die Datei schreiben. Die Methode erwartet zwei Parameter. Zum einen das Feld, in das geschrieben werden soll und der Wert, der geschrieben werden soll. Das Feld muss im Format A1 angegeben werden, also genau wie im Excel.
<?
// den wert test in das Feld A1 schreiben
$sheet->setCellValue("A1","test");
?>


Nun kann man noch den Titel des aktuellen Worksheets definieren. Wird nichs angegebn wird einfach der Filename benutzt.
<?
// den namen vom Worksheet 1 definieren
$xls->getActiveSheet()->setTitle("Titel");
?>


Zum Schluss müssen die Daten noch in eine Datei geschrieben werden. Dazu erstellt man erstmal eine neue Instanz der IOFactory und gibt dort an, welchen Dateityp die Datei haben soll. Also Excel 2007, Excel 5 usw. Ich habe aus Kompatibilitätsgründen Excel 5 gewählt.
<?
// eine writer instanz erstellen
// das dateiformat ist hier excel5
// alt, aber von allen excel versionen lesbar
$writer=PHPExcel_IOFactory::createWriter($xls,"Excel5");

// die daten speichern
$writer->save("filename.xls");
?>


Und so sieht das ganze Script aus:
<?
// neue instanz erstellen
$xls=new PHPExcel();

// dokumenteigenschaften schreiben
$xls->getProperties()->setCreator("David Lienhard")
                     ->
setLastModifiedBy("David Lienhard")
                     ->
setTitle("Test")
                     ->
setSubject("Test");

// das erste worksheet anwaehlen
$sheet=$xls->setActiveSheetIndex(0);

// den wert test in das Feld A1 schreiben
$sheet->setCellValue("A1","test");

// den namen vom Worksheet 1 definieren
$xls->getActiveSheet()->setTitle("Titel");

// eine writer instanz erstellen
// das dateiformat ist hier excel5
// alt, aber von allen excel versionen lesbar
$writer=PHPExcel_IOFactory::createWriter($xls,"Excel5");

// die daten speichern
$writer->save("filename.xls");
?>

Excel Dateien mit PHP und MS-Excel Stream Handler erstellen

Im Geschäft musste ich eine kleine Web-App erstellen, die Excel-Files ausliest und in einem anderen Format wieder neue Excel-Files schreibt. Wie man Excel-Files ausliest habe ja ja bereits beschrieben, darum hier eine kleines Howto, wie man Excel-Dateien schreibt.

Von PHP selber gibt es dazu keine Funktionen, dafür aber verschiedene Klassen und Funktionen dritter. Eine recht simple Möglichkeit ist der MS-Excel Stream Handler, den man nach einer Registration gratis herunterladen kann.

Die Funktion wird über ein File eingebunden und registriert sich dann gleich selber einen neuen Filestream mit dem Namen xlsfile. Die Vorgehensweise ist recht simpel: Man erstellt sich einen zweidimensionalen Array und schreibt diesen serialisiert über den Stream in die Datei. Etwas unschön ist in meiner Meinung, dass der Array-Index gleich als erste Zeile benutzt wird.

Aber hier ein kleines Beispiel:
<?
// einen array erstellen
$data=array();

// zweite zeile definieren
// der array-index (ueberschrift1-5) wird als erste zeile verwendet
$data[]=array(
    
"ueberschrift1" =>  "zeile 2 - spalte 1",
    
"ueberschrift2" =>  "zeile 2 - spalte 2",
    
"ueberschrift3" =>  "zeile 2 - spalte 3",
    
"ueberschrift4" =>  "zeile 2 - spalte 4",
    
"ueberschrift5" =>  "zeile 2 - spalte 5");

// dritte zeile definieren
$data[]=array(
    
"ueberschrift1" =>  "zeile 3 - spalte 1",
    
"ueberschrift2" =>  "zeile 3 - spalte 2",
    
"ueberschrift3" =>  "zeile 3 - spalte 3",
    
"ueberschrift4" =>  "zeile 3 - spalte 4",
    
"ueberschrift5" =>  "zeile 3 - spalte 5");

// dateiname definieren
$filename="excel.xls";

// stream oeffnen
$fp=fOpen("xlsfile:/".$filename,"wb");

// check ob datei erstellt werden konnte (schreibrechte, korrekter pfad)
if(!is_resource($fp))
{
    die(
"konnte datei nicht erstellen");
}

// den serialisierten array schreiben
fWrite($fp,serialize($data));

// datei schliessen
fClose($fp);
?>

Das ergibt dann das folgende Erbebnis:
http://images.t-error.ch/blog/1256/excel.jpg


Der erstellen eines Excel-Files geht so sehr einfach und schnell von der Hand, dafür hat man aber keine weiteren Konfigurationsmöglichkeiten. Man kann keine weiteren Tabellenblätter hinzufügen und die erste Zeile ist immer der Arrayindex.
Ich werde auf meiner Blog demnächst eine andere Möglichkeit beschrieben, die etwas aufwändiger ist, aber auch mehr Konfigurationsmöglichkeiten bietet.

Grub 2 nach Windowsinstallation wiederherstellen

Ich nutze auf dem Computer zuhause schon seit längerem Untuntu und bin sehr zufrieden damit. Einige Dinge (GPS, Spiele) laufen unter Ubuntu aber nicht darum habe ich paralell noch ein Windows XP installiert. Mit dem Grub Bootloader ist das ja kein Problem. Neulich musste ich aber mein Windows neu installieren, was ja ansich auch kein Problem ist. Bei der Installation überschreibt Windows aber den Bootloader und so kann man Linux nicht mehr booten. Hier darum eine kleine Anleitung wie man den Grub wieder installiert, so dass man Linux und Windows booten kann. Dazu benötigt man einfach eine Ubuntu Installations CD. Ich habe das ganze mit Ubuntu 9.10 durchgespielt.

Als erstes legt man die Ubuntu CD ins Laufwerk und bootet davon im Live Modus. So hat man ein Linux zur Verfügung, ohne dass man etwas ander Festplatte verändert. Das Problem ist aber, dass die Live CD den Grub 1 verwendet, die Installation aber Grub 2, aber das ist ein lösbares Problem.
Darum schreibt man nun als erstes den (alten) Grub in den MBR (Master Boot Record) der Festplatte. Da zu muss man die UUID der Bootpartition sowie der Name der Festplatte wissen. Am besten hängt man die Boot Partition über das GUI ein und gibt danach in der Shell den Befehl mount ein. Dort sieht man, wie die Partition eingebunden ist und auch die UUID der Partition. Wir brauchen wie gesagt die UUID der Partition und der Name der Festplatte. Ist die Parition die /dev/sda6 ist die Platte die /dev/sda. Im Normalfall ist eine IDE Platte die /dev/hda und eine SATA/SCSI die /dev/sda. Den Bootloader schreiben wir nun mit dem folgenden Befehl ({UUID} durch die entsprechende UUID ersetzen.
sudo grub-install --root-directory=/media/{UUID} /dev/sda

Bevor wir den Computer nun neustarten, müssen wir noch wissen, welche Parition die Root Partition ist. Also die Partition, die schlussendlich als / genutz werden soll. Gleiches vorgehen wie vorhin. Schnell einhängen und mit mount die Partition auslesen.
Jetzt können wir den Computer neustarten und die CD aus dem Laufwerk auslesen.

Beim neustart kommt nun der Grub im Konsolen Modus. Also keine Auswahl sondern nur eine Aufforderung etwas einzugeben. Nun müssen wir das System ein erstes mal "von Hand" booten. Zum Glück gibt es eine Autovervollständigung, die das ganze etwas einfacher macht. Als erstes gibt man die folgende Zeile ein:
linux /vmlinuz-2.6.31-20-generic root=/dev/sda6 ro quiet splash

Am einfachsten ist es nur linux /vmlinuz einzutippen und sich dann mit dem Tabulator die verschiedenen Kernel anzeigen zu lassen, so erwischt man auch immer den aktuellsten. /dev/sda6/ ist hier die Root Partition, dessen Name wir vorhin ausgelesen haben. (Das Tastaturlayout ist Englisch. Die Bindestriche und Slashes nimmt man am besten vom Numlock, das Gleichzeichen ist gleich links vom Backspace)
boot linux /vmlinuz-2.6.31-20-generic root=/dev/sda6 ro quiet splash

Nun ist der Kernel geladen und wir müssen nur noch Booten. Das geht mit demselben Befehl, nur noch mit einem boot davor.
boot linux /vmlinuz-2.6.31-20-generic root=/dev/sda6 ro quiet splash

Jetzt sollte das System wieder booten wie vor der Windows installation. Damit man das aber nicht bei jedem Start machen muss, muss man nun noch die neuste Version vom Grub installieren. Das geht recht simpel mit dem folgenden Befehl:
sudo gub-install --root-directory=/ /dev/sda

Wenn man das Windows nachträglich installiert, oder bei der Neuinstallation die Windows Partition komplett gelöscht und neu erstellt hat, muss man das Configfile vom Grub anpassen, damit auch Windows wieder gebootet werden kann. Das geht mit dem folgenden Befehl schnell und vollautomatisch:
sudo grub-mkconfig -o /boot/grub/grub.cfg

Beim nächsten Neustart sollte man nun wieder den Grub 2 mit der Auswahl Linux und Windows haben.

Mit Windows 7 auf Samba-Shares zugreifen

Nach der Installation von Windows 7 hatte ich schon das erster Problemchen. Zwar konnte ich nicht mehr auf einen Sambashare zugreifen, das ganze scheiterte an der Authentifizierung.

Das Problem kann man allerdings mit einer Änderung an den lokalen Sicherheitsrichtlinie lösen. Zuerst öffnet man die Verwaltung über Start, Ausführen und dort secpol.msc

Nun Navigiert man nach Lokale Richtlinien und Sicherheitsoptionen. Dort stellt man die beiden folgenden Einträge um:

Netzwerksicherheit: LAN Manager-Authentifizierungsebene
auf
LM-und NTLM-Antworten senden

und
Netzwerksicherheit: Minimale Sitzungssicherheit für HTLM-SSP-basierte Clients (einschliesslich sicherer RPC-Clients)
auf
128-Bit-Verschlüsselung erfordern deaktivieren

Danach konnte ich wie gewohnt auf den Samba-Share zugreifen.

Simpler Kalender mit PHP

Hier ein kleines How-To, wie man mit PHP einen Simplen Kalender macht. In diesem Beispiel ohne grosse Einstellmöglichkeiten, aber das kann man auch im Nachhinein noch ganz gut ergänzen.
Der Kalender wird hier in einer HTML-Tabelle dargestellt, was im Normalfall die beste Lösung ist.

Ich möchte hier nicht allzuviele Worte verlieren, da ich denke, dass der Quelltext mit den Kommentaren verständlich genug sein sollte, aber den Ablauf möchte ich noch kurz erläutern:
Als erstes wir berchnet welches Wochentag der erste Tag im Monat hat und so werden wenn nötig die ersten leeren Zellen geschrieben. Wenn der erste Tag also ein Freitag ist werden 4 Zellen (Mo - Do) geschrieben. Nun werden die Tage des Monats geschrieben und immer nach sieben Tagen wird eine neue Zelle begonnen. Schlussendlich werden noch die restlichen Zellen bis zum Schluss des Monats geschrieben.

Das sieht dann so aus:
<?
echo "
<table border=\"1\" cellspacing=\"0\">
    <tr>
        <th>Mo</th>
        <th>Di</th>
        <th>Mi</th>
        <th>Do</th>
        <th>Fr</th>
        <th>Sa</th>
        <th>So</th>
    </tr>
    <tr>"
;
    
    
// monat bestimmen
$month=date("m");

// jahr bestimmen
$year=date("y");

// timestamp des ersten tages im monat
$ts=mkTime(0,0,0,$month,1,$year);

// anzahl der tage im monat
$days_of_month=date("t",$ts);

// erster tag im monat
// mo=0, di=1, ..., so=6
$first_day=date("w",$ts);
if(
$first_day==0)
{
    
$first_day=7;
}
$first_day--;

// der aktuelle wochentag
// mo=0, di=1, ..., so=6
$weekday=0;

// tage bis zum ersten tag auffuellen
for($i=0;$i<$first_day;$i++)
{
    
$weekday++;

    echo 
"
        <td>&amp;nbsp;</td>"
;
}

// wochentage schreiben
for($i=0;$i<$days_of_month;$i++)
{
    
// neue zeile nach sonntag
    
if($weekday==7)
    {
        echo 
"\n    </tr><tr>";
        
$weekday=0;
    }
    
$weekday++;

    
// aktueller tag hervorheben
    
if(intVal($i+1)==intVal(date("d")) AND intVal($month)==intVal(date("m")) AND intVal($year)==intVal(date("y")))
    {
        echo 
"
        <td style=\"background-color:#f0f0f0;\">"
.($i+1)."</td>";
    }
    else
    {
        echo 
"
        <td>"
.($i+1)."</td>";
    }
}


// tage bis zum letzen tag auffuellen
for($i=$weekday;$i<7;$i++)
{
    echo 
"
        <td>&amp;nbsp;</td>"
;

    
$weekday++;
}

// tabelle abschliessen
echo "
    </tr>
</table>"
;
?>

Update der Ajax-Klasse

Nun habe ich doch noch einen "Fehler" in meiner Ajax-Klasse gefunden. In meiner Web-Applikation kann der Benutzer in mehreren Inputfeldern Daten Filtern, die dann in einem Dix-Container ausgegeben werden. Mit einem listener auf den Felder wird überprüft, ob etwas eingegeben wurde und sobald dies der Fall ist, wird mittels Ajax die PHP-Datei aufgerufen und die Daten in den Container geschrieben. Soweit so gut, das hat mit der alte Klasse auch recht gut geklappt. Allerdings ist es ja so, dass je mehr Daten der Benutzer eingab, desto weniger Daten musste die PHP-Datei zurückgeben. Mehr Filterdaten=Weniger Daten.
Das bedeutet aber auch, dass die Requests die anfangs gestartet werden länger dauern als die die später gestartet werden. Nun kann es also sein (wenn der Benutzer schnell ist), dass zuerst ein Request gestartet wird, bei welchem eine grosse Datenmenge zurück kommt. In der Zwischenzeit wird ein nächster Request, vom selben Benutzer in derselben Session ein neuer Request mit mehr Filter-Daten gestartet, bei welchem weniger Daten zurückkommen. Dieser wird natürlich von PHP schneller abgearbeitet und wird auch schneller zum Browser übertragen. So werden diese Daten schön im Div-Container angezeigt. Soweit so gut, das Problem ist nun allerdings, dass noch der andere Request mit der grösseren Datenmenge läuft und sobald der fertig ist, werden die Daten angezeigt. Also die alten, die der Benutzer gar nicht sehen will.
Das bedeutet nun also, dass sobald ein neuer Request gestartet wird, der alte, noch laufende, abgebrochen werden soll. Allerdings sollen aber trotzdem mehre Requests paralell laufen können.

Das bedeutet, dass pro Objekt ein Request aufs mal laufen soll, aber man soll mehrere Objekte erstellen können, die dann paralell laufen können.

In meiner Lösung erstellt man nun als erstes eine Referenz zu einem Objekt in welchem ein XMLHttp Objekt erstellt wird. Wenn nun ein Request gestartet werden soll, ruft man die Methode start() mit URL, und ID des Ziels auf. Sobald ein neuer Request mit demselben Objekt gestartet wird, wird der alte abgebrochen.
ajax=new XMLHttp;
ajax.start("ajax.php?param=test","feld");
Weitere Requests können dann so gestartet werden:
ajax.start("ajax.php?param=blub","feld");
Und auch mehrere paralelle Requests sind kein Problem:
ajax1=new XMLHttp;
ajax2=XMLHttp;

ajax1.start("ajax.php?param=ajax1","feld1");
ajax2.start("ajax.php?param=ajax2","feld2");
Und die ganze Klasse sieht dann so aus:
// Objekt XMLHttp
// Param url: Url der aufzurufenden Datei
// Param dst: ID des HTML-Elements
XMLHttp=function()
{
    // Den Browsertyp auslesen
    var browser=navigator.appName;
    var obj=this;

    if(browser=="Microsoft Internet Explorer")             // IE
    {
        var http=new ActiveXObject("Microsoft.XMLHTTP");
    }
    else                                                   // Mozilla, Safari, Opera, usw.
    {
        var http=new XMLHttpRequest();
    }

    obj.start=function(url,dst)
    {
        // bereits laufende requests abbrechen
        http.abort();

        obj.dst=dst;

        // HTTP-Request senden
        // Parameter url als Adresse
        http.open("GET",url,true);

        // Wenn Status geaendert wurde
        http.onreadystatechange=function()
        {
            // ueberpruefen, ob daten gesendet wurden
            // readystate 4 = complete
            if(http.readyState==4)
            {
                // ueberpruefen, ob status vom server richtig ist
                // status 200 = OK
                if(http.status==200)
                {
                    // Antwort vom Server in HTML-Element schreiben
                    // dst als ID
                    document.getElementById(obj.dst).innerHTML=http.responseText;
                }
                else if(http.status!=0)
                {
                    // HTTP Fehlercode zurückgeben
                    document.getElementById(obj.dst).innerHTML="Fehler:\nHTTP-Status: "+http.status+"\nHTTP-Statustext: "+http.statusText;
                }
            }
        }

        http.send(null);
    }
}

Simple AJAX-Klasse

Ich habe vor ca zwei Jahren bereits einen kleinen Beitrag über Ajax geschrieben und muss das nun für ein Projekt im Geschäft neu aufrollen. Mit etwas OOP habe ich eine Ajax-Klasse geschrieben, die die Daten vom Server abholt und in ein beliebiges HTML-Element einfügt.
Mit dieser Klasse sind auch mehrere paralelle Anfragen möglich und das ganze funktioniert im Firefox, IE und Opera. Andere Browser habe ich (noch) nicht getestet. Die Klasse erwartet den Parameter Url (die Adresse die aufgerufen werden soll) und Dst (die ID des HTML-Elements für die Ausgabe). Mit einigen Veränderungen kann die Klasse die Daten vom Server auch anderst ausgeben und natürlich kann man das noch beliebig erweitert (Lade-Bilder usw.).
// Objekt XMLHttp
// Param url: Url der aufzurufenden Datei
// Param dst: ID des HTML-Elements
XMLHttp=function(url,dst)
{
    // Den Browsertyp auslesen
    var browser=navigator.appName;

    if(browser=="Microsoft Internet Explorer")             // IE
    {
        var http=new ActiveXObject("Microsoft.XMLHTTP");
    }
    else                                                   // Mozilla, Safari, Opera, usw.
    {
        var http=new XMLHttpRequest();
    }

    // HTTP-Request senden
    // Parameter url als Adresse
    http.open("GET",url,true);

    // Wenn Status geaendert wurde
    http.onreadystatechange=function()
    {
        // ueberpruefen, ob daten gesendet wurden
        // readystate 4 = complete
        if(http.readyState==4)
        {
            // ueberpruefen, ob status vom server richtig ist
            // status 200 = OK
            if(http.status==200)
            {
                // Antwort vom Server in HTML-Element schreiben
                // dst als ID
                document.getElementById(dst).innerHTML=http.responseText;
            }
            else
            {
                // HTTP Fehlercode zurückgeben
                alert("Fehler:\nHTTP-Status: "+http.status+"\nHTTP-Statustext: "+http.statusText);
            }
        }
    }
    http.send(null);
}


Das ganze wird nun folgendermassen aufgerufen. Hier wird die Adresse ajax.php?param=test angefragt und die Anwort vom Server wird in das HTML-Element (div/span/p/usw..) geschrieben.
ajaxObj=new XMLHttp("ajax.php?param=test","feld");

OOP mit JavaScript: Prototypen

Noch ein kleiner, zweiter Teil zu OOP mit JavaScript. Und zwar möchte ich kurz erklären, wie es mit Prototypen möglich ist nachträglich noch Variablen und Methoden zu einem Objekt hinzuzufügen.

Beispiel

Zuerst habe ich hier ein kleines Objekt, welches als Basis des Beispiels dient. Darin hat es eine Variable und eine Methode, die beide Public sind.
// Das Objekt (Klasse) erstellen
meinObjekt=function()
{
    // Eine Variable erstellen
    this.variable="Variable";
    
    // Eine Methode
    this.methode=function()
    {
        alert("Methode");
    }

    return true;
}

Variabeln / Methoden hinzufügen

Nun kann man dem bestehenden Objekt (oder einer Referenz) mit dem Stichwort Prototype neune Variabeln oder Mehthoden hinzufügen. Diese sind dann immer Public, also von überall verfügbar. Das sieht dann so aus:
// Eine neue Variable hinzufuegen
meinObjekt.prototype.neueVariable="Eine neue Variable";

// Eine neue Methode hinzufuegen
meinObjekt.prototype.neueMethode=function()
{
    alert(this.neueVariable);
}

Variabeln / Methoden aufrufen

Um auf die neuen Variabel oder Methoden zuzugreifen erstellt man wie übliche eine Referenz und hat sie nun ganz nortmal zur Verfügung.
// Referenz erstellen
var obj=new meinObjekt;

// Ausgabe der Variable
alert(obj.neueVariable);

// Aufruf der Methode
obj.neueMethode();