/// <reference path="../Scripts/typings/moment/moment.d.ts" />
/// <reference path="../scripts/typings/jquery/jquery.d.ts" />
/// <reference path="DuckTyping.ts" />

$("#content").before("Hallo Welt!");

import modell = DemoKunden.GO;

var expertenname: string = "Holger Schwichtenberg";
var plz: number = 45257;
var autor: boolean = true;
var website: any = "http://www.dotnet-doktor.de"

//function ausgabe(text: string): void {
// $('#content').before(text + "<br>");
//}

function ausgabeVar(obj: any): void {
 ausgabe(typeof obj + ": " + obj);
}


// Deklaration einer Enumeration
enum Protokolleintragsart { Information, Warnung, Fehler };

// Nutzung der Enumeration
function DemoEnum() {

 var art: Protokolleintragsart;

 art = Protokolleintragsart.Warnung;

 ausgabeVar(art); // liefert 1
 ausgabeVar(Protokolleintragsart[art]);  // liefert "Warnung"

}

function DemoKlassen() {

 // Konstruktor
 var k1 = new DemoKunden.GO.Kunde(123, "Holger Schwichtenberg", "Essen");

 // Typepruefungen

 var IstInVariableEinKunde: boolean = k1 instanceof GO.Kunde;
 var IstInVariableEinKontakt: boolean = k1 instanceof GO.Kontakt;
 var TypName = typeof k1;

 ausgabe(IstInVariableEinKunde.toString());
 ausgabe(IstInVariableEinKontakt.toString());
 ausgabe("k hat den Typ:" + TypName);
}

function DemoModule() {

 var k1 = new DemoKunden.GO.Kunde(123, "Holger Schwichtenberg", "Essen");
 var k2 = new modell.Kunde(123, "Holger Schwichtenberg", "Essen");
}

function TypHerleitung() {

 var transformString: (s: string) => string;
 transformString = (str) => str.toLowerCase();

 function add(a: number, b: number) {
  return a + b;
 }
 var sum = add(1, 2);

}


function DemoFunktionen() {
 ausgabe("DemoFunktionen");



 /** Gibt eine Begrüßung aus. 
 * @param Gruss und Trennzeichen sind optional.
 */
 function halloWelt(name: string, gruss: string = "Hallo", trenner?: string): void {
  if (trenner == undefined) trenner = " ";
  ausgabe(gruss + trenner + name);
 }

 halloWelt("Holger");




 halloWelt("Holger", "Hallo");
 halloWelt("Holger", "Hallo", ", ");
 // Diese Zeile fuehrt zu einem Kompilierungsfehler
 // halloWelt(5);

 // --------------------------------------
 function mult(a: number, b: number): Number {
  return a + b;
 }
 var sum = mult(1, 2);

 // ---------------------------------------
 function Zusammensetzen(a: string, b: string): string {
  return a + "  " + b;
 }

 var ganzerName = Zusammensetzen("Holger", "Schwichtenberg");

 // ---------------------------------------
 var berechnung: (a: number, b: number) => number;
 function add(x: number, y: number): number {
  return x + y;
 }

 berechnung = add;
 ausgabe("Ergebnis: " + berechnung(17, 2));


 // ---------------------------------------
 function filter(objs: number[], callback: (item: number) => boolean):
  Array<number> {

  var ergebnismenge: number[] = new Array<number>();
  for (var i: number = 0; i < objs.length; i++) {

   if (callback(objs[i])) {
    ergebnismenge.push(objs[i]);
   }
  }
  return ergebnismenge;
 }

 var result = filter([1, 2, 3, 4, 5, 6], (item: number) => item % 2 == 0);
 ausgabe("Anzahl der Elemente in der Ergebnismenge: " + result.length);

 // ---------------- Funktionstypen




 // Variable mit Funktionstyp deklarieren
 var FunktionsTypIntIntAufString: (x: number, y: number) => string;

 // Funktion mit klassischem Rumpf
 function SummeAlsString(x: number, y: number): string {
        return "Die Summe aus " + x + " und " + y + " ist " + (x + y) + "."
    }

 // Zuweisung der Funktionstyp-Variablen an die Funktion
 FunktionsTypIntIntAufString = SummeAlsString;

 // Aufruf der Funktion
 ausgabe(FunktionsTypIntIntAufString(1, 3));

 // Variable mit Funktionstyp deklarieren
 var transformString: (s: string) => string;

 // Funktion mit Lambda-Ausdruck im Rumpf
 transformString = (str) => str.toLowerCase();

 ausgabe(transformString("Holger Schwichtenberg"));

}





function DemoVariablen() {
 ausgabe("DemoVariablen");

 ausgabeVar(name);
 ausgabeVar(plz);
 ausgabeVar(autor);
 ausgabeVar(website);

 // Nicht erlaubt
 //var x : undefined;
 var x = undefined;
 ausgabeVar(x);

 // Nicht erlaubt
 //var y: null;
 var y = null;
 ausgabeVar(y);

 var z;
 ausgabeVar(z);

 // Typsicherheit
 var a: number;
 a = 5;
 // Fehler: a = "test";

 var b: string;
 // Fehler:  b = a;
 b = a.toString();
 b = "test";

 var website1 = "http://www.ix.de";
 //Website1 = 11; // Fehler: "Cannot convert 'number' to 'string'."
 ausgabeVar(website1);
 var website2: any = "http://www.dotnet-doktor.de";
 website2 = 1;
 ausgabeVar(website2);
 var website3;
 website3 = "http://www.typescript.org"
    website3 = 4;
 ausgabeVar(website3);

 var m = null;
 var n = undefined;

 // IntelliSense Demo
 var Zahl1: number;
 Zahl1 = 5;
 ausgabeVar(Zahl1.toString());

 var Zahl2;
 Zahl2 = 5;
 ausgabeVar(Zahl2.toString()); // Keine IntelliSense

 // Any
 var test;
 test.bla();
}



